V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Knife42
V2EX  ›  程序员

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

  •  
  •   Knife42 ·
    knight42 · 2015-08-07 00:55:47 +08:00 · 3301 次点击
    这是一个创建于 3431 天前的主题,其中的信息可能已经有所发展或是发生改变。
    项目主页 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   ·   实用小工具   ·   2394 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:00 · PVG 00:00 · LAX 08:00 · JFK 11:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.