[OS] 운영체제(3장) 프로세스 - 2
3. 프로세스 연산
프로세스 생성
- 프로세스는 create-process 시스템 호출을 사용하여 new 프로세스를 생성
- 부모 프로세스 - 자식 프로세스
- 생성된 프로세스들의 계속적인 프로세스 생성의 결과로 프로세스 트리(process tree)를 형성
- 프로세스들은 프로세스 식별자(process identifier, pid)로 구분
부모프로세스와 자식프로세스 간의 여러 가지 자원 공유 방법
- 자식 프로세스가 OS에서 자원을 직접 얻음
- 부모와 자식 프로세스간에 자원을 공유하지 않음
- 자식 프로세스가 부모 프로세스 자원의 부분집합을 사용
- 자식 프로세스는 부모 프로세스의 모든 자원 또는 일부 자원 공유
- 부모 프로세스는 자식 프로세스들에게 자신의 자원을 분할 제공
Linux 시스템의 프로세스 트리
실행(Execution)
- 부모와 자식이 병행(concurrent) 수행 or 부모가 모든 또는 일부 자식이 끝나기를 기다림(wait)
주소 공간(Address space)
- 자식은 부모의 복사본(duplicate) or 새로 적재되는 프로그램을 가짐
Examples
- UNIX: fork 와 exec system call 사용
- fork() : new process 생성. 부모 프로세스의 주소공간의 복제본으로 구성됨
- exec() : 프로세스 메모리 공간을 새 프로그램으로 대치하여 새로운 프로그램을 실행
- Win32 API:
- CreateProcess() : 프로그램을 적재하여 자식프로세스를 생성하여 실행. 인수가 복잡함(10개 이상)
UNIX에서의 프로세스 생성
프로세스를 생성하는 C 프로그램 (UNIX/Linux)
#include <stdio.h>
int main(void)
{
int pid;
pid = fork(); /* fork another process */
if (pid < 0) {
fprintf(stderr, "Fork failed");
exit(-1);
} else if (pid == 0) { /* child process */
execlp("/bin/ls", "ls", NULL); /* execute a new program */
} else { /* parent process */
wait(NULL); /* wait for the child to complete */
printf("Child complete");
exit(0);
}
}
UNIX에서의 fork/exec/wait 동작
프로세스 종료 (정상적)
프로세스의 정상 종료
- 프로세스가 마지막 문장의 실행이 끝나면 exit() 시스템 호출을 하여 운영체제에게 자신을 삭제를 요청함
- 자식 프로세스는 부모에게 상태 값(대개 정수)을 반환할 수 있다.
- 부모는 wait() 시스템 호출을 하여 이 값을 기다림
- 운영체제는 프로세스가 사용한 자원을 반납(deallocate)함
좀비(Zombie) 프로세스
- 종료되었지만 부모가 wait()를 아직 호출하지 않아서 남아있는 프로세스
- terminated/zombie 상태로 짧은 시간 동안 이 상태에 머무름
프로세스의 종료 (비정상적)
프로세스의 비정상 종료
다음 경우에 부모가 자식을 종료할 수 있음
- child가 자신에게 할당된 자원을 초과하여 사용할 때
- child에게 할당된 태스크(작업)가 더 이상 필요 없을 때
- 부모 종료 시, 운영체제가 자식이 계속하여 실행하는 것을 허용하지 않을 때 → 연쇄적 종료(cascading termination)
부모 프로세스 종료 후에 자식의 계속적인 실행을 허용하는 경우
- 모든 프로세스는 종료 후 처리를 위하여 부모 프로세스가 있어야 함
- 부모가 먼저 종료된 자식 프로세스는 고아(orphan) 프로세스가 되며 init 프로세스(Linux는 systemd 프로세스)를 새로운 부모 프로세스로 지정함
4. 프로세스간 통신(Interprocess Comminication)
병행(concurrent) 프로세스의 종류
- 독립(Independent) 프로세스:
- 다른 프로세스의 실행에 영향을 주거나 받지 않음
- 협력(Cooperating) 프로세스:
- 다른 프로세스의 실행에 영향을 주거나 받음
프로세스 협력을 허용하는 이유
- 정보 공유 (예) 공유 파일
- 계산 가속화(Computation Speedup)
- 작업을 서브 작업으로 나누어, 병렬 실행
- 모듈성(Modularity) – 기능 모듈화
- 편의성(Convenience)
- 개별 사용자가 한 번에 여러 작업을 수행함
프로세스간 통신(IPC) 모델
두 가지 IPC 모델 : 메시지 전달, 공유 메모리
공유 메모리 시스템 IPC
Shared Memory Systems – 공유 영역에 있는 버퍼 사용
시스템 호출을 사용하여 공유 메모리 영역 지정
- UNIX: shmget(), shmat() 공유 메모리가 지정되면 보통의 메모리와 같이 접근됨
생산자-소비자 문제(Producer-Consumer)
- 협력 프로세서들의 간단하고 전형적인 예
- producer 프로세스는 정보를 생산하고, consumer 프로세스는 정보를 소비함
생산자-소비자 문제의 공유 메모리 구현 방법 – 두 유형의 버퍼
- 무한(unbounded) 버퍼 : 버퍼 크기의 제한이 없음(이상적)
- 유한(bounded) 버퍼 : 고정된 버퍼 크기
- 버퍼가 full이면 producer는 기다려야 함
메시지 전달 시스템 IPC
메시지 전달
같은 주소 공간을 공유하지 않고, 통신으로 동작을 동기화하는 기능을 제공함(네트워크로 연결된 분산환경에 특히 유용)
메시지 전달 IPC 함수 – 최소 두 가지 제공
- send(message)
- receive(message)
메시지 크기와 IPC 구현
메시지 크기 | OS구현 | 응용프로그래밍 |
---|---|---|
Fixed size | 간단함 | 더 복잡함 |
Variable size | 더 복잡함 | 간단함 |
한 번에 전송/수신할 수 있는 메시지 길이는 제한됨. 길이가 길면 제한된 길이로 분할하여 여러 번 전송하거나, 여러 번 수신하여 합해야 함
- fixed size IPC : 프로그래머가 이 작업을 수행
- variable size IPC : IPC 함수에서 이 작업을 수행
IPC의 통신 연결(Communication Link)
통신 프로세스 P와 Q가 서로 통신을 하려면 그들 간에 통신 연결이 설정되어야 함
communication link의 구현
- 물리적 구현 : 공유 메모리, 하드웨어 버스, 네트워크
- 논리적 구현 : 운영체제의 관심 사항
communication link와 send/receive의 논리적 구현 방법
- direct / indirect communication → 명명(naming) 방법
- 상대편을 참조하는(가리키는) 방법
- synchronous / asynchronous communication
- send와 receive의 동작 동기화 여부
- 자동(automatic) / 명시적(explicit) buffering
Naming - Direct Communication
Direct Communication – 서로의 이름을 명시 (대칭 주소 지정)
- send (P, message) – process P에게 message 전송
- receive(Q, message) –process Q로부터 message 수신
비대칭(asymmetric) 주소 지정
- send(P, message)
- receive(id, message) – 임의의 process로부터 message 수신 id = sending process의 이름
communication link의 특성
- 링크가 자동적으로 설정
- 링크는 두 프로세스들 사이에서만 연관됨
- 두 프로세스들 사이에 정확히 1개의 링크만 존재
문제점
프로세스의 이름을 변경하면, 다른 프로세스에서 필요한 부분을 조사하여 이름 변경을 반영해야 함 → 해결책: 간접 통신
Naming - Indirect Communication
mailbox (또는 port)를 경유하여 message를 송신하거나 수신함
- 각 메일박스는 고유의 ID를 가짐
- 프로세스들은 메일박스를 공유할 때에, 메일박스를 통하여 통신
메일박스를 사용한 send/receive
- send(A, message): mailbox A로 message 송신
- receive(A, message): mailbox A에서 message 수신
communication link의 특성
- 프로세스들이 공유(common)메일박스를 가질 때에만 통신 링크가 설정됨
- 링크는 두 개 이상의 프로세스와 연관가능
- 두 프로세스들 간에 다수의 링크를 공유 가능
메일박스 생성 및 소유
- 운영체제는 메일박스 생성/송수신/삭제 기능
- 메일박스는 생성한 프로세스의 소유임
- 운영체제도 자체의 메일박스 소유 가능
동기화(Synchronization)
동기식(synchronous) 통신 - Blocking 송수신
동작이 상대편 동작에 영향을 받음
- Blocking send - 송신 프로세스는 수신 프로세스나 메일박스가 메시지를 받을 때까지 block 되어 있음
- Blocking receive - 수신 프로세스는 수신 메시지가 있을 때까지 block 되어 있음
비동기식 통신 - Non-blocking 송수신
동작이 상대편 동작에 영향을 받지 않음
- Non-blocking send - 송신 프로세스는 메시지를 보내고 바로 return. 작업을 계속 수행함(수신 여부와 관계없이)
- Non-blocking receive - 수신 프로세스는 유효한 메시지를 받거나 널을 받고 바로 return. 작업을 계속 수행함
동기식 통신이 프로그래머가 사용하기 더 쉽다
버퍼링(Buffering)
메시지 큐
프로세스간에 교환되는 메시지는 링크에 연관된 message queue(버퍼)에 저장되어 전송됨
buffer queue의 구현 방법
- 유한용량(Bounded capacity) - 유한한 길이의 버퍼(길이 n)
- 큐가 full이면 sender는 기다려야 함
- 무한용량(Unbounded capacity) - 무한한 길이의 버퍼(이상적)
- Sender는 결코 기다리지 않음
- 무용량(Zero capacity) - 링크에 버퍼가 없음
- Sender는 receiver가 준비되어 직접 수신할 때까지 기다려야 함
→ 랑데부(rendezvous)라고 함
댓글남기기