1. Process Concept
Process란 무엇인지, 어떤 상태를 갖는지, 관리가 어떻게 이루어지는 지 살펴보자.
Process concept
먼저 Job과 Process를 구분할 줄 알아야한다.
- Job (App, Execution/Image file) -> 아직 실행되지 않음
- Process -> 실제로 실행돼 Kernel에 등록돼있는 상태
- kernel이 전체적인 system performance를 관리하기 시작함.
- Process는 아래 다섯가지 Context를 갖는다.
- Program code -> text
- Global data (글로벌 변수) -> data
- Temporary data (로컬 변수, 함수인자, return address) -> stack
- Heap -> 동적 할당 받는 memory area
- process registers (cpu 레지스터)
정적인 상태인 Job이 실행된 후 노란색 영역인 System 안으로 들어가, Process가 된 후에 자원을 사용한다.
그럼 Process에 대해 제대로 정의해보자.
- execution 상태에 있는 program (running과 구분. execution은 꼭 cpu를 사용하지 않고 있는 상태, running은 cpu를 사용하면서 run하고 있는 상태)
- kernel에 등록된 entity, kernel에 의해 관리받고 있는 entity.
- System 자원을 요청하고 사용할 수 있는 entity.(App의 상태에선 사용할 수 없음)
- PCB를 할당받은 entity.
- Active entity : request/allocate/release하는 능동적인 entity.
Resource concept
능동적인 process와 달리, resource는 수동적이다.
kernel의 통제 아래 프로세스가 하라는대로 allocated/released 된다.
System States
컴퓨터 시스템은 크게 Process,Resource,Kernel 세가지로 구성되어있다.
Active한 Process와 Passive한 Resource와 둘 사이의 요청/할당/반납 과정을 중재하는 Kernel 이렇게 3종류의 entity들이 존재한다.
PCB
일종의 Data structure로 프로세스가 생성될 때 kernel안에 각자의 PCB도 생성된다.
kernel이 프로세스를 관리하는 수단인 것이다.
- Information in PCB
- PID
- Process state
- Scheduling information : 프로세스 우선순위 등
- Memory management information : 어떤 memory에 저장되어 있는지?
- I/O status information : 현재 I/O중이면 어떤 resource를 사용중인지?
- Accounting information
- Context save area : CPU 레지스터에 있는 값들을 임시로 저장. -> (3. Interrupt에서 다시 나온다)
- OS마다 다른 PCB
- Unix : Process table slot , U-area로 부르고 정보를 나눠서 저장.
- Linux : Process descriptor라고 부르고 task_struct 구조체에 PCB정보를 저장.
- PCB information은 OS마다 다르다
- PCB에 접근하는 경우가 많기 때문에 속도가 빨라야 한다.
2. Process States
프로세스가 생성돼서 종료하기까지 어떤 상태를 거치는지 살펴보자.
Process states
현재 어떤 리소스를 request/allocate/release 하고 있는 지에 따라 달라짐.
프로세스는 아래 5가지 상태를 가질 수 있다. 다른 용어들은 모두 직관적으로 와닿지만 suspend를 중지라고 해석하면서 보면 한층 이해가 수월하다.
Memory 관점
프로세스가 생성되고 나면, 제일 먼저 memory를 요청한다. Kernel은 memory에 가서 여유 공간이 있으면 memory를 할당해주고 ready 상태가 된다. memory 할당을 받지 못했다면, suspended ready 상태가 된다. ready 상태에 있는 프로세스가 memory를 뺏길 수도 있는데 이를 swap-out(suspend) 라고 하고 suspended ready상태가 된다. 반대로 memory를 할당 받는 걸 swap-in(resume) 이라고 하고 ready상태가 된다.
CPU 관점
Memory를 할당받은 프로세스가 CPU까지 할당 받는 것을 dispatch(schedule) 이라 하고, running 상태가 된다. 하지만 한 프로세스가 CPU를 너무 오래 사용하면 안되기 때문에 CPU 사용시간을 제한해두는데, timeslice(time quantum)이라고 한다. time quantum이 지나 CPU를 반납하는 과정을 timerunout(preemption) 이라고 하고 ready상태로 돌아가 다시 CPU 할당을 기다리고 있는다.
running 상태에 있는 프로세스가 I/O device를 사용해야 할 경우, 자발적으로 CPU를 반납하는 것을 sleep(block) 이라고 하고 running에서 asleep 상태가 된다. I/O가 끝나면, CPU로 interrupt를 건다. kernel은 interrupt handling하는 과정에서 asleep에 있는 프로세스를 ready상태로 보낸다 (wakeup). 어떤 형태로든 CPU를 뺏긴 프로세스는 다시 ready 상태에 가서 스케줄링을 기다리는 것이다. kernel이 메모리 공간 확보를 위해 asleep 상태의 프로세스 memory를 swap-out 하면 suspended blocked 상태가 된다.
terminated 되면 PCB에 일부 정보를 남기고 종료된다.
복잡하니 각각의 상태를 다시 정리해보자.
- Created state
- 사용자의 job / command 요청이 kernel에 등록됨.
- PCB 하나가 할당되고 새로운 프로세스가 만들어짐.
- 잠깐 지나가는 state ( transient state ).
- Kernel은 메모리공간을 확인하고, ready or suspended ready로 보내게 된다.
- ++Unix system에서는 fork()로 프로세스가 생성된다.
- fork라는 system call로 parent process -> child process가 생성되기 때문에 tree 형태의 hierarchy를 갖는다.(Unix , Linux)
- Ready State : CPU를 제외한 모든 자원을 다 가지고 있는 상태
- CPU 자원을 할당받기 위해 기다리고 있는 상태로 CPU 할당받으면 즉시 실행할 수 있는 상태
- Dispatch(schedule) : ready -> running state
- Running State : CPU 마저도 할당받고 있는 상태 -> CPU에서 해당 프로세스가 실행중이다.
- Preemtion : 강제로 running -> ready state (time quantum, 우선순위가 높은 프로세스가 ready상태에 있다면 발생)
- Block/sleep : 스스로 running -> alseep state (입출력 자원 할당을 위해서)
- Blocked/asleep state : CPU/MEM 이 아닌 다른 자원을 요청하고 다 끝나기를 기다리는 상태
- system call을 통해 resource request를 한다.
- Wakeup : blocked/asleep -> ready state (Interrupt signal에 의해서)
- 왜 running으로 바로 돌려보내지 않고 ready state로 보낼까? 스케줄링 일관성을 위해서, 4장에서 공부함.
- Suspended state : memory 자원이 swap-out 된 상태
- suspended ready state : ready state에서 swap-out
- suspended asleep state : asleep state에서 swap-out
- swap-out 되면 swap device로 간다. swap device는 file system으로, memory image를 임시로 저장해두고 swap-in 되면 memory로 다시 올려준다.
- Terminated/zombie state : 프로세스가 다 끝난 상태
- kernel은 자원 모두 반납
- PCB에 일부 정보를 남김 (나중에 parent가 정리를 마쳐주면 다 사라짐)
- Unix : exit() system call에 의해 전환되는 state.
Process States in Unix
transition에 약간의 차이가 있다. running을 user mode, kernel mode로 구분한다.
Process States in Linux
Ready queue
ready state에 있는 프로세스들을 담는 큐다.
- Priority queue이기 때문에 fifo가 아닌, 중간에 더 높은 우선순위를 가진 프로세스가 있으면 먼저 스케줄링한다.
I/O queue (Block list)
asleep state에 있는 프로세스를 담는 큐로, asleep이 되는 여러가지 이유에 따라서 queue를 별도로 둔다.
Schedulers
- Long-term scheduler : App 중에 누굴 먼저 프로세스로 생성할지 스케줄링
- Medium-term scheduler : Suspended 상태에 있는 프로세스 중 누구에게 memory를 줘서 active 상태로 바꿀것인지 스케줄링
- Short-term scheduler : ready state 프로세스 중 누구에게 CPU를 할당할지 스케줄링
3. Interrupts
Interrupt
Unexpected (external) event로, CPU 외부로부터 들어오는 event이다.
Kinds of interrupts
- I/O interrupt : ex) '달라고 한 하드디스크에 원하는 block을 읽어서 memory에 가져다놨다'라고 CPU에 interrupt를 줌
- Clock interrupt : ex) time quantum이 끝났음을 CPU에 알려줌
- Console interrupt
- Machine check interrupt
- Inter-process communication interrupt
Interrupt handling process
Interrupt가 온다면 CPU는 현재 실행중인 프로세스를 중지시키고 Interrupt handling 단계로 들어간다. 제일 먼저 interrupt가 어디서 (timer / 키보드 등) 왔는지 확인하고, interrupt가 온 이유 (요청한 블럭의 I/O가 끝났는지 / time quantum이 끝났는지) 를 확인한다.
Interrupt와 현재 실행중인 프로세스 중 Interrupt가 더 중요하다고 판단하면 interrupt service에 들어간다 -> ISR (Interrupt Service Routine) 를 불러온다.
이 과정을 더 자세히 보자.
- Interrupt가 들어오고 CPU는 Pi를 중지한다.
- Pi가 가지고 있던 CPU register 값들을 PCB의 Context save area에 저장한다.
- CPU에 Interrupt handler 함수가 들어와서 interrupt가 어디서, 왜 왔는지 검사한다.
- interrupt 받아야겠다고 결정되면, ISR이 들어 와서 해당 interrupt에 대한 service가 실행된다.
- CPU에서 실행해야할 프로세스가 바뀔수도 있기 때문에 스케줄링을 다시한다.
- 실행할 프로세스의 CPU register 값들을 PCB로부터 다시 가져온다. Pi -> Pj로 바뀐 것을 Context Switching 이라고 한다.
Context switching
4. IPC (Inter-Process Communication)
Process 간의 정보를 전달하고 싶을 때, 어떤 과정을 거쳐 이루어질까?
간단하게 알아보자.
IPC가 필요한 이유
- Information sharing
- Computation speedup
- Modularity
- Convenience
기법
- Message passing
- send (P, message), receive (Q, message) 로 소통한다.
- Direct/indirect communication
- send하고 ack를 기다리는 blocking, send하고 ack를 기다리지 않는(waiting이 없음) non-blocking 매커니즘이 있다.
- Buffering mechanism 필요함
- Shared memory
- read (buf, message), write (message,buf)
- Indirect communication