프로세스(Process)란?
프로세스 정의 (definition)
프로세스는 프로그램의 수행 단위다.
Process is a program in execution.
즉, 실행 중인 프로그램을 프로세스라고 말한다.
프로세스 문맥 (process context)
-
- 하드웨어 문맥 (harware context)
- 하드웨어인 CPU가 프로세스의 명령어(instruction) 어디까지 수행했는지를 의미한다.
-
- program counter
- CPU가 프로세스의 코드를 어디까지 처리했는지 기록함
-
- register
- 프로세스의 결과값 및 커널(=os)의 주소값을 저장
-
- 프로세스의 주소 공간 (memory)
- 메모리 내 프로세스의 위치를 의미한다.
-
- stack
- 프로그램의 출력값
-
- data
- 프로그램 내 각종 변수(variale)
-
- code
- 프로그램 내 코드 (=instruction, 기계어)
-
- 커널(OS) 문맥
- 커널은 특정한 자료구조에 프로세스 정보를 저장한다.
-
- PCB(Process Control Block)
- 커널이 프로세스를 관리하기 위해 프로세스 별로 유지하는 정보이다.
-
- Kernel Stack
- 프로세스가 system call을 실행하면 커널 함수를 호출하게 되는데, 이 때 커널 함수를 호출한 프로세스 정보를 kernel stack에 저장한다. kernel stack의 역할은 여러 프로세스가 커널 함수를 호출하는 경우 (time-sharing), 프로세스별로 커널 함수 실행 정보를 저장하여 프로세스간 실행 정보가 꼬이지 않게 하기 위함이다.
프로세스 상태 (process status)
- Running
- CPU가 프로세스의 명령어(instruction)을 수행 중인 상태
- Ready
- 프로세스가 메모리에 올라와있지만(=in memory), 아직 CPU 처리를 기다리는 상태
- Blocked (=Wait, Sleep)
- 프로세스가 I/O 작업 완료를 기다리거나 프로세스가 메모리에 올라와있지 않은 상태
- Suspended (=Stopped)
- 외부적인 이유 (1. swapper가 메모리에서 프로세스를 내림 2. 사용자가 프로세스 실행을 멈춤 ex. Ctrl+C)로 프로세스의 수행이 정지된 상태. 프로세스가 디스크에 통째로 swap-out 됨.
- New
- 프로세스가 새로 생성중인 상태
- Terminated
- 프로세스가 종료중인 상태
time-sharing
time-sharing이란multiprogramming
또는multitasking
의 실행 방식 중 하나로, CPU가 ready 상태의 프로세스들을 번갈아가며 수행하는 방식을 의미.
PCB (Process Code Block)
: 운영체제는 여러 프로세스를 관리(관리의 예시로는 CPU와 같은 자원의 분배)하기 위해 프로세스별로 PCB 구조체를 유지한다. 프로세스별 PCB는 커널 주소공간 중 data에 저장된다.
- OS가 프로세스 관리를 위해 필요한 정보
- 프로세스 상태 (process state)
- 프로세스 ID (pid)
- CPU 스케줄링 정보 및 우선 순위 (scheduling information and priority)
- 하드웨어 문맥 = CPU 수행 정보
- program counter : CPU가 프로세스의 코드를 어디까지 처리했는지
- register : 프로세스의 결과값
- 메모리 관련
- code, data, stack의 위치 정보
- 파일 관련
- open file descriptors
문맥 교환 (Context Switch)
: CPU가 처리 중인 프로세스가 다른 프로세스로 바뀌는 상황. 즉 현재 실행중이던 프로세스가 프로세스A라고 한다면 프로세스A의 상태가 running에서 ready로 변하고 다른 프로세스인 프로세스B의 상태가 ready에서 running으로 바뀔 때 문맥 교환이 일어났다고 한다.
- 문맥 교환 시 오버 헤드 발생: Cache Memory Flush
- 프로세스의 timer가 종료되거나 I/O 요청이 필요한 경우 시스템 콜이 발생하게 되는데 이 때 문맥 교환이 일어난다. 이 때, 커널은 프로세스의 CPU 수행 정보를 PCB에 저장하는데, 문맥 교환이 일어나면 다른 프로세의 PCB를 캐시 메모리에 올려야하기 때문에 캐시 메모리를 초기화하는 cache memory flush가 일어나 오버 헤드가 발생한다.
- 주의
- 프로세스A의 시스템 콜로 CPU 제어권이 프로세스A에서 커널로 넘어갔다가 다시 프로세스A로 돌아오는 경우는 문맥 교환이 일어나지 않는다. 이 경우에는 프로그램A의 PCB이 캐싱되어있기 때문에 커널 모드에서 유저 모드로 전환하는 과정에서 오버헤드가 발생하지 않기 때문이다.
스케줄러 (Scheduler)
- CPU scheduler (short-term scheduler)
- 어떤 프로세스를 running할지 결정
- millisecond 단위로 빨라야 함
- Swapper (medium-term scheduler)
- 메모리에서 어떤 프로세스를 뺄 지 결정
- degree of multiprogramming을 결정 (즉, time-sharing할 프로세스를 결정)
스레드(Thread)란?
스레드 정의
스레드는 프로세스 내부의 CPU 수행 단위다.
스레드 구성
- 스레드가 독립적으로 갖는 자원 : CPU 수행과 관련된 자원
- program counter
- register set
- stack space
- 스레드간 공유하는 자원 : 하나의 task를 수행하는데 필요한 자원
- data
- code
- os resources
스레드 장점
- 빠른 응답 속도
- 자원의 효율적인 사용 (커뮤니케이션 비용 낮춤)
- 빠른 생성 및 수행 속도
- 멀티 코어 (여러 CPU를 사용) 환경에서 병렬 처리 가능
스레드 단점
- 하나의 스레드의 문제가 다른 스레드에 영향을 미칠 수 있음
단일 스레드 (single thread) VS 다중 스레드 (multi thread) 구조
…
스레드 구현 (thread implementation)
- Kernel thread
- 커널이 스레드의 존재를 알아 스레드 스케줄링을 직접 한다.
- User thread
- 커널이 스레드의 존재를 몰라 라이브러리로 스레드를 구현한다.
- ex. Python multi-threading library
Additional
파이썬 멀티 프로세싱 패키지 (Python Multi-processing)
Python은 GIL(Global Interpretor Lock)
때문에 멀티 코어를 사용하지 못한다. 파이썬 환경에서 프로세스를 다중 CPU에 나눠 병렬로 처리하고 싶을 땐, Python multi-processing library를 사용해 프로세스를 병렬 처리할 수 있다.