[Linux] select์ poll. ๊ทธ๋ฆฌ๊ณ epoll
select์ poll, epoll์ Linux์์ ์ ๊ณต๋๋ ๋ค์ค I/O ์ฒ๋ฆฌ๋ชจ๋ธ์ด๋ค.
์ฌ์ค ์ด linux api๋ฅผ ๋ฐ๋ก ์ธ์ผ์ ๊ฑฐ์ ์์๊ฒ์ด๋ค. ๋ณดํต ๊ณ ๊ธ์ธ์ด์์ทํต์ ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ์ด๋ฐ๊ฒ๋ค์ ์์์ ๊ตฌํ์ ํด๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ์ฌ์ฉํ๊ณ ์๋ ํต์ ๋ชจ๋์ด ์ด๋ค ๋ฐฉ์์ ์ฌ์ฉํด์ ๊ตฌํ๋์๋์ง ๋ถ๊ฐํ๊ณ , ์ด๋ค ํ๊ณ์ ์ด ์๋์ง๋ ์์๋ณผ ์ ์์ด์ผํ๋ค.
select
select๋ ์ฑ๊ธ์ค๋ ๋๋ก ๋ค์ค I/O๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ๋จ์ํ๊ณ ์ค๋๋ ๊ธฐ๋ฒ์ด๋ค.
์์ ๊ท๋ชจ์์๋ ์ ๋์ํ๋, ํ๊ณ๊ฐ ๋ง์์ ๋๊ท๋ชจ ์ฒ๋ฆฌ๋ ์ด๋ ต๋ค.
๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ ์ด๋ ๋ค.
๋ฆฌ๋ ์ค์์ ํ์ผ์ฒ๋ฆฌ๋ ์์ผํต์ ์ ์ ๋ถ ํ์ผ ๋์คํฌ๋ฆฝํฐ(FD: File Descripter)๋ฅผ ํตํด ๊ด๋ฆฌ๋๋ค.
๊ทธ๋์ ๊ทธ๋ฅ ๋ฌดํ๋ฃจํ๋๋ฉด์ ๊ด์ฌ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ(์ดํ FD)๋ค์ ์ํ๋ฅผ ๊ณ์ ๊ฒ์ฌํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ฒ ๊ฒ์ฌํ๋ค๊ฐ FD์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋ฃ๋ ์คํจ๊ฐ ๋ ๊ฒ์ด๋, ๊ทธ๊ฑธ ์ ๋ฌํด์ค์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค.
https://applefarm.tistory.com/144
๋จ์ ์, ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์ต๋ ๊ฐ์๊ฐ ์ ํด์ ธ์์ด์ ๊ทธ ์ด์์ ๋์์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋จ ๊ฒ์ด๋ค.
๋ด๋ถ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๊ด๋ฆฌ์ fd_set์ด๋ผ๋ ์ ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋๋ฐ, ๋ณดํต์ ๊ธธ์ด๊ฐ 1024๋ผ์ 1024๊ฐ๊น์ง๋ง ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. ์ ์ด๋ ๊ฒ ๋ง๋ค์ด๋จ์ง...?
๊ทธ๋ฆฌ๊ณ ๋งค๋ฒ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ณ์ ์กฐํํ๋ ๊ฒ์์ ์ฑ๋ฅ ๋ญ๋น๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ๋ ๋จ์ ์ด๋ค.
C ํค๋ sys/select.h์ select ๋ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด select ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
๊ด๋ จ ํจ์ (sys/select.h)
select
FD_ZERO
FD_SET
FD_CLEAR
FD_ISSET
poll
poll์ select์์ ํ์ผ๋์คํฌ๋ฆฝํฐ์ ๊ฐ์๊ฐ ์ ํ๋์ด์๋ค๋ ๋จ์ ์ ํด์ํ ๊ธฐ๋ฒ์ด๋ค.
์ ์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ง ์๊ณ pollfd๋ผ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ํตํด ๋์ ํ ๋น์ ํด์ ํ์ผ๋์คํฌ๋ฆฝํฐ ๋ฑ์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, select์ ๊ฐ์ ๋ฌธ์ ๋ ๋ฐ์ํ์ง ์๋๋ค.
๊ทธ ์ธ์๋ ์์ํ ๋ถ๋ถ์์ select๋ณด๋ค๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
๋๊ท๋ชจ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธด ํ๋, ๋ง์ฐฌ๊ฐ์ง๋ก ๊ด์ฌ์๋ ํ์ผ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ณ์ ๋ฌดํ๋ฃจํ๋๋ฉฐ ๊ฒ์ฌํ๋ค๋ ์ ์ ๋ค๋ฅด์ง ์์์ ์ฑ๋ฅ์ ์ ํ๊ฐ ์์ ์ ์๋ค.
epoll
epoll์ ๊ณ ์ฑ๋ฅ I/O ์ฒ๋ฆฌ๋ฅผ ์ํ ๋งค์ปค๋์ฆ์ด๋ค. windows์ iocp๊ฐ ์๋ค๋ฉด, ๋ฆฌ๋ ์ค์๋ ์ด๊ฒ ์๋ค.
epoll์ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ๋์ํด์ ๊ด์ฌ์ด ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ง ๊ฒ์ฌ๋ฅผ ํ๋ค. ์ปค๋์ด FD๋ฅผ ๋์ ๊ด๋ฆฌํด์ฃผ๋ ๊ฒ์ด๋ค.
๊ด์ฌ์๋ I/O์ FD๋ฅผ epoll ์ธ์คํด์ค๋ก ๋ง๋ค์ด์ฃผ๊ณ , wait์ ํ๋ฉด. ๊ฐ์ด ๋ค์ด์์๋ wait์ด ์ข ๋ฃ๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ฌ ์ ์๋ ๊ตฌ์กฐ๋ค.

https://medium.com/@avocadi/what-is-epoll-9bbc74272f7c
epoll_create, epoll_ctl, epoll_wait ํจ์๋ฅผ ์ฌ์ฉํด ๊ตฌํํ ์ ์๋ค.
๋จ์ ์ด๋๊ฑด ๋ฑํ ์๋๊ฒ๊ฐ๋ค.
epoll: ์ฌ์ฉ๋ฒ
- epoll ์ธ์คํด์ค ์์ฑ
epoll_create ๋๋ epoll_create1 ํจ์๋ฅผ ์ฌ์ฉํ์ฌ epoll ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ์ด ํจ์๋ ์ฑ๊ณต ์ epoll FD๋ฅผ ๋ฐํํ๋ค.
์ด ์์ฒด์ ์ธ FD๋ฅผ ํตํด ์ฒ๋ฆฌ๋ฅผ ์ ์ดํ๊ฒ ๋๋ค.
๏ปฟint epoll_fd = epoll_create1(0);
- ๊ด์ฌ ์๋ FD ๋ฑ๋ก
epoll_ctl ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ด์ฌ ์๋ FD๋ฅผ ๋ฑ๋กํ๋ค.
์ด ํจ์๋ epoll FD, ์ํ๊ฐ, ๊ด์ฌ FD, ์ด๋ฒคํธ๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค.
๊ด์ฌ FD์ ๋ญ๊ฐ ๋ค์ด์ค๋ฉด ์ด๋ฒคํธ๊ฐ ๋ค์ด์ค๊ฒ ํ๋ ๊ฒ์ด๋ค.
๏ปฟstruct epoll_event event; // ์ด๋ฒคํธ ์ ์ฅ์
event.events = EPOLLIN; // ๊ด์ฌ ์ด๋ฒคํธ๋ฅผ ์ฝ๊ธฐ ์ค๋น ์๋ฃ๋ก ์ค์
event.data.fd = fd; // ๋์ ํ์ผ ๋์คํฌ๋ฆฝํฐ
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &event); // epoll ์ธ์คํด์ค์ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ถ๊ฐ
- ์ด๋ฒคํธ ๋๊ธฐ
epoll_wait ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๊น์ง ๋๊ธฐํ๋ค.
์ด ํจ์๋ ๋ญ๊ฐ ๋ค์ด์์ ๋๊ธฐ๊ฐ ๋๋๋ฉด ๋ฐ์ํ ์ด๋ฒคํธ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
struct epoll_event events[MAX_EVENTS];
int num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); // ๋ค์ด์ฌ๋๊น์ง ๋๊ธฐ
- ์ด๋ฒคํธ ์ฒ๋ฆฌ
epoll_wait ํจ์๋ก๋ถํฐ ๋ฐํ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ค. ์๋ฅผ ๋ค์ด, ์ฝ๊ธฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ํด๋น ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค.
๏ปฟfor (int i = 0; i < num_events; i++) {
int event_fd = events[i].data.fd;
if (events[i].events & EPOLLIN) {
// ์ฝ๊ธฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ฒ๋ฆฌ
}
}
- ์ ๋ฆฌ
์ฌ์ฉ์ด ๋๋ ํ, epoll ์ธ์คํด์ค์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ซ๋๋ค.
๏ปฟclose(epoll_fd);์ฐธ์กฐ
https://ozt88.tistory.com/m/21
https://applefarm.tistory.com/144