实现了一个基于 epoll 的简单 http server,求围观求指点~ - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Knife42
V2EX    程序员

实现了一个基于 epoll 的简单 http server,求围观求指点~

  •  
  •   Knife42
    knight42 2015-08-07 00:55:47 +08:00 3663 次点击
    这是一个创建于 3721 天前的主题,其中的信息可能已经有所发展或是发生改变。
    项目主页 https://github.com/knight42/Zerver

    程序基于 CSAPP 上的 tiny server 进行修改,使用 epoll 来实现异步非阻塞 io。目前能处理 GET/POST/HEAD 请求,也能比较粗糙地支持 CGI(cgi 程序要放在 zerver 所在文件夹的 cgi-bin 目录下,通过QUERY_STR 获取参数) 。

    未来打算实现 nginx 那种 master + workers 的形式,不过“惊群”貌似不太好解决。慢慢来吧~
    12 条回复    2015-08-07 23:48:33 +08:00
    tracyone
        1
    tracyone  
       2015-08-07 01:36:21 +08:00 via Android
    打算看这本书,没想到这本书讲这么深…
    Knife42
        2
    Knife42  
    OP
       2015-08-07 08:26:09 +08:00
    @tracyone 我觉得要读懂CSAPP 上像处理器体系结构、存储器层次结构等章节确实需要比较专业的 CS 知识,但像优化程序性能、异常控制流、系统级 IO、网络编程、并发编程等章节感觉上更加偏向于工业实践,一边敲代码一边 Google、SO 就能懂,从这几个章节我也学到了很多。共勉~
    loggerhead
        3
    loggerhead  
       2015-08-07 08:48:42 +08:00 via iPhone
    我实现了一个基于 libuv 的简单 http server,正好有些问题可以交流交流
    nirocfz
        4
    nirocfz  
       2015-08-07 10:05:32 +08:00
    似乎并不能算是异步
    zts1993
        5
    zts1993  
       2015-08-07 10:35:22 +08:00
    epoll 可以实现异步??求教
    Mirana
        6
    Mirana  
       2015-08-07 17:38:00 +08:00
    nfds = epoll_wait(efd, events, MAXEVENTS, -1);
    这句还是阻塞了,似乎只有用上线程池才能模拟真正的异步。
    Knife42
        7
    Knife42  
    OP
       2015-08-07 18:49:46 +08:00
    @nirocfz
    @zts1993

    抱歉之前没厘清概念~ 我实现的只是 io 多路复用,还是属于同步 io 的。感谢指出 :)

    @Mirana

    我是最近才开始接触网络编程这块,对概念不是很了解。我想问一下,通常讲的非阻塞是不是仅指 io 方面的?如果不是的话,那么有符合你的理解的非阻塞编程模型吗?求指点!
    Knife42
        8
    Knife42  
    OP
       2015-08-07 18:50:13 +08:00
    @loggerhead
    在 GitHub 上有项目吗?我想参观学习~
    loggerhead
        9
    loggerhead  
       2015-08-07 18:55:04 +08:00
    @Knife42 https://github.com/loggerhead/lhttpd 感觉有点乱,但是自己理不清,要是你能给点意见就好了~
    Mirana
        10
    Mirana  
       2015-08-07 19:45:12 +08:00
    @Knife42 我也是最近刚开始研究这个,select/poll是异步io,但是事件通知是阻塞的,然后epoll/kqueue将select/poll的fds遍历进化掉了,然而事件通知仍然是阻塞的,异步不阻塞的方法:
    1.posix aio
    2.epoll/kqueue,使用线程池模式分主线程和worker线程,主线程不阻塞一直循环,子线程阻塞监听io事件,也就是libev和libuv的eventloop
    3.在并发量不大的情况下,可以fork子进程的模式去处理连接,和线程池模式有点相似
    4.如果有些说的不对不要打我。。
    Knife42
        11
    Knife42  
    OP
       2015-08-07 22:10:06 +08:00
    @Mirana 感谢回复,我才知道原来还有 aio~对于第二点我还有点疑问,如果主线程不阻塞一直循环的话那它都干些什么呢?感觉程序一直保持循环而不阻塞等待或者 sleep 的话会比较费 CPU。
    Mirana
        12
    Mirana  
       2015-08-07 23:48:33 +08:00
    @Knife42 嗯,说错了,listen是阻塞的,其他的全是不阻塞的,其他阻塞的事情全交给worker线程做。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1055 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:24 PVG 02:24 LAX 11:24 JFK 14:24
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86