목차
- 프로세스의 개념
- 프로세스의 상태(Process State)
- 프로세스의 개념
- 프로세스 상태도
- Process Control Block(PCB)
- 문맥교환(Context Switch)
- 프로세스를 스케줄링하기 위한 큐
- Ready Queue와 다양한 Device Queue
- 스케줄러(Scheduler)
프로세스의 개념
- 프로세스: 실행중인 프로그램
- 프로세스의 문맥이라는 것은 특정 시점을 봤을 때 이 프로세스가 어디까지 수행을 했고, process라는 것은 실행이 시작되면 process 만의 독자적인 주소 공간(code, data, stack으로 구성)을 형성한다. process가 cpu를 잡게되면 PC(program counter)라는 레지스터가 process code 어느 부분을 가리키고 있고, 그러면 cpu가 code의 instruction을 읽어서 cpu안으로 불러들인다. 레지스터 (R1, R2, ...Rn)에 어떤 값을 넣고, 산술논리연산(ALU) 장치에서 무언가 연산을 하고, 그래서 그 결과를 레지스터에 저장을 하거나 또는 다시 바깥의 메모리에다가 (교수님이 code랑 data를 가리키심) 저장을 한다. 이런식으로 process를 계속 진행하다가 어느 시점에 '과연 이 process는 어디까지 와있는가' 를 규명하는 것이 '프로세스의 문맥'이다. 그래서 현재 시점에 PC가 어딜 가리키고 있는가 ! 즉, code의 어느부분까지 실행을 했는가 도 알아야 하고, 프로세스 메모리에 어떤 내용을 담고 있는가 (만약에 코드가 실행되면서 함수를 호출했으면 stack에 쌓여있겠죠/ data의 변수의 값도 프로그램이 실행되면서 바뀌고 그랬겠지 / 레지스터에 어떤 값이 들어가있고, 어떤 함수까지 실행을 했는가)
- 운영체제 역할 중 하나가 프로세스들을 관리하는 역할을 한다. process가 하나 생길 때마다 운영체제는 그 process를 관리하기 위해서 자신의 data 영역에 자료구조인 PCB를 두고 있다. (이 프로세스한테 cpu를 얼마나 줘야할지, 메모리를 얼마나 줘야할지, 나쁜짓을 하고 있지는 않은지 관리!)
- 프로세스가 본인이 할 수 없는 일을 운영체제한테 요청할 때가 있다. (시스템콜) 시스템 콜을 하게되면 PC가 운영체제의 code를 가리키면서 커널 코드를 실행한다. 커널이 함수 호출 하면 stack에 쌓아둔다. 그런데 커널의 code는 여러 process들이 공유하는 코드다. 그래서 프로세스마다 커널 스택을 별도 두고 있음(어떤 프로세스의 code인지 알기위함)
- 프로세스 문맥이 왜 필요한가? cpu를 여러 프로세스가 돌아가면서 쓰기 때문에 (멀티 태스킹) 프로세스 문맥을 알아서 어디까지 실행했다고 저장을 하기 위해서다! (그게 아니라면 처음부터 계속 실행해야함)
프로세스의 상태 (Process State)
- 공유데이터: 자원 중, 소프트웨어 자원 / 여러 프로세스가 동시에 접근하면 일관성이 깨져셔, 그에 따른 queue가 있다.
- 하드웨어 쪽에 queue에 줄 서는 것을 같이 그려넣었는데, 사실, queue라는건 운영체제 커널이 본인의 data 영역에 자료구조로 queue를 만들어놓고 process의 상태를 바꿔가면서 ready 상태인 애들한테는 cpu를 주고, blocked 상태이면 cpu를 안주고 와 같은 관리를 한다.
프로세스 상태도
- ready: 최소한의 메모리를 가지고 있어야 한다. 당장 cpu에서 instruction을 실행하는데 필요한 부분이 memory에 올라와 있어야 하기 때문.
PCB
문맥교환(Context Switch)
다음 CPU를 얻었을 때, 정확하게 요~시점부터 실행을 재개하기 위해서 레지스터에 저장되어 있는 값, pc 값, memory map을 그 process의 pcb에다가 save를 한다.
시스템콜: process가 자기가 필요에 의해서 운영체제한테 요청할 때 하는 것.
인터럽트: 컨트롤러 같은 장치가 cpu한테 정보를 전달할 목적.
(cpu가 a사용자 프로세스에서 b 사용자 프로세스한테 넘어가는 것을 context switch라 한다. cpu가 하나의 프로세스에서 운영체제한테 넘어가는 것은 context switch가 아님 ! )
프로세스를 스케줄링하기 위한 큐
Ready Queue와 다양한 Device Queue
- queue에 줄세우는 것들은 process라고 했는데, 정확하게는 운영체제가 프로세스를 관리하는 자료구조, 즉, PCB를 관리하는 것 !
- PCB에는 pcb를 줄줄이 연결하는 pointer들이 있다.
magnetic tape 서비스를 기다리는 process는 없는 모습 !
하드디스크의 서비스를 기다리는 process들은 이렇게 줄줄이 있음 !
스케줄러
- cpu 스케줄러
- disk 스케줄러
- 장기 스케쥴러는 프로그램이 시작될 때 메모리를 줄지 말지 결정
- 지금의 시스템들은 시작되면 무조건 메모리 주긴 함 (장기 스케줄러가 없는것임)
=> 메모리에 너무 많은 프로그램이 올라가 있으면 문제가 시작 !
=> swapper가 필요
- swapper: 메모리에서 프로세스를 디스크로 쫓아냄
- degree of multiprogramming : memory에 올라가있는 프로그램 수를 제어
=> 메모리에 너무 많은 프로그램이 올라가면 성능이 안좋아지고, 메모리에 너무 적은 프로그램이 올라가도 성능이 안좋아짐.(메모리가 있어야 cpu를 사용할 수 있는데, 메모리를 갖는 어떤 프로그램도 없으면 cpu가 놀기 때문임)
프로세스의 상태
중기 스케줄러. 즉, swapper 때문에 기존 프로세스 상태에서 하나가 더 추가됨 ! suspended
- 외부적인 이유: 중기 스케쥴러 , 사용자의 멈춤
- suspended blocked => suspended ready 로 넘어갈 수 있다 !
(진행하던 i/o를 마무리 함에 따라)