Linux&Apue(0.4.0):多进程和多线程的区别&I/O多路复用的基础知识

(一)多进程和多线程的区别

在说I/O多路复用之前,我们先聊聊之前学过的多进程和多线程。这样有助于我们了解为什么需要I/O多路复用,并且可以将其串联。

(1) 多进程和多线程的区别

方面多进程多线程
数据共享、同步子进程之间数据分隔(共享复杂:需要IPC进程间通信)。同步:简单子线程共享主线程数据(共享简单)。同步:复杂
内存、CPU内存占用:多(每个进程2GB)。进程间切换复杂:CPU利用率低内存占用:少(每个线程共享2GB),线程间切换简单:CPU利用率高
创建、销毁的速度速度慢速度快
编程、调试简单复杂
可靠性进程间相互独立线程间可能存在相互影响(如临界资源)
分布式适用:多核、多机器适用:多核(为何不适用于多机器:从可靠性既可以看出)

我们看到多进程和多线程的区别后,我们会提出一个问题:多进程和多线程之间如何进行选择?
在这里引用RCU发明者的话:在能使用一个多进程解决问题的时候不要使用多线程。(当然这并不是绝对的。)

(2) 多进程、多线程、I/O多路复用的关系

这里我喜欢用一个比喻,可能不恰当。
现在有一个供水厂,用多个大管道(多进程)去向各个地区供水。各个地区需要用多个小管道(多线程)向各个小区进行供水。各个小区要向多个住户进行供水,那么多住户,我要知道水到了住户没有(毕竟要计数来收水费的),如果要用多个大管道(多进程)和多个小管道(多线程)这得多麻烦啊,并且也会浪费资源。但是我又想知道水管口(I/0端口)是否有水流到达,那么我们是不是可以用摄像头(类似于select,poll,epoll的功能)去监控这些水管(I/O端口),让一个工作人员看着屏幕即可知道。
所以,进程、线程、I/O多路复用的搭配:
线程(一般)/进程+I/O多路复用

(3)从五种网络I/O模型了解I/O多路复用

在了解五种网络I/O模型前,我们要了解同步和异步,阻塞和非阻塞的基本含义。
同步和异步:描述用户线程与内核的交互方式。(同步:用户线程发起I/O请求后需要等待或轮询内核I/O操作完成后才能继续执行。异步:用户线程发起I/O请求后继续执行,当内核I/O操作完成则会通知用户线程,或调用用户注册的回调函数。)
阻塞和非阻塞:描述用户线程调用内核I/O操作的方式。(阻塞:I/O操作在没有接收完数据或者没有得到结果之前不返回,需要彻底完成后才返回到用户空间。非阻塞:I/O操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完
成。)
扩展:轮询法的概念是:由CPU定时发出询问,依序询问每一个周边设备是否需要其服务,有即给予服务,服务结束后再问下一个周边,接着不断周而复始。
在这里插入图片描述

(二)I/O多路复用的基础知识

I/O的多路复用定义( I/O multiplexing ):单个线程通过记录、跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流。
在这里插入图片描述
红色的相当于我们物理做实验的时候经常用的单刀多掷开关。
那么大概知道I/O多路复用的概念后,我们就可以了解下其具体的实现,分别有select,poll,epoll三种实现方式。这里我们只是简单说说三者的定义,而具体怎么用会在下篇文章中提到。

(1) select

select:用于监视文件描述符的变化情况——读写或是异常。
特点:性能低,线程不安全。
性能低:会修改传入的参数数组。并且任何一个sock_fd(只能监视1024个)出现数据,select仅做返回,并不会挑出那个有数据的sock_fd,只有遍历去寻找那个有数据sock_fd。(就像是每次班上来新同学,让全班人进行自我介绍一样。)
线程不安全:如果select()监视的文件描述符在另一个线程中关闭,则结果是未指定的。

(2) poll

poll:和select实现的功能差不多,poll的作用是把当前的文件指针挂到等待队列。
特点:不会像select一样传入参数数组,并且解决select中1024个链接限制(连接限制解除了,这意味着链接增多了呀。这就变成了班上每次来个新同学,就让全校的人进行自我介绍。所以,这就导致了epoll出现),线程不安全。

(3) epoll

epoll:epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。
特点:高效,线程安全,只能在Linux下使用。

(4)select、poll、epoll高性能网络编程对比

在这里插入图片描述
其实,我们可以发现。如果并发数比较低的时候,三者的效率基本持平。但是,随着并发数的增加,select/poll的处理效率在急剧下降(poll() 和 select()缺点:包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大),但是epoll却可以维持在高效率上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误是因为在编译过程中找不到apue.h文件导致的。通常情况下,apue.h是一个头文件,用于包含在C程序中使用的一些函数和定义。在Linux下,这个头文件通常是由一个库文件提供的。根据你提供的信息,你可能没有正确设置编译环境,或者没有将apue.h头文件包含在你的编译命令中。 为了解决这个问题,你可以按照以下步骤进行操作: 1. 确保你已经正确安装了apue库文件。可以使用命令`apt-get install libapue-dev`来安装这个库文件。 2. 确保你的编译命令中包含了正确的头文件路径。你可以使用`-I`选项来指定头文件的路径。例如,`gcc -o myprogram myprogram.c -I/path/to/apue/include`。 3. 如果你已经安装了apue库文件,但是还是找不到apue.h文件,那么可能是因为头文件没有正确地安装到系统目录中。你可以手动将apue.h文件复制到/usr/include/目录下。可以使用命令`cp /path/to/apue/include/apue.h /usr/include/`来复制文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Unix环境高级编程——解决第一个问题“apue.h: No such file or directory”](https://blog.csdn.net/qq_41899773/article/details/107376991)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [unix高级编程时遇到apue.h 报错问题](https://blog.csdn.net/zhuqinfeng/article/details/50468178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值