Process = program in execution (실행중인 프로그램)
- 프로세스는 실행이 시작되면 해당 프로세스만의 독자적인 주소공간을 생성함
- pc가 해당 프로세스 주소공간의 code 영역의 한 부분을 가리키고 있고, 해당 주소의 instruction을 읽어와서 CPU가 연산함
프로세스의 문맥(context)
Context의 개념
: 프로그램이 태어나서 → 실행 → 종료되기까지의 시간 중에 중간 어느 시점을 잘라놓고 보았을 때,이 프로그램이 무엇을 어떻게 실행했는지, 현재 시점이 어떤 상태에 있는지를 나타내기 위해 사용되는 개념
: 특정 시점을 놓고 보았을 때 이 프로세스가 어디까지 실행되었는가
Context가 담는 내용
- PC가 어디를 가리키고 있는가
- code의 어느 부분까지 실행했는가
- 메모리에 어떤 내용을 담고 있는가
- data 영역) 현재 변수의 값은 얼마인가
- stack 영역) 함수를 호출했다면 관련 내용이 stack에 쌓여있을 것
- register에 어떤 값을 넣어놓고, 어떤 instruction까지 실행했는가
Context의 분류
- 하드웨어 문맥 : CPU 수행 상태를 나타냄
- 프로세스는 CPU를 잡고 매순간 instruction을 실행함
- 현재 시점에 이 프로세스가 instruction을 어디까지 실행했는가?
- register에 어떤 값을 넣었는가
- program counter가 어떤 값을 가리키고 있었는가 등
- 프로세스의 주소 공간 (메모리 관련)
- 현 시점에 code, data, stack에 어떤 내용이 들어있는가
- 프로세스 관련 커널 자료 구조
- 운영체제가 이 프로세스를 어떻게 평가하고 있느냐도 알아야 한다.
- 운영체제의 역할 중 하나가 현재 컴퓨터 안에서 돌아가는 프로세스들을 관리하는 것임
- 이를 위해서 OS는 자신의 data영역에 PCB(Process Control Block)라는 자료구조를 두고 있음
- 프로세스가 하나씩 실행될 때마다 PCB를 하나씩 두면서 이 프로세스에 CPU/메모리를 얼마나 주어야 할지, 나쁜 짓을 하고 있지는 않은지 등을 관리함
- Kernel stack
- 각 프로세스가 자기 자신의 코드를 실행 중일 때는 자신의 stack에 호출된 함수를 저장/return한다
- 그런데 실행 중 system call을 하게 되면, PC가 kernel의 code 영역을 가리키게 되면서 커널의 함수가 호출됨
- 이때 호출된 함수에 대한 내용이 stack에 쌓여야 함
- 그런데 커널은 여러 프로세스가 공유하는 코드임. 즉, 어떤 프로세스든 OS에 요청을 할 때 커널의 코드를 실행하게 됨. 따라서 커널이 누구의 부탁을 받고 실행되고 있는지가 매번 다름
- 따라서 stack에 정보를 쌓을 때는 커널을 어떤 프로세스가 호출했는지에 따라 프로세스별로 stack을 별도로 두고 있음
Context의 필요성
- 현재의 OS는 time sharing, multi-tasking 등으로 여러 프로세스들이 번갈아서 실행됨
- 따라서 한 프로세스가 CPU 제어권을 얻고 실행하다가, 다른 프로세스로 CPU가 넘어가는 등의 행동이 반복됨
- 이때 프로세스의 진행상황, 즉 context를 백업해놓지 않으면, 다음번 CPU를 잡았을 때 어디서부터 실행해야 하는지 알 수 없게 됨
프로세스의 상태 (Process State)
Running
- CPU를 잡고 instruction을 수행중인 상태
- CPU가 하나인 컴퓨터라면 매 순간 Running 상태의 프로세스는 1개일 것
Ready
- CPU를 기다리는 상태 (메모리 등 다른 조건을 모두 만족한 채로)
Blocked (wait, sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- process 자신이 요청한 event(I/O 등)가 즉시 만족되지 않아 이를 기다리는 상태
Suspended (stopped)
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- ex) 사용자가 프로그램을 일시 정지시킨 경우 (break key), 시스템이 여러가지 이유로 프로세스를 잠시 중단시키는 경우 (메모리에 너무 많은 프로세스가 올라와 있을 때)
- 프로세스는 통째로 디스크에 swap out됨
- 중기 스케줄러 때문에 메모리를 통째로 빼앗긴 상태
- 외부에서 resume해주어야 active됨
New
Terminated
프로세스 상태도
PCB
: OS kernel이 각 프로세스마다 프로세스와 관련된 정보(프로세스를 관리하기 위한 정보)를 자신의 Data 영역에 두는데, 이를 PCB라고 함
: 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
PCB가 가지는 정보 구성
- (1) OS가 관리상 사용하는 정보
- 프로세스의 상태 (process state)
- 프로세스 ID
- scheduling information, priority
- (2) CPU 수행 관련 하드웨어 값 (프로세스의 문맥을 표시하기 위한 값들)
- program counter
- registers
- (3) 메모리 관련
- (4) 파일 관련
- open file descriptors
- 프로세스가 open하고 있는 file이 어떤 것인가
문맥 교환 (Context Switch)
프로세스를 스케줄링하기 위한 큐
큐의 종류
- Job queue
- 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready queue, Device queue가 모두 Job queue에 포함
- Ready queue
- 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device queues
- I/O device의 처리를 기다리는 프로세스의 집합
스케줄러 (Scheduler)
스케줄러의 종류
- Long-term scheduler(장기 스케줄러 or job scheduler)
- 프로세스에 메모리를 주는 문제
- degree of multiprogramming(메모리에 올라가 있는 프로세스의 수)을 제어
- 메모리에 너무 많은/적은 프로그램이 동시에 올라가면 컴퓨터 전체의 성능이 안좋아짐 (이전 강의 참고)
- time sharing system의 경우 보통 장기 스케줄러가 없음 (무조건 ready)
- 그러면 time sharing system은 degree of multiprogramming을 어떻게 제어하는가? : Medium-term scheduler
- Short-term scheduler(단기 스케줄러 or CPU scheduler)
- 프로세스에 CPU를 주는 문제 : 다음번에 어떤 프로세스에 CPU를 줄 것인가?
- Medium-term scheduler(중기 스케줄러 or Swapper)
- 장기스케줄러는 프로그램 시작 시 메모리를 줄지 말지 결정
- 중기 스케줄러는 프로그램 시작 시 무조건 메모리를 부여
- 메모리에 너무 많은 프로그램이 동시에 올라오는 문제
- 이를 조절하는 역할을 담당
- 일부 프로그램을 골라서 메모리에서 통째로 쫓아냄(디스크로 보냄)
- → degree of multiprogramming 제어
- 중기 스케줄러로 인해 process state가 하나 추가됨: suspended 상태
참고 링크
KOCW 운영체제 - 이화여대 반효경 교수 (2014-1) 5강