본문 바로가기

CS/오퍼레이팅 시스템

15. IPC 프로세스간 커뮤니케이션 : shared memory, producer-consumer문제

- independent : 다른 프로세스의 영향을 받지 않음

- cooperating : 여러 프로세스가 병렬적으로 수행되면서 한가지 일을 당성하고자함

 

* IPC의 장점

- information sharing : 파일 하나만 오픈하고 공유하면 리소스 사용을 줄일 수 있음

- computation speed up : 병렬적으로 수행하여 빨라짐

- modularity : 하나의 프로세스에 모든 기능을 넣으면 프로세스가 방대해져서 프로그램 모듈화가 어려움

- convenience : 여러가지 일을 한 번에 처리해서 편리하게 일 처리를 함

 

하지만 각 프로세스마다 주소 공간이 있고 다른 프로세스의 공간을 볼 수 없어서

여러 프로세스간의 커뮤니케이션은 어려움

 

*IPC는 커널의 도움을 받아서 프로세스간 커뮤니케이션이 가능하다

1) message passing : 커널 내부에 메일 박스라는 데이터 스트럭처를 생성

2) shared memory : 특정 프로세스의 일부를 공유 영역으로 지정하고 그 영역을 통해서 커뮤니케이션 진행

 

*IPC의 전형적 예시 - producer-consumer 문제

- producer는 아이템을 계속 생산하고 conumer는 생산된 아이템을 계속 소비함

 두 프로세스는 synchronization이 필요하게 됨

- 이 문제는 shared memory 방법을 사용함

producer 프로세서가 생산한 아이템을 저장한 공간을 버퍼라고 하고

그 버퍼를 consumer 프로세스가 소비하는 공간으로도 볼 수 있다

bounded 는 버퍼에 생산할 수 있는 아이템의 개수 제한이 있는 거고 unbounded는 개수 제한이 없는 거임

#define BUFFER_SIZE 10
typedef struct {
...
}item;

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

- 아이템 구조체를 정의함

- in은 비어있는 위치 인덱스이고, out은 차 있는 첫번째 인덱스를 가리킴

1) in, out은 버퍼가 비어있을 때 두 포인터가 가리키는 공간이 같음

2) 버퍼가 비어있으면 consumer는 spin lock을 이용해서 아이템을 waiting : 이때 while loop를 사용

3) producer 가 아이템을 생산

4) 아이템이 버퍼에 들어가고 이때 in은 현재 아이템이 있는 위치의 다음 위치인, 아이템이 없는 위치를 가리킴

5) consumer가 아이템이 있는 것을 확인하고 spin lock에서 벗어남

6) consumer가 아이템을 소비하고나면 out은 다시 in과 같은 위치를 가리킴

 

- producer

while(true){
	/* Produce an item*/
	while((in+1)%BUFFER_SIZE == out)//버퍼가 가득차면
    ; // 아무것도 안함
    buffer[in] = item; // 아이템을 만들면 아이템을 넣어주고
    in = (in+1) % BUFFER_SIZE // in의 위치를 갱신해줌
}

- consumer

while(true){
	while(in == out) // 버퍼가 비어있으면 소비할 아이템이 없다는거
    ; // 그럼 아무것도 안함
    
    // 버퍼에서 아이템을 소비
    item = buffer[out];
    out = (out+1) % BUFFER_SIZE;
    return item;
}

운영체제 synchronization에서 스핀락을 되게 많이 사용함

shared memory 방법에서는 synchronization이 필요

 

*shared memmory

1) shmget 시스템콜 : 특정 공간을 공유공간으로 지정하는 시스템콜

2) shmat 시스템콜 : 남의 영역을 자기 영역인냥 사용하기 위해 그 공간을 attach하는 시스템콜

3) 자연스럽게 read write를 두 프로세스가 하면서 ipc가 진행됨

4) shmdt : 공유영역을 삭제하기 위해 해당 영역을 detach하는 시스템콜