1. 프로세스
실행 중인 프로그램
1.1 프로세스의 상태
멀티 프로그래밍 시스템 기준
new:
프로그램이 메인 메모리에 할당된 상태
ready:
할당된 프로그램이 초기화와 같은 작업을 통해 실행되기 위한 모든 준비를 마친 상태
running:
CPU가 실제로 프로세스를 실행한 상태
watiting:
- 프로세스가 끝나지 않은 시점에서, I/O로 인해 CPU를 사용하지 않고 다른 작업을 실행한 상태.
- CPU는 그 동안 다른 ready 상태인 프로세스를 실행한다(해당 프로세스는 running 상태).
- I/O 작업이 끝나면 다시 CPU 서비스를 받기 위해 ready 상태가 된다.
terminated:
프로세스가 완전히 종료된 상태
타임 쉐어링 시스템 기준
- 멀티프로그래밍 시스템 기준 경로가 1개 추가
- running 상태에서 waiting을 거치지 않고, 바로 ready 상태가 될 수 있다.
- 일정 시간이 지나면 강제로 swithing하기 때문에 이 같은 상태변화를 time expired(running->ready)라 한다.
1.2. PCB(process control block)
프로세스 제어 블록, 프로세스의 모든 정보가 들어 있다. 프로세스의 상태, 프로세스 번호(PID), 해당 프로세스의 program counter(pc), register값, MMU정보, CPU점유 시간 등이 포함되어 있다.
참고! process, task, job은 다 같은 의미로 생각하자
PCB는 운영체제 내부의 프로세스를 관리하는 코드 부분에 저장되어 있다.
CPU는 한 프로세스가 종료될 때까지 수행하는 것이 아니라 여러 프로세스를 중간 중간에 바꿔가면서 수행한다. 그러므로 CPU는 수행중인 프로세스를 나갈 때, 이 프로세스의 정보를 어딘가에 저장하고 있어야 다음에 이 프로세스를 수행할 때 이전에 수행한 그 다음부터 이어서 작업할 수 있다. 이러한 정보를 저장하는 곳이 PCB이다.
1.3. 프로세스 큐(Queue)
- Job Queue
하드디스크에 있는 프로그램이 실행되기 위해 메인 메모리의 할당 순서를 기다리는 큐이다.
- Ready Queue
CPU 점유 순서를 기다리는 큐이다.
- Device Queue
I/O를 하기 위한 여러 장치가 있는데, 각 장치를 기다리는 큐가 각각 존재한다.
1.3.1. Scheduling
큐의 순서를 정해주는 알고리즘
- Job Queue - Job Scheduler(Long-term scheduler)
메모리가 프로그램을 올릴 수 없다. 프로그램을 메모리에 올리는 결정은 메모리가 여유있을 때 결정한다.
따라서, 스케줄링은 자주 일어나지 않는다(Long-term scheduler). - Ready Queue - CPU Scheduler(Short-term scheduler)
I/O 작업 또는 time expired되면, 다음 CPU 서비스를 받을 프로세스를 결정해야 한다. CPU 작업은 놀면 안되기 때문에 switching이 빨라야 한다(Short term). 1초에 수십, 수백번 switching이 일어날 수 있다. 여러 프로세스가 동시에 실행되는 것처럼 보이는 건 이 때문이다. - Device Queue - Device Scheduler
2. 멀티프로그래밍(Multiprogramming)
멀티프로그래밍은 단일 프로세서(CPU) 환경에서 여러 개의 프로세스가 동시에 실행되는 것을 말한다. (실제로 동시에 실행되지는 않음) 여러 프로세스가 실행되려면 이 프로세스들은 모두 메인 메모리에 존재하고 있어야 한다.
2.1. Degree of multiprogramming
현재 메모리에 할당되어 있는 프로세스의 개수, Degree=수준, 점도
2.2. I/O bound process VS CPU bound process
프로세스는 I/O bound process 와 CPU bound process 로 나뉜다.
I/O bound process: 프로세스가 하는 일이 주로 I/O 작업인 프로세스
CPU bound process: 프로세스가 하는 일이 주로 CPU 작업인 프로세스
운영체제, 정확히 말하면 job scheduler 는 I/O bound process와 CPU bound process를 적절히 분배해서 메모리에 할당해주어야 한다.
2.3. Medium-term scheduler
- Backing store에 있는 프로세스들 중 어떤 프로세스를 올릴 것인지 결정
- short-term보다는 덜 발생하지만, long-term보다는 자주 발생하는 scheduler
- Time sharing system, Interactive system(= Window)에서 주로 사용
예를 들어, 서버 컴퓨터에 여러명의 사용자가 사용하고 있다. 그 중 B가 작업을 하다가 멈추고 5분 동안 자리를 비웠다고 가정해보자. B 프로세스은 메모리 위에 있지만 CPU 작업을 하고 있지 않다. 메모리에 있는 B 프로세스 전체를 5분 동안 쫓아낸 후, 비어있는 메모리를 활용하면 성능을 높일 수 있다. 다른 프로세스를 올리거나 다른 프로세스에 메모리를 나눠 줄 수 있다.
swap out: 기존 메모리에 있는 프로세스를 H/D에 쫓아내는 행위(swap= 빗자루로 쓸다)
swap out로 H/D로 쫒겨난 프로세스들은 Swap device(Backing store, 일반적으로 하드디스크는 File system + Backing store 로 구성)에 저장된다.
swap in: Swap device에 있던 프로세스를 다시 메인 메모리에 할당해주는 행위
ex) 5분 뒤 B가 오면, Swap device로 쫒아낸 B를 다시 메모리에 올려야겠지?
프로세스 이미지 전체가 Swap device로 쫓겨나고, 필요할 때 다시 메모리에 올리는 일련의 행위를 통칭해서
swapping이라고 한다.
참고!
swap out을 통해 메인 메모리의 공간이 생기므로 이를 더욱 효율적으로 사용할 수 있다. 만약 swap out된 프로세스가 다시 swap in으로 메인 메모리에 할당하려고 할 때 이전의 공간으로 할당되는 것을 보장하지는 않는다. 왜냐하면 위에 말했듯이 swap out으로 생긴 메모리 공간은 다른 프로세스가 사용할 수 있기 때문이다.
2.4. Context switching(문맥 전환)
CPU가 한 프로세스에서 다른 프로세스로 옮겨가는 것을 말한다. 즉, 한 프로세스가 실행중인 것을 멈추고 다른 프로세스가 실행되는 것이다.
Dispatcher
실제로 스케줄러(CPU scheduler가 선택한 프로세스를 실행하도록 여러가지 상태나 레지스터 값을 바꿔주는 행위
프로세스 p1에서 p2로 switching 되는 것을 예로 들어보자
1. 기존 p1의 상태, 레지스터 보관
(1) p1의 현재 상태를 PCB에 저장한다.
(2) MMU의 base/limit register의 현재 정보를 PCB에 저장한다.
2. p2을 실행하기 위해 p2의 상태, 레지스터로 전환
(1) CPU의 pc, sp를 p2의 PCB에 저장된 값을 저장
(2) 마찬가지로, MMU에 p2의 PCB에 저장된 값을 저장
Context switching이 발생할 때마다, dispatcher에서 수행하는 작업을 매번 수행해야하며 이 모든 것은 overhead이다. 그리고 문맥 전환은 매우 자주 발생하는 작업이므로 overhead를 줄이기 위해서는 dispatcher를 구현하는 코드에 대한 효율을 최대한 높여주어야한다.