운영체제 3장 - 프로세스 연산과 프로세스간 통신
3.3 프로세스 연산
프로세스 생성(Creation)
- 프로세스는 create-process 시스템 호출을 사용하여 새로운 프로세스를 생성함
- 부모-자식 프로세스 관계
- 프로세스들은 프로세스 식별자(process identifier, pid)로 구분함
- 부모 프로세스와 자식 프로세스간의 자원 공유 방법
- 자식 프로세스가 OS에서 직접 자원을 얻음
- 자식 프로세스가 부모 프로세스의 자원을 일부 사용
- 부모 프로세스와 자식 프로세스간의 자원 공유 방법
- 실행(Execution)
- 부모와 자식이 병행(concurrent) 수행
- 혹은 부모가 모든 또는 일부 자식이 끝나길 기다림
- 주소공간(address space)
- 자식은 부모의 복사본 - UNIX, Linux
- UNIX 의
fork()
는 새로운 프로세스 생성, 부모 프로세스의 주소공간의 복제본으로 구성됨.exec()
는 프로세스의 메모리 공간을 새 프로그램으로 대치하여 새로운 프로그램을 실행
- UNIX 의
- 자식은 새로 적재되는 프로그램을 가짐 - windows
- 자식은 부모의 복사본 - UNIX, Linux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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);
}
}
프로세스의 종료
- 정상 종료
- 프로세스가 마지막 문장의 실행이 끝나면,
exit()
시스템 호출을 하여, 운영체제에게 자신의 삭제를 요청함 - 자식 프로세스는 부모에게 상태값을 반환할 수 있음
- 부모는
wait()
시스템 호출을 하여 이 값을 기다림
- 부모는
- 운영체제는 프로세스가 사용한 자원을 반납함(deallocate)
- 프로세스가 마지막 문장의 실행이 끝나면,
- 좀비 프로세스
- 종료되었지만, 부모가 wait()을 아직 호출하지 않아 남아있는 프로세스
- 비정상 종료
- 부모는
abort()
를 호출하여 강제종료 시킬 수 있음- 자식이 자신에게 할당된 자원을 초과하여 사용할 때
- 자식에게 할당된 작업이 더이상 필요하지 않을 때
- 부모가 종료하는데, 운영체제가 자식이 계속하여 실행하는 것을 허용하지 않을 때
- 부모 프로세스 종료 후에 자식의 계속적인 실행을 허용하는 경우
- 자식 프로세스는 고아 프로세스가 되며, init 프로세스를 새로운 부모로 지정함
- 모든 프로세스는 종료 후 처리를 위해 부모 프로세스가 있어야함
- 부모는
3.4 프로세스간 통신(Interprocess Communication)
- 병행(concurrent) 프로세스의 종류
- 독립(Independent) 프로세스 : 다른 프로세스 실행에 영향을 받지 않음
- 협력(Coopertaing) 프로세스 : 다른 프로세스의 실행에 영향을 주거나 받음
- 정보 공유, 계산 가속화, 모듈성, 편의성 등을 위해 협력함
- 크롬 브라우저는 3 프로세스를 사용. 문제 발생시 다른 렌더러에 영향을 주지 않음
프로세스간 통신 모델 (IPC)
- 메시지 전달(Message Passing) 방식
- 통신을 하고 동작을 동기화 하는 기능을 제공함.
- 메시지 전달 IPC 함수 이용.
send() recieve()
- 고정 사이즈 방식과, 변동 사이즈 방식
- 적은 양의 데이터 전달에 유용
- 충돌이 없음
- 구현이 용이
- 코어 수가 증가할 때 더 나은 성능
- 공유 메모리(Shared Memory) 방식
- 공유 영역에 있는 버퍼 사용
- 시스템 호출을 사용하여 공유 메모리 영역을 지정함
- 최대 속도
- 편의성. 보통 메모리처럼 접근 가능
- 코어 수 증가 시, 캐시 일관성 문제로 성능 저하
- 생산자-소비자 문제
- 버퍼의 크기가 유한하므로, 생산자는 버퍼가 비길 기다려야함
IPC의 통신 연결(Communication Link)
- 운영체제는 물리적 구현은 관심 없고, 논리적 구현에만 관심을 가짐
- 연결 방식 : direct / indirect
- direct communication : 서로에게 이름을 명시함
- 프로세스의 이름을 변경하면, 모든 다른 프로세스가 정의에 대한 재검사가 필요함
- indirect communication : 메일박스를 경유하여 메시지를 송수신함
- direct communication : 서로에게 이름을 명시함
- 동기화 여부 : synchronous / asynchronous
- 동기식 통신 : 동작이 상대편 동작에 영향을 받음. Blocking
- 비동기식 통신 : 동작이 상대편 동작에 영향을 받지 않음. Non-Blocking
- 버퍼링
- 자동 버퍼링(Automatic Bufferuing) : 운영체제가 버퍼 관리
- 명시적 버퍼링(Explicit Buffering) : 사용자가 버퍼 관리
3.5 IPC 시스템 사례 - UNIX의 공유 메모리 함수
- Shared Memory IPC
- POSIX shared memory IPC
- Mach의 message passing
- Windows의 IPC - Local Procedure Calls
3.6 클라리언트-서버 시스템에서의 통신
- 소켓(Sockets)
- 응용프로그램간에 통신이 연결되는 종단점(endpoint)
- IP 주소와 포트번호에 의해 식별됨
- IP주소는 해당 시스템을, 포트 번호는 프로세스와 연결됨
- 원격 프로시저 호출(Remote Procedure Calls)
- 일반적으로 프로세스는 자신의 주소 공간안에 존재하는 함수만 호출하여 실행 가능
- 그러나, RPC를 이용하면 원격지의 프로세스에 접근하여 프로시저 또는 함수를 호출하여 사용 가능함
- Stubs : 서버의 프로시저에 대한 원격 호출을 대행해주는 프로시저
- 파이프(pipes)
- 두개의 프로시저가 서로 통신이 가능하도록 전달자 역할 수행
- 단방향 또는 양방향
- 일반 파이프
- 생성한 프로세스만 접근 가능
- 생산자-소비자 형태로 두 프로세스간의 통신을 허용
- 부모 프로세스가 파이프 생성, 자식 프로세스를 생성하여 통신
- 지명 파이프(named pipe)
- 지명 파이프를 사용하는 프로세스들은 부모-자식 관계가 필요하지 않음
- 양방향 통신 가능
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.