운영체제(OS) - Process & Process Management (3)
본 글은 (KOCW) 운영체제, 이화여자대학교 반효경 교수님의 강의를 듣고 내용을 요약 및 정리했습니다.
개인 공부에 목적이 있으며, 자세한 사항은 http://www.kocw.or.kr/home/cview.do?mty=p&kemId=1046323에 참고하시면 됩니다.
Chapter 3.
- Process1 - 1시간
- Process2 - 15분
- Process3 - 15분
Chapter 4.
- Process Management 1 - 11분
- Process Management 2 - 1시간 7분
(+) 인프런의 주니온 박사님의 운영체제 공룡책 강의를 듣고 내용을 보충했습니다. 자세한 사항은 여기를 참고하시면 됩니다.
프로세스
- “Process is an instance of a program in execution”
- 하나의 프로그램은 몇몇 프로세스들이 될 수 있다.
- 프로세스는 process ID(PID)를 통해 식별된다.
- 프로세스는 CPU context (registers), OS resources, other information을 포함한다.
- 프로세스의 문맥(context)
- CPU 수행 상태를 나타내는 하드웨어 문맥(context)
- Program Counter
- 각종 register (주로 register가 어떤 값인지 본다)
- 프로세스의 주소 공간
- code, data, stack
- 함수는 어떻게 쌓여있고 data는 어떻고 등등 프로세스의 상태
- 프로세스 관련 커널 자료 구조
- PCB (Process Control Block)
- 각 프로세스는 PCB에 의해 운영 체제에 표시된다.
- PCB는 특정 프로세스와 관련된 많은 정보들을 가지고 있다.
- ex. 이 프로세스에게 얼마나 할당해야 하는지
- Kernel stack
- 커널도 함수로 이루어져 있다.
- 커널은 여러 프로세스들이 공유하는 코드라 할 수 있다.
- 커널 스택을 프로세스마다 별도로 있다.
- PCB (Process Control Block)
- CPU 수행 상태를 나타내는 하드웨어 문맥(context)
프로세스의 상태 (Process State)
- 프로세스는 상태(state)가 변경되며 수행된다.
- Running : CPU를 잡고 instruction을 수행중인 상태
- Ready : CPU를 기다리는 상태 (메모리 등 다른 조건을 모두 만족하고)
- Blocked (wait, sleep) : CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- Process 자신이 요청한 event(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태
- ex. 디스크에서 file을 읽어와야 하는 경우
- Process 자신이 요청한 event(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태
- New : 프로세스가 생성중인 상태
- Terminated : 수행(execution)이 끝난 상태
PCB (Process Control Block)
- Process Control Block의 약어.
- 블록 (block) : 작은 단위들이 합쳐져 일정 구획을 갖는 집합체 1
- PCB : 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
- 다음의 구성 요소를 가진다. (구조체로 유지)
- (1) OS가 관리상 사용하는 정보
- Process state, Process ID(PID)
- scheduling information, priority
- (2) CPU 수행 관련 하드웨어 값
- Program counter, Registers
- (3) 메모리 관련
- Code, Data, Stack의 위치 정보
- (4) 파일 관련
- Open file descriptors
- (1) OS가 관리상 사용하는 정보
문맥 교환 (Context Switch)
- 문맥 교환 (Context Switch) : CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
- 프로세스의 context는 PCB에 있다
- CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
프로세스를 스케줄링하기 위한 큐
- Job queue : 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready queue : 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device queues : I/O device의 처리를 기다리는 프로세스의 집합
- 프로세스들은 각 큐들을 오가며 수행된다.
스케줄러 (Scheduler)
- Long-term scheduler (Job scheduler)
- 시작 프로세스(new 상태의 프로세스)가 메모리에 올라오는걸 관리
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
- degree of multi-programming을 제어
- multi-programming: 2개 이상의 프로그램을 주기억장치에 기억시키고, 중앙처리장치를 번갈아 사용하는 처리기법
- time sharing system에는 보통 장기 스케줄러가 없음 (무조건 ready)
- time sharing의 목적은 프로세스 간의 CPU 코어를 빈번히 바꾸어 사용자는 프로그램이 작동하는 동안 각 interact할 수 있게 하는 것.
- Short-term scheduler (CPU scheduler)
- 어떤 프로세스를 다음번에 running시킬지 결정
- 짧은 시간 안에 스케줄이 이루어져야함
- 충분히 빨라야함 (millisecond) 단위
- Medium-term scheduler (Swapper)
- 여유공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
- 프로세스에게서 memory를 빼앗는 문제
- degree of multi-programming을 제어
프로세스의 상태
- Running
- Ready
- Blocked
- Suspended (stopped)
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out 됨
- ex. 사용자가 프로그램을 일시 정지시킨 경우 (break key)
- Blocked : 자신이 요청한 event가 만족되면 Ready
- Suspended : 외부에서 resume 해주어야 Active
Thread
- 스레드는 프로세스 내에서 동시성을 저렴하게 늘릴 수 있을까에 대한 의문으로 출발한다.
- 실행 상태에서 프로세스를 분리한다.
- 스레드 (thread) : 프로세스 내부의 실행 단위
- A thread is a lightweight process.
- 프로세스 하나에 CPU 수행 단위(a basic unit of CPU utilization)만 여러개 두고 있다.
- 프로세스 하나에서 공유할 수 있는것은 공유하고 CPU 수행에 관한 정보(CPU 카운터, register set, stack etc.)는 별도로 가지고 있다.
- Thread의 구성 : Program counter, resister set, Stack space
- Thread가 동료 Thread와 공유하는 부분(= Task) : code section, data section, OS resources
- single-threaded process vs multithreaded process
- web server에서의 multithreading 예시
Thread의 장점
- Responsiveness (응답성)
- eg) multi-threaded Web
- if one thread is blocked (eg network), another thread continues (eg display)
- eg) multi-threaded Web
- Resource Sharing (자원 공유)
- 여러개의 스레드가 프로세스 내부의 자원들을 공유할 수 있다
- Economy (경제성)
- Context Switching을 할 필요가 없다.
- overhead(어떤 처리를 하기 위해 들어가는 간접적인 처리 시간, 메모리) 를 줄일 수있다.
- Context Switching을 할 필요가 없다.
- Utilization of MP(Multi-Processor) Architectures
- 서로 다른 CPU에서 각 스레드들이 병렬적으로 일을 처리하면 결과를 빨리 얻을 수 있다.
Thread 구현
- Kernel Threads : 프로세스 안에 스레드가 여러개 있다는걸 운영체제가 알고있음
- 커널이 알아서 스레드 관리
- User Threads : 프로세스 안에 스레드가 여러개 있다는걸 운영체제는 모름
- 유저 프로그램이 스레드를 직접 관리
- 구현상의 제약점들이 있을 수 있다.
Process vs Thread
- 프로세스는 여러 개의 스레드를 가질 수 있다.
- 스레드는 단일 프로세스에 묶인다(bound).
- 프로세스는 스레드가 실행되는 컨테이너이다.
- PID, 주소 공간, 사용자 및 그룹 ID, 열린 파일 설명자, 현재 작업 디렉토리 등
- 스레드 간 데이터 공유 비용이 저렴하다.
- 모두 동일한 주소 공간을 본다.
- 스레드는 스케줄링 단위이다.
- 프로세스는 정적(static)인 반면 스레드는 동적(dynamic) 엔티티이다.
one-to-one
- 각 사용자 수준 스레드는 커널 스레드에 매핑된다.
- 사용자 수준 스레드를 만들면 커널 스레드가 생성된다.
- 다대일(many to one)보다 동시성 향상이 특징이다.
- 오버헤드로 인해 프로세스당 스레드 수가 제한되는 경우가 있다.
many-to-one
- 단일 커널 스레드에 매핑된 많은 사용자 수준 스레드를 말한다.
- 사용자 스레드 간의 작고 빠른 컨텍스트 전환이 이뤄진다.
- 하나의 스레드 차단이 되면, 모든 스레드가 차단된다.
- 한 번에 하나의 스레드만 커널에 있을 수 있기 때문에 다중 스레드는 다중 코어 시스템에서 병렬로 실행되지 않을 수 있다.
- 현재 이 모델을 사용하는 시스템이 거의 없다.
many-to-many
- 많은 사용자 수준 스레드를 여러 커널 스레드에 다중화
- 운영 체제에서 충분한 수의 커널 스레드를 생성할 수 있다.
프로세스 생성 (Process Creation)
- Copy-on-Write (COW) : write가 발생했을 때 Copy해서 쓴다.
- 부모 프로세스(Parent process)가 자식 프로세스(children process) 생성
- 프로세스의 트리(계층 구조) 형성
- 프로세스는 자원을 필요로 함
- 운영체제로부터 받는다.
- 부모와 공유한다.
- 자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델
- 수행 (Execution)
- 부모와 자식은 공존하며 수행되는 모델
- 자식이 종료(terminate)될 때까지 부모가 기다리는(
wait
) 모델
- 주소 공간 (Address space)
- 자식은 부모의 공간을 복사함 (binary and OS data)
- 자식은 그 공간에 새로운 프로그램을 올림
- 유닉스의 예
fork()
시스템 콜이 새로운 프로세스를 생성- 부모를 그대로 복사 (OS data except PID + binary)
- 주소 공간 할당
- fork 다음에 이어지는
exec()
시스템 콜을 통해 새로운 프로그램을 메모리에 올림
- 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (
exit
)- 자식이 부모에게 output data를 보냄 (
via wait
) - 프로세스의 각종 자원들이 운영체제에게 반납됨
- 자식이 부모에게 output data를 보냄 (
- 부모 프로세스가 자식의 수행을 종료시킴 (
abort
)- 자식이 할당 자원의 한계치를 넘어섬
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 부모가 종료(
exit
)하는 경우- 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다.
- 단계적인 종료
fork() 시스템 콜
fork()
: create a child (copy)- 프로세스는
fork()
시스템 콜에 의해 생성된다.
exec() 시스템 콜
exec()
: overlay new image- 프로세스는
exec()
시스템 콜에 의해 다른 프로그램이 실행한다.
int main()
printf("1");
execlp("echo", "echo", "hello", "3", (char *)0);
printf("2");
wait() 시스템 콜
wait()
: sleep until child is done- 프로세스 A가 wait() 시스템 콜을 호출하면
- 커널은 child가 종료될 때까지 프로세스 A를 sleep시킨다. (block 상태)
- Child process가 종료되면 커널은 프로세스 A를 깨운다. (ready 상태)
exit() 시스템 콜
exit()
: frees all the resources, notify parent- 프로세스의 종료
- 자발적 종료
- 마지막 statement 수행 후 exit() 시스템 콜을 통해
- 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌
- 비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자식 프로세스가 한계치를 넘어서는 자원 요청
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 키보드로 kill, break 등을 친 경우
- 부모가 종료하는 경우
- 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자발적 종료
프로세스 간 협력
- 독립적 프로세스 (Independent process) : 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
- 협력 프로세스 (Cooperating process) : 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
- 프로세스 간 협력 메커니즘 (IPC; Inter-Process Communication) : send data to and receive data from each other.
- 메시지를 전달하는 방법
- message passing : 커널을 통해 메시지 전달
- 주소 공간을 공유하는 방법
- shared memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
- thread : 스레드는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 프로세스를 구성하는 스레드들 간에는 주소 공간을 공유하므로 협력이 가능
- 메시지를 전달하는 방법
Shared memory
- Producer-Consumer 문제
- producer는 consumer에 의해 소비되는 정보를 만들어 낸다.
- shared-memory를 사용하여 해결
- producer와 consumer에게 concurrent하게 동작하도록 허용한다.
- buffer가 있다면, producer는 buffer를 채우고 consumer는 buffer를 비운다.
- shared-memory는 producer와 consumer 프로세스에 의해 공유되는 메모리의 영역이다.
Message Passing
- Message system : 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
- send(message)
- send(message)
- Direct Communication : 통신하려는 프로세스의 이름을 명시적으로 표시
- send(P, message)
- receive(Q, message)
- 링크는 자동으로 생성되고, 프로세스의 각 상에는 하나만 존재한다.
- Indirect Communication : mailbox (또는 port)를 통해 메시지를 간접 전달
- send(A, message)
- send(A, message)
- 링크는 프로세스가 2개 이상 형성될 수 있다.
- Message-Passing Systems의 실행을 위한 다른 디자인 옵션
- blocking or non-blocking : synchronous or asynchronous
- Blocking send : the sender is blocked until the message is received.
- Non-blocking send : the sender is sneds the message and continue.
- Blocking receive : the receiver blocks until a message is available.
- Non-blocking receive : the receiver retrieves either a valid message or a null message.
댓글남기기