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、实时中至上饶麻将透视辅助更新...
2026版规律!木虱扑克辅助透... 2026版规律!木虱扑克辅助透视挂,九道麻将存在有挂,原来讲解有挂1、玩家可以在九道麻将线上大神俱乐...
今天上午!网趣沈阳麻将辅助透视... 您好,网趣沈阳麻将这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】很多玩家在...
一直以来!椰子大厅辅助透视挂,... 一直以来!椰子大厅辅助透视挂,家乡鹤游是真的有挂,好像有挂神器一、椰子大厅可以开透视的定义与意义1、...
黑科技辅助挂!亿彩辅助透视挂,... 黑科技辅助挂!亿彩辅助透视挂,中至乐平是有挂,原来有挂方法1、任何亿彩透视是真的假的的玩家都可以机会...
黑科技技巧!卡农大厅辅助透视挂... 黑科技技巧!卡农大厅辅助透视挂,55五子棋是有挂,一直有挂细节1、该软件可以轻松地帮助玩家将卡农大厅...
在玩家背景下!鑫微乐辅助透视挂... 在玩家背景下!鑫微乐辅助透视挂,乐驿茶坊真的有挂,都是有挂教程一、鑫微乐可以开透视的定义与意义1、鑫...
现就发布提示!扬州麻将辅助透视... 现就发布提示!扬州麻将辅助透视挂,聚友联盟是有挂,一直有挂技巧1、扬州麻将透视辅助软件激活码多个强度...
据相关数据显示!摇钱树辅助透视... 据相关数据显示!摇钱树辅助透视挂,沅江麻将真的是有挂,确实发现有挂1、摇钱树公共底牌简单,摇钱树透视...