-
Chapter 3 (Processes)운영체제(OS) 2022. 10. 11. 22:38728x90
What is a Process?
우리는 보통 디스크에 있는 것을 프로그램이라 하고
이 프로그램이 메모리에 load 되면 process 라고 합니다.
여기서 process는 job, task 모두 동일하게 사용하겠습니다.
프로세스는 code(=text), data, stack, heap 과 program counter를 포함합니다.
Process State
new : 프로세스가 처음에 생성되었을 때
ready : 프로세스가 CPU에 할당되기를 기다릴 때
running : 프로세스가 할당되어 실행될 때
waiting : 프로세스가 event를 기다릴 때
terminated : 프로세스가 실행을 끝냈을 때
Process Control Block (PCB)
각각의 process는 자신의 정보 묶음 block인 PCB를 가지고 있습니다.
process의 상태
해당 process가 이어서 실행해야 할 명령의 주소를 가리키는 카운터
CPU register : 프로세스가 interrupt 이후 올바르게 작업을 이어가기 위해 참조하는 CPU 레지스터 값
CPU-scheduling information : process의 중요도, 스케쥴링 큐 포인터 등 스케쥴링 parameter 정보
Memory-management information : base, limit 레지스터 값, 페이지 테이블 등 메모리 시스템 정보
Accounting information : 사용된 CPU 총량, process 개수, 시간 제한 등
I/O status information : process에 할당된 입출력 장치 목록, 열린 파일 목록 등
Concept of Process Scheduling
CPU의 효율을 높이기 위해 항상 process를 실행하기 위함입니다.
멀티 프로그래밍과 멀티 테스킹은 결국 CPU의 효율을 위해 여러 process를 자주 전환하고
항상 기다리지 않고 효율적으로 계속 process를 실행시킵니다.
즉, 스케쥴링은 CPU에서 프로그램을 실행하기 위해 사용 가능한
process를 선택하여, 어떤 process를 CPU에게 할당할 것인가를 결정하는 일을 담당합니다.
Process Scheduling Queues
process가 처음에 시스템에 들어오게 되면 Job queue에 들어갑니다.
job queue는 시스템의 모든 process로 구성되어 있습니다.
메인 메모리에서 실행을 기다리는 ready 상태의 process들은 ready queue에 쌓입니다.
I/O 장치를 기다리는 process들은 device queue에 들어갑니다.
Schedulers
다음에 실행될 process를 선택하고 process를 CPU에 할당하는 것을
CPU 스케줄러 또는 short-term 스케줄러 라고 합니다.
swap(or paging) 이 있는 CPU 스케줄러가 일반적으로 사용됩니다.
핵심 아이디어는 때때로 프로세스를 메모리에서 제거하는 것이 유리할 수 있고(swap out),
나중에 프로세스가 메모리에 다시 도입되어 실행(swap in)을 계속할 수 있다는 것입니다.
Context Switch
process가 실행되다 갑자기 interrupt가 발생해 os가 개입하여 CPU에 할당된 process를바꾸는 것을 의미합니다.CPU가 다른 process로 switch 할 때, 시스템은 작업중인던 process의 상태를 저장하고새로운 process의 상태를 load 합니다.context는 보통 현재 내 시스템에서 활용가능한 모니터링된 정보들을 의미합니다.CPU 입장에서 context는 PCB 이기 때문에 PCB 정보가 바뀌는 것을 context switch 라고 합니다.이러한 context switch는 overhead가 발생하기 때문에 너무 많이 발생하면 성능 저하를 야기합니다.Process Creation
process는 tree 형태로 구성되어집니다.
여러 process는 PCB에 저장된 pid(process id)로 식별합니다.
부모 process가 자식 process를 만드는 것과 동일합니다.
process가 만들어지는데 여러 옵션이 아래와 같이 있습니다.
Resource sharing option
1. 부모와 자식은 모든 resource를 공유합니다.
2. 자식은 부모 resource의 부분집합을 공유합니다.
3. 부모와 자식은 어떠한 resource를 공유하지 않습니다.
Execution option
1. 부모와 자식은 동시에 실행합니다.
2. 부모는 자식이 종료될 때까지 기다립니다.
Address space option
1. 자식은 부모의 복제입니다.
2. 자식은 하위 항목에 load된 프로그램을 가집니다.
ex) UNIX에서 process creation을 보겠습니다.
부모 process가 fork를 통해 자식 process를 만들어 냅니다.
자식 process는 부모 process의 주소 공간에 구성됩ㄴ디ㅏ.
fork()는 부모 process에게 자식 process의 pid를
자식 process는 0을 return 합니다.
exec() 시스템 콜은 fork() 이후에 사용되어지는데 자식 process가 현재 메모리 공간을
새로운 프로그램으로 대체하기 위함입니다.
Process Termination
process가 모든 작업을 끝내고 os에게 자신을 종료시키라고 요청할 때 exit(status)
시스템콜을 사용합니다.
부모 process는 wait(&status) 를 통해 자식 process에 대한 상태 value를 알아냅니다.
자식 process의 resource는 os에 의해 메모리 해제 됩니다.
부모 또는 user가 kill 시스템 콜이나 kill 명령어로 자식 process를 종료시킬 수 도 있습니다.
부모 process가 자식 process 보다 먼저 종료되면 자식 process는 부모 process 보다 상위 process
를 부모 process로 바라봅니다.
Zombie vs Orphan Processes
좀비 프로세스는 작업을 다 끝냈지만 process table에 정보가 그대로 남아있는 상태입니다.
자식 process가 종료되었음에도, 부모 process가 wait를 통해 자식 process가 return 한 정보를
회수 하지 않으면 발생합니다.
모든 process들은 아주 잠깐동안 좀비 process로 존재할 수 있습니다.
결국 좀비 process는 부모 process는 실행중에 있지만, 자식 process는 죽은 경우 입니다.
부모 process가 wait를 호출하지 않고 종료된 경우 자식 process는 orphan(고아)process가 됩니다.
즉, 자식 process는 아직 실행중에 있습니다.
이럴 경우 init process 자식 process에게 새로운 부모 process를 할당해 줍니다.
init process는 주기적으로 wait를 호출해 고아 process의 exit status를 수집합니다.
결국 고아 process는 부모 process는 죽고, 자식 process는 실행중에 있는 경우 입니다.
Process Address Space
각 process는 process address space(virtual address space)를 가지고 있습니다.
process address space는 물리적 주소공간에 mapping 되어 있습니다.
process가 malloc() 을 통해 동적메모리 할당을 요청했을 경우,
추가적인 물리적 메모리를 가지는 것은 아닙니다.
대신에 가상메모리 공간을 얻을 권리를 얻게 됩니다.
Paging Overview
가상 메모리(Virtual memory)에서 더욱 효율적이게 메모리를 관리하는 것입니다.
가상 메모리는 해당 process의 관련된 모든 data들을 적재하는것은 아닙니다.
각 process의 시작주소를 담아 사용하는것은 연속된 메모리 공간이 필요합니다.
하지만 연속된 메모리 공간을 확보하는것은 매우 힘들기 때문에 process의 physical 주소 공간이
연속되지 않아도 되는 메모리 관리 기법인 paging을 사용하는 것입니다.
logical memory 를 page라는 동일한 크기의 block
으로 나눕니다.
physical memory를 고정된 크기의 frame 이라는
block으로 나눕니다.
page와 frame의 크기는 보통 똑같습니다.
사용가능한 모든 frame들을 추적합니다.
n개의 page를 실행하기 위해, 우리는 m개의
사용가능한 frame들이 필요합니다.
(m < n)
각 process는 logical 주소로 부터 physical 주소로
옳기기 위해 page table에 셋팅 됩니다.
page table은 가상 주소를 physical 주소로 바꾸기 위한
정보를 가지고 있는 table 입니다.
Address Translation Scheme
보통 우리가 cpu로 부터 만들어진 주소를 logical 주소라 하고 RAM에 실질적으로 load 되는 주소를
physical 주소라고 합니다.
logical 메모리를 physical 메모리로 mapping 하기 위해 page와 frame은 번호를 갖습니다.
하지만 page의 번호만으로는 정확한 주소를 표기할 수 없어 offset을 사용합니다.
예를 들어 하나의 page가 4KB 라고 하면 page0의 크기도 4KB 입니다.
결국 page0는 주소로 따지면 0번지 부터 2^12(4096 = 4KB) 까지의 번지가 있는 것입니다.
따라서 page0의 0번 offset이라고 하면 2^12 위치의 logical 주소가 되고
page1의 0번 offset 이라고 하면 2^13 번지에 위치한 주소를 가리키게 됩니다.
page 번호를 p라고 표현하고 해당 page 내에서 주소 위치를 나타내는 offset을 d라고 표현합니다.
즉, logical 주소의 정확한 표현은 p와 d로 이루어 집니다.
따라서 위의 그림을 보면 page의 크기와 frame의 크기는 똑같기 때문에 offset도 똑같이 해주면 됩니다.
즉, logical 메모리에서 p페이지의 d offset 위치는 f 프레임의 d에 적재되어있는 것입니다.
Two-Level Page-Table Scheme
주소공간 낭비를 방지하기 위해 사용합니다.
자세한건 검색
Cooperating Processes
독립한 process들은 다른 process에게 영향을 끼치지 못하지만
cooperating 한 process들은 다른 process에게 영향을 끼칠 수 있습니다.
이러한 process간의 협력은 장점이 있습니다.
1. 정보 공유
2. computation 속도 증가
3. Modularity
4. 편리함
Inter-Process Communication (IPC)
서로 통신하는 process들은(IPC) 는 message passing과 shared memory를 사용합니다.
Message Passing System
send process가 정보를 recieve process에게 kernel을 통해 정보를 전달 하며,
receive process 또한 kernel에 접근해 정보를 받습니다.
이러한 정보 전달 방식은 context switching을 유발하며 속도가 느립니다.
message passing 시스템을 디자인 하는 데에는 몇가지 이슈가 있습니다.
1. Naming
2. Synchronization
3. Buffering
Naming
Direct Communication
process들은 서로의 이름을 반드시 명백하게 만들어야 합니다.
만약 process 이름이 각각 P, Q일 경우
send -> send a message to process P
receive -> receive a message from process Q
Indirect Communication
message들은 direct로 전달되고 mailbox(or port)를 통해 receive 합니다.
각 mailbox들은 고유의 id를 가집니다.
process들은 오로지 mailbox를 통해서만 통신할 수 있습니다.
결국, direct와 indirect는 kernel이 직접주냐 안주냐로 나눌 수 있습니다.
Synchronization
messaging passing을 할 경우 동기화 문제가 발생합니다.
이를 해결하기 위해 blocking 방식과 non-blocking방식을 사용합니다.
- Blocking send : 수신자가 메시지를 받을 때 까지 송신자는 block
- Blocking receive : 메시지를 수신할 때 까지 수신자는 block
- Non-blocking send : 송신자가 메시지를 보내고 작업을 계속 함
- Non-blocking receive : 수신자가 유효한 메시지나 null 메시지를 받음
Buffering
messeage queue는 아래 3가지중 하나로 구현됩니다.
- Zero capacity (0 messages)
송신자는 수신자를 반드시 기다려야 한다.
- Bounded capacity (유한한 n 개의 메시지들)
송신자는 link가 다 찰 경우 기다려야 한다.
-Unbounded capacity (무한한 메시지들)
송신자는 기다릴 필요가 없다.
Pipe
IPC의 대표적인 예시 입니다.
부모 process와 자식 process가 통신할 때 사용하는 방식입니다.
https://riveroilstone.tistory.com/165
Named Pipe (FIFO)
pipe이 이름을 붙이 named pipe를 사용하면
부모-자식 관계가 아닌 process 끼리 통신할 수 있습니다.
즉, process 끼리 통신이 종료되어도 계속 존재할 수 있습니다.
named pipe가 구축되면, 여러 process들이 이를 사용하여 통신할 수 있습니다.
c언어의 mkfifo() 또는 mknod() 함수로 만들 수 있습니다.
Sockets
socket은 client-server system 통신의 ipc의 대표적인 예 입니다.
IP 주소와 port 번호가 있으면 client는 네트워크를 통해 server process에 접근할 수 있습니다
예를 들어 socket 정보가 161.25.19.8:1625 라면
port 번호가 1625이고, host가 161.25.19.8 이라는 것을 의미합니다.
Socket Communication
Remote Procedure Calls (RPC)
process가 process가 네트워크로 이어져 있을 때 발생하는 호출을 말합니다.
서버와 client가 통신할 때는 IP 주소와 port를 묶어서 stub으로 만들어 전송합니다.
'운영체제(OS)' 카테고리의 다른 글
Chapter 9 (Main Memory) (0) 2022.11.21 Chapter 5 (CPU Scheduling) (0) 2022.10.26 Chapter 6 - 7 (Synchronization Tools and Examples) (0) 2022.10.22 Chapter 4 (Thread and Concurrency) (0) 2022.10.19 Chapter 1(Introduction) & 2(System Structures) (0) 2022.10.10