Program이 메모리에 올라갈 경우
동일한 Program을 여러 번 실행할 경우
- 1. a.c 파일
- 2. gcc -o a.out a.c로 a.out 실행 파일 생성 -> Program
- 3. a.out 실행 -> Memory에 load -> Process 생성
- 4. Memory에 load 되면 Process의 Memory Instance 생성 (m1라고 가정)
- 5. a.out을 또 실행(동일한 프로그램을 컴퓨터에서 다시 실행할 경우)
- 6. Memory에 또 load -> Process 생성 -> Memory Instance 생성 (m2라고 가정)
- 7. m1과 m2의 Data, Heap, Stack의 메모리 주소는 다르고, Instruction은 공유 (메모리 공간을 위해)
Core가 1개일 경우, Process가 100개라 하더라도, 실제 Process가 실행될 때는, 1개의 Process가 실행되고,
해당 Process의 Process Control Block(Linux: task-struct) 자료구조 값이 CPU의 Program Counter,
Register 등의 Hardware에 복사된다.
해당 Process의 실행이 종료되면, 다시 Process Control Block에 CPU의 값들이 복사된다.
Process의 PCB(Process Control Block)의 값을 CPU에 복사하거나, CPU의 값을 PCB에 전달해주는 것은
OS가 수행한다. 개개의 Process는 고유의 PC 값을 가지고 있어야, 각각 일관되게 Process가 실행될 수 있다.
Q . OS는 어떻게 수 많은 Process를 관리하지?
A . 각 Process의 정보들을 일일히 따라가는 것은 복잡하기에 Process의 정보들을 하나로 저장해두는 자료구조가 필요하다. 그래서 만들어진 것이 Process Control Block이다.
new: Process가 만들어지는 상태. new 상태는 아직 Program -> Process 과정이므로 Process는 아니다.
ready: running이 가능한 준비가 끝난 상태. cpu에 이동할 수 있는 상태이다.
running: Process가 CPU에서 실행되는 상태. core가 1개면 running 상태 1개. core가 100개면 running 상태 100개.
waiting: 이벤트, I/O 발생시 멈추는 상태. 이 상태에서 해당 작업을 대기한다. 해당 작업이 끝나 Interrupt가 발생하면 ready 상태로 이동한다.
terminated: 종료된 상태.
Linux의 Process State
- new는 없다.
- runnable: ready랑 동일한 상태.
- running: 위 running과 동일.
- stop: waiting이랑 동일한 상태.
- zombie: terminated랑 동일한 상태. 이 상태에서 부모 Process가 정리해줘야 한다. 이 상태를 벗어나지 못할 경우, zombie process가 된다. 왜냐하면, 자신 Process가 사용한 Resource는 반환해줘야 한다. zombie 상태에 머무르고 있다는 것은, 관리정보가 정리가 안된 종료 상태이다.
Linux Process 실행 예시
- Process가 fork() 호출시, 새 Process가 생성된다. (new)
- CPU에서 실행가능한 준비가 끝난다. (runnable)
- CPU를 점유하며 실행된다. (running)
- 실행이 끝나면 종료된다, (zombie)
new -> ready 상태로 이동하는 것은 admitted(허락된)라고 하며, long term scheduler가 관리한다.
ready -> running 상태로 이동하는 것은 scheduler dispatch라고 하며, short term scheduler가 관리한다.