[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: ์‚ฌ์šฉ๋ฒ•

  1. epoll ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
    epoll_create ๋˜๋Š” epoll_create1 ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ epoll ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์„ฑ๊ณต ์‹œ epoll FD๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    ์ด ์ž์ฒด์ ์ธ FD๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋ฅผ ์ œ์–ดํ•˜๊ฒŒ ๋œ๋‹ค.
๏ปฟint epoll_fd = epoll_create1(0);
  1. ๊ด€์‹ฌ ์žˆ๋Š” 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 ์ธ์Šคํ„ด์Šค์— ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ถ”๊ฐ€
  1. ์ด๋ฒคํŠธ ๋Œ€๊ธฐ
    epoll_wait ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.
    ์ด ํ•จ์ˆ˜๋Š” ๋ญ”๊ฐ€ ๋“ค์–ด์™€์„œ ๋Œ€๊ธฐ๊ฐ€ ๋๋‚˜๋ฉด ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
struct epoll_event events[MAX_EVENTS];
int num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); // ๋“ค์–ด์˜ฌ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  1. ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
    epoll_wait ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜๋œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฝ๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
๏ปฟfor (int i = 0; i < num_events; i++) {
  int event_fd = events[i].data.fd;

  if (events[i].events & EPOLLIN) {
    // ์ฝ๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ
  }
}
  1. ์ •๋ฆฌ
    ์‚ฌ์šฉ์ด ๋๋‚œ ํ›„, epoll ์ธ์Šคํ„ด์Šค์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‹ซ๋Š”๋‹ค.
๏ปฟclose(epoll_fd);


์ฐธ์กฐ
https://ozt88.tistory.com/m/21
https://applefarm.tistory.com/144