{"id":77,"date":"2007-05-02T12:23:34","date_gmt":"2007-05-02T12:23:34","guid":{"rendered":"http:\/\/newblog.mix1009.net\/?p=77"},"modified":"2007-05-02T12:23:34","modified_gmt":"2007-05-02T12:23:34","slug":"unix-socket-model-and-libevent","status":"publish","type":"post","link":"https:\/\/mix1009.net\/?p=77","title":{"rendered":"UNIX Socket Model &#038; libevent"},"content":{"rendered":"<p>\ud68c\uc0ac\uc5d0\uc11c <a href=\"http:\/\/www.monkey.org\/%7Eprovos\/libevent\/\">libevent<\/a>\uc5d0 \ub300\ud55c \uc2a4\ud130\ub514\ub97c \ud558\uae30\ub85c \ud588\uc2b5\ub2c8\ub2e4. \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\uc2dc FreeBSD\uc5d0\uc11c KQueue\uc640 Solaris\uc5d0\uc11c \/dev\/poll \uac1c\ubc1c \uacbd\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. \ucd5c\uadfc\uc5d0\ub294 \ub9ac\ub205\uc2a4 \uc11c\ubc84\uc5d0\uc11c libevent\ub97c \uc774\uc6a9\ud558\uc5ec \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\ub3c4 \uc81c\uc791\ud588\uc2b5\ub2c8\ub2e4. OS\ubcc4\ub85c \uac01\uae30 API\uac00 \uc870\uae08\uc529 \ud2c0\ub824\uc11c \uc774\uc2dd\uc131\uc774 \ub5a8\uc5b4\uc838\uc11c \uc774\uc81c\ub294 libevent\ub85c \ud1b5\uc77c\ud574\uc11c \uac1c\ubc1c\ud558\ub824\uace0 \ud569\ub2c8\ub2e4.<\/p>\n<p class=\"MsoNormal\">\uc5ec\uae30\uc11c \uc124\uba85\ud558\ub294 \uc18c\ucf13 \ubaa8\ub378\uc740 \uc5ec\ub7ec \uc18c\ucf13\uc744 \ud55c \ud504\ub85c\uc138\uc2a4\uc5d0\uc11c \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ud558\uae30 \uc704\ud55c \ubc29\uc2dd\uc73c\ub85c, \uc8fc\ub85c \ub2e8\uc77c \uc4f0\ub808\ub4dc \ubc29\uc2dd\uc758 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc5ec\ub7ec \uc18c\ucf13 \uc5f0\uacb0(\uc138\uc158)\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud574\uc11c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc18c\ucf13 \ubfd0 \uc544\ub2c8\ub77c \ud30c\uc77c IO \ub4f1\uc744 \uac19\uc774 \ucc98\ub9ac\ud560\uc218 \uc788\uc73c\uba70, File Descriptor\ub97c \ud1b5\ud574\uc11c \uc561\uc138\uc2a4 \ud569\ub2c8\ub2e4.<\/p>\n<p class=\"MsoNormal\">select\uc640 poll\uc774 \uc720\ub2c9\uc2a4 \ud45c\uc900\uc73c\ub85c \uc815\ud574\uc838 \uc788\ub294 \ud568\uc218\uc774\uba70, \ud504\ub85c\ud1a0\ud0c0\uc785\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<br \/>\n[CODE type=cpp]<br \/>\nint select(int nfds, fd_set *r_fds, fd_set *w_fds, fd_set *exceptfds, struct timeval *timeout);<br \/>\nint poll(struct pollfd fds[], nfds_t nfds, int timeout);<br \/>\n[\/HTML][\/CODE]<\/p>\n<p class=\"MsoNormal\">select\uc640 poll \ubaa8\ub450 file descriptor \ub9ac\uc2a4\ud2b8\ub97c \uc778\uc790\ub85c \ub118\uae30\uace0, timeout \ub3d9\uc548 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. Timeout \uc2dc\uac04 \uc774\uc804\uc5d0 \uc804\ub2ec\ud55c fd \uc911\uc5d0 \uc774\ubca4\ud2b8\uac00 \uc788\uc73c\uba74 \ub9ac\ud134\ud569\ub2c8\ub2e4.<\/p>\n<p class=\"MsoNormal\">\ub2e8\uc77c \uc4f0\ub808\ub4dc \uc18c\ucf13 \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc758 pseudo code\ub294 \ub300\ucda9 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<br \/>\n[CODE type=cpp] <br \/>\nwhile (1) {<br \/>\n&nbsp; setup_fd_list();<br \/>\n&nbsp; select_or_poll();<br \/>\n&nbsp; handle_fd_events();<br \/>\n}<br \/>\n[\/HTML][\/CODE]<\/p>\n<p class=\"MsoNormal\"><v:stroke joinstyle=\"miter\"><v:f eqn=\"if lineDrawn pixelLineWidth 0\"><v:f eqn=\"sum @0 1 0\"><v:f eqn=\"sum 0 0 @1\"><v:f eqn=\"prod @2 1 2\"><v:f eqn=\"prod @3 21600 pixelWidth\"><v:f eqn=\"prod @3 21600 pixelHeight\"><v:f eqn=\"sum @0 0 1\"><v:f eqn=\"prod @6 1 2\"><v:f eqn=\"prod @7 21600 pixelWidth\"><v:f eqn=\"sum @8 21600 0\"><v:f eqn=\"prod @7 21600 pixelHeight\"><v:f eqn=\"sum @10 21600 0\"><v:path o:connecttype=\"rect\" gradientshapeok=\"t\" o:extrusionok=\"f\"><o:lock aspectratio=\"t\" v:ext=\"edit\"><v:imagedata o:title=\"libevent-benchmark2\" src=\"file:\/\/\/C:\/DOCUME%7E1\/mix1009\/LOCALS%7E1\/Temp\/msoclip1\/02\/clip_image001.jpg\">Select\ub294 fd\uc758 \ub9ac\uc2a4\ud2b8\ub97c \ube44\ud2b8 \ub2e8\uc704\ub85c \uc778\ucf54\ub529\ud574\uc11c \ubcf4\ub0c5\ub2c8\ub2e4. FD_SETSIZE\ub97c \uc815\uc758\ud574\uc11c bitset\uc758 \uae38\uc774\ub97c \uc815\ud574\uc904\uc218 \uc788\uc9c0\ub9cc, \uc2dc\uc2a4\ud15c\uc5d0 \ub530\ub77c\uc11c \uc81c\uc57d\uc774 \uc788\ub294 \uacbd\uc6b0\ub3c4 \uc788\ub2e4\uace0 \ud569\ub2c8\ub2e4. Poll\uc740 struct array\ub85c fd \ub9ac\uc2a4\ud2b8\ub97c \uc804\ub2ec\ud558\uc5ec \uae38\uc774\uc5d0\ub294 \uc81c\ud55c\uc774 \uc5c6\uc9c0\ub9cc, array\uc758 \uc911\uac04 fd\uac00 \uc9c0\uc6cc\uc9c0\uba74 \ucc98\ub9ac\uac00 \uc880\ub354 \ubcf5\uc7a1\ud574\uc9d1\ub2c8\ub2e4. Select\uc640 poll \ubaa8\ub450 \ud638\ucd9c\ud560\ub54c\ub9c8\ub2e4 fd \ub9ac\uc2a4\ud2b8 \uc804\uccb4\ub97c \uc804\ub2ec\ud558\uae30 \ub54c\ubb38\uc5d0 \uc5f0\uacb0\uc218\uac00 \ub9ce\uc544\uc9c0\uba74 \ube44\ud6a8\uc728\uc801\uc774 \ub429\ub2c8\ub2e4. \uc720\uc800\uc2a4\ud398\uc774\uc2a4\uc5d0\uc11c \ucee4\ub110\ub85c \uc804\ub2ec\ud558\ub294 \ub370\uc774\ud0c0\uac00 \uc5f0\uacb0\uc218\uc5d0 \ube44\ub840\ud558\uc5ec \uc120\ud615\uc801\uc73c\ub85c \ub298\uac8c\ub429\ub2c8\ub2e4.<\/v:imagedata><\/o:lock><\/v:path><\/v:f><\/v:f><\/v:f><\/v:f><\/v:f><\/v:f><\/v:f><\/v:f><\/v:f><\/v:f><\/v:f><\/v:f><\/v:stroke><\/p>\n<p class=\"MsoNormal\">\uc544\ub798\ub294 libevent \ud648\ud398\uc774\uc9c0\uc5d0 \uc788\ub294 \uc18c\ucf13 \ubaa8\ub378\uac04\uc758 \ube44\uad50 \uadf8\ub798\ud504\uc785\ub2c8\ub2e4. select\uc640 poll \ubaa8\ub450 \uc5f0\uacb0\uc218\uac00 \ub9ce\uc544\uc9c8\uc218\ub85d \ucc98\ub9ac\uc2dc\uac04\uc774 \ube44\ub840\ud558\uc5ec \uc99d\uac00\ud558\ub294\uac83\uc744 \ubcfc\uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p class=\"MsoNormal\">\n<p><img loading=\"lazy\" src=\"https:\/\/mix1009.net\/wp-content\/uploads\/1\/1054523872.jpg\" class=\"aligncenter\" width=\"500\" height=\"386\" alt=\"\" \/><\/p>\n<p class=\"MsoNormal\">\uc774\ub7ec\ud55c \ubb38\uc81c\uc810\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c OS\ubcc4\ub85c \ub2e4\ub978 \uc18c\ucf13 \ubaa8\ub378\uc744 \uac1c\ubc1c\ud588\uc2b5\ub2c8\ub2e4. BSD\uc5d0\uc11c\ub294 Kqueue, Solaris\uc5d0\uc11c\ub294 \/dev\/poll, Linux\uc5d0\uc11c\ub294 epoll \ub4f1\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubaa8\ub378\ub4e4\uc740 fd \ub9ac\uc2a4\ud2b8 \uc804\uccb4\ub97c \ud56d\uc0c1 \uc804\ub2ec\ud558\uc9c0 \uc54a\uace0, \ud55c\ubc88 \ub4f1\ub85d\ud55c fd\ub294 \ud638\ucd9c\ud560\ub54c \ub2e4\uc2dc \ub4f1\ub85d\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub4f1\ub85d\ub41c \uc0c1\ud0dc\ub85c \ub418\uc5b4 \ucee4\ub110 \ucabd\uc5d0\uc11c \uad00\ub9ac\uac00 \ub429\ub2c8\ub2e4. fd\ub97c \ub4f1\ub85d\ud558\uace0, \ub098\uc911\uc5d0 \uc0ad\uc81c\ud560 \ub54c\ub098 \uc774\ubca4\ud2b8\uac00 \uc788\uc744 \ub54c \uae4c\uc9c0 \ub4f1\ub85d\ub41c \uc0c1\ud0dc\ub85c \ub0a8\uc544\uc788\uc5b4, \ucee4\ub110\uacfc \uc720\uc800\uc2a4\ud398\uc774\uc2a4 \uac04\uc758 \ud1b5\uc2e0 \uc624\ubc84\ud5e4\ub4dc\ub97c \ub300\ud3ed \uc904\uc600\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc5f0\uacb0\uc774 \ub298\ub354\ub77c\ub3c4 \uc774\ub97c \ucee4\ub110\ucabd\uc5d0\uc11c \ud6a8\uc728\uc801\uc73c\ub85c \ucc98\ub9ac\ud558\uc5ec \ucc98\ub9ac\uc2dc\uac04\uc774 \ud06c\uac8c \ub298\uc9c0 \uc54a\ub3c4\ub85d \uad6c\ud604\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc704\uc5d0 \uadf8\ub798\ud504\ub97c \ubcf4\uba74 Kqueue\uc640 epoll\uc740 \uc5f0\uacb0\uc218\uac00 \ub298\uc5b4\ub098\ub3c4 \ucc98\ub9ac\uc2dc\uac04\uc740 \uac70\uc758 \uc77c\uc815\ud55c \uac83\uc744 \uad00\ucc30\ud560\uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p class=\"MsoNormal\">\ud558\uc9c0\ub9cc \uc774\ub7ec\ud55c \uc18c\ucf13 \ubaa8\ub378\ub4e4\uc740 \ud45c\uc900\ud654 \ub418\uc9c0 \uc54a\uace0, \uad6c\ud604 \ubc94\uc704\ub3c4 \uc870\uae08\uc529 \ucc28\uc774\uac00 \ub098\uae30\ub54c\ubb38\uc5d0 \uc774\uc2dd\uc131\uc774 \uc88b\uc740 \uc18c\ucf13 \uc11c\ubc84\ub97c \uad6c\ud604\ud558\ub294 \uac83\uc740 \uc27d\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. Libevent\ub294 \uc774\ub7ec\ud55c \uc18c\ucf13 \ubaa8\ub378\ub4e4\uc744 \ubaa8\ub450 \uc9c0\uc6d0\ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c \uc2dc\uc2a4\ud15c\uc5d0 \ub530\ub77c\uc11c \uc81c\uc77c\uc88b\uc740 \uc18c\ucf13 \ubaa8\ub378\uc744 \uc120\ud0dd\ud558\uc5ec \ub3d9\uc791\ud558\ub3c4\ub85d \ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p class=\"MsoNormal\">\ucc38\uace0 URL: <a href=\"http:\/\/www.kegel.com\/c10k.html\">http:\/\/www.kegel.com\/c10k.html<\/a><\/p>\n<p class=\"MsoNormal\">c10k \ubb38\uc81c(10000 \uc5f0\uacb0 \ubb38\uc81c)\ub77c\uace0 \ud558\uc5ec \uc5f0\uacb0\uc744 \ub3d9\uc2dc\uc5d0 \ub9ce\uc774 \uc720\uc9c0\ud558\ub294 \uc11c\ubc84 \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0 \ub300\ud574\uc11c\uc798 \uc815\ub9ac\ub418\uc5b4 \uc788\ub294 \ud398\uc774\uc9c0\uc785\ub2c8\ub2e4.<\/p>\n<p><\/p>\n<p class=\"MsoNormal\">\uc2a4\ud130\ub514 \uc8fc\uc81c\uac00 \uc774\ubbf8 \uc5b4\ub290\uc815\ub3c4 \uc544\ub294 \ub0b4\uc6a9\uc73c\ub85c \uc815\ud574\uc84c\uace0, \uc0c8\ub85c \uc624\uc2e0 \ubd84\ub4e4\uc774 \uc720\ub2c9\uc2a4 \uacbd\ud5d8\uc774 \ub9ce\uc9c0 \uc54a\uc544\uc11c \uc2a4\ud130\ub514\ud558\uba74\uc11c \ub098\ub984\ub300\ub85c \uc0c8\ub85c\uc6b4 \ub0b4\uc6a9\ub4e4\uc744 \uacf5\ubd80\ud574\ubd10\uc57c\uaca0\uc2b5\ub2c8\ub2e4. \uc77c\ub2e8 \uac1c\uc778 \uad00\uc2ec\uc5b8\uc5b4\uc778 Ocaml\ub85c ocaml-event\ub97c \uc774\uc6a9\ud574\uc11c \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc744 \uc791\uc131\ud574\ubcf4\uace0, Make\ub300\uc2e0 automake\uc640 autoconf \uacf5\ubd80\ub3c4 \uc880 \ud574\uc57c\uaca0\ub124\uc694. \uc6cc\ub099 BSD Parallel Make\uc5d0 \uc775\uc219\ud574\uc838\uc11c \uc694\uc998 \ub9ac\ub205\uc2a4\uc5d0\uc11c GNU Make \uc4f0\ub294\ub370 \ub2f9\ud669\uc2a4\ub7fd\ub354\uad70\uc694. &#8211;;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud68c\uc0ac\uc5d0\uc11c libevent\uc5d0 \ub300\ud55c \uc2a4\ud130\ub514\ub97c \ud558\uae30\ub85c \ud588\uc2b5\ub2c8\ub2e4. \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8 \uac1c\ubc1c\uc2dc FreeBSD\uc5d0\uc11c KQueue\uc640 Solaris\uc5d0\uc11c \/dev\/poll \uac1c\ubc1c \uacbd\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. \ucd5c\uadfc\uc5d0\ub294 \ub9ac\ub205\uc2a4 \uc11c\ubc84\uc5d0\uc11c libevent\ub97c \uc774\uc6a9\ud558\uc5ec \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\ub3c4 \uc81c\uc791\ud588\uc2b5\ub2c8\ub2e4. OS\ubcc4\ub85c \uac01\uae30 API\uac00 \uc870\uae08\uc529 \ud2c0\ub824\uc11c \uc774\uc2dd\uc131\uc774 \ub5a8\uc5b4\uc838\uc11c \uc774\uc81c\ub294 libevent\ub85c \ud1b5\uc77c\ud574\uc11c \uac1c\ubc1c\ud558\ub824\uace0 \ud569\ub2c8\ub2e4. \uc5ec\uae30\uc11c \uc124\uba85\ud558\ub294 \uc18c\ucf13 \ubaa8\ub378\uc740 \uc5ec\ub7ec \uc18c\ucf13\uc744 \ud55c \ud504\ub85c\uc138\uc2a4\uc5d0\uc11c \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ud558\uae30 \uc704\ud55c \ubc29\uc2dd\uc73c\ub85c, \uc8fc\ub85c \ub2e8\uc77c \uc4f0\ub808\ub4dc \ubc29\uc2dd\uc758 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc5ec\ub7ec \uc18c\ucf13 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[19],"tags":[70,71,72,73,74,75],"_links":{"self":[{"href":"https:\/\/mix1009.net\/index.php?rest_route=\/wp\/v2\/posts\/77"}],"collection":[{"href":"https:\/\/mix1009.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mix1009.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mix1009.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mix1009.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=77"}],"version-history":[{"count":0,"href":"https:\/\/mix1009.net\/index.php?rest_route=\/wp\/v2\/posts\/77\/revisions"}],"wp:attachment":[{"href":"https:\/\/mix1009.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=77"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mix1009.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=77"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mix1009.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=77"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}