🗣 서론
KOCW 반효경 교수님의 운영체제 수업을 들으면서 작성한 글입니다.
[Process 1]
프로세스의 개념, 프로세스의 상태(Process State), 프로세스의 개념, 프로세스 상태도, Process Control Block(PCB), 문맥 교환(Context Switch), 프로세스를 스케줄링하기 위한 큐, Ready Queue와 다양한 Device Queue, 스케줄러(Scheduler)
[Process 2, 3]
Thread, Single and Multithreaded Processes, Benefits of Threads, Implemetation of Threads
📌 프로세스의 개념
"Process is a program in execution"
프로세스의 문맥(context)
프로그램이 태어나서 실행되다가 종료되는데 문맥이라는 것은 중간 시점을 기준으로 프로그램이 무엇을, 어떻게 실행했는지 현재 시점이 어떤 상태인지 나타내는 것을 문맥이라고 한다. 즉, 프로세스의 현재 상태를 나타내는데 필요한 모든 요소를 프로세스 문맥이라고 부른다.
[CPU 수행 상태를 나타내는 하드웨어 문맥]
현재 시점에 프로세스가 인스트럭션을 어디까지 수행했는가
- PC (Program Counter)가 어디를 가리키고 있는가?
- 각종 register에 어떤 값을 가지고 있는가?
[프로세스의 주소 공간] 메모리 관련
- code, data, stack에 어떤 내용이 들어있는가?
[프로세스 관련 커널 자료 구조]
- PCB (Process Control Block)
운영체제가 프로세스에게 CPU나 메모리를 얼마나 줘야 하는지, 나쁜 짓(?)을 하고 있지는 않은지 등 관리하는 역할을 하는데
이때 프로세스마다 상태를 관리하기 위해 PCB를 두고 있다. - Kernel stack
시스템 콜을 하면 PC가 커널의 code를 가리키며 수행되는데 호출 정보를 kernel stack에 프로세스 별로 스택을 두어서 저장한다.
[질문] 프로세스의 문맥은 왜 필요한가?
프로세스 혼자 실행된다면 굳이 알 필요가 없을 것 같다. 하지만 현재 컴퓨터 시스템은 타임 쉐어링, 멀티태스킹으로 인해 프로세스들이 번갈아가면서 실행된다. 즉, 하나의 프로세스가 CPU를 잡고 실행하다가 CPU를 놓고 다른 프로세스에게 넘어가는 형태이다. 그러나 프로세스의 문맥을 모른다면 앞부분부터 실행해야 하기 때문에 어느 시점까지 실행되었는지 이러한 정보들을 가지고 있어야 하기 때문에 프로세스의 문맥은 필요하다.
📌 프로세스의 상태 (Process State)
프로세스는 상태가 변경되며 수행된다.
상태 | 설명 | 기타 |
Running | CPU를 잡고 인스트럭션을 수행중인 상태 | 주요 상태 |
Ready | CPU를 기다리는 상태 | |
Blocked (wait, sleep) | CPU를 줘도 당장 인스트럭션을 수행할 수 없는 상태 | |
프로세스 자신이 요청한 이벤트(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태 ex) 디스크에서 파일을 읽어와야 하는 경우 |
||
New | 프로세스가 생성중인 상태 | 경우에 따라 해당 상태도 추가하기도 한다. |
Terminated |
수행이 끝난 상태 |
|
정리하는 작업이 남아 있기 때문에 상태에 포함하기도 한다. |
스케줄러로 인해 추가된 Suspended 상태가 있다. (여기서는 언급하지 않고, 스케줄러 얘기를 할 때 언급할 예정)
📌 프로세스 상태도
아래 스케줄러로 인해 프로세스 상태도는 변경될 예정 (위 그림을 가볍게 보고, 맨 아래 최종 프로세스 상태도 참고)
- 프로세스가 생성되면 new 상태에서 ready 상태가 된다.
- ready 상태에서 CPU를 얻으면 running 상태가 된다.
- CPU 얻은 상태에서 내려놓는 경우
- running -> terminated
본인의 역할을 다했으면 종료된다. - running -> waiting
I/O 같은 오래 걸리는 작업을 하면, CPU를 가지고 있어 봐야 인스트럭션이 불가능하기 때문에 waiting 상태가 된다. - running -> ready
CPU는 시간을 나눠서 써야 하는데 할당된 시간이 끝난 경우에 ready 상태가 된다.
- running -> terminated
[예시]
running 상태의 프로세스가 사용자로부터 키보드 입력을 받아서 결과를 보고 실행한다고 가정해보자.
그러면 keyboard I/O queue에 줄을 서게 된다. 즉, running 상태에서 blocked 상태로 변경된다.
키보드 입력을 받으면 keyboard controller가 CPU에게 인터럽트를 걸어서 알려준다.
CPU는 하던 일을 멈추고 운영체제에게 넘어가서 프로세스 상태를 ready로 바꾼다.
즉, 키보드 입력이 들어왔기 때문에 CPU를 얻는 자격이 주어진다.
프로세스는 공유 데이터에 접근하던가, 디스크, 키보드 등 어떤 종류에 따라 그에 맞는 queue에 줄을 서게 된다. 이러한 과정을 보면 일종의 놀이동산에 줄을 서는 것과 비슷하다.
[질문] 프로세스가 blocked 상태가 된다는 것은 하드웨어뿐인가?
아니다. 하드웨어 말고 자원 중에 소프트웨어 자원도 있다. 그림을 보면 공유 데이터라는 게 있다. 하지만 여러 프로세스가 동시에 접근하면 일관성이 깨지는 문제가 생길 수 있다. 그래서 keyboard I/O ququec처럼 공유 데이터도 Resource queue에 줄을 서야 한다. (blocked 상태가 된다)
[질문] 그림처럼 queue에 먼저 들어온 프로세스에게 CPU를 할당하나?
아니다. 먼저 온 순서대로 일정 시간을 두고 처리하는 것을 라운드 로빈이라고 하며, 이렇게 할당할 수 있다. 하지만 CPU 스케줄링은 우선순위가 높은 순서대로 할당한다던지 등, CPU 스케줄링 방식에 따라 할당한다고 보면 될 것 같다. (스케줄링 관련해서 나중에 자세히 다룰 예정)
프로세스를 스케줄링하기 위한 큐
프로세스들은 각 큐들을 오가며 수행된다.
[Job queue]
현재 시스템 내에 있는 모든 프로세스의 집합 (Ready, Device queue도 포함)
[Ready queue]
현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
[Device queues]
I/O device의 처리를 기다리는 프로세스의 집합
📌 PCB
운영체제가 프로세스들을 관리하기 위해 프로세스의 정보들을 담고 있다.
[구성 요소]
1 | OS가 사용하는 정보 | Process state, Process ID |
scheduling information, priority | ||
2 | CPU 수행 관련 하드웨어 값 | Program counter, registers |
3 | 메모리 관련 | Code, data, stack의 위치 정보 |
4 | 파일 관련 | Open file descriptors 등 |
📌 문맥 교환(Context Switch)
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정을 의미한다.
[과정]
CPU가 다른 프로세스에게 넘어갈 때 운영체제는 아래 2가지 과정을 수행한다.
- CPU를 내어주는 프로세스 상태를 해당 프로세스의 PCB에 저장한다.
- CPU를 새롭게 얻는 프로세스의 상태를 해당 프로세스의 PCB에서 읽어온다.
- 시스템 콜이나 인터럽트 발생 시 반드시 context switch가 일어나는 것은 아니다.
(위 그림에서 첫 번째) - 사용자 프로세스 하나로부터 또 다른 사용자 프로세스로 넘어가는 것을 context switch라고 한다.
- 시스템 콜이나 인터럽트가 발생한 후에 운영체제가 CPU를 다른 프로세스에게 넘겨주는 것도 context switch라고 한다.
(위 그림에서 2번째)
📌 스케줄러(Scheduler)
Long-term scheduler(장기 스케줄러 또는 job scheduler)
어떤 프로세스에 memory(및 각종 자원)를 주는 문제
- 시작 프로세스 중 어떤 것을 ready queue로 보낼지 결정한다.
- degree of Multiprogramming 제어 즉, 메모리에 올라가 있는 프로세스의 수를 제어한다.
- time sharing system에는 보통 장기 스케줄러가 없다. (무조건 ready 즉, 프로그램 100개를 실행하면 모두 ready 상태)
Short-term scheduler(단기 스케줄러 또는 CPU scheduler)
어떤 프로세스에 CPU를 주는 문제
- 다음번에 어떤 프로세스를 running 시킬지 결정한다.
- 충분히 빨라야 한다. (millisecond 단위)
Medium-term scheduler(중기 스케줄러 또는 Swapper)
프로세스에게서 memory를 뺏는 문제
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아낸다.
- degree of Multiprogramming 제어 즉, 메모리에 올라가 있는 프로세스의 수를 제어한다.
"지금의 시스템은 장기 스케줄러가 없고, 중기 스케줄러가 degree of Multiprogramming 제어를 한다."
중기 스케줄러로 인해 프로세스의 상태 중에 추가된 것이 있다. (위에서 언급을 하지 않음)
Suspended(stopped) 상태이다. Suspended 상태에 대한 특징은 아래와 같다.
상태 | 설명 | 기타 |
Running | CPU를 잡고 인스트럭션을 수행중인 상태 | 주요 상태 |
Ready | CPU를 기다리는 상태 | |
Blocked (wait, sleep) | CPU를 줘도 당장 인스트럭션을 수행할 수 없는 상태 | |
프로세스 자신이 요청한 이벤트(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태 ex) 디스크에서 파일을 읽어와야 하는 경우 |
||
Suspended (stopped) |
외부적인 이유로 프로세스의 수행이 정지된 상태 | |
프로세스는 메모리에서 통째로 디스크로 swap out 된다. ex) 사용자가 프로그램을 일시 정지시킨 경우 (break key 예: ctrl + z) 시스템이 여러 이유로 프로세스를 잠시 중단 (메모리에 너무 많은 프로세스가 올라와 있는 경우) |
||
New | 프로세스가 생성중인 상태 | 경우에 따라 해당 상태도 추가하기도 한다. |
Terminated |
수행이 끝난 상태 |
|
정리하는 작업이 남아 있기 때문에 상태에 포함하기도 한다. |
[질문] 왜 중기 스케줄러로 인해 Suspended 상태가 추가됐나? 기존의 Running, Ready, Blocked로 표현할 수 없나?
메모리를 통째로 빼앗긴 프로세스 상태를 Running, Ready, Blocked로 표현 할 수 없다.
메모리를 통째로 빼앗겼으면 CPU를 얻어도 아무 일도 못하기 때문이다.
[질문] Blocked 상태로 표현할 수 있을 것 같은데 Blocked 상태와 Suspended(stopped) 상태의 차이는 무엇인가?
Blocked 상태
자신이 요청한 작업을 하면서 오래 기다리고 있는 상태이다. 즉, 자신이 요청한 작업이 끝나면 다시 Ready 상태로 돌아갈 수 있다.
Suspened(stopped) 상태
외부에서 정지시킨 상태를 의미한다. 즉, 외부에서 resume 해야 Active 상태로 넘어갈 수 있다.
*Active 상태: Running, Ready, Blocked 상태
📌 최종 프로세스 상태도
초반에 그렸던 프로세스 상태도와 다른 점은 Running 상태가 2가지로 나눴다는 것과 Suspended의 존재 여부 차이이다.
2가지의 Running 상태
[Runnning(user mode)]
프로세스가 CPU를 가지고 있으면서 본인의 코드를 실행 중인 상태가 Running(user mode)이다.
[Running(kernel mode)]
system call이나 interrupt 또는 trap으로 인해 운영체제의 코드가 실행 중인 상태가 Running(kernel mode)이다.
[질문] 운영체제가 Running 상태에 있다고 표현해도 되나?
안된다. 프로세스가 자신의 코드를 실행하다가 system call로 인해 운영체제의 코드를 실행 중인 상태라고 가정하겠다.
이때 유저 모드에서 커널 모드로 넘어갔다던가, 프로세스가 커널 모드에서 Running 상태라고 표현하는 게 맞다.
운영체제가 Running 상태에 있다고 표현하지는 않는다.
왜냐하면 system call을 발생시킨 프로세스가 아직 Running 중이란 것을 전제로 하기 때문이다. 이 점을 꼭 유의해야 한다.
Suspended
Suspended도 Blocked 상태에서 Suspended 되었는지, Ready 상태에서 Suspended 되었는지에 따라
Suspended Blocked와 Suspended Ready 서로 다른 두 가지 상태로 나뉜다.
[질문] active와 inactive를 나눈 기준이 무엇인가? (점선으로 나눈 이유)
inactive는 외부적인 이유로 프로세스가 얼어붙은 상태를 의미한다. 즉, 메모리를 완전히 잃어버린 상태이다.
외부에서 프로세스를 정지시켰기 때문에 active로 넘어가려면 다시 외부에서 재개를 해줘야 한다.
📌 스레드(Thread)
"A thread (or lightweight process) is a basic unit of CPU utilization"
프로세스 내부에 CPU 수행 단위가 여러 개 있는 것을 스레드(Thread)라고 부른다.
스레드의 구성
- program counter
- register set
- stack space
프로세스는 PCB는 하나만 만들어진다. 스레드가 여러 개 있으면 CPU 관련 정보들을 각 스레드마다 가지고 있다.
스레드가 다른 스레드와 공유하는 부분(=task)
- code section
- data section
- OS resources
"전통적인 개념의 heavyweight process는 하나의 스레드를 가지고 있는 task로 볼 수 있다."
장점
[Responsiveness(응답성)]
- 사용자 입장에서 빠르다.
- 다중 스레드로 구성된 task 구조에는 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도
동일한 task 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다. - 예를 들어, 네트워크를 통해 웹 페이지를 읽어오는 동안 브라우저는 blocked 상태가 된다.
만약 여러 개의 스레드로 구성되어 있다면 하나의 스레드는 그림을 불러오고
또 다른 스레드는 불러온 텍스트를 뿌려주게 되면 사용자 입장에서 답답함이 덜하다.
(이미 읽어온 부분은 먼저 보여주기 때문에)
[Resource Sharing(자원 공유)]
- 똑같은 일을 하는 프로그램을 프로세스를 여러개 두는 것보다 하나의 프로세스를 만들고
n개의 스레드를 사용하면 자원을 공유하기 때문에 자원을 효율적으로 사용할 수 있다.
binary code, data, resource of the process 공유
[Economy(경제성)]
- 응답성과 다른 의미로 프로세스를 하나 만드는 것은 오버헤드가 큰데 스레드를 추가하는 것은 오버헤드가 크지 않다.
- 프로세스 간의 Context switching은 오버헤드가 크다. 하지만 스레드가 Context switching은 오버헤드가 적다.
(Solaris 경우 두 가지 오버헤드가 각각 30배, 5배)
[Utilization of MP Architectures(멀티 프로세서 아키텍처의 활용)]
- 스레드가 여러개 있으면 각각의 스레드가 서로 다른 CPU에서 병렬적으로 일을 할 수 있다.
Implementation of Threads
- [kernel threads] - 커널이 스레드의 존재를 알아서 커널의 지원을 받는 스레드들을 의미한다.
- [user threads] - 커널의 지원을 받지 않고, 사용자 수준에서 스레드를 구현하는 스레드들을 의미한다.
- [real-time threads]
'OS' 카테고리의 다른 글
💻 KOCW-OS-3: System Structure & Program Execution 2 (0) | 2020.10.05 |
---|---|
💻 KOCW-OS-2: System Structure & Program Execution 1 (0) | 2020.10.04 |
💻 KOCW-OS-1: Introduction to Operating Systems (0) | 2020.10.03 |