2009년 3월 18일 수요일

15Day Study

15Day Study
[[[[[세마포어, 공유 메모리, 메시지 대기열 IPC(Inter=Process Communication)]]]]]

세마포어의 정의
가장 간단한 세마포어는 오직 0과 1만의 값만 받아들이는 변수, 바이너리 세마포어
다양한 양의 값을 받아들이는 세마포어는 일반 세마포어

P와 V의 정의는 간단하다. 세마포어 변수 sv가 있다고 하자
P(sv) : sv가 0보다 크면 sv를 감소시킨다. sv가 0이라고 하면 이 프로세스의 실행을 일시 중단한다( -1)
V(sv) : 다른 프로세스가 sv를 가르켰을 때 일시 중단되어 있다면, 이 프로세스의 실행을 재개시킨다. sv를 기다리며 일시 중단되어 있는 프로세스가 없다면 sv를 증가시킨다( +1)

#include < sys/types.h>
#include < sys/ipc.h>
#include < sys/sem.h>

새로운 세마포러를 만들거나 기존 세마포어의 세마포어 키를 반환
int semget(key_t key, int num_sems, int sem_flags);

세마포어의 값을 변경
int semop(int sem_id, struct sembuf *sem_ops, size-t num_sem_ops);

세마포어 정보를 직접 제어
int semctl(int sem_id, int sem_num, int command, ...);
command 맴버: SETVAL(세마포어 초기화), IPC_RMID(세마포어 식별자 삭제)

공유메모리(shared memory)는 세 가지 IPC 기능 중에서 두번째임

#include < sys/types.h>
#include < sys/ipc.h>
#include < sys/shm.h>

공유메모리 할당하기
int shmget(key_t key, size_t size, int shmflg);
shmflg를 통해서 읽고쓰기 가능 및 읽기전용에 대한 권한 설정
반환값: 실패 -1, 성공 0 이상

처음 공유 메모리 세그먼트를 만들고 쓸 수 없기 때문에 프로세스의 주소 공간에 공유메모리 연결
void *shmat(int shm_id, const void *shm_addr, int shmflg);
shmflg 멤버 : SHM_RND 공유 메모리가 연결되는 주소를 제어
SHM_RDONLY 연결된 메모리를 읽기 전용으로 만듬
반환값: 실패 -1, 성공 공유 메모리의 첫번째 바이트에 대한 포인터 반환

공유 메모리를 현재 프로세스로 부터 분리(삭제되지 않고 현 프로세스가 공유 메모리를 사용을 불가능 하게함)
shmdt(int shm_id);
반환값: 실패 -1

공유메모리 제어
int shmctl(int shm_id, int command, struct shmid_ds *buf);
shm_id는 shmget가 반환한 값
command는 취해야 할 동작(IPS_STAT, IPC_SET, IPC_RMID);
*buf는 공유메모리 모드와 권한
반환값: 실패 -1, 성공 0

공유메모리 예: 753페이지 참조

IPC(메시지 대기열)
메시지 대기열은 두개의 연관이 없는 프로세스끼리 쉽고 표율적으로 데이터를 주고받을 수 있다. 메시지 대기열은 송신 프로세스와 수신 프로세스에 대해 독립적으로 존재하기 때문에, 명명된 파이프를 열고 닫을 때 동기화를 수행하면서 따르는 어려움을 다소 없애준다. 이것이 메시지가 명명된 파이프에 비해 가지는 장점이다

#include < sys/types.h>
#include < sys/ipc.h>
#include < sys/msg.h>

메시지 대기열 만들기
int msgget(key_t key, int msgflg);
반환값: 실패 -1, 성공 양의 정수인 대기열 식별자

메시지 대기열에 메시지 추가
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);

메시지 대기열에서 메시지 갖어오기
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);

메시지 대기열에서 메시지 제어
int msgctl(int msqid, int command, struct msqid_ds *buf);
command 맴버: IPC_STAT, IPC_STAT, IPC_RMID
반환값: 실패 -1, 성공 0
프로세스가 msgsnd 함수나 msgrcv 함수에서 기다리고 있는 동안 메시지 대기열을 삭제하면, 송신 함수나 수신 함수는 실패한다.

메시지 대기열 예: 762페이지 참조(사용자 1), 766페이지 참조(사용자 n

IPC 상태 명령
세마포어을 사용하여 개발한 프로그램이 세마포어을 삭제하지 않고 죽었을 경우 메모리에 찌꺼기가 남아서 위험하다. 그것을 확인할 수 있는 명령어는

세마포어 상태 보기 명령
$ ipcs - s
--- Semaphore Arrays ----
semid owner perms nsems status
768 rick 666 1

세마포어 죽이기(최신 리눅스)
$ ipcrm -s 768

세마포어 죽이기(오래된 리눅스)
$ ipcrm sem 768

공유 메모리 상태 보기 명령
$ ipcs -m

공유 메모리 죽이기
$ ipcrm -m < ID>

메시지 대기열 상태 보기 명령
$ ipcs -q

메시지 대기열 죽이기
$ ipcrm -q < ID>

댓글 없음:

댓글 쓰기