실제적으로 IPC를 사용하는 방법 살펴보기!
1.
POSIX shared memory 사례
cf> fd = fopen()을 통해 파일을 열 경우, 일반적인 경우 HDD(하드디스크)의 스토리지 시스템에 영역을 잡게 된다.
POSIX는 memory-mapped files을 이용하는데, 이는 메모리에 파일을 생성해서 훨씬 빠른 속도로 읽을 수 있다. memory-mapped files를 사용하려면 다음과 같은 과정을 거친다.
먼저 공유 메모리를 메모리 영역에 생성해서,
read, write 하는 단위(chunk)의 크기를 정해주고,(ex > 4096)
memory-mapped file을 공유메모리에다가 mapping 시켜준다.
ex >
shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
⇒creat 및 read, write 권한을 준다.
ftruncate로 사이즈를 준다.(read, write 하는 청크 단위 사이즈 정해주기)
ptr = (char *)mmap(~~~,shm_fd, 0);
⇒ 메모리에 shared-file 영역을 주었다.(shm_fd가 메모리에 생성된 영역을 가리키게 된다)
sprintf(ptr, “%s”, message_0);
⇒ptr 포인터가 가리키는 영역에 message_0의 문자열을 write한다.
ptr += strlen(message_0);
⇒ message_0문자열의 길이 만큼 ptr이 가리키는 위치를 뒤로 이동시킨다.
소비자의 경우, shm 오픈 및 메모리 맵핑 시키는 것도 똑같다.
⇒ 맵핑을 시키고 나면 Ptr이 생산자가 아까 쓴 string의 맨 처음 주소를 가리키게 된다.
printf(”%s, (char *)str);
⇒ Ptr이 가리키고 있는 스트링을 출력
shm_unlik(name);
⇒ 쉐어드 메모리 영역 삭제(다 소비했으므로)
→ 쉐어드 메모리 방식 → 일일이 다 오픈, 라이트, 리드, 클로즈 해줘야 해서 번거로움
2.
Pipe 사례
•
초창기 유닉스 시스템에서의 초기 IPC 매커니즘
•
파이프는 두개의 프로세스가 커뮤니케이션 하기위한 도구처럼 행동한다.
•
파이프 구현은 unidirectional or bidirectional 하게 할 수 있다.(단방향 흐름 or 양방향 흐름)
•
two-way communication : half-duplex or full-duplex
•
relationship 이 존재해야하는지(ex> parent - child)
•
네트워크를 통해서도 갈수 있는지? ⇒ 요즘 파이프는 네트워크에서 쓰진 않고, 네트워크에서 비슷한 역할로는 소켓을 쓴다.(아주 예전 구시대의 파이프는 네트워크를 통한 것도 고려해서 구현하기도 했다)
•
등을 결정해서 구현 할 수 있다.
파이프의 2가지 타입
Ordinary pipes: 반드시 parent-child 관계가 필요.
Parent가 pip를 create 하면 반드시 child process와 coummunication 하는 데 써야 한다.
양방향 통신을 위해서는 반드시 2개의 파이프가 필요하다.
one-way면 1개로도 가능
Named pipes :parent-child relationship 없이도 쓸 수 있는 파이프. 두개의 프로세스 사이에 수많은 수와 종류(방향이 다른) 파이프가 존재할 수 있고, 각각에 이름을 붙여 줄 수 있다.
유닉스에 존재하는 pipe 유닉스 시스템 콜에 fd배열을 주면, (현재 양방향 Ordinary라고 가정하면 무조건 fd 배열의 길이는 2)
하나는 read end로, 다른 하나는 wirte end로 생성해서 반환해 준다.
페어런트가 공급자, 차일드가 소비자인 경우.
파이프에서는 fort()를 하는 순간, Parent가 돌고, child 프로세스도 돌고 pipe(fd[ ]) 를 통해 생성한 두개의 end를 통해 통신을 할 수 있게 한다.
⇒ shared 메모리 방식에서 조금 더 진화된 Pipe 방식이었음.
네트워크를 사용하는 컴퓨터를 고려하자면, internet을 이용해 통신을 하려면 shared memory나 pipe는 사용할 수 가 없다.
이런 배경에서 socket이 등장했다.
소켓
•
통신을 위한 양 종단.
•
통신을 할 각각 컴퓨터를 IP address로 특정화 하고, 양 컴퓨터를 연결할 파이프는 “포트”가 대신한다.
•
이 IP address와 port를 한데 묶으면 → 이게 소켓이다!
•
2개의 remote(원격지)에 있는 컴퓨터하고의 연결을 의미한다.
•
소켓을 연결하면 데이터를 주고 받을 수 있게 된다.
⇒ 그런데! 각각의 컴퓨터 사양( 32 bit과 64 bit 등등)이 다르면 소켓으로 통신을 하기가 까다로운데, 이를 보완하기 위해 나온 것이 RPCs 이다.
IP address와 포트 넘버로 네트워크 상의 컴퓨터를 특정화 할 수 있다.→ socket connetion을 맺어서 통신 가능.
소켓 프로그래밍을 할 땐 자바를 언어로 채택하면 쉽게 학습할 수 있다.
자바의 3가지 소켓 종류 :
그냥 소켓 : TCP소켓 → 서버 소켓은 이걸 상속한 클래스.
datagramSocket : UDP (broad cast, 방송)
MulticastSoket : 특정한 recipient들에게만 방송
RPCs(Remote Procedure Calls)
•
netwoked systems에 있는 프로세스들 간의 “원격 호출”을 “추상화”한다.
•
원격에 있는 컴퓨터를 호출해서 사용.