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

相关内容

热门资讯

十分钟透视!德州之星app安卓... 十分钟透视!德州之星app安卓版(透明挂黑科技)外挂透明挂辅助软件(2026已更新)(哔哩哔哩);1...
大家学习交流!aapoker辅... 大家学习交流!aapoker辅助是可以,wpk ai,扑克教程(存在有挂)-哔哩哔哩;aapoker...
黑科技计算!(WPK外挂)外挂... 《黑科技计算!(WPK外挂)外挂辅助挂!(德扑线上)微扑克教程(2025已更新)(哔哩哔哩)》 德扑...
5分钟俱乐部!aapoker透... 5分钟俱乐部!aapoker透视脚本,wepoker透视版下载(透视)透牌教程(有挂规律)5分钟俱乐...
两分钟领会!德州之星有辅助挂吗... 两分钟领会!德州之星有辅助挂吗(透明挂黑科技)外挂透明挂辅助智能(2021已更新)(哔哩哔哩);德州...
科普!智星德州菠萝外挂,wep... 科普!智星德州菠萝外挂,wepower让系统发好牌,软件教程(有挂规律)-哔哩哔哩;致您一封信;亲爱...
一分钟揭秘!(pokerrrr... 一分钟揭秘!(pokerrrr2挂)外挂透明挂ai代打辅助科技!(wepoke计算)扑克教程(202...
6分钟辅助!竞技联盟透视,we... 6分钟辅助!竞技联盟透视,wepoker手机助手(透视)wepoke教程(有挂方式)wepoker手...
两分钟私人局!wpk微扑克有辅... 【福星临门,好运相随】;两分钟私人局!wpk微扑克有辅助吗(透明挂黑科技)外挂透明挂辅助机器人(20...
透视中牌率!(wepoke存在... 透视中牌率!(wepoke存在)外挂透视透明挂辅助器安装!(鱼扑克fishpoker俱乐部)德州教程...