-
eventfd개발/컴퓨터사이언스 2018. 7. 18. 21:37
eventfd는 리눅스기반 운영체제에서 파일 디스크립터를 통해 프로세스들끼리 통신 할 수 있는 API중 하나다. IPC로 가장 유명한 pipe는 read와 write용으로 채널을 따로 만드는 것과는 달리 eventfd에서는 읽고 쓸 파일 디스크립터 하나면 충분하기 때문에 번거로운 세팅작업 없이 간단하게 구현 할 수 있다. 그러나 단 한개의 채널을 사용하는만큼 사용할 수 있는 기능은 제한적이다. 이 파일 디스크립터로 교환할 수 있는 값은 1 이상의 64비트 정수 하나가 전부라 데이터 전송보다는 이름처럼 프로세스간에 event를 전달하는 용도로 사용한다.
1. eventfd(uint64 initval, int flag)
프로세스들끼리 통신 할 수 있는 파일 디스크립터를 만드는 함수다. 종료후에는 채널로 사용 할 수 있는 64비트 정수형 파일 디스크립터가 리턴된다.
첫번째 인자는 counter 값이다. counter 값은 eventfd의 고유한 값 정도로 보면 될 것 같다. 이 값은 write로 추가 할 수 있고 read로 읽을 수 있다. 그런데 flag에 따라서 동작이 달라지니까 유의하도록 한다.
2. read(int fd, void* buf, size_t count)
eventfd의 counter 값을 읽는 함수다. 단 counter 값은 무조건 1 이상이 되야 하고 counter 값이 0이면 되면 읽지 못하고 에러를 리턴한다. 1이상이면 가지고 있던 counter 값을 리턴한다. 그런데 리턴한 후에는 flag 값에 따라서 counter 값을 변형한다.
- EFD_SEMAPHORE가 세팅된 경우에는 counter 값을 1만큼 감소시킨다. 세마포어 기능을 한다고 보면 된다. 여러개 프로세스가 읽는 경우를 생각한 것 같다.
- EFT_SEMAPHORE가 세팅이 안된 경우에는 counter 값을 0으로 리셋한다.
3. write(int fd, const void *buf, size_t count)
counter 값을 추가할 수 있는 함수다. counter 값은 uint64 범위 내에서 자유롭게 추가 할 수 있으며 만약 최대값을 넘는 경우에는 막히고 에러를 리턴한다. 별거 어려운게 없다.
나중에는 실제로 프로세스들이 어떻게 사용하고있는지 분석해봐야겠다.
'개발 > 컴퓨터사이언스' 카테고리의 다른 글
CPU pinning과 taskset (0) 2018.08.27 스핀락 (0) 2018.07.23 workqueue 사용법 (0) 2018.07.16 tasklet 사용법 (0) 2018.06.17 tasklet과 workqueue의 차이점 (1) 2018.06.15