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

2015-08-07 00:55:47 +08:00
 Knife42
项目主页 https://github.com/knight42/Zerver

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

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

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

@Mirana

我是最近才开始接触网络编程这块,对概念不是很了解。我想问一下,通常讲的非阻塞是不是仅指 io 方面的?如果不是的话,那么有符合你的理解的非阻塞编程模型吗?求指点!
Knife42
2015-08-07 18:50:13 +08:00
@loggerhead
在 GitHub 上有项目吗?我想参观学习~
loggerhead
2015-08-07 18:55:04 +08:00
@Knife42 https://github.com/loggerhead/lhttpd 感觉有点乱,但是自己理不清,要是你能给点意见就好了~
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
2015-08-07 22:10:06 +08:00
@Mirana 感谢回复,我才知道原来还有 aio~对于第二点我还有点疑问,如果主线程不阻塞一直循环的话那它都干些什么呢?感觉程序一直保持循环而不阻塞等待或者 sleep 的话会比较费 CPU。
Mirana
2015-08-07 23:48:33 +08:00
@Knife42 嗯,说错了,listen是阻塞的,其他的全是不阻塞的,其他阻塞的事情全交给worker线程做。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/211386

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX