首页 > 其他 > 详细

网络编程学习-面向工资编程-读书总结

时间:2017-01-22 20:25:05      阅读:303      评论:0      收藏:0      [点我收藏+]

接上一篇 http://www.cnblogs.com/charlesblc/p/6241926.html

 

来源:

https://zhuanlan.zhihu.com/p/20204159

(一):演进——从Apache到Nginx

网上关于Apache和Nginx性能比较的文章非常多,基本上有如下的定论:

  1. Nginx在并发性能上比Apache强很多,如果是纯静态资源(图片、JS、CSS)那么Nginx是不二之选。
  2. Apache有mod_php、在PHP类的应用场景下比Nginx部署起来简单很多。一些老的PHP项目用Apache 来配置运行非常的简单,例如Wordpress。
  3. 对于初学者来说Apache配置起来非常复杂冗长的类XML语法,甚至支持在子目录放置.htaccess 文件来配置子目录的属性。Nginx的配置文件相对简单一点。
  4. Nginx的模块比较容易写,可以通过写C的mod实现接口性质的服务,并且拥有惊人的性能。 分支OpenResty,可以配合lua来实现很多自定义功能,兼顾扩展性和性能。

 

这里我们要着重讨论的是为什么Nginx在并发性能上比Apache要好很多
 

非阻塞&事件驱动这么好,为什么大家没有一开始就采用这种方式呢? 原因有二:

  1. 非阻塞&事件驱动需要系统的支持,提供non-blocking版的整套 系统调用。
  2. 非阻塞&事件驱动编程难度较大,需要很高的抽象思维能力, 把整个任务拆解;采用有限状态机编程才能实现。
 
第二篇:
 
下面这段摘自wikipedia:

epoll是Linux内核的可扩展I/O事件通知机制。它设计目的只在取代既有POSIX select(2)与poll(2)系统函数,让需要大量操作文件描述符的程序得以发挥更优异的性能 (举例来说:旧有的系统函数所花费的时间复杂度为O(n),epoll则耗时O(1))。 epoll与FreeBSD的kqueue类似,底层都是由可配置的操作系统内核对象建构而成, 并以文件描述符(file descriptor)的形式呈现于用户空间。

 

epoll由下面几个系统调用组成:

int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event);
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

为了解决高并发问题,大约在2000年,Jonathan Lemon在FreeBSD内核中实现了第一个版本 的kqueue,并在FreeBSD 4.1版本发布。之后FreeBSD在处理高并发的问题上一直领先于Linux。


在2002年,Linux的2.5.44版本(测试版本)首次加入了epoll机制。 直到2004年,在Linux的2.6.9版本epoll相关的API才稳定下来, Linux的高并发机制这才跟赶上FreeBSD。
 

各种操作系统在解决这个问题的办法上也是百花齐放:

技术操作系统kqueueUNIX (FreeBSD、MacOS)epollLinux 2.5.44/2.6.9IOCP (IO Completion Port)Windows NT 3.5, AIX, Solaris 10

 

第三篇
 

Libevent

技术分享

 

由于POSIX标准的滞后性,事件通知API的混乱一直保持到现在, 所有就有libevent、libev甚至后面的libuv的出现为跨平台编程扫清障碍
 

下面是WikiPedia对于libevent的介绍:

libevent是一个异步事件处理软件函式库,以BSD许可证发布。 libevent提供了一组应用程序编程接口(API),让程序员可以设定某些事件发生时所执行的函式,也就是说,libevent可以用来取代网络服务器所使用的事件循环检查框架

由于可以省去对网络的处理,且拥有不错的效能, 有些软件使用libevent作为网络底层的函式库,如:Chromium(Chrome的开源版)、 memcached、Tor。

按照libevent的官方网站,libevent库提供了以下功能:当一个文件描述符的特定事件 (如可读,可写或出错)发生了,或一个定时事件发生了, libevent就会自动执行用户指定的回调函数,来处理事件。


libevent的高明之处还在于,它把fd读写、信号、DNS、定时器甚至idle(空闲) 都抽象化成了event(事件)。
 
 
ET/LT区别

二者的差异在于Level Triggered模式下只要某个socket处于readable/writable状态, 无论什么时候进行epoll_wait都会返回该socket;

而Edge Triggered模式下只有某个socket从unreadable变为readable或 从unwritable变为writable时,epoll_wait才会返回该socket。



第四篇
https://zhuanlan.zhihu.com/p/20336461?refer=auxten
看专门的笔记:
 

网络编程学习-面向工资编程-读书总结

原文:http://www.cnblogs.com/charlesblc/p/6341265.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!