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

相关内容

热门资讯

透视好牌!悟空大厅免费辅助器&... 透视好牌!悟空大厅免费辅助器"解谜辅助插件"真是真的有挂(哔哩哔哩)透视好牌!悟空大厅免费辅助器"解...
6分钟了解!决战卡五星必赢神器... 6分钟了解!决战卡五星必赢神器!都是一直都是有辅助技巧(有挂详细)-哔哩哔哩1、决战卡五星必赢神器破...
第6分钟了解!潮汕汇鱼虾蟹挂辅... 第6分钟了解!潮汕汇鱼虾蟹挂辅助器!竟然有辅助脚本(有挂秘笈)-哔哩哔哩1、潮汕汇鱼虾蟹挂辅助器辅助...
方法辅助挂!财神十三章怎样加强... 方法辅助挂!财神十三章怎样加强运气"解谜辅助插件"切实是真的有挂(哔哩哔哩)1.财神十三章怎样加强运...
1分钟了解!欢乐对决破解版免内... 1分钟了解!欢乐对决破解版免内购!好像存在有辅助攻略(今日头条)-哔哩哔哩1、欢乐对决破解版免内购辅...
据通报!宝宝吃吃吃外g挂&qu... 据通报!宝宝吃吃吃外g挂"推荐辅助脚本"总是确实有挂(哔哩哔哩)1、不需要AI权限,帮助你快速的进行...
第三分钟了解!广东闲来辅助视频... 第三分钟了解!广东闲来辅助视频!确实真的有辅助技巧(有挂分享)-哔哩哔哩1、进入到广东闲来辅助视频是...
透视存在!小唐家乐园山西辅助软... 透视存在!小唐家乐园山西辅助软件"开挂辅助脚本"好像确实有挂(哔哩哔哩)亲,关键说明,小唐家乐园山西...
第3分钟了解!werplan外... 第3分钟了解!werplan外开挂!都是有辅助插件(确实有挂)-哔哩哔哩1、完成werplan外开挂...
透视透视!贪吃蛇辅助器2022... 透视透视!贪吃蛇辅助器2022"详情辅助技巧"果然存在有挂(哔哩哔哩)1.贪吃蛇辅助器2022 选牌...