개념
- 프로세스 : 실행중인 프로그램
- CPU가 다른 프로세스로 넘어갈 때 이전에 실행하던 시점부터 시작하기 위한 정보가 필요하다.
- 프로세스의 문맥 (context)
- 프로세스의 현재 상태를 나타내기 위해 필요한 정보
- CPU 수행 상태를 나타내는 하드웨어 문맥
- instruction 을 어디까지 실행했는지에 대한 정보
- Program Counter : 실행 중인 프로세스의 코드 영역을 가리키고 있음. (어디까지 실행했는지)
- 각종 register
- 프로세스의 주소 공간
- 현재 프로세스의 메모리 공간에 어떤 값이 담겨있는지?
- code, data, stack
- 프로세스 관련 커널 자료구조
- 커널에서 프로세스를 관리하기 위해서 가지고 있는 정보.
- PCB (Process Control Block) : 프로세스 하나 당 PCB 하나
- Kernel Stack : 커널 함수 실행 스택 - 프로세스별로 따로 공간을 가짐.
PCB
- 운영체제가 각 프로세스를 관리하기 위해 유지하는 정보
- OS가 관리상 사용하는 정보
- Process State, Process ID
- scheduling information, priority
- CPU 수행 관련 하드웨어 값
- Program Counter, registers
- 메모리 관련
- Code, Data, Stack 의 위치 정보
- 파일 관련
- Open file descriptors ....
상태
- Running : CPU 를 잡고 instruction 을 수행 중인 상태
- Ready : CPU 를 기다리는 상태 - 다른 조건은 모두 만족하고 있어서 CPU를 잡기만 하면 바로 수행이 가능한 상태.
- Blocked (wait, sleep) : CPU 를 주어도 instruction 을 수행할 수 없는 상태
- Process 가 요청한 event (ex. I/O) 가 만족되지 않아서 그걸 기다리고 있는 상태
- ex) 디스크에서 파일을 읽어와야 함...
- New : 프로세스가 생성 중인 상태
- Terminated : 수행이 끝난 상태 (종료됐지만 정리할 것이 남음)
문맥 교환 (Context Switch)
- CPU 를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
- 운영체제의 역할
- CPU 를 내어주는 프로세스의 상태를 해당 프로세스의 PCB 에 저장하고,
- CPU 를 얻는 프로세스의 상태를 해당 프로세스의 PCB 에서 읽어옴.
- System call, Interrupt 가 발생했을 때, 항상 문맥 교환이 일어나는 것은 아니다.
- 다른 프로세스로 CPU 가 넘어갈 때만 일어남. (ex. timer interrupt)
- +) System Call 이 일어나서 OS 커널 코드가 실행중이면, 프로세스가 커널 모드에서 실행중이라고 하지 운영체제가 실행중이다.. 라고 하지 않는다.
프로세스 스케쥴링 큐
- Job Queue : Ready + Device
- Ready Queue
- 현재 메모리에 올라와 있으면서, CPU 를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device Queues
- I/O device 의 처리를 기다리는 프로세스의 집합
- 프로세스는 Ready, Device 를 왔다갔다 하면서 실행된다.
- 큐는 연결리스트로 구현된다. PCB 를 연결!!!
스케쥴러
- Long-term Scheduler (장기 스케줄러 or Job Scheduler)
- New -(Long-term Scheduler)-> Ready
- 시작 프로세스 중에서 어떤 것을 ready queue 로 보낼지 결정.
- 프로세스에 메모리(+ 자원) 을 주는 문제
- degree of MultiProgramming 을 제어 : 메모리에 올라가는 프로세스 수를 제어
- Time-Sharing 에는 없는 경우가 많음.
- Short-term Scheduler (단기 스케줄러 or CPU Scheduler)
- Ready -(Short-term Scheduler)-> Running
- 어떤 프로세스를 다음번에 running 시킬지 결정
- 프로세스에 CPU 를 주는 문제
- ms 단위로 동작할 수 있을 만큼 빨라야함.
- Medium-term Scheduler (중기 스케줄러 or Swapper)
- Ready/Running -(Medium-term Scheduler)-> Suspended
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄.
- 프로세스에게서 memory 를 빼앗는 문제
- degree of MultiProgramming 제어 : 메모리에서 내림.
프로세스의 상태 - Suspended(Stopped)
- 중기 스케줄러 때문에 추가되는 프로세스의 상태
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 Swap Out 된다.
- 예) 사용자가 프로그램을 일시 정지 시킴 (Ctrl + Z)
- 시스템이 프로세스를 잠시 중단시킴 (메모리에 너무 많은 프로세스가 올라와 있다던지..)
Blocked vs Suspended
- Blocked : 자신이 요청한 Event 가 만족되면 Ready
- Suspended : 외부에서 resume 해주어야 Active
Thread (lightweight process)
개념
- 프로세스 내부의 CPU 실행 단위.
- 같은 일을 하는 프로세스를 여러개 띄우고 싶을 때, 쓰레드를 사용하면 더 빠르고 자원의 낭비 없이 수행할 수 있다.
- Thread 의 구성 : CPU 실행과 관련된 부분으로 이루어짐. (공유 X)
- Program Counter
- Register set
- Stack space
- Thread 가 공유하는 영역 (= task)
- 메모리 내 Code, Data 영역
- OS resources
- 프로세스 (heavyweight process) : 하나의 thread를 가지는 task
장점
- 하나의 서버 스레드가 Blocked (waiting) 상태여도 동일한 태스크 내의 다른 스레드가 Running (실행) 되면서 빠른 처리를 할 수 있다.
- Web Browser : 각각을 프로세스가 아니라 쓰레드로 구성하면, Web Page (html 문서) 를 읽어오는 I/O 를 하는 동안 Blocked 로 가지 않고, 다른 스레드가 이미 읽어온 텍스트 먼저 보여줄 수 있다.
- 동일한 일을 하는 다중 스레드가 협력해서 처리율이 높아지고 성능이 향상됨.
- 같은 일을 하는 프로세스가 많으면 메모리에 전부 올라와 있어서 메모리 낭비임.
- 하나의 프로세스 안에 스레드 여러개로 구성하면 많은 영역을 공유할 수 있어서 자원 낭비를 줄일 수 있음.
- CPU 가 여러개인 컴퓨터에서 스레드 사용 시 병렬성을 높일 수 있다.
- Responsiveness
- Resource Sharing
- Economy
- 프로세스에 비해, Creating & Context Switching 오버헤드가 훨씬 적다.
- Solaris 시스템의 경우, 스레드에 비해 프로세스의 오버헤드가 생성 30배, 문맥 교환 5배
- Utilization of Multi Processer Architectures
- 각 스레드가 각각 다른 CPU 에 의해서 병렬적으로 실행됨.
구현
- Kernel Threads
- OS 에서 지원하는 스레드
- 쓰레드가 여러개임을 OS 도 알고 있기 때문에 CPU 가 thread 사이에서 이동할 때도 OS가 개입한다.
- User Thread
- 사용자 수준에서 스레드를 생성하는 것.
- 직접 메모리에 접근해서 생성할 일은 없고, 라이브러리 코드를 이용!
출처 / 참고
반효경 교수님의 2014 운영체제 3. Process, 2, 3 강의를 듣고 포스팅하고,
공룡책을 읽고 추가 정리합니다.
사진 출처는 강의 자료.