[Unix Programming] IPC 기본 개념
IPC 기법에는 여러가지의 종류가 있는데 우선 다음의 기법에 대해 알아보도록 하자.
- message passing
- shared memory
- pipe
우선 위 기법에 대해 알아보기 전, facility key와 get 연산에 대해 먼저 알아야 한다.
IPC에는 facility key라는 것이 있는데 이것은 IPC 객체를 유일하게 식별하기 위해 사용되는 수이다.
소켓 통신을 할 때 IP와 Port 번호로 소켓을 유일하게 식별하는 것처럼, IPC 통신에서는 facility key를 사용하여 객체를 식별하는 것이다.
facility key 값을 integer 형식의 숫자로 부여해도 되지만 숫자는 중복될 가능성이 높기 때문에 이 위험을 방지하기 위해 ftok이라는 함수를 쓴다.
ftok은 파일 이름을 키로 변환해 주는 함수로 형태는 다음과 같다.
#include <sys/ipc.h>
key_t ftok(const char *path, int id);
먼저 위 함수의 원리를 살펴보자.
file에는 file의 meta정보를 가지고 있는 inode라는 구조체가 있는데, 이 inode number의 값이 한 file system마다 unique 하다. 위 ftok 함수는 inode number 값에 해당 device의 minor number와 사용자가 부여한 id 값을 조합하여 key값을 만들어준다.
완벽하게 unique 한 값은 아니지만 어느정도 값을 unique하게 가져올 수 있다.
-> file이름과 id값이 같으면 같은 key 값이 나온다.
다음은 IPC의 get 연산에 대해 알아보자.
get 연산은 IPC 객체를 생성할 때, 기존 IPC 객체에 접근할 때 필요한 연산이다. (이는 create나 open과 유사하다)
또, get 연산은 IPC facility identifier를 return 하는데, 이는 fd와 유사하지만 unique한 값이다.
각 기법에 따라 각각 msgget, semget, shmget 함수가 있다.
이 외에 다른 IPC 연산은, 제어 연산인 msgctl, semctl, shmctl와 message passing에서의 msgsnd, msgrcv가 있다.
IPC 객체가 생성될 때 Status data 구조체가 하나씩 만들어지며, 이는 각 IPC facility마다 하나씩 존재한다.
이 <sys/ipc.h> 시스템 헤더 파일에 의해 정의되는 ipc_perm 구조는 다음의 멤버들을 포함한다.
uid_t cuid; /* IPC 객체를 만든 사용자 id */
gid_t cgid; /* 만든 그룹 id */
uid_t uid; /* 소유자 id */
gid_t gid; /* 소유그룹 id */
mode_t umode; /* 읽기/쓰기 권한 */
다음엔 IPC 기법 중 하나인 Message Passing에 대해 알아보도록 할 예정이다.
'Computer Science > OS' 카테고리의 다른 글
[Unix Programming] ipcs & ipcrm (0) | 2021.12.13 |
---|---|
[Unix Programming] Shared Memory (0) | 2021.12.13 |
[Unix Programming] Semaphore (0) | 2021.12.04 |
[Unix Programming] Message Passing (0) | 2021.12.04 |
[Unix Programming] Record Locking (0) | 2021.12.02 |
댓글
이 글 공유하기
다른 글
-
[Unix Programming] Shared Memory
[Unix Programming] Shared Memory
2021.12.13 -
[Unix Programming] Semaphore
[Unix Programming] Semaphore
2021.12.04 -
[Unix Programming] Message Passing
[Unix Programming] Message Passing
2021.12.04 -
[Unix Programming] Record Locking
[Unix Programming] Record Locking
2021.12.02