프로세스, Process
프로세스의 개념
•
문맥
◦
프로그램이 특정 시점을 봤을 때, 어디까지 실행을 했는지
◦
CPU 수행상태를 나타내는 하드웨어 문맥
▪
Program Counter 가 어디있는가
▪
각종 register 가 현재 어떤 값을 가지고 있는가
◦
프로세스의 주소공간
▪
code data, stack에 어떤 내용이 들어있는가
◦
프로세스 관련 커널 자료구조
▪
PCB(Process Control Block)
▪
Kernel stack
•
여러 프로세스들이 공유하는 공간이기에 프로세스별로 별도로 관리된다.
프로세스의 상태
•
프로세스는 상태가 변경되며 수행된다.
•
Running : 현재 CPU를 잡고 instruction 을 수행중인 상태
•
Ready : 메모리 등 다른 모든 조건을 만족하고 CPU를 기다리는 상태 (CPU가 오기만 하면 되는 상태)
•
Blocked (wait, sleep)
◦
CPU를 주어도 당장 instruction 을 수행할 수 없는 상태
◦
Process 자신이 요청한 event (I/O) 가 즉시 만족되지 않아 이를 기다리는 상태
▪
예를 들면, 디스크에서 file 을 읽어와야 하는 경우
•
New : 프로세스가 생성 중인 상태
•
Terminated : 수행이 끝난 상태
한 장으로 보는 프로세스의 문맥 변경 과정
Process Control Block, PCB
•
운영체제가 각 프로세스를 관리하기 위해 프로세스 당 유지하는 정보
•
다음과 같이 구성되어있다.
◦
OS 가 관리상 사용하는 정보
▪
process state, process id, scheduling information, priority
◦
CPU 수행 관련 하드웨어 값
▪
program counter, registers
◦
메모리 관련
▪
code, data, stack 의 위치정보
◦
파일 관련
▪
open file descriptors
문맥교환, context switch
•
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
•
다른 프로세스로 넘어갈 때, 운영체제는 다음의 과정을 수행한다.
◦
현재 실행중인 프로세스의 상태를 그 프로세스의 PCB에 저장한다. (다시 돌아왔을 때 어디서부터 시작해야하는지 기억하기 위해서)
◦
새롭게 실행이 될 프로세스의 상태를 PCB 에서 읽어온다. (전에 어디까지 했는기 기억하여 거기서부터 시작하기 위해서)
•
system call 이나 interrupt 발생할 때, 반드시 context switch 가 일어나는 것은 아니다.
◦
보통은 system call 이나 interrupt 발생 이후에 원래의 프로세스로 CPU가 돌아간다.
◦
하지만 CPU를 공정하게 분배하려는 timer interrupt 가 발생하거나, 시간이 오래걸리는 I/O 요청이 system call 로 온 경우에는 운영체제가 다시 프로세스에게 문맥을 넘겨줄때, 다른 프로세스에게 주게 된다. 이때 발생하는 것이 바로 문맥교환 context switch 이다.
•
비록, (1)의 경우에 문맥교환이 발생하지 않더라도 CPU 수행 정보 등 context 의 일부를 PCB에 저장해야하지만,
•
문맥 교환을 해야하는 (2)의 경우에는 훨씬 더 많은 context 정보를 저장해야하는 부담이 생긴다. (cache memory flush)
프로세스를 스케줄링 하기 위한 큐
•
job queue : 현재 시스템 내에 있는 모든 프로세스의 집합
•
ready queue : 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
•
device queue : I/O device의 처리를 기다리는 프로세스의 집합
•
프로세스들은 각 큐들을 오가며 수행된다.
스케줄러, scheduler
•
long-term scheduler : 장기 스케줄러 혹은 job scheduler
◦
시작 프로세스 중 어떤 것들을 ready queue 로 보낼지 결정한다.
◦
프로세스에 memory 및 각종 자원을 주는 문제
◦
degree of multiprogramming 을 제어한다. 즉, 메모리에 올라가는 프로그램의 수를 제한한다.
◦
실제로 대부분의 컴퓨터가 사용하는 time sharing system에는 보통 장기 스케줄러가 없고 무조건 ready 하게 된다.
•
short-term scheduler : 단기 스케줄러 혹은 CPU scheduler
◦
어떤 프로세스를 다음 번에 running 시킬지 결정한다.
◦
프로세스에 CPU를 주는 문제를 계획한다.
◦
millisecond 단위로 충분히 빨라야한다.
•
medium-term scheduler : 중기 스케줄러 혹은 swapper
◦
대부분의 컴퓨터에서 사용하는 스케줄러
◦
시작하면서 메모리에 올라갈 프로세스를 결정하는 장기 스케줄러와 달리, 중기 스케줄러는 일단 프로그램이 실행되면 메모리를 무조건 할당한다.
◦
이렇게 실행할 경우, 메모리는 빠르게 여유공간이 없어지는데, 공간 마련을 위해서 프로세스를 통째로 메모리에서 디스크로 쫓아낸다.
◦
이런 방식으로 degree of multiprogramming 을 제어하며 프로세스에게서 memory를 뺏는 문제를 다룬다.
중기 스케줄러의 존재로 인해 추가된 프로세스의 상태
•
기존에 존재하던 기본적인 상태 : Running, Ready, Blocked(wait, sleep)
•
새롭게 추가된 상태 : Suspended(stopped)
◦
외부적인 이유(사용자가 프로그램을 일시정지하는 등)로 프로세스의 수행이 정지된 상태
◦
프로세스는 통째로 디스크 swap out 된다.
◦
예를들어 사용자가 프로그램을 일시 정지 시킨 경우, (메모리에 너무 많은 프로세스가 올라와있다면) 시스템이 이 중단되어 사용하지 않는 상태의 프로세스를 잠시 중단시킨다.
•
Blocked : 자신이 요청한 이벤트가 만족되면 ready 상태로 변한다.
•
Suspended : 외부에서 resume 해주어야 active 된다.