[운영체제 기초 다지기] Process (1)
프로세스
프로세스의 개념
- 프로세스: 실행 중인 프로그램
- 프로세스의 문맥: 특정 시점에서 이 프로세스가 어디까지 실행했는가
- 프로세스의 현재 상태를 나타내기 위해 필요한 모든 것이 프로세스의 문맥을 구성함
- 프로그램 카운터가 코드 영역의 어디를 가리키고 있는가
- Program Counter(PC): 프로세스의 독자적인 주소 공간의 code부분을 가리키는 포인터
- 각종 레지스터에 현재 어떤 값을 저장하고 있는가
- 프로그램 카운터가 코드 영역의 어디를 가리키고 있는가
- 프로세스를 관리하는 역할인 운영체제가 해당 프로세스에 대해 어떤 값(PCB, 커널스택)을 갖고 있는지도 프로세스의 문맥에 해당함
- PCB: 프로세스는 생성될 때마다 커널 주소 공간 내 data 영역에 PCB라는 자료구조를 생성함
- 커널 스택: 시스템 콜이 발생하여 커널 내 code 영역의 함수가 실행될 때 그에 대한 정보가 들어있음
- 프로세스의 현재 상태를 나타내기 위해 필요한 모든 것이 프로세스의 문맥을 구성함
프로세스의 상태
- 프로세스는 상태가 변경되며 수행됨
- New: 프로세스가 생성 중인 상태
- Running: CPU 제어권을 갖고 instruction을 수행하고 있는 상태
- Ready: CPU가 디스크에는 접근 못하므로 당장 실행되어야 하는 instruction 부분들이 물리적인 영역(메모리)에 올라와있는 준비된 상태로 CPU 제어권을 할당받기까지 대기하는 상태
- Running 상태에서 타이머 인터럽트에 의해 수행이 정지되면 Ready 상태로 전환됨
- Blocked(wait, sleep): CPU 제어권을 할당받아도 당장 instruction을 수행할 수 없는 상태
- 프로세스 자신이 요청한 event(IO, 디스크에서 파일 읽어오기 등)이 즉시 만족되지 않아 이것을 기다리는 상태
- 자신이 요청한 event가 만족되면 Ready 상태가 됨
- Suspended(stopped): CPU 뿐만 아니라 외부적인 이유로 프로세스의 수행이 정지된 상태이며 프로세스는 통째로 디스크로 swap out됨
- 외부에서 다시 프로세스 수행을 재개해줘야 CPU 제어권을 점거할 수 있음
- ex. 사용자가 프로그램을 일시 정지시킨 경우, 메모리에 너무 많은 프로세스가 올라와 있는 등의 이유로 프로세스를 잠시 중단시킨 경우 → 중기 스케줄러 내용 참조
- Terminated: 프로세스의 수행이 끝난 상태
- 프로세스가 시스템 콜을 해서 운영체제가 CPU 제어권을 얻어도 ‘운영체제가 Running 중인 상태’라고 표현하지 않음 → ‘해당 프로세스가 모니터 모드(커널 모드)로 Running 중인 상태’라고 표현함
- Suspended 상태여도 IO 작업 가능: IO가 완료되면 Suspended Blocked에서 Suspended Ready 상태로 변화
- Suspended는 메모리에서 Swap out 당하는 것이므로 CPU의 관점에서는 아무 작업도 할 수 없는 것일 뿐, IO는 가능함
Process Control Block
- PCB: 운영체제가 각 프로세스를 관리하기 위해 프로세스당 하나씩 생성하여 유지하는 정보
- 다음의 구성 요소를 구조체로 유지
- OS가 관리상 사용하는 정보
- Process state: Ready, Running…etc.
- Process ID
- scheduling information, priority
- 프로세스에게 CPU 제어권을 할당하기 위해서는 우선순위가 필요하며 이런 우선순위에 대한 값도 PCB에 저장됨
- 먼저 대기 중인 프로세스에게 먼저 할당하지는 않음
- CPU 수행 관련 하드웨어 값
- Program counter, registers
- 메모리 관련
- Code, Data, Stack의 위치 정보
- 파일 관련
- OS가 관리상 사용하는 정보
- 다음의 구성 요소를 구조체로 유지
문맥 교환 (Context Switch)
- 문맥 교환: CPU 제어권을 한 프로세스에서 다른 프로세스로 넘겨주는 과정
- CPU가 다른 프로세스에게 넘어갈 때의 운영체제가 수행하는 작업
- CPU 제어권을 내어주는 프로세스의 상태를 해당 프로세스의 PCB에 저장 → CPU 제어권을 넘겨받는 프로세스의 상태를 PCB에서 읽어옴
- 시스템 콜이나 인터럽트 발생 시 반드시 문맥 교환이 일어나지는 않음
- 이후 운영체제가 CPU 제어권을 다른 프로세스에게 넘기면 문맥 교환이 일어남
- (1)의 경우: 인터럽트가 들어오거나 사용자 프로세스 A가 시스템 콜 할 때 커널 모드로 바뀌었다가 다시 유저 모드로 문맥 교환 없이 복귀하는 것
- (2)의 경우: 타이머 인터럽트 또는 IO 요청 시스템 콜의 경우 다른 사용자 프로세스에게 CPU 제어권을 넘김 → 커널 모드로 IO 요청 후, 다른 프로세스에게 CPU 제어권 넘기며 문맥 교환 발생
스케줄러
- 스케줄링: 각각의 자원 별로 어떤 작업을 수행할지, 얼마만큼의 시간을 소모할지 결정하는 것
- 장기 스케줄러: 메모리를 어떤 프로세스에게 줄지 결정
- 시작된 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
- 프로세스가 메모리에 적재되는 것이 허락되면 CPU 제어권을 얻을 수 있게 됨(New → Ready)
- degree of Multiprogramming을 제어
- Multiprogramming: 메모리에 여러 프로그램이 동시에 올라가 있는가
- 즉, 장기 스케줄러가 메모리에 올라가 있는 프로세스의 수를 결정함
- 메모리에 너무 많은/적은 프로그램이 올라가 있으면 성능이 저하/낭비됨
- 보통 현재 통용되는 시스템에서는 장기 스케줄러가 필요하지 않음 → 중기 스케줄러가 유사한 역할을 대리
- 만약 프로그램 100개를 실행시키면 일단 100개의 프로세스가 다 Ready 상태가 됨
- 단기 스케줄러(CPU 스케줄러)
- 어떤 프로세스를 다음 범에 Running 시킬지 결정
- 프로세스에 CPU 제어권을 주는 문제
- 짧은 시간 단위로 스케줄링이 일어남
- 중기 스케줄러: 어떤 프로세스를 메모리에서 쫓아낼지
- 메모리에 너무 많은 프로그램이 동시에 적재되어 있으면 여유 공간을 확보하기 위해 일부 프로그램을 골라 메모리에서 쫓아냄(Swap out)
- 즉, Running 프로세스를 Suspended 상태로 변경함
- degree of Multiprogramming을 제어
- 현 시스템에서 장기 스케줄러가 하던 역할을 대리하는 것과 같음