<aside> ๐งญ
์ด ๋ฌธ์๋ IOCP๋ ์์ ์ต์์ง๋ง epoll์ ์ฒ์์ธ ์ฌ๋์ ์ํ ๊ฒ์ด๋ค. ๋ชจ๋ ์ค๋ช ์ "IOCP์์๋ ์ด๋ ๋๋ฐ, epoll์์๋ ์ด๋ป๊ฒ ๋๋๊ฐ"์ ๋๋น๋ก ํ๋ค.
๋ชฉ์ ์ epoll ์ผ๋ฐ๋ก ์ด ์๋๋ผ ์ฐ๋ฆฌ ์๋ฒ์ Transport_Epoll.cpp๋ฅผ ์ฝ์ ์ ์๊ฒ ๋ง๋๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ๊ฐ๋
ํ๋๋ง๋ค ๊ทธ ๊ฐ๋
์ด ์ค์ ๋ก ๋ํ๋ ์ฝ๋ ์ค๋ฒํธ๋ฅผ ๋ถ์๋ค.
</aside>
<aside> ๐
๋ฒ์ โ ๋ฆฌ๋
์ค epoll, ๋ ๋ฒจ ํธ๋ฆฌ๊ฑฐ ๊ธฐ์ค. ์ค๋ฒํธ ์ธ์ฉ์ ์ ๋ถ IOCP_Server/IOCP_Server/Transport_Epoll.cpp์ด๋ฉฐ, ๋ค๋ฅธ ํ์ผ์ ์ด๋ฆ์ ๋ฐํ๋ค. selectยทpoll์์ epoll์ ์ด๋ฅด๋ ๊ณ๋ณด๋ 0์ฅ์ ์๋ค.
์์ง ์ ์ด ๊ฒ โ EPOLLETยทEPOLLEXCLUSIVEยทSO_REUSEPORT๋ ์ฐ๋ฆฌ ์ฝ๋์ ์๋ค. ์ ์๋์ง๋ 8์ฅ์.
์ด ๊ฐ๋ ์ด ์ค์ ๋ก ๋ฌด์์ ๋ถ์๋์ง๋ ๋ฐ๋ก ์๋ค โ 3. ๋ ๋ชจ๋ธ ์ฐจ์ด๊ฐ ํฐ์ง ๊ณณ ยท ์ ์ฒด ์์ฝ์ 1. ์ ์ฎ๊ฒผ๋ ยท ๊ฒฐ๊ณผ
</aside>
์๋์ฐ์์ select๋ฅผ ๋ฒ๋ฆฌ๊ณ IOCP๋ก ๊ฐ๋ ์ด์ ๊ฐ ์์๋ค. ๋ฆฌ๋ ์ค์์ select๋ฅผ ๋ฒ๋ฆฌ๊ณ epoll๋ก ๊ฐ๋ ์ด์ ๊ฐ ๊ทธ๊ฒ๊ณผ ๊ฐ๋ค. ์ด ์ฅ์ ๊ทธ ๊ณ๋ณด๋ฅผ ํ ๋ฒ์ ํ๋๋ค. ์ด๋ฏธ ์๋ ์ฌ๋์ 1์ฅ์ผ๋ก ๊ฑด๋๋ฐ์ด๋ ๋๋ค.
select ยท poll ยท epoll์ ์ ๋ถ ์ค๋น ํต์ง๋ค. "์ฝ์ ์ ์๊ฒ ๋๋ค"๊น์ง๋ง ์๋ ค์ฃผ๊ณ recv๋ ๋ด๊ฐ ๋ถ๋ฅธ๋ค. ๋ฒํผ๋ ์ฒ์๋ถํฐ ๋๊น์ง ๋ด ๊ฒ์ด๋ค.
์ ์ ์ฐจ์ด๋ ํ๋๋ฟ์ด๋ค โ ๋๊ฐ ์ค๋น๋๋์ง ์์๋ด๋ ๋ฐฉ๋ฒ. ์๋ฃ ํต์ง์ธ IOCP์๋ ๊ณ์ด ์์ฒด๊ฐ ๋ค๋ฅด๊ณ , ๊ทธ ์ฐจ์ด๊ฐ 1์ฅ๊ณผ 2์ฅ์ ๋ด์ฉ์ด๋ค.
select๋ ๊ฐ์ํ ์์ผ ๋ฌถ์์ ๋งค ํธ์ถ๋ง๋ค ์ปค๋์ ๋๊ธด๋ค. ์ปค๋์ ๊ทธ ๋ฌถ์์ ์ฒ์๋ถํฐ ๋๊น์ง ํ์ผ๋ฉฐ ์์ผ๋ง๋ค ์ํ๋ฅผ ํ์ธํ๋ค. ์ค๋น๋ ๊ฒ์ด ํ๋๋ฟ์ด์ด๋ ์ ๋ถ๋ฅผ ๋๋ค.
์ฌ๊ธฐ์ ๋์ ์ ๋ณด์ด๋ ๋น์ฉ์ด ํ๋ ๋ ๋ถ๋๋ค. ์๋ฌด๊ฒ๋ ์ค๋น๋์ง ์์์ผ๋ฉด ์ ๋ค์ด์ผ ํ๋ฏ๋ก, ์ปค๋์ ์์ผ ํ๋ํ๋์ ๋๊ธฐํ์ "๋ฐ์ดํฐ ์ค๋ฉด ๊นจ์๋ผ"๋ฅผ ๊ฑธ์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐํํ ๋ ๊ทธ๊ฒ์ ์ ๋ถ ๋๋ค. ๊ฑธ์๋ค ๋ผ๊ธฐ๋ฅผ ๋งค ํธ์ถ๋ง๋ค n๋ฒ์ฉ ๋ฐ๋ณตํ๋ค.
๊ฒฐ๊ณผ๊ฐ ์
๋ ฅ์ ๋ฎ์ด์ฐ๋ ๋ฌธ์ ๋ ์๋ค. fd_set์ "์ด๊ฒ๋ค์ ๋ด ๋ฌ๋ผ"๊ณ ๋๊ธฐ๋ฉด ๋์์ฌ ๋๋ "์ด๊ฒ๋ค์ด ์ค๋น๋๋ค"๋ก ๋ฐ๋์ด ์๋ค. ์๋ณธ์ด ์ฌ๋ผ์ง๋ ๋ค์ ๋ฃจํ ์ ์ ๋ฌถ์์ ์ฒ์๋ถํฐ ๋ค์ ์ฑ์์ผ ํ๋ค.
// ํ ๋ฐํด์ n๊ฐ๋ฅผ ์ธ ๋ฒ ๋ง์ง๋ค
while (running) {
FD_ZERO(&readSet);
for (auto& s : sessions) FD_SET(s.fd, &readSet); // โ ๋ค์ ์ฑ์ฐ๊ธฐ
select(nfds, &readSet, NULL, NULL, &tv); // โก ์ปค๋์ด ์ ๋ถ ํ๊ธฐ
for (auto& s : sessions) if (FD_ISSET(s.fd, &readSet)) ... // โข ๊ฒฐ๊ณผ ํ๊ธฐ
}
๊ฐ์ ์ ํ๋ ์๋ค. ์๋์ฐ๋ 64, ๋ฆฌ๋ ์ค๋ 1024์ด๊ณ , ๋์ ์ฑ์ง์ด ๋ค๋ฅด๋ค.
// winsock2.h:132 โ ๊ฐ๋๊ฐ ์๋ค = ๋ฎ์ด์ฐ๋ผ๊ณ ๋ง๋ ์๋ฆฌ
#ifndef FD_SETSIZE
#define FD_SETSIZE 64
#endif
// bits/typesizes.h:103 โ ๊ฐ๋ ์๋ ๋ฌด์กฐ๊ฑด ์ ์
#define __FD_SETSIZE 1024
์๋์ฐ๋ winsock2.h๋ฅผ include ํ๊ธฐ ์ ์ ๋ค์ ์ ์ํ๋ฉด ์ฌ๋ผ๊ฐ๋ค. ๋ฆฌ๋
์ค๋ ์ ๋๋ค. sys/select.h์ ๊ตฌ์กฐ์ฒด๊ฐ ๋ด๋ถ ์ด๋ฆ __FD_SETSIZE๋ก ํฌ๊ธฐ๊ฐ ์ ํด์ง๊ณ ์ฐ๋ฆฌ์๊ฒ ๋ณด์ด๋ FD_SETSIZE๋ ๊ทธ๊ฒ์ ๋ฐ์ ๋ง๋ค์ด์ง ๋ฟ์ด๋ผ, ๋ฐ์์ ์๋ฌด๋ฆฌ ์ ์ํด๋ ๊ตฌ์กฐ์ฒด๋ ๊ทธ๋๋ก๋ค.
<aside> โ ๏ธ
์ซ์๋ฅผ ์ฌ๋ฆฌ๋ ๊ฒ์ด ํด๋ฒ์ด ๋ ์ ์ ์๋ค. FD_SETSIZE๋ "๋ช ๊ฐ๊น์ง ๋ด์ ์ ์๋"์ด๊ณ select๋ ๋ด๊ธด ๊ฒ ์ ๋ถ๋ฅผ ๋งค๋ฒ ํ์ผ๋ฏ๋ก, ๊ทธ ์ซ์๊ฐ ๊ณง ๋น์ฉ์ ํฌ๊ธฐ๋ค. ๋ด์ ์ ์๋ ๊ฐ์๋ฅผ ๋๋ฆฌ๋ฉด ๋ญ๋น๋ ๊ฐ์ด ๋์ด๋๋ค.
์๋์ฐ์์ 64๋ฅผ ๋๊ธฐ๋ ค๊ณ 64๊ฐ์ฉ ์ค๋ ๋์ ์ชผ๊ฐ ๋ถ์ด๋ ์์ ์ด ์์๋ค. ๊ทธ๋ฌ๋ฉด ์ค๋ ๋ ์๊ฐ ์ธ์ ์๋ฅผ ๋ฐ๋ผ๊ฐ๋ค โ 5,000๋ช ์ด๋ฉด ์ค๋ ๋ 79๊ฐ๋ค. IOCP๋ ์ด ๋ง๋ค๋ฅธ ๊ณจ๋ชฉ์ ์์ ๋ ค๊ณ ๋์๋ค.
</aside>
fd_set ๋นํธ๋ง์คํฌ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ๊พผ ๊ฒ์ด poll์ด๋ค.
struct pollfd {
int fd;
short events; // ๋ด ๊ด์ฌ์ฌ
short revents; // ์ปค๋์ด ์ฑ์ ์ฃผ๋ ๋ต
};