=Start=
缘由:
之前只是在看书的时候简单了解过几种网络服务器并发编程模型,但是细节什么的也不清楚,最近在碰到相关问题的时候想着再去了解、学习一下。接下来,主要以在「常见网络服务器并发编程模型」看到的内容为引子进行学习。
正文:
参考解答:
/* 循环式/迭代式服务器:UDP服务器 UDP循环服务器的实现非常简单:UDP服务器每次从套接字上读取一个客户端的请求,处理,然后将结果返回给客户端。因为UDP是非面向连接的,没有一个客户端可以老是占住服务端。只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够满足。可以用下面的算法来实现: */ socket(); bind(); while(1) { recvfrom(); process(); sendto(); } /* 循环式/迭代式服务器:TCP服务器 TCP循环服务器的实现也不难:TCP服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接。 TCP循环服务器一次只能处理一个客户端的请求,只有在这个客户的所有请求都满足后,服务器才可以继续后面的请求。这样如果有一个客户端占住服务器不放时,其它的客户机都不能工作了。因此,TCP服务器一般很少用循环服务器模型的。 */ socket(); bind(); listen(); while(1) { accept(); while(1) { read(); process(); write(); } close(); } /* 并发服务器:TCP服务器 为了弥补循环TCP服务器的缺陷,人们又想出了并发服务器的模型。并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是服务器创建一个子进程来处理。 TCP并发服务器可以解决TCP循环服务器客户机独占服务器的情况。不过同时也带来了一个不小的问题——为了响应客户机的请求,服务器要创建子进程来处理。而创建子进程是一种非常消耗资源的操作。 */ socket(); bind(); listen(); while(1) { accept(); if(fork()==0) { while(1) { read(); process(); write(); } close(); exit(); } close(); } /* 并发服务器:多路复用I/O 为了解决创建子进程带来的系统资源消耗,人们又想出了多路复用I/O模型。 在我们调用select()时进程会一直阻塞直到以下的一种情况发生:1)有文件可以读;2)有文件可以写;3)超时所设置的时间到。 */ socket(); bind(); listen(); while(1) { 设置监听读写文件描述符(FD_*); 调用select(); 如果是listen套接字就绪,说明一个新的连接请求建立 { 建立连接(accept); 加入到监听文件描述符中去; } 否则说明是一个已经连接过的描述符 { 进行操作(read或者write); } } /* TCP并发服务器模型 I/O多路复用 */ /* 服务器主进程 */ socket(); bind(); listen(); pthread_create(); //创建客户端连接线程和业务处理线程 /* 连接处理线程 */ while(1) { accept(); //接受一个客户端连接 store();//存储客户端套接字描述符到一个公共集合中 } /* 业务处理线程 */ while(1) { get(); //取出可用的客户端套接字描述符 select(); //设置监听读写文件描述符集合 recv(); process(); send(); close(); } pthread_join(); //等待线程结束 close(); //关闭服务器套接字
参考链接:
Linux网络编程:9. 服务器模型
http://read.pudn.com/downloads128/ebook/546205/Linux%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/09.pdf
Linux网络编程服务器模型选择之循环服务器
http://www.cnblogs.com/lizhenghn/p/3617608.html
Linux网络编程服务器模型选择之IO复用循环并发服务器
http://www.cnblogs.com/lizhenghn/p/3619091.html
常见网络服务器并发编程模型
http://cpper.info/2016/07/30/Concurrency-Network-Server-Models.html
使用事件驱动模型实现高效稳定的网络服务器程序
https://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/
使用异步 I/O 大大提高应用程序的性能
https://www.ibm.com/developerworks/cn/linux/l-async/
=END=
《 “Linux网络编程中的几种简单服务器模型” 》 有 5 条评论
twisted学习笔记
https://jiayi.space/post/twistedxue-xi-bi-ji
Unix中的几种I/O模型
http://fanchao01.github.io/blog/2015/02/06/note-asynchrounous/
Linux 的 IO 通信 以及 Reactor 线程模型浅析
https://mp.weixin.qq.com/s/TBUxW0vgSdwL_n97ALGZpg
`
经典的 I/O 通信模型;
Reactor 线程模型详述;
Reactor 线程模型几种模式;
Netty Reactor 线程模型的实践;
`
Linux 上 TCP bind 和 listen 的内部实现
https://ops.tips/blog/how-linux-tcp-introspection/
网络 IO 演变发展过程和模型介绍
https://mp.weixin.qq.com/s/EDzFOo3gcivOe_RgipkTkQ
`
1.1 网络 IO 的各个发展阶段
通常,我们在此讨论的网络 IO 一般都是针对 linux 操作系统而言。网络 IO 的发展过程是随着 linux 的内核演变而变化,因此网络 IO 大致可以分为如下几个阶段:
1. 阻塞 IO(BIO)
2. 非阻塞 IO(NIO)
3. IO 多路复用第一版(select/poll)
4. IO 多路复用第二版(epoll)
5. 异步 IO(AIO)
而每一个阶段,都是因为当前的网络有一些缺陷,因此又在不断改进该缺陷。这是网络 IO 一直演变过程中的本质。下面将对上述几个阶段进行介绍,并对每个阶段的网络 IO 解决了哪些问题、优点、缺点进行剖析。
`
IO 模式和 IO 多路复用
https://juejin.im/post/5bf7b89e518825369c564059
Linux IO 模式及 select、poll、epoll 详解
https://segmentfault.com/a/1190000003063859
Chapter 6. I/O Multiplexing: The select and poll Functions
http://www.masterraghu.com/subjects/np/introduction/unix_network_programming_v1.3/ch06.html
高性能 IO 模型分析-Reactor 模式和 Proactor 模式(二)
https://zhuanlan.zhihu.com/p/95662364