9. C++通过epoll+fork的方式实现高性能网络服务器、线程和进程的关系
创始人
2025-01-20 07:36:21
0次

epoll+fork 实现高性能网络服务器
一般在服务器上,CPU是多核的,上述epoll实现方式只使用了其中的一个核,造成了资源的大量浪费。因此我们可以将epoll和fork结合来实现更高性能的网络服务器。

创建子进程函数–fork( )
要了解线程我们先来了解fork()函数:fork() 函数的功能是在当前的进程创建一个子进程;在多核时代,CPU管理多个进程,一个单核CPU同一时间只能运行一个进程,比如8 核的 CPU 只能同时运行 8 个进程。但是一个进程中可以有多个线程并行运行。

线程

为什么要有线程

在这里插入图片描述
首先线程不是一开始就被提出来的技术概念!!而是由历史的发展而来的,也就是说我们现在研究的是线程的动机是什么!

打个比喻就是一个引用程序要做很多工作!如web浏览器,又要显示图片,文字,视频的!
假如这三个动作是顺序执行的,也就是说,一个网页显示完图片再显示文字,再显示视频,那么很明显这对用户来说是体验非常不好的,这样对cpu的利用也不高!
那么此时,就引入了进程的概念!我们希望这些三个动作,也就是文字,图片,视频能够“同时”的显示在网页上,那么就是说这三个程序需要并发或者并行(能并行那是因为有多个cpu)执行,此时,我们的网页就可以”同时“显示这三个内容!因为并发的进程是走走停停,交替执行,这个速度很快,快到我们人认为是同时进行的!此时,我们把这些能够同时执行的任务成为”执行流“,也就是说,在进程的概念中,执行流就是进程!,这里又文字,图片,视频三个执行流!很明显我们知道进程的创建和切换,也就是说并发执行是很耗时耗费资源的!
所以我们又提出了线程的概念,也就是说我们能否在一个进程中,执行这三执行流,其实可以的!
线程就是在一个进程中的一个执行流!有线程的概念我们就可以在一个进程执行这三个任务,不需要创建多个进程,并且进行进程切换!我们的线程在一个进程中,可以并发或者并行的执行!这样就大大减少了资源开销!

从内存块的角度理解线程

在这里插入图片描述

  • 比如一个单线程的进程,其实他就等价于一个进程中的任务!和进程区别不大!这个线程(执行流)共享进程的代码段,数据段,打开文件的信息等内容!同时进程的栈空间也是线程的栈空间!
  • 假如有多线程的进程,比如三个线程:说明:这个进程中有三个执行流,这个三个会有三个不同的空间,但是都属于一个进程中,它们有自己的栈空间,能够单独的执行自己的任务!但是这三个线程共享一个进程中的代码段,数据段,打开文件的信息等。
  • 共享带来的好处就是访问这些共享资源的代价低,存储资源节省!不再需要进程那样又要多一份空间存储资源!

线程就是cpu调度的单位了,而进程就是资源分配的单位了,因为即使一个进程只有一个线程,真正执行的还是进程中的线程!

多线程模型

M:1模型
也就是多个用户线程对一个内核线程!
在这里插入图片描述
这种模型的好处就是,对于用户来说,它看的多个线程在并行执行!
在实际来说,多个线程占用一个内核线程,这个意思就是,用户线程中有一个线程占用了cpu资源,那么其他的用户线程就不可以执行,只能进入等待状态了!

1:1模型

一个用户线程对于一个内核线程,假如内核线程和用户线程数量不匹配的话,那么就会开多内核线程和用户线程匹配起来
在这里插入图片描述
好处就是多个线程真正意义上实现了并发或并行执行;
缺点就是:内核开销很大!

epoll+fork代码

这个代码就是每次fork一个进程,然后在每个线程里面可以用epoll申请多个进程来进行监听。

#include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  //端口 #define PORT 8888 #define MESSAGE_LEN 1024 #define MAX_EVENTS 20 #define TIMEOUT 500 #define MAX_PROCESS 4   int main(int argc,char* argv[]){      int ret=-1;     int on=1;     int backlog=10;//缓冲区大小      int socket_fd,accept_fd;      struct sockaddr_in localaddr,remoteaddr;      char in_buff[MESSAGE_LEN]={0,};      int epoll_fd;      struct epoll_event ev,events[MAX_EVENTS];//epoll中event的结构体      int event_number;      int flags = 1;      pid_t pid=-1;      socket_fd=socket(AF_INET,SOCK_STREAM,0);     if(socket_fd==-1){         std::cout<<"Failed to create socket!"<0){//打印信息                         std::cout<<"receive messaage:"<

异步事件的惊群现象

参考文献https://blog.csdn.net/m0_46606290/article/details/120939528

相关内容

热门资讯

玩家必用透视器插件!德扑圈多功... 玩家必用透视器插件!德扑圈多功能透视器插件,德扑圈总是有透视器插件1、游戏颠覆性的策略玩法,独创攻略...
一分钟揭秘透视插件!微乐小程序... 一分钟揭秘透视插件!微乐小程序免费黑科技,微乐西安麻将透视多功能法子APP微乐小程序免费黑科技辅助器...
围绕透视问题辅助挂操作!冰球豪... 围绕透视问题辅助挂操作!冰球豪华版多功能辅助挂脚本,冰球豪华版好像存在有辅助脚本1、玩家可以在冰球豪...
安装程序教程透视挂教程!德普之... 安装程序教程透视挂教程!德普之星多功能透视挂教程,德普之星其实真的有透视挂教程;1、该软件可以轻松地...
玩家必备攻略透视方法!微乐小程... 您好,微乐小程序脚本工具平台这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】...
玩家必用开挂妙招!fishpo... 玩家必用开挂妙招!fishpoker多功能开挂方法,fishpoker确实是真的有辅助方法fishp...
我来教大家辅助教程!WePoK... 我来教大家辅助教程!WePoKer多功能辅助教程,WePoKer总是真的有辅助教程1、在WePoKe...
揭秘关于透视挂脚本!微乐小程序... 揭秘关于透视挂脚本!微乐小程序免费黑科技,微乐常州麻将透视挂多功能教材APP1、在微乐小程序免费黑科...
玩家必备科技辅助挂窍要!886... 玩家必备科技辅助挂窍要!886多功能辅助挂脚本,886真是是有辅助脚本1、886免费脚本咨询教程、8...
重大通报透视挂工具!德扑之星多... 重大通报透视挂工具!德扑之星多功能透视挂工具,德扑之星一贯是真的有透视挂工具1、任何德扑之星透视是真...