gayhub赛高
zhangn
采用 PreForking 模型可以对子进程的数量进行了限制。PreForking 是通过预先产生多个子进程,共同对服务器套接字进行竞争性的
June 22 , 2018 4 阅读全文
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。
poll模型和select模型很相似。两者间的主要区别在于我们要如何指定待检查的文件描述符。在select中,我们提供三个集合,在每个集合中标明我们感兴趣的文件描述符。而在poll中我们提供一列文件描述符,并在每个文件描述符上标明我们感兴趣的事件,完整代码戳这里,用到的系统调用如下
前面介绍的都是阻塞IO,又称同步IO,系统默认的IO操作都是同步的,即每次都阻塞在文件读写上,如果没有数据到来程序就阻塞在那,完全靠多线程和多进程实现并发。今天我们开学习非阻塞IO,又称异步IO,在单一线程中实现并发。
对于多线程模型,假设某一时刻,突然涌入大量的客户端请求,超过了系统创建的上限,如果程序处理的不好很容易把服务器搞挂掉。而且虽然线程的创建比进程的创建开销要小,但还是有一定的开销的。那么,我们能不能想个办法,既能控制住线程的数量使其不要超过系统的上限,又能减少线程创建的开销呢?于是乎就有了线程池的出现。
该模型和多进程模型的思想类似,只是把进程换成了线程,因为线程的创建比进程创建开销小。但这并不是说多线程就一定比多进程优秀,进程和线程都有各自的优缺点,具体请自行查阅线程和进程相关的内容,完整代码戳这里
该模型是在单一迭代模型的基础上的改进,父进程只在一个死循环里进行accept,当一个客户端接入时,父进程会fork一个子进程,然后父进程关闭该连接的socket,并继续accept,等待下一个客户端接入,子进程可以关闭监听socket,然后去处理客户端请求,处理结束后关闭连接socket,结束自身进程,完整代码戳这里
这是最简单的一种服务器模型,简单到实际开发中基本就不怎么能见到,其工作模式就是在一个死循环里不停的accept,如果有客户端接入,就进入一个子循环处理客户端的请求,直到客户端断开连接为止,然后再阻塞在accept,等待下一个客户端的接入,下面直接上代码,完整代码戳这里