[OS] 프로세스의 이해-2

Chris Kim·2024년 10월 15일

공룡책

목록 보기
4/14

4. 프로세스간 통신

프로세스가 동시에 실행된다는 것은 (1) 독립적으로 실행되거나 (2) cooperating 하거나 둘 중 하나다.
문제는 cooperating 일 경우, 다른 프로세스와 데이터를 공유할 때가 문제다.

IPC(Interprocess Communication) 메커니즘이 필요하다.

  • 데이터를 주거나, 혹은 받거나 하게 해주는 메커니즘이다.

(a)shared memory를 쓰거나
(b)message passing을 쓰는 모델이 있다.

5. 생산자-소비자 문제

생산자는 소비자가 소비하는 정보를 생산한다. 예를 들어 컴파일러는 어셈블리 코드를 생산하고, 어셈블러가 이를 이용한다. 웹서버는 HTML 파일을 생산하고, 브라우저가 이를 사용한다.

5.1 shared memory

생산자와 소비자가 concurrent하게 진행되는 경우, buffer를 사용하여 shared memory 솔루션을 사용할 수 있다. 생산자는 버퍼를 채우고, 소비자는 버퍼를 완전히 비운다. shared memory는 생산자와 소비자 프로세스가 공유하는 메모리 영역이다. 여기서 buffer의 크기는 bounded다.

#define BUFFE_SIZE 10

typedef struct{
...
} item;

item buffer[BUFFER_SIZE];
int in 0;
int out 0;

item next_produced;

while(true){
	while(((in+1)%BUFFER_SIZE) == out)
    	; /* do nothing
    buffer[in] = next_produced;
    in = (int + 1) % BUFFER_SIZE;
}

item next_consumed;

while(true){
	while(in == out)
    	; /* do nothing
    next_consumed = buffer[out];
    in = (int + 1) % BUFFER_SIZE;
	/* consume the item in next_consumed */
}

하지만 이 방식도 문제가 있다.

  • 프로그래머가 명시적으로 shared memory에 접근, 조작하도록 코드를 짜야한다.

5.2 Message-Passing

O/S가 메시지 전달 수단을 제공해준다.

  • send(message)
  • receive(message)
message next_consumed;
while(true){
	receive(next_consumed)
}

communication link의 구현은 직/간접적으로 통신, 동기화/비동기화 통신, 자동/명시 버퍼링 등 다양한 설계 옵션이 존재한다.

5.3 Direct message-passing

각 프로세스가 통신 상대방을 아는 경우, 송수신자의 이름을 명시적으로 알고 있어야한다.
send(P,message)
receive(Q,message)
이 방법을 통해 링크는 자동적으로 설정된다. 그리고 이 링크는 두 프로세스만을 연결한다.

5.4 inDirect message-passing

메시지는 mailbox, ports로 보내진다. port는 메시지가 저장되고 삭제될 수 있는 오브젝트다.
send(A, message)
receuve(A, message)
이 통신에서는 두 구성원이 포트를 공유할 때, 링크가 만들어진다. 이 링크는 두 개 이상의 프로세스가 참여할 수 있다. 수많은 링크가 각 프로세스 쌍에 대해서 만들어 질 수 있다.
따라서 OS는 port를 생셩하고 여기에 송수신하고, 메시지를 삭제할 수 있는 기능을 제공한다.

5.5 Bloking

송신자는 수신자가 메시지 수신을 완료할 떄까지 block된다.
수신자는 메시지 수신이 완료할 떄까지 block 된다.

5.6 non-Blocking

송신자는 메시지를 보내고, 다른 작업을 수행한다.
수신자는 유효한 메시지 혹은 비어있는 메시지를 받게된다.

6. 프로세스간 통신의 실제

6.1 IPC 예시

  • POSIX의 shared memory(Portable Operating System Interface(for uniX))
  • Pipes의 message passing

6.2 POSIX

memory-mapped 파일을 이용하여 shared memory 영역을 설정한다.

fd = shm_open(name, O_CREAT | ORDWR, 0666); // 공유 메모리 객체 생성
ftruncate(fd, 4096); //객체 크기 설정, 바이트 단위
mmap(0, SIZE, PROT_REAT | PROT_WRITE, MAP_SHARED, fd, 0); // memory mapped ㅏ일 생성

6.3 Pipes

유닉스에서 가장 초창기에 사용하던 방식이다. 파이프 구현에는
unidirectional, bidirectional
half-duplex, full-duplex
프로세스 간 부모-자식 관계를 가져야 하며, 네트워크에선 안쓰인다.

두 개의 타입이 있다 Ordinary pipes, Named pipes을 살펴보자
후자는 부모-자식 관계가 아니어도 사용할 수 있다.
uni면 하나, bi면 두 개의 파이프를 쓰면 된다.

6.4 클라이언트-서버 시스템

네트워크에서는 두 가지가 사용된다.
(1) Sockets : 통신을 위한 양 종단(IP Adress+Port)
(2) RPC(Remote Procedure Calls) : 네트워크 시스템 상 프로세스 간의 원격 호출을 저장.

6.5 소켓

IP 주소와 Port의 조합으로 구성된다.
JAVA는 소켓에 관해 쉬운 인터페이스를 제공해준다.
Socket class - TCP
DatagramSocket-UDP
MulitcastSocket

6.6 RPC

출처 인프런 강의

profile
회계+IT=???

0개의 댓글