服务器多进程、多线程和事件驱动模型

多进程模型、多线程模型

  • 多进程模型
    • 每接受一个连接就fork一个子进程,在该子进程中处理该连接的请求
    • 特点是多进程占用系统资源多,进程切换的系统开销大,Linux下最大进程数有限制,不利于处理大并发
  • 多线程模型
    • 每接受一个连接就create一个子线程,利用子线程处理这个连接的请求
    • Linux下有最大线程数限制(进程虚拟地址空间有限),进程频繁创建和销毁造成系统开销,同样不利于处理大并发
  • 优缺点
    • 多进程
      • 编程相对容易;通常不需要考虑锁和同步资源的问题
      • 更强的容错性:比起多线程的一个好处是一个进程崩溃了不会影响其他进程
      • 有内核保证的隔离:数据和错误隔离
      • 进程切换开销大
    • 多线程
      • 创建速度快
      • 共享数据,多线程间可以共享同一虚拟地址空间,多进程间的数据共享就需要用到共享内存、信号量等IPC技术
      • 较轻的上下文切换开销
      • 一旦有一个线程挂掉,整个进程都可能会挂掉
      • 需要对共享资源的访问进行同步

事件驱动模型

简介
  • Linux下基于select、poll或epoll实现
  • 程序的基本结构是一个事件循环结合非阻塞IO,以事件驱动和事件回调的方式实现业务逻辑,目前在高性能的网络程序中,使用得最广泛的就是这种并发模型
  • 结合线程池,避免线程频繁创建和销毁的开销,能很好地处理高并发
  • 事件驱动模型使得我们可以在一个线程内处理多个客户端的事件,省去了频繁创建销毁进程或线程的开销,结合非阻塞IO能够做到不使程序阻塞在某个描述符的读写操作上
I/O多路复用

I/O多路复用使得程序能同时监听多个文件描述符,在一个或更多文件描述符就绪前始终处于睡眠状态。Linux下的I/O复用方案有select、poll和epoll

  • select
 #include <sys/time.h>
 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于事件驱动的网络框架源码 首先看一下Server类,这个类就是整个框架的核心类,在这个类中只需要 s=new Server(8883,4); s->setUserConnectionCallback(onConnect); s->setUserMessageCallBack(onMessage); s->start(); 就可以启动一个4个线程在8883端口监听的完整的网络程序,其中的两个onXXX就是网络程序需要处理的业务 Server类中包括了有一个重要的类叫做Eventlooper这个类就是对epoll的封装,要用epoll_ctl注册到epoll上的fd又被封装为Channel类,当有数据到来需要操作时,channel中的几个函数指针就指向了需要回调的函数, 这里使用了boost库的function 其中的函数定义为: typedef boost::function EventCallBack; 在epoll返回的时候Eventlooper会遍历可以操作的所有channel,并调用其成员函数handleEvent,该函数会判断events,也就是EPOLLIN EPOLLPRI等,并更具相应的需要去调用处理函数。 这里的Channel并不直接使用而是做基类存在的,更直接的操作在Acceptor和TcpConnection中,其中的 Acceptor 对应了接受连接的socketfd,而TcpConnection则封装了socket的读写操作,在Server的构造函数中会创建一个Acceptor类,真正accept成功以后又会调用到Server的OnConnection函数中,这个函数会根据每个线程的负载将客服端连接的fd注册进相应线程的epoll(当然在单线程的情况下就只有一个epoll)。最后一个作为缓冲区的类charbuff,用链表将单个7KB的缓冲区穿在一起,当数据大于7kb的时候会自动将其释放,避免内存不足,如果数据的块数多余一块那么发送数据就会调用writev。至此整个框架的流程就都已经清楚了,一个简单的实现。 在此还要感谢一下linux多线程网络服务器编程的作者陈硕,CINF的实现部分就是参考其网络框架muduo来的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值