epoll(7) - wariua/manpages-ko GitHub Wiki

NAME

epoll - I/O ์ด๋ฒคํŠธ ์•Œ๋ฆผ ๊ธฐ๋Šฅ

SYNOPSIS

#include <sys/epoll.h>

DESCRIPTION

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)๋กœ ๋™์ž‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์‚ฌ๊ฑด๋“ค์ด ์ผ์–ด๋‚œ๋‹ค๊ณ  ํ•˜์ž.

  1. ํŒŒ์ดํ”„์˜ ์ฝ๊ธฐ ์ชฝ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ(rfd)๋ฅผ epoll ์ธ์Šคํ„ด์Šค์— ๋“ฑ๋กํ•œ๋‹ค.

  2. ํŒŒ์ดํ”„ ์“ฐ๊ธฐ ์ชฝ์—์„œ 2 kB ๋ฐ์ดํ„ฐ๋ฅผ ์จ๋„ฃ๋Š”๋‹ค.

  3. epoll_wait(2) ํ˜ธ์ถœ์ด ์ด๋ค„์ง€๊ณ , ์ค€๋น„ ์ƒํƒœ์ธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋กœ rfd๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. ํŒŒ์ดํ”„ ์ฝ๊ธฐ ์ชฝ์—์„œ rfd๋กœ๋ถ€ํ„ฐ 1 kB ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.

  5. epoll_wait(2) ํ˜ธ์ถœ์ด ์ด๋ค„์ง„๋‹ค.

ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ rfd๋ฅผ epoll ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”๊ฐ€ํ•  ๋•Œ EPOLLET(์—์ง€ ํŠธ๋ฆฌ๊ฑฐ) ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ํŒŒ์ผ ์ž…๋ ฅ ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ง ์žˆ๋Š”๋ฐ๋„ 5๋ฒˆ ๋‹จ๊ณ„์˜ epoll_wait(2) ํ˜ธ์ถœ์—์„œ ์•„๋งˆ ๋ฉˆ์ถœ ๊ฒƒ์ด๋‹ค. ๊ทธ๋™์•ˆ ์›๊ฒฉ ์ƒ๋Œ€๋Š” ์ด๋ฏธ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋Š” ๊ฑด ์—์ง€ ํŠธ๋ฆฌ๊ฑฐ ๋ชจ๋“œ์—์„œ๋Š” ๊ฐ์‹œ ๋Œ€์ƒ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์—์„œ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธธ ๋•Œ์—๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋†“๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ 5๋ฒˆ ๋‹จ๊ณ„์—์„œ ํ˜ธ์ถœ์ž๊ฐ€ ์ด๋ฏธ ์ž…๋ ฅ ๋ฒ„ํผ ๋‚ด์— ์žˆ๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์œ„ ์˜ˆ์—์„œ rfd์— ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฑด 2๋ฒˆ์—์„œ ์ด๋ค„์ง„ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์ด๊ณ  ๊ทธ ์ด๋ฒคํŠธ๋ฅผ 3๋ฒˆ์—์„œ ์†Œ๋ชจํ•œ๋‹ค. 4๋ฒˆ์—์„œ ์ด๋ค„์ง„ ์ฝ๊ธฐ ์—ฐ์‚ฐ์ด ๋ฒ„ํผ ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ์†Œ๋ชจํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ 5๋ฒˆ ๋‹จ๊ณ„์—์„œ ์ด๋ค„์ง€๋Š” epoll_wait(2) ํ˜ธ์ถœ์ด ๋ฌดํ•œ์ • ๋ธ”๋ก ํ•  ์ˆ˜๋„ ์žˆ๊ฒŒ ๋œ๋‹ค.

EPOLLET ํ”Œ๋ž˜๊ทธ๋ฅผ ์“ฐ๋Š” ์‘์šฉ์—์„œ๋Š” ๋ธ”๋ก ํ•˜๋Š” ์ฝ๊ธฐ๋‚˜ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํƒœ์Šคํฌ๊ฐ€ ๊ตถ๊ฒŒ ๋˜๋Š” ๊ฑธ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋…ผ๋ธ”๋กœํ‚น ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค. epoll์„ ์—์ง€ ํŠธ๋ฆฌ๊ฑฐ(EPOLLET) ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์“ฐ๋Š” ๊ถŒ์žฅ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋…ผ๋ธ”๋กœํ‚น ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์“ด๋‹ค.

  2. 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)์—์„œ ๊นจ์–ด๋‚œ๋‹ค. ์ด๋Š” ๋ช‡๋ช‡ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ์˜ "๊ฐœ๋–ผ์ฒ˜๋Ÿผ" ๊นจ์–ด๋‚˜๊ธฐ๋ฅผ ๋ง‰๋Š” ์ตœ์ ํ™” ํšจ๊ณผ๋ฅผ ์ค€๋‹ค.

autosleep๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ

/sys/power/autosleep๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์ด autosleep ๋ชจ๋“œ์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์žฅ์น˜๊ฐ€ ๊นจ๋Š” ๊ฒฝ์šฐ์— ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋Š” ์ด๋ฒคํŠธ๊ฐ€ ํ์— ๋“ค์–ด๊ฐˆ ๋•Œ๊นŒ์ง€๋งŒ ์žฅ์น˜๋ฅผ ๊นจ์›Œ ๋‘๊ฒŒ ๋œ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋œ ๋‹ค์Œ๊นŒ์ง€ ์žฅ์น˜๋ฅผ ๊นจ์›Œ ๋‘๋ ค๋ฉด epoll_ctl(2)์˜ EPOLLWAKEUP ํ”Œ๋ž˜๊ทธ๋ฅผ ์“ธ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

struct epoll_event์˜ events ํ•„๋“œ์— EPOLLWAKEUP ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ํ์— ๋“ค์–ด๊ฐ€๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” epoll_wait(2) ํ˜ธ์ถœ์— ์ด์–ด ๊ทธ ๋‹ค์Œ epoll_wait(2) ํ˜ธ์ถœ๊นŒ์ง€ ์‹œ์Šคํ…œ์ด ๊นจ์–ด ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ ์‹œ๊ฐ„ ๋„ˆ๋จธ๊นŒ์ง€ ์‹œ์Šคํ…œ์„ ๊นจ์›Œ ๋‘ฌ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‘ ๋ฒˆ์งธ epoll_wait(2) ํ˜ธ์ถœ ์ „์— ๋”ฐ๋กœ wake_lock์„ ์žก์œผ๋ฉด ๋œ๋‹ค.

/proc ์ธํ„ฐํŽ˜์ด์Šค

๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•ด 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 ์‚ฌ์ด๋ฅผ ๊ณ„์† ์˜ค๊ฐ€๋Š” ๊ฑธ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€

  1. epoll ์ง‘ํ•ฉ์— ๋“ฑ๋ก๋œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์„ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐ ์“ฐ๋Š” ํ‚ค๋Š” ๋ฌด์—‡์ธ๊ฐ€?

    ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ฒˆํ˜ธ์™€ ์—ด๋ฆฐ ํŒŒ์ผ ๊ธฐ์ˆ  ํ•ญ๋ชฉ(์—ด๋ฆฐ ํŒŒ์ผ์˜ ์ปค๋„ ๋‚ด ํ‘œํ˜„, "์—ด๋ฆฐ ํŒŒ์ผ ํ•ธ๋“ค"์ด๋ผ๊ณ ๋„ ํ•จ)์˜ ์กฐํ•ฉ์ด ํ‚ค๋‹ค.

  2. ์–ด๋–ค epoll ์ธ์Šคํ„ด์Šค์— ๊ฐ™์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‘ ๋ฒˆ ๋“ฑ๋กํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€?

    ์•„๋งˆ EEXIST๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ณต์ œ (dup(2), dup2(2), fcntl(2) F_DUPFD) ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๊ฐ™์€ epoll ์ธ์Šคํ„ด์Šค์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ณต์ œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์„ ๋‹ค๋ฅธ events ๋งˆ์Šคํฌ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ธฐ๋ฒ•์ด ์ด๋ฒคํŠธ ํ•„ํ„ฐ๋ง์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. epoll ์ธ์Šคํ„ด์Šค ๋‘ ๊ฐœ๊ฐ€ ๊ฐ™์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋‘ epoll ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ชจ๋‘๋กœ ๋ณด๊ณ ๋˜๋Š”๊ฐ€?

    ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด๋ฒคํŠธ๊ฐ€ ๋‘˜ ๋ชจ๋‘๋กœ ๋ณด๊ณ ๋  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์˜ฌ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์กฐ์‹ฌ์Šค๋Ÿฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค.

  4. epoll ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ž์น˜๋ฅผ poll/epoll/select ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

    ๊ฐ€๋Šฅํ•˜๋‹ค. epoll ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ๋Œ€๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.

  5. epoll ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๊ทธ ์ž์ฒด์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ง‘ํ•ฉ์— ๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€?

    epoll_ctl(2) ํ˜ธ์ถœ์ด ์‹คํŒจ(EINVAL)ํ•œ๋‹ค. ํ•˜์ง€๋งŒ epoll ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‹ค๋ฅธ epoll ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์„ธํŠธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.

  6. epoll ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“์„ ํ†ตํ•ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€?

    ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ์ˆ˜์‹  ํ”„๋กœ์„ธ์Šค์—์„œ ๊ด€์‹ฌ ๋ชฉ๋ก์— ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์˜ ์‚ฌ๋ณธ์ด ์—†์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  7. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋‹ซํžˆ๋ฉด epoll ๊ด€์‹ฌ ๋ชฉ๋ก์—์„œ ์ œ๊ฑฐ๋˜๋Š”๊ฐ€?

    ๊ทธ๋ ‡๊ธฐ๋Š” ํ•œ๋ฐ ์กฐ์‹ฌํ•  ์ ์ด ์žˆ๋‹ค. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ์—ด๋ฆฐ ํŒŒ์ผ ๊ธฐ์ˆ  ํ•ญ๋ชฉ(open(2) ์ฐธ๊ณ )์— ๋Œ€ํ•œ ์ฐธ์กฐ์ด๋‹ค dup(2), dup2(2), fcntl(2) F_DUPFD, fork(2)๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋ณต์ œ๋  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ์—ด๋ฆฐ ํŒŒ์ผ ๊ธฐ์ˆ  ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒˆ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ด๋ฆฐ ํŒŒ์ผ ๊ธฐ์ˆ  ํ•ญ๋ชฉ์€ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์ด ๋ชจ๋‘ ๋‹ซํž ๋•Œ๊นŒ์ง€ ๊ณ„์† ์กด์žฌํ•œ๋‹ค.

    ๊ด€์‹ฌ ๋ชฉ๋ก์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ๊ฑด ๊ธฐ๋ฐ˜ ์—ด๋ฆฐ ํŒŒ์ผ ๊ธฐ์ˆ  ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์ด ๋ชจ๋‘ ๋‹ซํžŒ ํ›„์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ด€์‹ฌ ๋ชฉ๋ก์— ์†ํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋‹ซํžŒ ํ›„์—๋„ ๋™์ผํ•œ ๊ธฐ๋ฐ˜ ์—ด๋ฆฐ ํŒŒ์ผ ๊ธฐ์ˆ  ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹ค๋ฅธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์—ด๋ ค ์žˆ๋‹ค๋ฉด ๊ทธ ๋‹ซํžŒ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ๋ณด๊ณ ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ง‰์œผ๋ ค๋ฉด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณต์ œํ•˜๊ธฐ ์ „์— (epoll_ctl(2) EPOLL_CTL_DEL๋กœ) ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๊ด€์‹ฌ ๋ชฉ๋ก์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค. ์•„๋‹ˆ๋ฉด ์‘์šฉ์—์„œ ๋ชจ๋“  ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์ด ๋‹ซ๋„๋ก ์‹ ๊ฒฝ ์จ์•ผ ํ•œ๋‹ค. (ํ•˜์ง€๋งŒ ์•ˆ ๋ณด์ด๋Š” ๊ณณ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๊ฐ€ dup(2)์ด๋‚˜ fork(2)๋ฅผ ์จ์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณต์ œํ–ˆ๋‹ค๋ฉด ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋‹ค.)

  8. epoll_wait(2) ํ˜ธ์ถœ ๊ฐ„์— ์ด๋ฒคํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋ฐœ์ƒํ•˜๋ฉด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง€๋Š”๊ฐ€, ์•„๋‹ˆ๋ฉด ๋”ฐ๋กœ ๋ณด๊ณ ๋˜๋Š”๊ฐ€?

    ํ•ฉ์ณ์ง„๋‹ค.

  9. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ๋Œ€ํ•œ ๋™์ž‘์ด ์ด๋ฏธ ์ˆ˜์ง‘๋์ง€๋งŒ ์•„์ง ๋ณด๊ณ ๋˜์ง€๋Š” ์•Š์€ ์ด๋ฒคํŠธ์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š”๊ฐ€?

    ๊ธฐ์กด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ œ๊ฑฐ ๋™์ž‘์€ ์ด ๊ฒฝ์šฐ์— ์˜๋ฏธ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋‹ค. ๋ณ€๊ฒฝ ๋™์ž‘์€ ๊ฐ€๋Šฅํ•œ I/O๋ฅผ ์žฌํ™•์ธํ•˜๊ฒŒ ํ•œ๋‹ค.

  10. 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์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๊ทธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ด๋ฏธ ์ œ๊ฑฐ๋˜์—ˆ์Œ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด๊ณ  ํ˜ผ๋™์ด ์—†์„ ๊ฒƒ์ด๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.5.44์—์„œ epoll API๊ฐ€ ๋„์ž…๋˜์—ˆ๋‹ค. glibc ๋ฒ„์ „ 2.3.2์—์„œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

CONFORMING TO

epoll API๋Š” ๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ด๋‹ค. ๋ช‡๋ช‡ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ๋„ ๋น„์Šทํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด FreeBSD์—๋Š” kqueue๊ฐ€ ์žˆ๊ณ  ์†”๋ผ๋ฆฌ์Šค์—๋Š” /dev/poll์ด ์žˆ๋‹ค.

NOTES

ํ”„๋กœ์„ธ์Šค์˜ /proc/[pid]/fdinfo ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์— ์žˆ๋Š” epoll ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ํ•ญ๋ชฉ์„ ํ†ตํ•ด epoll ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ†ตํ•ด ๊ฐ์‹œ ์ค‘์ธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์˜ ์ง‘ํ•ฉ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ proc(5) ์ฐธ๊ณ .

kcmp(2)์˜ KCMP_EPOLL_TFD ๋™์ž‘์„ ์‚ฌ์šฉํ•ด epoll ์ธ์Šคํ„ด์Šค ๋‚ด์— ์–ด๋–ค ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

SEE ALSO

epoll_create(2), epoll_create1(2), epoll_ctl(2), epoll_wait(2), poll(2), select(2)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ