Process
- program이 실행하는 경우
- encapsulation
- dynamic, active 객체이다.
- memory에 있는 process들의 scheduling을 관리
- process는 process ID(PID)를 부여받고 식별자로 사용된다.
- task, sequential process로도 불린다.
- process의 정보 안에는 CPU contexts(registers), OS resource(memory, open files...), Other information(PID, state, owner...)
Process Address Space

- Code : ROM에 저장되며 Read only constanct
- Data : Global initialized data + Global uninitialized data(BSS)
- Heap : Dynamic Memory Allocation
- Stack : Function Call ← 함수가 호출될 때 지원하기 위한 공간을 제공, 사용을 다 한 뒤에는 사라진다.
- 각 process는 자신만의 address space, open files를 가진다.
- 개인 virtual CPU를 가진 것처럼 사용하지만 실제로는 아니다.
- 각 process에서 사용하는 주소는 해당 process에서만 의미가 존재하는 주소이다.
- 각 process는 개별적이지만 상호작용을 하는 경우도 있다.
- emacs edits file, gcc compiler... → IPC
Machine Cycle/Instruction Cycle : 한 명령어가 처리되는 cycle
Process States

- new/Embryo : 준비 작업을 하는 상태(memory..)
- ready(ready to run) : 실행이 가능한 상태, CPU가 주어진 것이 아닌 기다리는 상태
- running : scheduler dispatch로 CPU가 주어진 상태, timer interrupt가 걸려서 CPU가 없어지면 ready로 돌아간다.
- waiting(blocked) : I/O call을 실행하거나 event, msg 등을 wait하고 완료될 때까지의 상태 → CPU를 잠시 반납 → I/O가 완료되면 ready 상태로 바뀐다.
- terminated(zombie process) : exit call을 받아 process가 종료되는 것을 기다리는 상태(resource를 정리하는 동안)
- CPU가 1개라면 running상태는 1개이고 대부분 나머지는 ready 상태 or waiting 상태이다.
- ready 상태의 process는 scheduling queue 상태로 관리한다. waiting 상태의 process는 waiting queue가 별개로 존재해서 해당 queue에 위치한다.
- 장치마다 waiting queue가 존재한다. → waiting queue per device
Waiting(Blocked) State

- block 상태가 되면 process는 CPU를 반납해야한다.
- 반납을 하면 프로세스는 일시정지가 되고, CPU는 다른 프로세스에게 넘어간다. 하지만 I/O는 진행되기 때문에 concurrent하게 진행이 된다.
- 요청한 I/O가 끝날 때까지 run할 수 없다. 즉, CPU를 scheduling할 수 없다.
- waiting이 끝나면 ready 상태로 변한다. 바로 CPU를 줘서 run하지 않는다.
- foreground process : 사용자와 상호작용을 하는 process
- background process : 사용자와 상호작용을 하지 않는 process
Linux Process States

- ready 중에서 current라는 변수가 가리키는 process만 실제로 running이고 다른 process는 runable 상태이다.
- block 상태
- TASK_INTERRUPTIBLE : signal이 왔을 때 깨어날 수 있는 Task, (ex. getchar())
- TASK_UNINTERRUPTIBLE : I/O가 완료될 때 까지 signal이 와도 깨어날 수 없는 Task, disk와 같이 high speed I/O를 할 때 사용
Process Data Structures
PCB(Process Control Block)
- process를 관리하기 위해서 정보를 관리하기 위한 block
- process가 만들어지면 그 때 PCB도 함께 만들어진다.
- pid, user id, file info, priority, state, event waiting(block reason), open FDT, 할당된 자원, working dir, memory mng info, pending signals, machine(CPU) context
PCBs and Hardware State
- 어떤 process가 running할 때 hardware state는 CPU 내부에 있다.
- process가 OS에 의해 일시정지 되었을 때, register value(context)는 PCB에 저장해야 한다.
- OS가 다시 process를 실행하고 싶다면, PCB 내에 있는 register value를 이용하여 복구하여야 한다.
Context Switch

- 사용자에게 응답성(서비스 품질)을 높이기 위해 multitasking을 할 때 사용을 한다.
- 다른 프로세스로 넘어갈 때 자신의 CPU상태(hardware context)를 PCB에 저장하는 것
- PCB에서 context를 reload하는 것은 CPU에 reload하는 것이다.
- context switch는 항상 kernel 안에서 진행된다.
- process가 block되는 것도 kernel 안에서 block되고, resume도 kernel에서 resume된다.
- Administrative overhead
- register, mmap의 save 및 load
- memory cache
- 다양한 table, lists의 update
- 초당 100s / 1000s번 일어난다.
Process State Queues
State queues
- OS가 process의 상태를 관리하기 위한 자료구조
- Job queue, Ready queue, wait queue...
- PCB가 여러 queue를 다녀가며 실행된다.
Scheduling queue
- priority에 따라 PCB를 할당한다. priority는 0~99까지 할당된다.
- running 상태는 current 변수가 위치한 process이다.
Process Creation
Process creation events
- System call 호출
- System initialization
- init process : 제일 먼저 생성되는 최초의 process
Background processes
- user와 상호작용 없이 혼자 작동하는 process
- Daemons
Resource sharing
- User ID, open files, 등 resource를 parent가 child에게 inherit(상속)한다.
Execution
- 동등하게 같이 작동하거나 parent가 child가 끝날 때 까지 기다리거나
Address space
- child는 parent의 address space(code 부분)를 duplicates한다.
Linux Process Creation
fork()

- child는 부모로부터 대부분의 resource를 inherit한다.
- Same text(code + read-only data) : 사실은 같은 주소공간을 가리킨다.
- Real/effective user id, group id
- Working, root directory
- Open files
- open file의 r/w offset
- 하지만 별도의 다른 process로 인지해야한다.
- pid, PCB도 별개로 할당된다.
- 독립적으로 scheduling을 해야하고, private resource도 별개로 가진다.
- data/stack도 처음에는 복제가 되지만 이후는 child의 control에 의해 사용된다.
Linux exec()
- int exec(char prog, char argv[])
- exec을 call한 process는 잠시 멈춘다.
- hardware context를 초기화하고, ready queue에 넣고 실행을 대기한다.
- exec()이 정상적으로 작동했다면 return을 하지 못한다.
- exec()은 새로운 process를 생성하는 것이 아니라 기존 프로그램을 다른 것으로 바꾸는 것이다.
wait() system call
- status는 1byte 이내의 값(0~255)만 사용이 가능하다.
- 어떤 process가 종료되면 그 process의 정보를 즉시 제거하지 않는다. - zombie process
- status는 4byte int 형이고, control 정보등 다른 정보도 encoding이 되어있다.
- waitpid(pid, opt) : pid에 해당하는 process를 wait / opt = 0 : blocking, opt = WNOHANG : non blocking
process creation system calls

Policy vs Mechanism
Policy
- system을 사용하는 사용자 입장에서 설정하는 부분
- mechanism을 기반으로 관리자, 사용자가 선택하는 사항들
- ex) 자원을 얼마나 할당할 것인가, 어떤 process에게 어떤 우선순위를 줄 것인가
Mechanism
- 실제로 기술적으로 해당하는 기능을 제공하는 부분
- Kernel에 구현되어있는 부분을 말함
- 어떤 일을 “어떻게” 해야 하는지 방법에 대한 것
Seperating policy from mechanism
- 두 가지를 잘 분리해야 한다.
- 만일 같이한다면 system의 확장성이 떨어진다.
- mechanism은 어디서든 동작하게 일반적으로 만들어야한다.
- policy는 실제 사용되는 장소, workload에 따라 변화에 적응하는 방식으로 정해야 한다.
Inter-process Communications


- 각 process는 독립적이며, 자신의 영역에만 접근할 수 있고 다른 영역에는 접근하지 못한다.
- process끼리 정보를 주고 받을 때는 OS의 도움을 받아야한다.
a) kernel을 통해 message를 주고받기
b) OS에게 memory 영역을 할당받아서 두 process가 함께 영역을 공유 – shared region attach
c) signals, alerts로 사건을 전달
- 한 개의 machine 내에서 정보 교환 방법
- sharing files
- sharing file pointer between parent and child
- message queue
- semaphores
- signals
- pipe : circular queue b/w processes
- unnamed pipe : parent, children 사이에 사용
- named pipe : 서로 독립적인 processes 사이에 사용 – mkfifo
- machine 사이의 정보 교환 방법 → network로 주고받는다.
- Sockets
- RPCs(Remote Procedure Calls) : 복잡성↓, 마치 procedure를 호출하는 것과 같이 인터페이스 제공
- Java RMI(Remote Method Invocation) : 복잡성↓, 마치 procedure를 호출하는 것과 같이 인터페이스 제공
PIPE
![업로드중..]()
- memory buffer를 제공하여 file과 같이 사용할 수 있도록 하는 방식
- 2개의 r/w pointer가 할당된다. → offset
- 1개는 reading을 할 때 사용되고, 나머지 1개는 writing을 할 때 사용된다.
- pipe는 둘 사이의 동기화를 system이 자동으로 support를 해주기 때문에 mutual exclusion이 된다.
- pipe에 data가 없는데 read를 시도하면 해당 process는 새로운 data가 들어올 때까지 block이 된다.
- pipe에 data가 가득 차 있는데 write를 시도하면 빈자리가 생길 때까지 block이 된다.