•
참고 강의
contents
프로세스(Process)
: 실행중인 프로그램(a program in execution)
•
프로세스의 문맥(context)
프로그램이 실행되는 중간 어느 시점을 봤을 때 도대체 이 프로그램이 무엇을 어떻게 실행했는지, 현재 시점이 어떤 상태에 있는지를 정확하게 나타내기 위해서 사용되는 개념
특정 시점을 놓고 봤을 때, 도대체 이 프로세스가 어디까지 수행을 했고 어디까지 와있는가를 규명하기 위해서 필요한 요소가 프로세스의 문맥
CPU 수행 상태를 나타내는 하드웨어 문맥
프로세스의 주소 공간
프로세스 관련 커널 자료 구조
현대의 컴퓨터 시스템에서는 Time-Sharing, Multi-tasking 등을 통해서 프로세스들이 번갈아 가면서 실행이 되기 때문에 현재 프로세스가 진행되는 걸 백업해놓지 않으면(= 문맥을 알아놓지 않으면) 다음번 CPU를 잡았을 때 앞 부분부터 다시 실행하는 문제가 생긴다. 문맥을 알아야 그 다음 시점부터 다시 실행이 가능해진다.
프로세스의 상태(Process State)
: 프로세스는 상태를 바꾸면서 실행을 한다.
가정 : CPU가 하나밖에 없기 때문에 CPU를 잡고 있는 프로세스는 매 순간 하나이다.
•
Running : CPU를 잡고 Instruction를 수행중인 상태
•
Ready : CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)
◦
물리적 메모리에 올라가 있어서 CPU만 얻게 되면 당장 프로세스를 실행할 수 있는 상태
◦
Ready상태에 있는 프로세스들이 CPU를 번갈아 얻게 되면서 Time-sharing를 구현하고 있다.
•
Blocked(wait, sleep) : CPU를 주어도 당장 Instruction을 수행할 수 없는 상태
◦
I/O 작업을 하는 상태 → 디스크에서 파일을 읽어와서야 Instruction를 실행할 수 있는 상태
◦
실행해야하는 코드가 메모리에 올라와있지 않고 디스크에 내려가 있으면 당장 실행할 수 없는 상태
◦
자신이 요청한 이벤트가 즉시 만족되지 않아서 이를 기다리는 상태
•
New : 프로세스가 생성중인 상태
•
Terminated : 수행이 끝난 상태 → 정리하는 작업을 실행중인 상태
Running → Waiting(Blocked) : I/O같은 오래걸리는 작업을 실행해야해서 CPU를 가지고 있어도 Instruction 실행이 불가능하다고 생각해서 CPU를 내려놓는 상태
Running → Ready : CPU를 계속 사용하고 싶은데 해당 프로세스에게 할당된 시간이 끝나서 CPU를 뺏긴 경우, 다시 Ready 상태로 돌아가서 자신의 차례가 오길 기다리는 상태
(하드웨어 자원) Ready queue → 실행할 순서가 되어서 CPU에서 Running → 중간에 I/O를 실행하게 되면 Blocked상태로 변경 Disk I/O queue에 줄을 선다 → 해당 프로세스가 원하는 I/O 작업이 끝나면 I/O Controller에서 CPU에 Interrupt를 건다 → CPU는 실행중인 프로세스를 멈추고 CPU 제어권이 운영체제 커널로 넘어간다 → 운영체제는 프로세스 메모리 영역에 해당하는 데이터를 넘겨주거나 프로세스 상태를 Ready로 변경해주는 일을 진행한다
(소프트웨어 자원) 공유 데이터를 여러 프로세스에서 동시에 접근하면 접근을 하나씩 할 수 있도록 막아주는 작업이 필요하다. 프로세스는 Blocked상태로 변경되고 Resource queue에서 자신의 차례를 기다리게 된다.
작업이 완료가 되면 Ready queue로 가서 CPU를 얻을 수 있게 된다.
운영체제 커널이 본인의 데이터 영역에 자료구조로 Queue를 만들어놓고 프로세스의 상태를 바꿔가면서 운영
Process Control Block(PCB)
: 운영체제가 각 프로세스를 관리하기 위해 프로세스 당 유지하는 정보
운영체제 커널이 프로세스를 관리하기 위해 자신의 데이터 영역에 두고 있는 PCB
1.
OS가 관리상 사용하는 정보
•
Process state : Ready, Running, Blocked 인지 확인하는 부분
•
Process ID : Process마다 숫자를 둬서 관리
•
Scheduling Information, Priority : 프로세스에게 CPU를 주기 위해서는 우선순위나 스케줄링 정보가 필요
2.
CPU 수행 관련 하드웨어 값
프로세스의 문맥을 표시하기 위한 정보
•
Program counter
•
Registers : CPU에다가 어떤 Register값들을 넣어서 실행하고 있었는지
3.
메모리 관련
•
Code, data, Stack이 메모리 어디에 위치해 있는가에 대한 정보
4.
파일 관련
•
프로세스가 Open하고 있는 파일은 무엇이 있는지
•
리소스 관련 정보
PCB에 저장되는 정보
문맥 교환(Context Switch)
: CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
: CPU가 사용자 프로세스 하나로부터 또 다른 사용자 프로세스로 넘어가는 과정
CPU를 뺏겼다가 다시 실행했을 때 처음부터 다시 실행하는 것이 아닌 실행하던 시점부터 다시 실행하는 메커니즘이 필요하다
커널의 프로세스 A PCB에 내용을 저장, 프로세스 B PCB에서 내용 복원
System Call이나 Interrupt 발생시(CPU 제어권이 운영체제에게 넘어감) 반드시 context switch가 일어나는 것은 아니다.
→ 사용자 프로세스 하나로부터 다른 사용자 프로세스로 넘어가는 과정을 Context Switch라고 함.
→ 운영체제가 CPU를 다른 사용자 프로세스에게 넘겨주는 경우 존재 = Context Switch
Timer Interrupt나 I/O 요청 System Call이 있으면 Ready 상태에 있는 프로세스에게 CPU를 넘겨줌
프로세스에서 실행을 하다가 커널을 실행하기 때문에 전에 실행중이던 프로세스를 실행하기 위해선 약간의 문맥이 저장되어야 한다. 하지만 프로세스 자체가 바뀌는 거에 비해서는 커널 모드로 들어왔다가 나가는게 Overhead가 적다. CPU Context정도만 세이브했다가 복원하면 된다.
eg. cache memory flush : 상당한 오버헤드. A에서 B로 넘어가게 되면 사용하던 캐시 메모리를 모두 지워야 한다. User mode와 Kernel mode를 왔다갔다 하는 상태에서는 그렇게 하지 않아도 된다.
Switching
프로세스를 스케줄링하기 위한 큐
•
Job queue : 현재 시스템 내에 있는 모든 프로세스의 집합
◦
Ready queue, Device queue에 있는 프로세스는 Job queue에 포함
•
Ready queue : 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
•
Device queues : I/O device의 처리를 기다리는 프로세스의 집합
•
운영체제가 프로세스를 관리하는 자료구조인 PCB를 줄세운다.
•
Pointer가 있기 때문에 줄줄이 연결 가능
프로세스들이 다양한 큐에 줄서서 서비스를 받게되고 운영체제가 이를 관리한다.
•
프로그램 시작 → Ready queue → CPU를 얻음 → 할당 시간이 끝남 → Ready queue
•
프로그램 시작 → Ready queue → CPU를 얻음 → 오래걸리는 작업 실행 → 해당 작업 큐에 줄을 섬 → 해당 작업이 끝남 → Ready queue
•
프로그램 시작 → Ready queue → CPU를 얻음 → Interrupt가 걸림 → Ready queue(정확하게 Ready는 아님)
•
프로그램 시작 → Ready queue → CPU를 얻음 → 자식 프로세스를 만듦 → 자식 프로세스 실행 → Ready queue
스케줄러(Scheduler)
: 각각의 자원별로 이번에 무슨 일을 하고 시간을 얼만큼씩 잡고 이런걸 정하는게 스케줄러
•
Long-term scheduler(장기 스케줄러, job scheduler)
◦
메모리를 어떤 프로세스에게 줄 지 결정(new → ready 상태에서 admitted해주는 것)
◦
시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
◦
degree of Multiprogramming(메모리에 여러 프로세스가 올라가는 것) 제어
▪
메모리에 올라가 있는 프로세스의 수를 제어 → 굉장히 중요한 이슈
◦
Time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready)
▪
어떻게 degree of Multiprogramming를 제어하는가? Medium-term scheduler를 사용해서!
▪
일단 메모리에 다 올려두고 너무 프로그램이 많이 올라가있다 싶으면 Medium-term scheduler가 몇 개를 쫓아냄
•
Short-term scheduler(단기 스케줄러, CPU scheduler)
◦
아주 짧은 시간 단위로 스케줄이 이뤄짐 → 스케줄이 이뤄지는 단위가 millisecond 단위
◦
다음번에 어떤 프로세스한테 CPU를 줄 지 결정
•
Medium-term scheduler(중기 스케줄러, Swapper)
◦
메모리에 너무 많은 프로세스들이 동시에 올라가 있으면 일부 프로그램을 골라서 메모리에서 통째로 쫓아낸다.
◦
degree of Multiprogramming을 제어
현대의 프로세스 상태
: 위의 프로세스 상태 + Suspended 상태
사용자 프로그램의 상태도
•
운영체제가 Running하는 것이 아니라 Kernel mode에서 Running하는 것
•
Interrupt가 들어와도 여전히 Running하는 것으로 간주, 하지만 mode가 변경된다.
•
프로세스가 정지되어 있는 상태 = inactive
•
Suspended상태에서도 Suspended Ready로 넘어갈 수는 있다.
추가
•
Suspended(stopped)
CPU뿐만 아니라 해당 프로세스를 강제로 정지시켜둔 상태 → 메모리를 통째로 빼앗기 때문에
◦
프로세스를 통째로 디스크에 Swap out한 상태
◦
Suspended를 하는 경우
▪
메모리에 너무 많은 프로세스가 올라와 있을 때
▪
사용자가 프로그램을 일시 정지시킨 경우(break key) → 재개시켜줘야지만 다시 실행 가능
▪
실행되는 프로세스가 오류를 보일 때
◦
(Swapped Out = Suspension / Swapped In = Resume) → Swapping
Suspended Ready, Blocked
Blocked와 Suspended의 차이