epoll(7) - wariua/manpages-ko GitHub Wiki
epoll - I/O ์ด๋ฒคํธ ์๋ฆผ ๊ธฐ๋ฅ
#include <sys/epoll.h>
epoll API๋ poll(2)๊ณผ ๋น์ทํ ์์ ์ ํ๋ค. ์ฆ ์ฌ๋ฌ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ I/O๊ฐ ๊ฐ๋ฅํ์ง ๊ฐ์ํ๋ค. epoll API๋ ์์ง ํธ๋ฆฌ๊ฑฐ ์ธํฐํ์ด์ค๋ ๋ ๋ฒจ ํธ๋ฆฌ๊ฑฐ ์ธํฐํ์ด์ค๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๊ฐ์ํ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์๊ฐ ๋ง์์ ธ๋ ์ ๋์ํ๋ค.
epoll API์ ํต์ฌ์๋ epoll ์ธ์คํด์ค๋ผ๋ ์ปค๋ ๋ด ์๋ฃ ๊ตฌ์กฐ๊ฐ ์๋๋ฐ, ์ฌ์ฉ์ ๊ณต๊ฐ์์ ๋ณด๋ฉด ๋ ๊ฐ์ง ๋ชฉ๋ก์ ๋ด์ ์ปจํ ์ด๋๋ผ๊ณ ํ ์ ์๋ค.
-
๊ด์ฌ ๋ชฉ๋ก (epoll ์งํฉ์ด๋ผ๊ณ ๋ ํจ): ํ๋ก์ธ์ค์์ ๊ฐ์ ๋์์ผ๋ก ๋ฑ๋กํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ์งํฉ.
-
์ค๋น ๋ชฉ๋ก: I/O "์ค๋น" ์ํ์ธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ์งํฉ. ์ค๋น ๋ชฉ๋ก์ ๊ด์ฌ ๋ชฉ๋ก์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ๋ถ๋ถ์งํฉ(๋ ์ ํํ๋ ์ฐธ์กฐ์ ์งํฉ)์ด๋ฉฐ, ๊ทธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์์ ์ผ์ด๋ I/O ํ๋์ ์ํด์ ์ปค๋์ด ๋์ ์ผ๋ก ์งํฉ์ ์ฑ์ด๋ค.
epoll ์ธ์คํด์ค ์์ฑ๊ณผ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ค์ ์์คํ ํธ์ถ๋ค์ ์ ๊ณตํ๋ค.
-
epoll_create(2)์์๋ ์ epoll ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๋ค. (๋ ์ต๊ทผ์ epoll_create1(2)์ epoll_create(2)์ ๊ธฐ๋ฅ์ ํ์ฅํ ๊ฒ์ด๋ค.)
-
๋ค์์ผ๋ก epoll_ctl(2)์ ํตํด ๊ด์ฌ ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฑ๋กํ๋ค. ๊ทธ๋ฌ๋ฉด epoll ์ธ์คํด์ค์ ๊ด์ฌ ๋ชฉ๋ก์ ํญ๋ชฉ์ด ์ถ๊ฐ๋๋ค.
-
epoll_wait(2)์์๋ I/O ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. ํ์ฌ ๊ฐ์ฉ ์ด๋ฒคํธ๊ฐ ์์ผ๋ฉด ํธ์ถ ์ค๋ ๋๋ฅผ ๋ธ๋ก ์ํจ๋ค. (epoll ์ธ์คํด์ค์ ์ค๋น ๋ชฉ๋ก์์ ํญ๋ชฉ์ ๊ฐ์ ธ์ค๋ ๊ฑธ๋ก ์๊ฐํ ์ ์๋ค.)
epoll ์ด๋ฒคํธ ๋ฐฐํฌ ์ธํฐํ์ด์ค๋ ์์ง ํธ๋ฆฌ๊ฑฐ(ET)๋ก ๋์ํ ์๋ ์๊ณ ๋ ๋ฒจ ํธ๋ฆฌ๊ฑฐ(LT)๋ก ๋์ํ ์๋ ์๋ค. ๋ ๋ฉ์ปค๋์ฆ์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ๋ค์ ์ฌ๊ฑด๋ค์ด ์ผ์ด๋๋ค๊ณ ํ์.
-
ํ์ดํ์ ์ฝ๊ธฐ ์ชฝ์ ๋ํ๋ด๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ(
rfd
)๋ฅผ epoll ์ธ์คํด์ค์ ๋ฑ๋กํ๋ค. -
ํ์ดํ ์ฐ๊ธฐ ์ชฝ์์ 2 kB ๋ฐ์ดํฐ๋ฅผ ์จ๋ฃ๋๋ค.
-
epoll_wait(2) ํธ์ถ์ด ์ด๋ค์ง๊ณ , ์ค๋น ์ํ์ธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก
rfd
๋ฅผ ๋ฐํํ๋ค. -
ํ์ดํ ์ฝ๊ธฐ ์ชฝ์์
rfd
๋ก๋ถํฐ 1 kB ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค. -
epoll_wait(2) ํธ์ถ์ด ์ด๋ค์ง๋ค.
ํ์ผ ๋์คํฌ๋ฆฝํฐ rfd
๋ฅผ epoll ์ธํฐํ์ด์ค์ ์ถ๊ฐํ ๋ EPOLLET
(์์ง ํธ๋ฆฌ๊ฑฐ) ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํ์ผ ์
๋ ฅ ๋ฒํผ์ ๋ฐ์ดํฐ๊ฐ ์์ง ์๋๋ฐ๋ 5๋ฒ ๋จ๊ณ์ epoll_wait(2) ํธ์ถ์์ ์๋ง ๋ฉ์ถ ๊ฒ์ด๋ค. ๊ทธ๋์ ์๊ฒฉ ์๋๋ ์ด๋ฏธ ๋ณด๋ธ ๋ฐ์ดํฐ์ ๋ํ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ ์ ์๋ค. ์ด๋ ๊ฒ ๋๋ ๊ฑด ์์ง ํธ๋ฆฌ๊ฑฐ ๋ชจ๋์์๋ ๊ฐ์ ๋์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ๋ณํ๊ฐ ์๊ธธ ๋์๋ง ์ด๋ฒคํธ๋ฅผ ๋ด๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ 5๋ฒ ๋จ๊ณ์์ ํธ์ถ์๊ฐ ์ด๋ฏธ ์
๋ ฅ ๋ฒํผ ๋ด์ ์๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ ์๊ฐ ์๋ค. ์ ์์์ rfd
์ ์ด๋ฒคํธ๊ฐ ์์ฑ๋๋ ๊ฑด 2๋ฒ์์ ์ด๋ค์ง ์ฐ๊ธฐ ๋๋ฌธ์ด๊ณ ๊ทธ ์ด๋ฒคํธ๋ฅผ 3๋ฒ์์ ์๋ชจํ๋ค. 4๋ฒ์์ ์ด๋ค์ง ์ฝ๊ธฐ ์ฐ์ฐ์ด ๋ฒํผ ๋ฐ์ดํฐ ์ ์ฒด๋ฅผ ์๋ชจํ์ง ์์ผ๋ฏ๋ก 5๋ฒ ๋จ๊ณ์์ ์ด๋ค์ง๋ epoll_wait(2) ํธ์ถ์ด ๋ฌดํ์ ๋ธ๋ก ํ ์๋ ์๊ฒ ๋๋ค.
EPOLLET
ํ๋๊ทธ๋ฅผ ์ฐ๋ ์์ฉ์์๋ ๋ธ๋ก ํ๋ ์ฝ๊ธฐ๋ ์ฐ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ํ์คํฌ๊ฐ ๊ตถ๊ฒ ๋๋ ๊ฑธ ํผํ๊ธฐ ์ํด ๋
ผ๋ธ๋กํน ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ข๋ค. epoll์ ์์ง ํธ๋ฆฌ๊ฑฐ(EPOLLET
) ์ธํฐํ์ด์ค๋ก ์ฐ๋ ๊ถ์ฅ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
-
๋ ผ๋ธ๋กํน ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ด๋ค.
-
read(2)
๋write(2)
๊ฐEAGAIN
์ ๋ฐํํ ํ์ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
๋ฐ๋ฉด ๋ ๋ฒจ ํธ๋ฆฌ๊ฑฐ ์ธํฐํ์ด์ค(EPOLLET
๋ฅผ ์ง์ ํ ์ง ์์์ ๋์ ๊ธฐ๋ณธ ๋ฐฉ์)๋ก ์ธ ๋ epoll์ ๊ทธ๋ฅ ๋ ๋น ๋ฅธ poll(2)์ด๋ฉฐ, ๊ฐ์ ๋์ ๋ฐฉ์์ ๊ณต์ ํ๊ธฐ์ poll(2)์ ์ฐ๋ ๊ณณ ์ด๋์๋ ์ธ ์ ์๋ค.
์์ง ํธ๋ฆฌ๊ฑฐ epoll์ ์ฐ๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฉ์ด๋ฆฌ ์์ ํ๋ฉด ์ด๋ฒคํธ๊ฐ ์ฌ๋ฌ ๊ฐ ์์ฑ๋ ์ ์๋ค. ์ด๋ ํธ์ถ์๋ EPOLLONESHOT
ํ๋๊ทธ๋ฅผ ์ง์ ํด์ epoll_wait(2)์ผ๋ก ์ด๋ฒคํธ๋ฅผ ํ๋ ์์ ํ ๋ค์์๋ epoll์์ ์ฐ๊ณ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋นํ์ฑํ ํ๋๋ก ํ ์๋ ์๋ค. EPOLLONESHOT
ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ epoll_ctl(2) EPOLL_CTL_MOD
๋ก ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฌํ์ฑํํ๋ ๊ฑด ํธ์ถ์์ ๋ชซ์ด๋ค.
์ฌ๋ฌ ์ค๋ ๋๊ฐ (์์ ํ๋ก์ธ์ค๊ฐ fork(2)๋ฅผ ๊ฑฐ์น๋ฉฐ epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฌผ๋ ค๋ฐ์ ๊ฒฝ์ฐ๋ผ๋ฉด, ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ) ๊ฐ์ epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ epoll_wait(2)์์ ๋ธ๋ก ๋ผ ์๋๋ฐ ์์ง ํธ๋ฆฌ๊ฑฐ(EPOLLET
) ์๋ฆผ ํ์๊ฐ ๋ ๊ด์ฌ ๋ชฉ๋ก ๋ด์ ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์ค๋น ์ํ๊ฐ ๋๋ฉด ๊ทธ ์ค๋ ๋(ํ๋ก์ธ์ค)๋ค ์ค ํ๋๋ฉด epoll_wait(2)์์ ๊นจ์ด๋๋ค. ์ด๋ ๋ช๋ช ์๋๋ฆฌ์ค์์์ "๊ฐ๋ผ์ฒ๋ผ" ๊นจ์ด๋๊ธฐ๋ฅผ ๋ง๋ ์ต์ ํ ํจ๊ณผ๋ฅผ ์ค๋ค.
/sys/power/autosleep
๋ฅผ ํตํด ์์คํ
์ด autosleep ๋ชจ๋์ ๋ค์ด๊ฐ ์๋๋ฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด์ ์ฅ์น๊ฐ ๊นจ๋ ๊ฒฝ์ฐ์ ์ฅ์น ๋๋ผ์ด๋ฒ๋ ์ด๋ฒคํธ๊ฐ ํ์ ๋ค์ด๊ฐ ๋๊น์ง๋ง ์ฅ์น๋ฅผ ๊นจ์ ๋๊ฒ ๋๋ค. ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋ ๋ค์๊น์ง ์ฅ์น๋ฅผ ๊นจ์ ๋๋ ค๋ฉด epoll_ctl(2)์ EPOLLWAKEUP
ํ๋๊ทธ๋ฅผ ์ธ ํ์๊ฐ ์๋ค.
struct epoll_event
์ events
ํ๋์ EPOLLWAKEUP
ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ฉด ์ด๋ฒคํธ๊ฐ ํ์ ๋ค์ด๊ฐ๋ ์๊ฐ๋ถํฐ ๊ทธ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ epoll_wait(2) ํธ์ถ์ ์ด์ด ๊ทธ ๋ค์ epoll_wait(2) ํธ์ถ๊น์ง ์์คํ
์ด ๊นจ์ด ์๊ฒ ๋๋ค. ๊ทธ ์๊ฐ ๋๋จธ๊น์ง ์์คํ
์ ๊นจ์ ๋ฌ์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๋ ๋ฒ์งธ epoll_wait(2) ํธ์ถ ์ ์ ๋ฐ๋ก wake_lock
์ ์ก์ผ๋ฉด ๋๋ค.
๋ค์ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด epoll์์ ์๋ชจํ๋ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ํํ ์ ์๋ค.
-
/proc/sys/fs/epoll/max_user_watches
(๋ฆฌ๋ ์ค 2.6.28๋ถํฐ) - ์์คํ
์ ๋ชจ๋ epoll ์ธ์คํด์ค๋ค์์ ์ฌ์ฉ์๊ฐ ๋ฑ๋กํ ์ ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ด๊ฐ์์ ์ ํ์ ์ง์ ํ๋ค. ์ค์ ์ฌ์ฉ์ ID๋ณ๋ก ์ ํํ๋ค. ๋ฑ๋ก๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๊ฐ๊ฐ์ 32๋นํธ ์ปค๋์์๋ ์ฝ 90๋ฐ์ดํธ, 64๋นํธ ์ปค๋์์๋ ์ฝ 160๋ฐ์ดํธ๊ฐ ๋ ๋ค. ํ์ฌ
max_user_watches
์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ฐ ๋ฉ๋ชจ๋ฆฌ์ 1/25(4%)๋ฅผ ๋ฑ๋ก๋น ๋๋ ๋ฐ์ดํธ๋ก ๋๋ ๊ฒ์ด๋ค.
๋ ๋ฒจ ํธ๋ฆฌ๊ฑฐ ์ธํฐํ์ด์ค๋ก ์ธ ๋๋ epoll ์ฌ์ฉ ๋ฐฉ์์ด poll(2)๊ณผ ๊ฐ์ง๋ง ์์ง ํธ๋ฆฌ๊ฑฐ๋ก ์ธ ๋๋ ์์ฉ์ ์ด๋ฒคํธ ๋ฃจํ์์ ๋ฉ์ถ๋ ๊ฑธ ๋ง๊ธฐ ์ํด ๋ ๋ช
ํํ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค. ์ด ์์์ ๋ฆฌ์ค๋๋ ๋
ผ๋ธ๋กํน ์์ผ์ listen(2)
์ ํธ์ถํ ๊ฒ์ด๋ค. do_use_fd()
ํจ์์์๋ ์๋ก ์ค๋น๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ EAGAIN
์ด ๋ฐํ๋ ๋๊น์ง read(2)
๋ write(2)
๋ก ์ฌ์ฉํ๋ค. ์ด๋ฒคํธ ์ฃผ๋ ์ํ ๋จธ์ ์์ฉ์์๋ EAGAIN
์์ ํ์ ํ์ฌ ์ํ๋ฅผ ๊ธฐ๋กํด ๋ฌ์ ๋ค์ do_use_fd()
ํธ์ถ ๋ ์ค์ง ์ง์ ๋ถํฐ read(2)
๋ write(2)
๋ฅผ ๊ณ์ํ ์ ์๋๋ก ํด์ผ ํ ๊ฒ์ด๋ค.
#define MAX_EVENTS 10
struct epoll_event ev, events[MAX_EVENTS];
int listen_sock, conn_sock, nfds, epollfd;
/* ๋ฆฌ์จ ์์ผ 'listen_sock' ์ค๋น ์ฝ๋
(socket(), bind(), listen()) ์๋ต */
epollfd = epoll_create1(0);
if (epollfd == -1) {
perror("epoll_create1");
exit(EXIT_FAILURE);
}
ev.events = EPOLLIN;
ev.data.fd = listen_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
perror("epoll_ctl: listen_sock");
exit(EXIT_FAILURE);
}
for (;;) {
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_wait");
exit(EXIT_FAILURE);
}
for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listen_sock) {
conn_sock = accept(listen_sock,
(struct sockaddr *) &addr, &addrlen);
if (conn_sock == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
setnonblocking(conn_sock);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = conn_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
&ev) == -1) {
perror("epoll_ctl: conn_sock");
exit(EXIT_FAILURE);
}
} else {
do_use_fd(events[n].data.fd);
}
}
}
์์ง ํธ๋ฆฌ๊ฑฐ ์ธํฐํ์ด์ค๋ก ์ธ ๋ ๋ ๋์ ์ฑ๋ฅ์ ์ํด (EPOLLIN|EPOLLOUT)
์ ์ง์ ํด์ epoll ์ธํฐํ์ด์ค์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ถ๊ฐ(EPOLL_CTL_ADD
)ํ๋ ๊ฒ ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฌ๋ฉด EPOLL_CTL_MOD
๋ก epoll_ctl(2)์ ํธ์ถํ๋ฉฐ EPOLLIN
๊ณผ EPOLLOUT
์ฌ์ด๋ฅผ ๊ณ์ ์ค๊ฐ๋ ๊ฑธ ํผํ ์ ์๋ค.
-
epoll ์งํฉ์ ๋ฑ๋ก๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ๊ตฌ๋ณํ๋ ๋ฐ ์ฐ๋ ํค๋ ๋ฌด์์ธ๊ฐ?
ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ์ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ(์ด๋ฆฐ ํ์ผ์ ์ปค๋ ๋ด ํํ, "์ด๋ฆฐ ํ์ผ ํธ๋ค"์ด๋ผ๊ณ ๋ ํจ)์ ์กฐํฉ์ด ํค๋ค.
-
์ด๋ค epoll ์ธ์คํด์ค์ ๊ฐ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ ๋ฒ ๋ฑ๋กํ๋ฉด ์ด๋ป๊ฒ ๋๋๊ฐ?
์๋ง
EEXIST
๊ฐ ๋์ฌ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ณต์ (dup(2), dup2(2), fcntl(2)F_DUPFD
) ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ฐ์ epoll ์ธ์คํด์ค์ ์ถ๊ฐํ๋ ๊ฑด ๊ฐ๋ฅํ๋ค. ๋ณต์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ๋ค๋ฅธevents
๋ง์คํฌ๋ก ๋ฑ๋กํ๋ ๊ธฐ๋ฒ์ด ์ด๋ฒคํธ ํํฐ๋ง์ ์ ์ฉํ ์ ์๋ค. -
epoll ์ธ์คํด์ค ๋ ๊ฐ๊ฐ ๊ฐ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋๊ธฐํ ์ ์๋๊ฐ? ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ์ด๋ฒคํธ๊ฐ ๋ epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ชจ๋๋ก ๋ณด๊ณ ๋๋๊ฐ?
๊ฐ๋ฅํ๋ฉฐ, ์ด๋ฒคํธ๊ฐ ๋ ๋ชจ๋๋ก ๋ณด๊ณ ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ฌ๋ฐ๋ก ์ฒ๋ฆฌํ๋ ค๋ฉด ์กฐ์ฌ์ค๋ฐ ํ๋ก๊ทธ๋๋ฐ์ด ํ์ํ ๊ฒ์ด๋ค.
-
epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ ์์น๋ฅผ poll/epoll/select ํ ์ ์๋๊ฐ?
๊ฐ๋ฅํ๋ค. epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋๊ธฐ ์ด๋ฒคํธ๊ฐ ์์ผ๋ฉด ์ฝ๊ธฐ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ํ์๋๋ค.
-
epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ทธ ์์ฒด์ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์งํฉ์ ๋ฃ์ผ๋ ค๊ณ ํ๋ฉด ์ด๋ป๊ฒ ๋๋๊ฐ?
epoll_ctl(2) ํธ์ถ์ด ์คํจ(
EINVAL
)ํ๋ค. ํ์ง๋ง epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ค๋ฅธ epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ธํธ์ ์ถ๊ฐํ ์๋ ์๋ค. -
epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ ๋์ค ๋๋ฉ์ธ ์์ผ์ ํตํด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ก ๋ณด๋ผ ์ ์๋๊ฐ?
๊ฐ๋ฅํ์ง๋ง ์๋ฏธ๊ฐ ์๋ค. ์์ ํ๋ก์ธ์ค์์ ๊ด์ฌ ๋ชฉ๋ก์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ์ฌ๋ณธ์ด ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
-
ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ซํ๋ฉด epoll ๊ด์ฌ ๋ชฉ๋ก์์ ์ ๊ฑฐ๋๋๊ฐ?
๊ทธ๋ ๊ธฐ๋ ํ๋ฐ ์กฐ์ฌํ ์ ์ด ์๋ค. ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ(open(2) ์ฐธ๊ณ )์ ๋ํ ์ฐธ์กฐ์ด๋ค dup(2), dup2(2), fcntl(2)
F_DUPFD
, fork(2)๋ฅผ ํตํด ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ณต์ ๋ ๋๋ง๋ค ๋์ผํ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋ ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์์ฑ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ์์ ์ ๊ฐ๋ฆฌํค๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ด ๋ชจ๋ ๋ซํ ๋๊น์ง ๊ณ์ ์กด์ฌํ๋ค.๊ด์ฌ ๋ชฉ๋ก์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์ ๊ฑฐ๋๋ ๊ฑด ๊ธฐ๋ฐ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ด ๋ชจ๋ ๋ซํ ํ์ด๋ค. ๋ฐ๋ผ์ ๊ด์ฌ ๋ชฉ๋ก์ ์ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ซํ ํ์๋ ๋์ผํ ๊ธฐ๋ฐ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋ ๋ค๋ฅธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์ด๋ ค ์๋ค๋ฉด ๊ทธ ๋ซํ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋ํ ์ด๋ฒคํธ ๋ณด๊ณ ๊ฐ ์์ ์ ์๋ค. ์ด๋ฅผ ๋ง์ผ๋ ค๋ฉด ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ณต์ ํ๊ธฐ ์ ์ (epoll_ctl(2)
EPOLL_CTL_DEL
๋ก) ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ด์ฌ ๋ชฉ๋ก์์ ๋ช ์์ ์ผ๋ก ์ ๊ฑฐํด์ผ ํ๋ค. ์๋๋ฉด ์์ฉ์์ ๋ชจ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ด ๋ซ๋๋ก ์ ๊ฒฝ ์จ์ผ ํ๋ค. (ํ์ง๋ง ์ ๋ณด์ด๋ ๊ณณ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๊ฐ dup(2)์ด๋ fork(2)๋ฅผ ์จ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ณต์ ํ๋ค๋ฉด ์ด๋ ค์ธ ์๋ ์๋ค.) -
epoll_wait(2) ํธ์ถ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ์ฌ๋ฌ ๊ฐ ๋ฐ์ํ๋ฉด ํ๋๋ก ํฉ์ณ์ง๋๊ฐ, ์๋๋ฉด ๋ฐ๋ก ๋ณด๊ณ ๋๋๊ฐ?
ํฉ์ณ์ง๋ค.
-
ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋ํ ๋์์ด ์ด๋ฏธ ์์ง๋์ง๋ง ์์ง ๋ณด๊ณ ๋์ง๋ ์์ ์ด๋ฒคํธ์ ์ํฅ์ ๋ผ์น๋๊ฐ?
๊ธฐ์กด ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์ทจํ ์ ์๋ ๋์์ ๋ ๊ฐ์ง๊ฐ ์๋ค. ์ ๊ฑฐ ๋์์ ์ด ๊ฒฝ์ฐ์ ์๋ฏธ๊ฐ ์์ ๊ฒ์ด๋ค. ๋ณ๊ฒฝ ๋์์ ๊ฐ๋ฅํ I/O๋ฅผ ์ฌํ์ธํ๊ฒ ํ๋ค.
-
EPOLLET
ํ๋๊ทธ(์์ง ํธ๋ฆฌ๊ฑฐ ๋์)๋ฅผ ์ธ ๋EAGAIN
์ด ๋์ฌ ๋๊น์ง ๊ณ์ํด์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ ํด์ผ๋ง ํ๋๊ฐ?epoll_wait(2)์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์๋ค๋ ๊ฑด ๊ทธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์์ฒญํ I/O ๋์์ ๋ํด ์ค๋น ์ํ๋ผ๋ ๋ป์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ฒ (๋ ผ๋ธ๋กํน) ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ
EAGAIN
์ ๋ด๋์ ๋๊น์ง ์ค๋น ์ํ์ธ ๊ฒ์ผ๋ก ๋ด์ผ ํ๋ค. ๊ทธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ธ์ ์ด๋ป๊ฒ ์ธ์ง๋ ์ ์ ์ผ๋ก ํ๋ก๊ทธ๋๋จธ์๊ฒ ๋ฌ๋ ค ์๋ค.ํจํท/ํ ํฐ ์งํฅ ํ์ผ(๊ฐ๋ น ๋ฐ์ดํฐ๊ทธ๋จ ์์ผ, ์ ๊ท ๋ชจ๋ ํฐ๋ฏธ๋)์์ ์ฝ๊ธฐ/์ฐ๊ธฐ I/O ๊ณต๊ฐ์ ๋์ ์์๋ด๋ ์ ์ผํ ๋ฐฉ๋ฒ์
EAGAIN
์ด ๋์ฌ ๋๊น์ง ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ ๊ณ์ํ๋ ๊ฒ์ด๋ค.์คํธ๋ฆผ ์งํฅ ํ์ผ(๊ฐ๋ น ํ์ดํ, FIFO, ์คํธ๋ฆผ ์์ผ)์์๋ ๋์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ ๋ฐ์ดํฐ์ ์์ ํ์ธํ๋ ๊ฒ์ผ๋ก ์ฝ๊ธฐ/์ฐ๊ธฐ I/O ๊ณต๊ฐ์ด ๊ณ ๊ฐ๋์๋์ง ์์๋ผ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด
read(2)
๋ฅผ ํธ์ถํด์ ์ด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ผ๊ณ ํ๋๋ฐread(2)
๊ฐ ๊ทธ๋ณด๋ค ์ ์ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๋ค๋ฉด ๊ทธ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์ฝ๊ธฐ I/O ๊ณต๊ฐ์ด ๊ณ ๊ฐ๋๋ค๊ณ ํ์ ํ ์ ์๋ค.write(2)
๋ก ์ฐ๊ธฐ๋ฅผ ํ ๋์๋ ๋ง์ฐฌ๊ฐ์ง๋ค. (๊ฐ์ํ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ํญ์ ์คํธ๋ฆผ ์งํฅ ํ์ผ์ ๊ฐ๋ฆฌํจ๋ค๊ณ ๋ณด์ฅํ ์ ์๋ค๋ฉด ์ด ๊ธฐ๋ฒ์ ์ฐ์ง ๋ง์์ผ ํ๋ค.)
์์ฃผ ํฐ I/O ๊ณต๊ฐ์ด ์๋ค๋ฉด ๊ทธ๊ฑธ ๋น์ฐ๋ ค๊ณ ํ๋ ๋์ ๋ค๋ฅธ ํ์ผ๋ค์ด ์ฒ๋ฆฌ๋์ง ์์์ ๊ธฐ์๋ฅผ ์ ๋ฐํ๊ฒ ๋ ์ ์๋ค. (์ด๊ฑด epoll์ ํ์ ๋ ๋ฌธ์ ๋ ์๋๋ค.)
ํด๋ฒ์ ์ค๋น ์ํ์ธ ๋์คํฌ๋ฆฝํฐ ๋ชฉ๋ก์ ์ ์งํ๊ณ ๊ด๋ จ ์๋ฃ ๊ตฌ์กฐ์์ ๊ทธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ค๋น ์ํ๋ผ๊ณ ํ์ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ฒ๋ฆฌํด์ผ ํ ํ์ผ๋ค์ ์์ฉ์์ ๊ธฐ์ตํ๋ฉด์ ์ค๋น ์ํ์ธ ํ์ผ๋ค์ ๋์๊ฐ๋ฉฐ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฏธ ์ค๋น ์ํ์ธ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋ํด ์ดํ ์์ ํ ์ด๋ฒคํธ๋ฅผ ๋ฌด์ํ ์ ์๊ธฐ๋ ํ๋ค.
์ด๋ฒคํธ ์บ์๋ฅผ ์ด๋ค๋ฉด, ์ฆ epoll_wait(2)์์ ๋ฐํ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ๋ชจ๋ ์ ์ฅํ ๋ค์ ์ฒ๋ฆฌํ๋ค๋ฉด ๋์ ์ผ๋ก (์ฆ ์ ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์ํด) ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ซํ ๊ฑธ ํ์ํ ๋ฐฉ๋ฒ์ด ์์ด์ผ ํ๋ค. ๊ฐ๋ น epoll_wait(2)์ผ๋ก 100๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์๋๋ฐ 47๋ฒ ์ด๋ฒคํธ์์ ์ด๋ค ์กฐ๊ฑด ๋๋ฌธ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ 13์ ๋ซ๊ฒ ๋๋ค๊ณ ํ์. ๊ทธ๋ฅ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ ๊ฑฐํ๊ณ close(2) ํ๋ค๋ฉด ์ด๋ฒคํธ ์บ์์์ ๊ทธ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋ํ ์ด๋ฒคํธ๊ฐ ์๋ค๊ณ ํ๋จํ ์๋ ์์ ๊ฒ์ด๊ณ ๊ทธ๋์ ํผ๋์ด ์๊ธธ ์ ์๋ค.
์ด์ ๋ํ ํ ํด๋ฒ์ 47๋ฒ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋์ epoll_ctl(EPOLL_CTL_DEL)
์ ํธ์ถํด์ ํ์ผ ๋์คํฌ๋ฆฝํฐ 13์ ์ญ์ ํ๊ณ close(2) ํ ๋ค์์ ๊ด๋ จ ์๋ฃ ๊ตฌ์กฐ์ ์ญ์ ํ์๋ฅผ ํด์ ์ ๊ฑฐ ๋ชฉ๋ก์ ์ฐ๊ฒฐํด ๋๋ ๊ฒ์ด๋ค. ๋ฐฐ์น ์ฒ๋ฆฌ ์ค ํ์ผ ๋์คํฌ๋ฆฝํฐ 13์ ๋ํ ๋ค๋ฅธ ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๊ทธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์ด๋ฏธ ์ ๊ฑฐ๋์์์ ์๊ฒ ๋ ๊ฒ์ด๊ณ ํผ๋์ด ์์ ๊ฒ์ด๋ค.
๋ฆฌ๋ ์ค ์ปค๋ 2.5.44์์ epoll API๊ฐ ๋์ ๋์๋ค. glibc ๋ฒ์ 2.3.2์์ ์ง์์ด ์ถ๊ฐ๋์๋ค.
epoll API๋ ๋ฆฌ๋
์ค ์ ์ฉ์ด๋ค. ๋ช๋ช ๋ค๋ฅธ ์์คํ
์์๋ ๋น์ทํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋๋ฐ, ์๋ฅผ ๋ค์ด FreeBSD์๋ kqueue
๊ฐ ์๊ณ ์๋ผ๋ฆฌ์ค์๋ /dev/poll
์ด ์๋ค.
ํ๋ก์ธ์ค์ /proc/[pid]/fdinfo
๋๋ ํฐ๋ฆฌ ์์ ์๋ epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ ํญ๋ชฉ์ ํตํด epoll ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํตํด ๊ฐ์ ์ค์ธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ์งํฉ์ ๋ณผ ์ ์๋ค. ์์ธํ ๋ด์ฉ์ proc(5) ์ฐธ๊ณ .
kcmp(2)์ KCMP_EPOLL_TFD
๋์์ ์ฌ์ฉํด epoll ์ธ์คํด์ค ๋ด์ ์ด๋ค ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์๋์ง๋ฅผ ๊ฒ์ฌํ ์ ์๋ค.
epoll_create(2), epoll_create1(2), epoll_ctl(2), epoll_wait(2), poll(2), select(2)
2019-03-06