网络编程---笔记1
学东西还是做点笔记好些,方便复习。之前把尹圣雨的《TCP/IP网络编程》学了一遍,到现在都忘的差不多了。这是这次学习知乎专栏的文章的笔记。算作复习吧 https://zhuanlan.zhihu.com/p/20204159
1. 老牌HTTP服务器:Apache web服务器,通过一系列的语言相关的扩展模块支持很多解释型语言的后端;
Nginx:俄罗斯哥们儿Igor Sysoev利用异步事件驱动的架构能够处理高并发的web服务器,“轻、快、活”。
2. 最原始的Linux中accept、read、write调用都是 阻塞的(现在,阻塞也是这些调用的默认行为)。
3. 每次连接新开一个子进程,缺点:内存复制占用较多占用,fork()过程费时;
进程/线程池,“空间换时间”,缺点明显:当并发数大于进程/线程池的大小的时候 性能就会发生很大的下滑,退化成“子进程”的情况。
4.非阻塞&事件驱动
好是好,但其实现难度很大(1.非阻塞&事件驱动需要系统的支持,提供non-blocking版的整套 系统调用 2.非阻塞&事件驱动编程难度较大,需要很高的抽象思维能力, 把整个任务拆解;采用有限状态机编程才能实现。)
5. 利用邮差寄信收信的过程形象模拟了网络通信的各个概念(貌似书上也是用邮差来解释的),包括阻塞式通信,select()、poll()、epoll()。
epoll()的详细介绍:
epoll是Linux内核的可扩展I/O事件通知机制。它设计目的只在取代既有POSIX select(2)与poll(2)系统函数,让需要大量操作文件描述符的程序得以发挥更优异的性能 (举例来说:旧有的系统函数所花费的时间复杂度为O(n),epoll则耗时O(1))。 epoll与FreeBSD的kqueue类似,底层都是由可配置的操作系统内核对象建构而成, 并以文件描述符(file descriptor)的形式呈现于用户空间。
6. libevent
概念:libevent是一个异步事件处理软件函式库,以BSD许可证发布。 libevent提供了一组应用程序编程接口(API),让程序员可以设定某些事件发生时所执行的函式,也就是说,libevent可以用来取代网络服务器所使用的事件循环检查框架。
按照libevent的官方网站,libevent库提供了以下功能:当一个文件描述符的特定事件 (如可读,可写或出错)发生了,或一个定时事件发生了, libevent就会自动执行用户指定的回调函数,来处理事件。
libevent的高明之处还在于,它把fd读写、信号、DNS、定时器甚至idle(空闲) 都抽象化成了event(事件)。详情:https://zhuanlan.zhihu.com/p/20315482