位置: 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)

  • 华为nova9pro能拍月亮吗(华为nova9pro能拍星空吗)

    华为nova9pro能拍月亮吗(华为nova9pro能拍星空吗)

  • 华为儿童手表怎么取卡(华为儿童手表怎么下载微信)

    华为儿童手表怎么取卡(华为儿童手表怎么下载微信)

  • 电脑版微信不能群发消息和链接吗 电脑微信群发消息和链接的方法(电脑版微信不能打开小程序)

    电脑版微信不能群发消息和链接吗 电脑微信群发消息和链接的方法(电脑版微信不能打开小程序)

  • 抖音上显示2个共同好友的意思(抖音出现两个账号怎么办)

    抖音上显示2个共同好友的意思(抖音出现两个账号怎么办)

  • 苹果xr边框摔凹了怎么修复(iphonex边框摔凹陷了)

    苹果xr边框摔凹了怎么修复(iphonex边框摔凹陷了)

  • 华为手机只能打出不能打进(华为手机只能打不能接)

    华为手机只能打出不能打进(华为手机只能打不能接)

  • steam被盗了邮箱被改了怎么办(steam被盗了邮箱收不到验证码)

    steam被盗了邮箱被改了怎么办(steam被盗了邮箱收不到验证码)

  • 钉钉截图会留痕迹吗(钉钉截图有隐藏水印吗)

    钉钉截图会留痕迹吗(钉钉截图有隐藏水印吗)

  • 微信怎么打开美颜视频聊天(微信怎么打开美颜相机)

    微信怎么打开美颜视频聊天(微信怎么打开美颜相机)

  • 苹果7p和苹果11对比(苹果7p和苹果11参数对比)

    苹果7p和苹果11对比(苹果7p和苹果11参数对比)

  • x4760k相当于i几(x4760k最高配什么显卡)

    x4760k相当于i几(x4760k最高配什么显卡)

  • 华为mate30摄像头用贴膜吗(华为mate30摄像头打不开闪退)

    华为mate30摄像头用贴膜吗(华为mate30摄像头打不开闪退)

  • 苹果7喇叭只有一边响(苹果喇叭只有右边响)

    苹果7喇叭只有一边响(苹果喇叭只有右边响)

  • 苹果手机零售机是什么意思(苹果手机零售机和官换机有什么区别)

    苹果手机零售机是什么意思(苹果手机零售机和官换机有什么区别)

  • 闲鱼被拉黑有提示吗(闲鱼拉黑后会提醒对方评价么)

    闲鱼被拉黑有提示吗(闲鱼拉黑后会提醒对方评价么)

  • 卸载了显卡驱动会怎么样(卸载了显卡驱动显示器黑屏了)

    卸载了显卡驱动会怎么样(卸载了显卡驱动显示器黑屏了)

  • 直播的软件怎么下载(直播软件怎么做)

    直播的软件怎么下载(直播软件怎么做)

  • 手机老是黑屏怎么办(手机老是黑屏怎么解决小米)

    手机老是黑屏怎么办(手机老是黑屏怎么解决小米)

  • 手机百度贴吧怎么隐藏自己的帖子(手机百度贴吧怎么发图片回复)

    手机百度贴吧怎么隐藏自己的帖子(手机百度贴吧怎么发图片回复)

  • 服务器是不是电脑主机(服务器是网络吗)

    服务器是不是电脑主机(服务器是网络吗)

  • 三星出现白色边框怎么回事(三星屏幕旁边有白色的)

    三星出现白色边框怎么回事(三星屏幕旁边有白色的)

  • 手机淘宝在哪里切换家乡版(手机淘宝在哪里看自己的店铺)

    手机淘宝在哪里切换家乡版(手机淘宝在哪里看自己的店铺)

  • 微信怎么绑定银行卡(微信怎么绑定银行卡查余额)

    微信怎么绑定银行卡(微信怎么绑定银行卡查余额)

  • rfid属于物联网的哪个层(RFID属于物联网的( )层)

    rfid属于物联网的哪个层(RFID属于物联网的( )层)

  • 手机屏怎么设置(手机屏怎么设置时间和日期)

    手机屏怎么设置(手机屏怎么设置时间和日期)

  • 同程砍价砍多少就可以返现多少吗(同程砍价的钱在哪里领)

    同程砍价砍多少就可以返现多少吗(同程砍价的钱在哪里领)

  • 微信朋友圈详情在哪里(微信朋友圈详情怎么设置)

    微信朋友圈详情在哪里(微信朋友圈详情怎么设置)

  • 土地税房产税会计分录
  • 表见代理通俗
  • 商誉减值是在年报还是半年报
  • 年终奖影响社保公积金基数吗
  • 申报增值税之后怎么做账
  • 社保基数3125交多少钱
  • 老板从公司拿钱怎么拿税最低
  • 假发票是怎么开出来的?
  • 银行承兑逾期证明怎么写
  • 车辆保险费发票的会计分录
  • 当期进项税额大于销项税额
  • 员工工伤保险报销走什么科目
  • 没收租赁保证金开什么内容的发票
  • 公司没有收入算正常经营吗
  • 公司向个人租赁设备
  • 报废 库存商品
  • 抬头是别的公司怎么报销
  • 培训费用可以开专票吗
  • 单位在工资表中如何填写
  • 实际结算金额超出出票金额,银行汇票要给收款人么
  • 境外所得税收抵免政策
  • 小微企业的资产总额看哪里判断的
  • 企业所得税申报表在哪里打印
  • 劳务费个人还需要交税吗
  • 什么是往来科目
  • 公司租赁房屋的物业费怎么入账
  • 受托加工物资算资产吗
  • 企业分红给企业股东怎么交税
  • 主营业务收入少记跨年怎么办
  • 全年平均职工人数按季度平均公式
  • 委托加工物资成本计入
  • win7取消共享文件夹
  • pb估值是什么意思
  • 上月库存占比怎么算
  • 预收房租费用计入什么科目
  • 劳保用品做账分录
  • macOSCatalina10.15.5正式版值得升级吗 macOSCatalina10.15.5更新了什么
  • php serialize
  • 期末损益类科目结转
  • php到底是什么
  • UserScripts Safari 苹果iOS上特别好用且免费的脚本插件,五分钟学会
  • initpki.dll有什么用
  • 已开票未收款怎么做账
  • 贷款滞纳金如何收取
  • 购买加油卡能否抵扣
  • 巴尼奥斯附近的阿格杨瀑布
  • 嵌入式软件开票税负是1%还是3%
  • 发票密码什么意思
  • web主要的请求方式有几种
  • python如何导入excel
  • vue加载时如何避免出现代码
  • 单位社保年底清算
  • zabbix安装部署
  • 已经提完折旧的房产价值评估
  • 房东减免后二房东不减房租
  • 过渡期怎么坚持下去
  • mysql异常退出
  • 经营出租固定资产折旧费计入什么科目
  • 企业所得税中资产计税基础怎么填
  • 餐饮费发票可以抵扣进项税吗
  • 高新技术企业政府补助要交所得税吗
  • 股权投资如何记账
  • 营业成本包括三大费用如何称呼
  • 什么是发票抬头怎么填
  • iis w3svc
  • 找回被删除的文件时第一步应该是什么
  • linux详解
  • freebsd挂载ntfs
  • 重庆四日游最佳攻略超详细
  • icore是什么意思
  • glht函数
  • css div 不换行
  • [置顶]马粥街残酷史
  • 简述javascript
  • android上吹一吹功能的实现代码
  • android network
  • 使用java
  • 工商与税务合并了吗
  • 百望税控盘电子发票开好了如何打印及导出发票
  • 资源税谁缴纳
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设