位置: IT常识 - 正文

C++ Linux Web Server 面试基础篇-操作系统(四、线程通信)

编辑:rootadmin
C++ Linux Web Server 面试基础篇-操作系统(四、线程通信)

推荐整理分享C++ Linux Web Server 面试基础篇-操作系统(四、线程通信),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗!

近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏定期更新Qt的一些项目Demo 项目与比赛专栏定期更新比赛的一些心得,面试项目常被问到的知识点。

Linux Web Server项目虽然是现在C++求职者的人手一个的项目,但是想要吃透这个项目,还是需要一定的基础的,以项目为导向,进行基础的学习。

涵盖了计算机网络(网络编程)常见的知识点和常见的操作系统知识。

博主参加过大大小小的互联网厂和银行的秋招和春招的笔试与面试,整理了下面的2万7千字的长文(😄都是干货,写作不易啊),喜欢,觉得有帮助的,欢迎订阅专栏,后续有很多优质的文章进行更新,有任何疑问,欢迎留言!

C++ Linux Web Server 面试基础篇-操作系统(四、线程通信)目录C++ Linux Web Server 面试基础篇-操作系统(四、线程通信)1、线程间的通信方式2、简述Linux零拷贝的原理?3、为什么要有DMA技术4、传统的文件拷贝的不足5、如何减少[数据拷贝]的次数?6、如何实现零拷贝7、大文件传输用什么方式实现?参考资料1、线程间的通信方式

同个进程下的线程之间都是共享进程的资源,只要是共享变量都可以做到线程间通信,比如全局变量,所以对于线程间关注的不是通信方式,而是关注多线程竞争共享资源的问题,信号量也同样可以在线程间实现互斥与同步:

互斥的方式,可保证任意时刻只有一个线程访问共享资源;同步的方式,可保证线程 A 应在线程 B 之前执行;2、简述Linux零拷贝的原理?

什么是零拷贝:

所谓「零拷贝」描述的是计算机操作系统当中,CPU不执行将数据从一个内存区域,拷贝到另外一个内存区域的任务。通过网络传输文件时,这样通常可以节省 CPU 周期和内存带宽。

零拷贝的好处:

(1)节省了 CPU 周期,空出的 CPU 可以完成更多其他的任务

(2)减少了内存区域之间数据拷贝,节省内存带宽

(3)减少用户态和内核态之间数据拷贝,提升数据传输效率

(4)应用零拷贝技术,减少用户态和内核态之间的上下文切换

3、为什么要有DMA技术

如果没有直接内存访问DMA 则CPU 一直参与搬运

DMA 收到磁盘的信号,将磁盘控制器缓冲区中的数据拷贝到内核缓冲区中,此时不占用 CPU,CPU 可以执行其他任务;

4、传统的文件拷贝的不足

要想提高文件传输的性能,就需要减少「用户态与内核态的上下文切换」和「内存拷贝」的次数。

5、如何减少[数据拷贝]的次数?

从上图中国可以看到,内核区的缓存是没有必要的,通过避免这一缓存可以减少数据拷贝的次数。

在操作系统中,减少数据拷贝的次数是提高性能和效率的重要手段之一。以下是一些常见的减少数据拷贝次数的方法:

零拷贝(Zero-copy):零拷贝技术是一种可以在不拷贝数据的情况下进行数据传输的技术。在使用零拷贝技术时,内核将应用程序的缓冲区映射到系统内核空间的缓冲区中,然后直接将数据传输到目标设备或缓冲区中,从而避免了多次数据拷贝的操作。内核缓冲区复制:在某些情况下,如果应用程序需要在进程间传输数据,可以使用内核缓冲区复制技术,这种技术将数据从一个进程的用户空间缓冲区复制到内核空间的缓冲区,然后再将数据从内核空间的缓冲区复制到另一个进程的用户空间缓冲区,避免了不必要的用户空间和内核空间的切换。分页技术:分页技术可以将数据拆分成多个小块,每个小块都有自己的页表。这样在进行数据传输时,只需要传输需要的页,而不需要拷贝整个数据,从而避免了不必要的数据拷贝。预先分配空间:预先分配空间可以避免在传输数据时动态分配内存的开销。如果应用程序需要传输大量数据,可以在传输之前预先分配足够的空间,这样在传输时就不需要动态分配内存,从而减少数据拷贝的次数。操作系统缓存:一些操作系统提供了数据缓存功能,可以缓存数据以避免重复的拷贝。在数据传输时,如果数据已经被缓存,可以直接使用缓存中的数据,避免了不必要的数据拷贝。

这些技术都可以在不同的场景中使用,以提高操作系统的性能和效率。

6、如何实现零拷贝

零拷贝技术实现的方式:

mmap + writesendfile

mmap + write

C++ Linux Web Server 面试基础篇-操作系统(四、线程通信)

mmap() 替换 read() 系统调用函数

buf = mmap(file, len);write(sockfd, buf, len);

系统调用函数会直接把内核缓冲区里的数据「映射」到用户空间.

零拷贝(*Zero-copy*)技术,因为我们没有在内存层面去拷贝数据,也就是说全程没有通过 CPU 来搬运数据,所有的数据都是通过 DMA 来进行传输的。

在 Linux 中,可以通过使用零拷贝技术来减少数据拷贝的次数,从而提高数据传输的效率。零拷贝技术是指在数据传输的过程中,尽可能地减少 CPU 和内存的拷贝操作,从而降低数据传输的延迟和 CPU 占用率。

下面给出两个示例代码,分别演示了如何在 Linux 中使用零拷贝技术进行文件传输和网络传输。

文件传输

使用 mmap 系统调用将文件映射到内存中,然后使用 sendfile 系统调用将文件从内存中传输到网络中,从而避免了数据在用户空间和内核空间之间的拷贝。

#include <sys/sendfile.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>int sendfile(int out_fd, int in_fd, off_t *offset, size_t count);int main(){ int in_fd = open("file.txt", O_RDONLY); struct stat stat_buf; fstat(in_fd, &stat_buf); off_t offset = 0; sendfile(STDOUT_FILENO, in_fd, &offset, stat_buf.st_size); close(in_fd); return 0;}

网络传输

使用 splice 系统调用将数据从一个文件描述符传输到另一个文件描述符,从而避免了数据在用户空间和内核空间之间的拷贝。

#include <sys/socket.h>#include <netinet/in.h>#include <fcntl.h>#include <unistd.h>int splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags);int main(){ int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in servaddr = {0}; servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(8080); bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); listen(sockfd, 10); int connfd = accept(sockfd, NULL, NULL); int filefd = open("file.txt", O_RDONLY); int flags = SPLICE_F_MOVE | SPLICE_F_NONBLOCK; splice(filefd, NULL, connfd, NULL, 4096, flags); close(filefd); close(connfd); close(sockfd); return 0;}

需要注意的是,零拷贝技术的使用需要考虑诸多因素,如硬件支持、内核版本等,同时也需要谨慎使用,避免出现数据丢失或破坏等问题。

7、大文件传输用什么方式实现?

那针对大文件的传输,我们应该使用什么方式呢?

我们先来看看最初的例子,当调用 read 方法读取文件时,进程实际上会阻塞在 read 方法调用,因为要等待磁盘数据的返回,如下图:

具体过程:

当调用 read 方法时,会阻塞着,此时内核会向磁盘发起 I/O 请求,磁盘收到请求后,便会寻址,当磁盘数据准备好后,就会向内核发起 I/O 中断,告知内核磁盘数据已经准备好;内核收到 I/O 中断后,就将数据从磁盘控制器缓冲区拷贝到 PageCache 里;最后,内核再把 PageCache 中的数据拷贝到用户缓冲区,于是 read 调用就正常返回了。

对于阻塞的问题,可以用异步 I/O 来解决

它把读操作分为两部分:

前半部分,内核向磁盘发起读请求,但是可以不等待数据就位就可以返回,于是进程此时可以处理其他任务;后半部分,当内核将磁盘中的数据拷贝到进程缓冲区后,进程将接收到内核的通知,再去处理数据;

而且,我们可以发现,异步 I/O 并没有涉及到 PageCache,所以使用异步 I/O 就意味着要绕开 PageCache。

绕开 PageCache 的 I/O 叫直接 I/O,使用 PageCache 的 I/O 则叫缓存 I/O。通常,对于磁盘,异步 I/O 只支持直接 I/O。

前面也提到,大文件的传输不应该使用 PageCache,因为可能由于 PageCache 被大文件占据,而导致「热点」小文件无法利用到 PageCache。

于是,在高并发的场景下,针对大文件的传输的方式,应该使用「异步 I/O + 直接 I/O」来替代零拷贝技术。

直接 I/O 应用场景常见的两种:

应用程序已经实现了磁盘数据的缓存,那么可以不需要 PageCache 再次缓存,减少额外的性能损耗。在 MySQL 数据库中,可以通过参数设置开启直接 I/O,默认是不开启;传输大文件的时候,由于大文件难以命中 PageCache 缓存,而且会占满 PageCache 导致「热点」文件无法充分利用缓存,从而增大了性能开销,因此,这时应该使用直接 I/O。

另外,由于直接 I/O 绕过了 PageCache,就无法享受内核的这两点的优化:

内核的 I/O 调度算法会缓存尽可能多的 I/O 请求在 PageCache 中,最后「合并」成一个更大的 I/O 请求再发给磁盘,这样做是为了减少磁盘的寻址操作;内核也会「预读」后续的 I/O 请求放在 PageCache 中,一样是为了减少对磁盘的操作;

于是,传输大文件的时候,使用「异步 I/O + 直接 I/O」了,就可以无阻塞地读取文件了。

所以,传输文件的时候,我们要根据文件的大小来使用不同的方式:

传输大文件的时候,使用「异步 I/O + 直接 I/O」;

传输小文件的时候,则使用「零拷贝技术」;

参考资料

图片部分来源于小林Coding图解操作系统(非常推荐!!!)小林coding

最后,最后 如果觉得有用,麻烦三连👍⭐️❤️支持一下呀,希望这篇文章可以帮到你,你的点赞是我持续更新的动力

本文链接地址:https://www.jiuchutong.com/zhishi/295914.html 转载请保留说明!

上一篇:前端知识——css之flex布局(css前端还是后端)

下一篇:【bug】Failed at the node-sass@4.14.1 postinstall script(终于圆满解决)(but all failed)

  • 快速增加微博粉丝5大绝招(快速增加微博粉丝)

    快速增加微博粉丝5大绝招(快速增加微博粉丝)

  • 哈啰单车怎么手机关锁还车(哈啰单车怎么手动续费)

    哈啰单车怎么手机关锁还车(哈啰单车怎么手动续费)

  • 苹果怎样才有桌面歌词(苹果桌面在哪里设置方法)

    苹果怎样才有桌面歌词(苹果桌面在哪里设置方法)

  • 微信投诉失败,对方会收到提示吗(微信投诉失败对方会受限制吗)

    微信投诉失败,对方会收到提示吗(微信投诉失败对方会受限制吗)

  • 网络kb是什么意思(网络kb是什么意思啊百度)

    网络kb是什么意思(网络kb是什么意思啊百度)

  • 红米k30pro信号不好(红米k30 5g版信号不好)

    红米k30pro信号不好(红米k30 5g版信号不好)

  • 淘宝两天不发货怎么办(淘宝两天不发货,该赔偿多少钱)

    淘宝两天不发货怎么办(淘宝两天不发货,该赔偿多少钱)

  • 联发科p70相当于麒麟多少(联发科mt6753相当于骁龙多少)

    联发科p70相当于麒麟多少(联发科mt6753相当于骁龙多少)

  • 新版手机qq音乐设置在哪(新版手机qq音乐怎么退出)

    新版手机qq音乐设置在哪(新版手机qq音乐怎么退出)

  • 抖音开直播要多少岁(抖音开直播要多少等级)

    抖音开直播要多少岁(抖音开直播要多少等级)

  • 用什么软件拍快手(用什么软件拍快手视频好看)

    用什么软件拍快手(用什么软件拍快手视频好看)

  • 苹果11pro美版是双卡吗(苹果12pro美版)

    苹果11pro美版是双卡吗(苹果12pro美版)

  • 小米cc9pro怎么设置人脸解锁(小米cc9pro怎么设置全屏)

    小米cc9pro怎么设置人脸解锁(小米cc9pro怎么设置全屏)

  • 华为p20返回键失灵怎么办(华为p20返回键不灵敏)

    华为p20返回键失灵怎么办(华为p20返回键不灵敏)

  • vivoz3上市时间(vivoz3什么时候上市具体时间)

    vivoz3上市时间(vivoz3什么时候上市具体时间)

  • 苹果手机为什么打电话正在通话中(苹果手机为什么打不开wifi开关)

    苹果手机为什么打电话正在通话中(苹果手机为什么打不开wifi开关)

  • 宜搜小说怎么无法登录(宜搜小说为什么加载失败)

    宜搜小说怎么无法登录(宜搜小说为什么加载失败)

  • 优盘插上电脑怎么打开(优盘插上电脑怎么播放)

    优盘插上电脑怎么打开(优盘插上电脑怎么播放)

  • 怎样注销趣步账号(怎样注销趣步账号手机)

    怎样注销趣步账号(怎样注销趣步账号手机)

  • 蚂蚁森林怎么清空动态(蚂蚁森林怎么清除桌面上的动态)

    蚂蚁森林怎么清空动态(蚂蚁森林怎么清除桌面上的动态)

  • excel如何插入图表(excel中如何添加图例)

    excel如何插入图表(excel中如何添加图例)

  • Linux shell 比较运算符详解(linux shell 比较运算符)

    Linux shell 比较运算符详解(linux shell 比较运算符)

  • web自动化测试入门篇06 —— 元素定位进阶技巧(web自动化测试平台)

    web自动化测试入门篇06 —— 元素定位进阶技巧(web自动化测试平台)

  • 财务软件回收
  • 中华人民共和国国歌
  • 一般纳税人劳务费税率是多少
  • 业务招待费报销要求
  • 什么时候过路费是半价
  • 小规模纳税人不允许开具零税率发票
  • 免税的苗木发票抵扣税费怎么算
  • 股权转让收入属于什么
  • 海关进口关税专用缴款书可以抵扣吗
  • 出口退税进项抵扣了不退税可以吗
  • 有留抵税额会计分录
  • 水利建设专项收入怎么计算
  • 技术转让开具什么发票
  • 开了红字发票税额已经缴纳怎么做账?
  • 上年免税收入转内销补交税分录
  • 企业职工教育经费计入什么科目
  • 高新创投企业所得税税率
  • 实际成本法的会计分录怎么写
  • 企业代扣员工社保怎样做分录
  • 货物赔偿款会计分录
  • win10数字雨
  • 辞退补偿入账
  • 一些出口商为什么要倾销
  • EasyExcel使用与步骤
  • php流程引擎
  • 未分配利润为负的原因
  • 移动端适配方案面试题
  • 企业的安全费用怎么弄
  • 印花税申报时间填错了怎么处理?
  • 收到专票怎么入账
  • 自动执行python
  • 流动资产与资产总额的比率叫什么比率
  • mysql5.0升级到8.0
  • 附有销售退回条件的商品销售,如果不能对退货
  • 固定什么意思
  • mysql字符串索引如何排序
  • 企业合并的账务处理
  • sql server数据库恢复
  • 工业企业土地使用税
  • 电子承兑过期了
  • 暂估和开票的差异 erp处理
  • 创业带动就业补贴是给企业的还是员工的
  • 购货方收到销售方提供的发票怎么做分录
  • 防伪税控服务费怎么交
  • 一般纳税人普通发票要交增值税吗
  • 收到先征后返的增值税计入哪里
  • 长期应付未付款项清理方案
  • 仓库员工工资
  • 预收账款转收入的条件
  • 医疗器械行业进货未取得发票怎么做会计分录的
  • 专家评审费需要上税吗
  • 会计一般采用什么科目
  • 税务会计每个月几号需要干工作流程
  • mysql的操作
  • xp系统怎么删除系统
  • 使用u盘安装windows10电脑识别不出来
  • win8系统无法连接到网络
  • linux应对攻击的防御手段
  • win8系统更新在哪里
  • 命令提示符操作方法
  • win7小键盘怎么调出
  • linux系统中make的用法
  • post installation
  • win10桌面图片预览
  • Android Chronometer(定时器)
  • unity固定位置随机生成物体
  • unityai寻路
  • nodejs安装在c盘好还是d盘好
  • python的入门教程
  • js转义字符串
  • koa2 koa
  • nodejs cgi
  • nodejs怎么使用
  • Javascript removeChild()删除节点及删除子节点的方法
  • python的params
  • android中使用sharedprefence的步骤
  • 国家税务2018年61号附件
  • 甘肃国家税务总局
  • 消防咨询电话24小时
  • 联合举办的活动
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设