2019. 7. 24. 19:57ㆍ운영체제
http://www.kocw.net/home/search/kemView.do?kemId=1046323
KOCW 반효경 교수님의 운영 체제 강의를 수강하면서 작성한 포스트입니다. 😁
프로세스
"Process is a program in execution"
현재 시점의 정확한 상태를 규명하기 위해서 필요한 요소들을 문맥이라 할 수 있습니다.
프로세스의 문맥은 크게 3가지로 볼 수 있습니다.
* CPU 수행 상태를 나타내는 하드웨어 문맥 (Program counter, 각종 register)
* 프로세스의 주소 공간 (code, data, stack)
* 프로세스 관련 커널 자료 구조(PCB, Kernel stack)
프로세스의 상태 (Process state)
프로세스는 상태(state)가 변경되며 수행되게 됩니다.
Running
CPU를 잡고 instruction을 수행중인 상태
Ready
메모리 등 다른 조건을 모두 만족하고 CPU를 기다리는 상태
Blocked (wait, sleep)
CPU를 주어도 당장 instruction을 수행할 수 없는 상태
Process 자신이 요청한 이벤트가 즉시 만족되지 않아서 이를 기다리는 상태
Suspended (stopped)
외부적인 이유로 프로세스의 수행이 정지된 상태
프로세스는 통째로 디스크에 swap out 됨
(ex. 사용자가 프로그램을 일시 정지 시킨 경우, 시스템이 여러 이유로 프로세스를 잠시 중단 시킴)
Blocked vs. Suspended: Blocked는 자신이 요청한 event가 만족되면 ready 상태로 변경되고, suspended는 외부에서 resume 해줘야 active로 상태가 변경됩니다.
크게 이렇게 프로세스의 상태를 구분지을 수 있고, 경우에 따라서는 다음과 같은 상태들을 추가해서 생각합니다.
New: 프로세스가 생성 중인 상태
Terminated: 수행이 끝난 상태
Process Control Block (PCB)
PCB는 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보를 말합니다. PCB는 구조체 형태로 다음의 요소들을 가집니다.
* OS가 사용하는 정보 (Process state, Process ID, scheduling information, priority)
* CPU 수행 관련 하드웨어 값 (Program counter, registers)
* 메모리 관련 (code, data, stack의 위치 정보)
* 파일 관련 (open file descriptors...)
문맥 교환 (Context Switch)
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정을 문맥 교환, context switching이라고 합니다.
CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행하게 됩니다.
* CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
* CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어 옴
System call이나 Interupt가 발생 시 반드시 context switching이 일어나는 것은 아닙니다.
(1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save해야 하지만, 문맥 교환을 하는 (2)의 경우에는 그 부담이 훨씬 큽니다.
(1)의 경우는 Process A에서 커널 모드로 들어갔다가 다시 Process A가 실행되는 것을 볼 수 있습니다. 이런 경우는 context switching이라고 하지 않습니다. 커널 모드 진입 후 다른 프로세스를 실행시키는 (2)의 경우가 context switching이 발생했다고 말할 수 있습니다.
프로세스를 스케줄링하기 위한 큐
Job queue
현재 시스템 내에 있는 모든 프로세스의 집합
Ready queue
현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
Device queue
I/O device의 처리를 기다리는 프로세스의 집합
스케줄러 (Scheduler)
Long-term scheduler (장기 스케줄러 or job scheduler)
* 시작 프로세스 중 어떤 것들을 ready queue로 보낼 지 결정
* 프로세스에 memory(및 각종 자원)을 주는 문제
* degree of Multiprogramming을 제어 (메모리에 올라가 있는 프로세스의 수를 제어)
* time sharing system에는 보통 장기 스케줄러가 없음 (무조건 ready)
Short-term scheduler (단기 스케줄러 or CPU scheduler)
* 어떤 프로세스를 다음번에 running 시킬 지 결정
* 프로세스에 CPU를 주는 문제
* 충분히 빨라야 함 (millisecond 단위)
Medium-Term scheduler (중기 스케줄러 or Swapper)
* 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
* 프로세스에게서 memory를 뺏는 문제
* degree of Multiprogramming을 제어
요즘의 OS 들은 time sharing system을 사용하고 있기 때문에, Long-term scheduler 보다는 Medium-Term scheduler를 이용해서 degree of Multiprogrmming을 제어하고 있습니다. Medium-Term scheduler를 통해 프로세스를 메모리에서 디스크로 쫓아낼 경우 이 프로세스의 상태는 suspended로 변경됩니다.
Thread
"A thread (or lightweight process) is a basic unit of CPU utilization"
프로세스 내부에 CPU 수행 단위가 여러 개가 있는 경우 스레드라고 부르게 됩니다.
같은 일을 하는 프로세스를 여러 개 띄우게 되면, 프로세스가 낭비되겠죠. 그래서 스레드라는 개념이 나오게 되었습니다.
이처럼 프로세스 하나에 CPU 수행 단위만 여러 개 띄우는 것을 스레드라고 합니다. code, data 영역은 공통으로 사용하고, stack은 각각의 스레드가 따로 갖습니다. 공유할 수 있는 부분은 최대한 공유하고, CPU 사용과 관련된 정보들만 따로 갖게 됩니다. (PC, registers, stack)
Thread의 구성
* program counter
* register set
* stack space
Thread가 동료 Thread와 공유하는 부분 (=task)
* code section
* data section
* OS resources
다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked (waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있습니다. 동일한 일을 수행하는 다중 스레드가 협력하면 높은 처리율(throughput)과 성능 향상을 얻을 수 있습니다. 또한 스레드를 사용하게 되면 병렬성을 높일 수 있습니다.
Benefits of Threads
* Responsiveness
* Resource Sharing
* Economy
* Utilization of MP Architecture
'운영체제' 카테고리의 다른 글
Process Synchronization (0) | 2019.08.05 |
---|---|
CPU Scheduling (1) | 2019.07.26 |
Process Management (0) | 2019.07.26 |
System Structure & Program Execution (0) | 2019.07.24 |
Introduction to Operating Systems (0) | 2019.04.16 |