
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
并发编程开发是目前大多数软件开发程序员都在使用的一种编程开发方式,今天我们就通过案例分析来简单了解一下,常见并发编程模型都有哪些类型。
1、单线程IO复用+多线程IO复用
server在启动监听前,开辟固定数量(N)的线程,用threadpoll线程池管理
主线程mainthread创建listenfd之后,采用IO多路复用机制(如select、epoll)进行IO状态阻塞监控,有client连接请求,IO复用机制检测到listenfd触发读事件,则进行accept建立连接,并将新生成的connectfd分发给threadpool中的某个线程进行监听
threadpool中的每个thread都启动IO多路复用机制,用来监听mainthread建立成功并且分发下来的connectfd的读写事件,处理对应的读写业务,并将处理完的结果通过该thread自己的IO多路复用机制回执给客户端
优缺点
优点
将之前的mainthread单流程的读写,分散到多线程来完成,这样就增加了同一时刻读写的并行通道,并行通道的数量N,N就是线程池的数量
server同时监听connectfd的数量,几乎是成倍增加,之前的全部监控数量取决于mainthread的多路IO复用机制的大限制,所以理论上单点server高响应并发数量应该是之前的N倍(N是线程池数量,建议线程数量和CPU核心数1:1)
如果良好的线程池数量可CPU核心数适配,那么可以尝试将CPU与thread绑定,从而降低CPU的切换频率,提高每个thread处理合理业务的效率,降低CPU的切换成本
memchached的并发模型与该模型比较类似
缺点
虽然监听的并发数量提升,但是高的读写并行通道依然为N,并且多个身处于同一个thread的客户端,会出现读写排队现象,实际上每个thread模型与单线程IO多路复用机制是一致的
2、单进程IO复用+多进程IO复用
与单线程IO复用+多线程IO复用(线程池)无太大差异
不同点
进程和线程的内存布局不同,导致mainprocess(主进程)不再进行accept操作,而是将accept过分散到各个子进程中
进程的特性,资源独立,所以mainprocess如果accept成功的fd,其他进程无法资源共享,所以需要各个进程自行accept创建连接
mainprocess只是监听listenfd的状态,一旦触发读事件(有新连接请求),通过一些IPC(进程间通信,如信号、共享内存、管道等),让各自子进程process竞争accpet完成连接建立,并各自监听
优缺点
与单线程IO复用+多线程IO复用(线程池)无太大差异
不同点:
多进程内存资源空间占用稍微大一些
多进程模型安全稳定性较强,这也是各自进程互不干扰的特点导致
实际上每个子进程process都是一个单线程IO多路复用模型
3、单线程IO复用+多线程IO复用+多线程
模型分析
server在启动监听之前,开辟固定数量(N)的线程,用threadpool线程池管理
主线程mainthread创建listenfd之后,采用IO多路复用机制(如select、epoll)进行IO状态阻塞监控,有client连接请求,IO复用机制检测到listenfd触发读事件,则进行accept建立连接,并将新生成的connectfd分发给threadpool中的某个线程进行监听
threadpool中的每个thread都启动IO多路复用机制,用来监听mainthread建立成功并且分发下来的connectfd的读写事件,一旦有某个connectfd的读写事件被触发,立即开辟一个新的线程开处理IO读写业务
当某个线程处理完当前的读写业务,如果当前connectfd没有被关闭,那么将当前fd重新加回到threadpool的IO复用集合,并将自身线程销毁
优缺点
优点
除了能够保证同时响应高的并发数,又能够解决读写并行通道的局限问题
同一时刻读写并行通道,达到大化极限,一个客户端可以对应一个单独的执行流程处理读写业务
缺点
该模型过于理想化,要求CPU核心数足够大
如果硬件CPU数量有限,那么该模型就造成大量CPU切换的成本浪费。
实际开发中,几乎用不到如此复杂的网络模型,当前流行的开源网络组件中,也没有哪一款软件做到了如此复杂的程度
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。