Process
Process: 실행중인 프로그램
- = 즉, 실행파일이 메모리에 적재되고, CPU를 할당받아서 명령 수행중인 상태
- 이때, 실행파일 전체가 메모리에 올라가지 않고 일부만 올라감 + 나머지는 디스크의 특정 영역에 존재
- 어쨌든 프로세스를 위해 제공된 메모리가 어떻게 구성되어 있는지 알아야함. 어떻게?
Process 메모리의 구성요소
- Code(Text)
- 실행할 프로그램의 코드가 저장되는 영역
- CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리함
- Data
- 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역
- 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸함
- Stack
- 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역
- 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸함
- 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 함
- 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됨
- Heap
- 사용자에 의해 동적으로 할당되고 해제되는 영역
- 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됨
- 기타 pc 값이나 레지스터들
Process의 상태
- 생성(new), 종료(terminated)는 프로세스를 만들거나 종료시키는 일시적 상태고, 이외의 running, waiting, ready가 돌아가면서 프로세스가 수행되게 된다.
- new: 프로세스가 생성
- running: CPU에서 프로세스가 수행되고 있는 상태
- waiting: running 상태에서 I/O나 다른 이벤트가 발생했으면 CPU는 입출력 관리자에게 작업을 맡기고 프로세스를 waiting 상태로 만듬. 즉, 다른 이벤트를 기다리고 있는 상태.
- ready: running할 준비가 되어 있음. 이미 CPU가 다른 작업을 수행하고 있기 때문에 기다리고 있는 상태. Ready queue에 들어와있는 상태. Ready queue는 여러개를 사용하기도 하며, 차례는 CPU Scheduler가 관리함
- terminated: 프로세스가 종료됨. OS가 PCB를 제거하고 메인 메모리에서 빠져나간 상태
Process Control Block (PCB)
- PCB는 process에 대한 정보를 포함하는 운영체제 커널의 자료구조이다. 즉, PCB는 운영체제가 프로세스를 표현한 것이라고 볼 수 있다.
- 각 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB는 제거된다.
- 프로세스의 상태관리와 문맥교환을 위해 필요하다.
- 내용
- Process ID: 프로세스를 구분하는 ID
- Process State
- Program counter: 다음 instruction의 주소를 저장하는 카운터
- CPU registers: Accumulater, CPU Register 등
- CPU scheduling information: 우선순위, 최종 실행시간, CPU 점유시간 등
- Memory-management information: 해당 프로세스 주소공간의 정보
- Accounting information
- I/O status information
문맥 교환 (Context Switching)
- CPU가 여러 프로세스를 돌아가면서 실행시키려면 context switching이 필요하다.
- Context Switching이란, 현재 진행하고 있는 프로세스(혹은 thread)의 상태를 저장하고 다음 진행할 프로세스의 상태 값을 읽어 적용하는 과정을 말함
- Process 0이 수행되고 있다고 한다면 CPU안에 있는 레지스터인 PC, Stack Pointer 등은 process 0 의 상태로 수행이 된다. 여기서 interrupt가 걸리면 Process 0 은 ready으로 상태가 변경되고 CPU는 다른 프로세스를 running으로 바꿔서 수행한다. 이때 레지스터의 값들이 앞으로 수행할 프로세스에 대한 정보로 교체된다. 교체되기 전에 이전 값들을 어딘가에 저장해둬야 하는데 이를 PCB에 저장하면서 새로운 프로세스를 PCB에서 읽어서 레지스터에 적재하는 과정 == Context Switching
- Context Switching을 하는 시간은 overhead임
Process Scheduling Queues
- 수행 가능한 여러 프로세스들 중에서 하나의 프로세스를 선택하는 것. 이때 큐에 저장된 프로세스들 중에서 하나를 선택하게 된다.
- 보통 링크드 리스트로 저장
- 종류
- Job queue: 메모리 할당을 대기중인 프로세스. 프로세스가 시스템에 들어가면 job queue에 들어감. 여기에 모든 프로세스들이 존재함
- Ready queue: CPU 할당을 대기중인 프로세스. 메인 메모리에 저장되어 있으면서 실행을 기다리는 준비상태의 프로세스들은 준비 큐에 존재함
- Device queues: 입출력 장치 할당을 대기중인 프로세스
Schedulers
Long-term Scheduler (=Job scheduler)
- 어떤 process들이 Ready queue에 적재되어야 할지 고르는 스케줄러
- 빈번하지 않아 느려도 됨
- Multi-programming의 degree를 결정
- 요즘은 virtual memory management가 발달해 메모리가 무한이라고 할 수 있음 -> long-term scheduler가 의미 없어짐
- 메모리와 디스크 사이의 스케줄링을 담당
- 프로세스에 메모리 및 각종 리소스를 할당
- 실행중인 프로세스의 수 제어(degree of multiprogramming)
- 프로세스의 상태 new -> ready
Short-term Scheduler (=CPU scheduler)
- 어떤 process가 다음으로 실행되고 CPU를 할당받을지 고르는 스케줄러
- 매우 빈번하게 발생하기 때문에 빨라야함
- 프로세스의 상태 ready -> running -> waiting -> ready
- 현대의 컴퓨터가 여러 프로그램을 동시에 사용하는 것과 같은 효과를 주는 이유가 이 스케줄링 속도가 매우 빠르기 때문
Medium-term Scheduler (=Swapper)
- 어떤 프로세스들이 CPU를 할당받을 지 결정
- 메모리가 부족하면 프로세스를 내리고 (swapping out), 다시 올리고 (swapping in) 하는 것을 swapping이라고 함
- 요즘 virtual memory 개념이 있기 때문에 사용되지 않음
- degree of Multiprogramming 제어
- 현 시스템에서 메모리에 너무 많은 프로그램이 동시에 올라가는 것을 조절하는 스케줄러
- 프로세스의 상태 ready -> suspended(stopped, 메모리에서 내려간 상태)
Process Creation
- 프로세스는 pid (process identifier)로 인식, 관리됨
- Parent 프로세스는 children 프로세스들을 생성하는데, 이는 트리 형식을 구조를 이루고 있음
- 이런 과정에서 부모-자식 프로세스간 이슈에 선택지가 있음. 이는 OS마다 다름
- Resource Sharing
- 부모와 자식은 모든 자원을 공유한다.
- 자식들은 부모의 자원의 일부를 공유한다.
- 부모와 자식은 어떤 자원도 공유하지 않는다.
- Execution
- 부모-자식 프로세스가 Concurrently하게 돈다.
- 부모는 자식이 종료될 때까지 wait한다.
- Resource Sharing
- UNIX 운영체제 기준으로 프로세스 생성은 다음과 같다.
- fork() 시스템콜(새로운 프로세스를 생성함) 호출 이후 child 프로세스는 parent 프로세스와 동일한 context를 가지게 된다.
- 따라서 child 프로세스와 parent 프로세스는 동일한 지점에서 시작하게 된다. (fork() 시스템콜 직후 & 리턴값이 돌아오기 직전)
- fork()의 리턴값은 child 프로세스에서는 0, parent 프로세스에서는 child 프로세스의 pid 값이다.
- exec() 시스템콜은 현재 프로그램의 메모리 영역에 exec의 인자로 전달된 프로그램의 메모리로 덮어씌워버림
- 아래의 이미지에서 보면 fork()에서 부모 - 자식 프로세스가 분리되고, 자식 프로세스에서 exec()을 호출한다. exec()를 호출하여 binary 파일을 메모리로 불러오고 기존 프로세스에서 할당받았던 메모리를 덮어버리는 동안 부모 프로세스는 자식 프로세스가 exit() 할 때까지 wait() 시스템콜을 호출하여 대기한다.
Process Termination
- Exit: 프로세스가 마지막 명령어를 수행하고 exit() 시스템콜을 통해 OS에게 삭제 요청을 하는 정상적인 종료. 결과 데이터는 child -> parent 프로세스에게 전달된다. 프로세스의 자원들은 OS에 의해 회수(deallocate)된다.
- Abort: 부모 프로세스가 자식 프로세스를 abort() 시스템콜을 통해 종료하는 비정상적인 종료. 자식 프로세스가 리소스를 넘어서는 일을 했을 경우, 필요없어질 경우, 부모 프로세스가 먼저 exit()해서 orphan process가 된 경우 일어난다. (UNIX 계열에서 부모없는 자식 프로세스는 생길 수 없음. 이런 상황을 cascading termination이라고 함)
Interprocess Communication (IPC)
- Process는 완전히 독립된 실행객체다. 이는 서로다른 프로세스의 영향을 받지 않는다는 장점이 있지만 서로 통신이 어렵다는 단점도 있다. 이를 위해 커널 영역에서 IPC라는 내부 프로세스간 통신을 제공한다.
- 종류: PIPE, Named PIPE, Message Queue, Shared Memory, Memory Map, Socket, Semaphore
Threads
Threads
- Thread란 CPU 실행의 기본 단위이다. 모든 프로세스는 한개 이상의 스레드라 존재하며 두개 이상을 가지면 멀티스레드 프로세스라고 한다.
- Thread는 code, data, file을 공유하고 registers와 stack은 각자 가짐
- 장점
- Responsiveness: 사용자 응답성 증가
- Resource Sharing: 자원과 메모리 공유
- Economy: 경제성 좋음. 프로세스 context switching 보다 스레드 context switching이 더 오버헤드가 적음
- Scalability: 다중 처리로 성능과 효율 향상
- Thread의 구현
- 사용자 수준 스레드 - 다대일 매핑: 사용자 영역에서 구현하므로 커널은 스레드의 존재를 알지 못함. 스레드 라이브러리로 구현되며 커널에 독립적으로 스케줄링을 할 수 있어 이식성이 높다고 오버헤드가 적다는 장점이 있음. 하지만 스레드 단위로 다중 처리를 하지못해 시스템의 동시성을 지원하지 않는다는 것과 스레드 간에 보호가 불가능하다는 단점이 있음
- 커널 수준 스레드 - 일대일 매핑: 사용자 수준 스레드의 한계를 극복하는 방법으로 커널이 관리하는 것을 말함
- 혼합형 스레드 - 다대다 매핑: 위의 두개를 혼합한 구조. 시스템 호출시 다른 스레드를 중단하는 사용자 수준 스레드와 스레드 수를 제한하는 커널 수준 스레드의 문제를 극복하는 방법.
728x90
반응형
'CS > Operating System' 카테고리의 다른 글
[OS] Memory Management (0) | 2021.09.29 |
---|---|
[OS] CPU Scheduling (0) | 2021.09.22 |
[OS] Computer System Overview (0) | 2021.09.07 |
[OS] Process 동기화 (3) Deadlock (0) | 2021.02.11 |
[OS] Process 동기화(2) (0) | 2021.02.11 |