fork 함수의 몇가지 이슈
- 1. Resource sharing options : 자원 공유 : subset, 즉 일부만 공유한다
- 2. Execution options : 수행 측면 : Parent, child는 concurrently 하게 동작한다
Parent 는 child 가 termination 될때까지 wait 한다
- 3. Address space : Child 는 duplicate 한 후 exec 로 초기화를 하여 또다른 process를 생성한다
Stack, Heap, Data, Text 중 Text는 새로운 코드로 바뀌며 나머지는 초기화 된다.
fork 4가지 측면 정리
- 1. Resource sharing : subset
- 공유 가능 : file
- 공유 불가능 : CPU time, memory : 별도의 process이기 때문
- 2. Execution : concurrently
- 3. Address space
- Fork : Duplicate, exec : 초기화
- 4. call once, return twice : return value 값에 따라 Parent, Child 프로세서를 구별
- value : 0 : Child Process
- value : PIC : Parent Process
- value : 음수 : Error
Zombie status
- child process가 terminate 된 후 반환되지 않는 경우의 상태
- Parent : fork 실행 후 보통 wait 을 실행하여 반환값을 기다린다
- wait 함수가 없는 경우 child가 termitate 되면 zombie 상태로 전환된다
Parent : fork -- | wait ---------- | ready -- dispatch
Child : | exec -- exit |
Process termination
- exit : 자발적인 종료 : 인자를 통해 Parent Process로 데이터를 전송할 수 있다
- abort : 비자발적인 종료 : Tree 구조이기 때문에 child Process의 처리가 필요하다
- 1. cascading termination : 해당 Process + Child Process 모두 termination
- 2. orphan process : 해당 Process의 Child Process들을 init Process의 Child로 이동시킨 후
해당 Process만 termination
IPC : Inter-Process Communication
- Indepentent : 독립적인 Process
- Cooperating : Communitation이 필요한 Process
- Information Sharing : 정보를 공유한다
- speed up : 빠르게 효율적으로 작업을 수행한다
- Modularity : 모듈화로 일을 효과적으로 분산한다
- Convenience : editing, printing, compiling을 동시에 수행한다
P-C process (Producer, Consumer)
- buffer를 통해 정보를 send, read 한다
- buffer는 shared memory 공간에 위치한다
Buffer and Synchronization : 동기화
- in, out 위치를 통해 데이터 유무 구별이 가능하다
- in : Free position in the buffer : 비어있는 공간 위치
- out : the First full position in the buffer : 차있는 공간의 첫번째 위치
- Spin Lock : 동기화를 위해 사용되는 기술 (loop)
- Producer : while(((in+1)%BUFFER_SIZE) == out) 즉 꽉 찬 경우에 Spic Lock 활성화
- Consumer : while(in == out) 즉 비어있는 경우에 Spin Lock 활성화
IPC의 방법
- 1. Message passing : Mailbox를 생성하여 kernel을 통해 데이터를 송수신
- send, read 할 때 마다 system call : kernel 도움이 필요하다
- 2. Shared Memory : 한 Process 내부에 공간을 할당하여 두가지 이상의 Process간의 데이터를 송수신
- 공유할 Process 내에서 할당시에만 system call : kernel의 도움이 필요하다
- 공간 생성시 shmget 함수 실행
- 공간 접근시 shmat 함수 실행
- synchronalization 설정이 필요하다
Establishing links
- 1. Dirent communication : Hard coding : 보내고 받는 Process의 이름이 필요하다
- Q.send(P, message)
- P.receive(Q, message)
- 2. Indirent communitation : mailbox, 즉 shared memory를 통해 송수신
- 매개체 : OS, hard coding 방식이 아니다