다음 위로 이전 목차 리눅스 프로그래머를 위한 가이드

6.4.1 기본적인 개념 (Fundamental Concepts)

시스템 V상에서 AT&T는 IPC 설비의 갖는 세가지 새로운 형태(메세지 큐(message queue), 세마퍼(semaphores), 공유 메모리(shared memory))를 소개했다. POSIX 위원회에서는 아직 이 세가지 설비에 대한 표준화를 마치지 못하고 있지만, 대부분의 구현들은 이들을 지원하고 있다. 더군다나 버클리(BSD)는 시스템 V 요소보다는 소켓을 IPC의 기초 형태로 사용한다. 뒷장에서 소켓에 대해 논하겠지만, 리눅스는 IPC의 두가지 형태(BSD와 System V)를 사용할 수 있다.

시스템 V IPC의 리눅스 구현은 Krishna balasubramanian(balasub@cis.ohio-state.edu)에 의해 기술되었다.



IPC 확인자 (IPC Identifiers)

각각의 IPC 객체(Object)은 그것과 연관된 유일한 IPC 확인자(Identifier)를 갖는다. "IPC 객체(object)"라고 함은 단일 메세지 큐(single message queue), 세마퍼 집합(semaphore set), 또는 공유 메모리 세그먼트(shared memory segment)를 말한다. IPC 객체에 대한 우일한 확인자는 커널 안에서 사용된다. 예를 들면, 특별한 공유 메모리 세그먼트에 접근하기 위해 그 세그먼트에 할당된 유일한 ID 값이 필요하다.

확인자의 유일성은 문제의 객체 타입(type)과 관계 있다. 이를 설명하기 위해, "12345"라는 수치 확인자를 가정하자. 같은 확인자를 같는 두개의 메세지 큐는 없으므로, 같은 수치 확인자를 가진 공유 메모리 세그먼트와 메세지 큐를 구별할 수 있는 가능성이 존재한다.


IPC 키 (IPC Keys)

유일한 ID를 얻기위해, 키(key)가 사용되어져야 한다. 키(key)는 클라이언트와 서버 프로세스간에 서로 동의되어야 한다. 이것은 응용프로그램을 위한 클라이언트/서버 체제를 구성하는 첫번째 단계를 의미한다.

당신이 누군가에게 전화를 하고자 할 때는 전화번호를 알고 있어야 한다. 게다가 전화 회사는 당신에게서 나가는 전화를 마지막 목적지까지 어떻게 중계할 것인지 알고 있어야 한다. 반대편이 전화에 응답해야 연결이 이루어 진다.

시스템 V IPC 설비의 경우, 전화는 사용되는 객체의 타입을 가지고 직접적인 관련이 있다. 전화 회사나 라우팅 방법(routing method)은 IPC 키(key)와 적접 연관되어 진다.

키는 응용프로그램에서 키값을 하드코딩함으로써 항상 같은 값을 가질 수 있다. 이것은 키가 이미 사용된 것일 수 있다는 단점이 있다. 종종 ftok() 함수는 클라이언트와 서버 모두에 의해 키값을 발생시키는데 사용된다.


 LIBRARY FUNCTION: ftok();

  PROTOTYPE: key_t ftok ( char *pathname, char proj );
    RETURNS: new IPC key value if successful
             -1 if unsuccessful, errno set to return of stat() call

ftok()로 부터 반환된 키값은 첫번째 아규먼트인 파일로 부터 inode 번호, minor 장치번호와 두번째 아규먼트인 한글자 프로젝트 확인자의 조합에 의해 발생한다. 이것은 유일성을 보장하지 않지만, 응용프로그램은 충돌을 체크하여 키를 다시 발생시킬 수 있다.


	key_t	mykey;
	mykey = ftok("/tmp/myapp",'a');

위의 예에서, 디렉토리 "/tmp/myapp"는 'a'라는 한글자와 조합된다. 또 다른 일반적인 예는 현재 디렉토리를 사용하는 것이다.


	key_t	mykey;
	mykey = ftok(".",'a');

사용되는 키 발생 알고리즘은 전적으로 응용프로그램 프로그래머의 마음에 달려 있다. 측정이 데드락(deadlocks), 경쟁상태의 방지등에 있는 한, 어떤 방법이든 나타날 수 있다. 예제의 목적은 ftok()의 사용에 있다. 만약 각 클라이언트 프로세스가 각기 유일한 홈 디렉토리로 부터 수행될 것이라고 가정한다면, 발생되는 키는 우리의 필요를 충족시켜야 한다.

얻어진 키값은 IPC 객체를 만들고 접근하기 위해 일련의 IPC 시스템 호출에서 사용된다.


ipcs 명령어 (The ipcs Command)

ipcs 명령어는 모든 시스템 V IPC 객체의 상태를 얻는데 사용할 수 있다. 이 툴의 리눅스 버전은 Krishna Balasubramanian에 의해 제작되었다.


ipcs	-q:	메세지 큐(message queues)만을 보여준다.
ipcs	-s:	세마퍼(semaphore)만을 보여준다.
ipcs	-m:	공유 메모리(shared memory)만을 보여준다
ipcs --help:	부가적인 아규먼트(arguments)

디폴트로 세가지 객체의 종류가 모두 보여진다. 다음의 간단한 ipcs의 출력을 살펴보자:


------ Shared Memory Segments --------
shmid     owner     perms     bytes     nattch    status      

------ Semaphore Arrays --------
semid     owner     perms     nsems     status      

------ Message Queues --------
msqid     owner     perms     used-bytes  messages    
0         root      660       5           1

여기서 우리는 "0"이라는 확인자(Identifier)를 가진 단일 메세지 큐(single message queue)를 볼 수 있다. 그것의 주인은 root 사용자이고, 660(-rw-rw--)의 8진 허가사항을 가지고 있다. 큐에는 한개의 메세지가 있고, 메세지의 총 크기는 5바이트이다.

ipcs 명령어는 IPC 객체에 대해 커널의 저장 조직을 엿볼 수 있는 가장 강력한 도구이다.


ipcrm 명령어 (The ipcrm Command)

ipcrm 명령어는 커널로 부터 IPC 객체를 제거하는데 사용된다. IPC 객체는 사용자 코드내에서 시스템 호출을 경우하여 제거될 수 있으며, 특히 개발 환경하에서 종종 수동으로 IPC 객체를 제거해야할 필요가 발생한다. 사용법은 간단하다.:


ipcrm <msg | sem | shm>  <IPC ID>


지울 객체가 메세지 큐(msg)인지 세마퍼(sem)인지 공유 메모리(shm)인지를 간단히 지정한다. IPC ID는 ipcs 명령어로 구할 수 있다. 확인자는 같은 타입안에서만 유일함으로 객체의 타입을 지정해 주어야만 한다. (앞의 내용을 상기하라)


이전:6.4 시스템 V IPC (System V IPC) 다음:6.4.2 메세지 큐 (Massge Queues)

Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved

Email To:Webmaster , Another address
LAST UPDATE Nov 18,1997
Created Nov 17,1997