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

  • 超级影视vip怎么取消自动续费(超级影视VIP怎么买便宜)

    超级影视vip怎么取消自动续费(超级影视VIP怎么买便宜)

  • wps打开两个文件怎样在两个窗口显示(wps打开两个文件就崩溃)

    wps打开两个文件怎样在两个窗口显示(wps打开两个文件就崩溃)

  • vivox23多少瓦快充(vivox23最高支持多少w快充)

    vivox23多少瓦快充(vivox23最高支持多少w快充)

  • 苹果11怎么降级(苹果11怎么降级到14.6版本)

    苹果11怎么降级(苹果11怎么降级到14.6版本)

  • 快手评论赞最多为什么不置顶(快手多少评论才会显示作者赞过)

    快手评论赞最多为什么不置顶(快手多少评论才会显示作者赞过)

  • 核显和独显可以一起用吗(核显和独显可以交火吗)

    核显和独显可以一起用吗(核显和独显可以交火吗)

  • apple watch可以听歌吗(applewatch可以听音乐吗)

    apple watch可以听歌吗(applewatch可以听音乐吗)

  • 华为p40第一次充电注意事项(华为p40第一次充电要多久)

    华为p40第一次充电注意事项(华为p40第一次充电要多久)

  • webm是什么格式(webm是什么格式怎么在手机上看)

    webm是什么格式(webm是什么格式怎么在手机上看)

  • 散热器的作用(散热器的作用是使发动机冷却水强制循环)

    散热器的作用(散热器的作用是使发动机冷却水强制循环)

  • 华为手机与苹果手机对比(华为手机与苹果手机拍照哪个好)

    华为手机与苹果手机对比(华为手机与苹果手机拍照哪个好)

  • 微信封号解封聊天记录还有吗(微信解封聊天)

    微信封号解封聊天记录还有吗(微信解封聊天)

  • 滴滴属于腾讯还是阿里(滴滴属于腾讯还是腾讯)

    滴滴属于腾讯还是阿里(滴滴属于腾讯还是腾讯)

  • nova6上市时间(nova6上市时间是)

    nova6上市时间(nova6上市时间是)

  • us sprint是美国哪个运营商(us species)

    us sprint是美国哪个运营商(us species)

  • 苹果平板开机键在哪(苹果平板开机键坏了怎么开机关机)

    苹果平板开机键在哪(苹果平板开机键坏了怎么开机关机)

  • 魅族16s怎么切换输入法(魅族16th怎么切换应用)

    魅族16s怎么切换输入法(魅族16th怎么切换应用)

  • 闲鱼要交1000保证金吗(闲鱼要交1000块的保证金?)

    闲鱼要交1000保证金吗(闲鱼要交1000块的保证金?)

  • 什么叫开源字体(开源字体可以注册商标吗)

    什么叫开源字体(开源字体可以注册商标吗)

  • airpods是自动充电吗(airpodspro自动充电)

    airpods是自动充电吗(airpodspro自动充电)

  • 苹果怎么下载小米直播(苹果怎么下载小鸡模拟器)

    苹果怎么下载小米直播(苹果怎么下载小鸡模拟器)

  • vivo哪款手机有红外线(vivo哪款手机有遥控功能)

    vivo哪款手机有红外线(vivo哪款手机有遥控功能)

  • 盒马鲜生如何下单(盒马鲜生如何下单送货到家)

    盒马鲜生如何下单(盒马鲜生如何下单送货到家)

  • 6sp摄像头抖动(6sp摄像头抖动原因)

    6sp摄像头抖动(6sp摄像头抖动原因)

  • 增值税普通发票怎么开
  • 法人独资企业怎么样
  • 发票第二年是否可以作废
  • 资本公积什么时候做账
  • 税务退税会计分录
  • 现金日记账年结图片
  • 银行手续费没拿可以退吗
  • 个人以房抵债交税吗
  • 预收货款属于资金投入吗
  • 交易性金融资产属于什么科目
  • 个人在电商平台购买跨境商品需要缴纳什么税
  • 小规模怎样计算进项税额
  • 申报密码遗失怎么重置
  • 将自产产品无偿赠送 会计处理
  • 固定资产折旧年限的最新规定2023
  • 进项留抵退税会计科目
  • 需要会计报表的人
  • 营业费用包括哪些明细科目内容
  • 销售净利率怎么求
  • w10关闭
  • 公司收到项目投资款怎么做账 项目结束后需要退本金
  • 盘盈的资产
  • 权益法分红的会计分录
  • 小规模纳税人的专票可以抵税吗
  • 企业买金税盘做什么科目
  • 现在windows11
  • 进程core
  • phpstudy的ftp
  • 支付宝语音提示在哪里打开
  • 未取得发票入账违反什么规定
  • 递延所得税资产是什么意思
  • vue实战技巧
  • 秋分日的时间意义庆祝方式
  • PHP:imagecolorsforindex()的用法_GD库图像处理函数
  • webpack常用属性
  • vue.js如何安装
  • openai 入门
  • php获取远程图片文件流
  • 销售退货和销售折让的区别
  • 一次性伤残就业补助金
  • 备用金管理方式
  • 办税人员可绑定银行卡吗
  • 上月未结账本月是否能记账
  • 个体户需要给员工买五险一金吗
  • 商品损耗进项税额怎么算
  • 土地作为无形资产入账依据
  • 购买员工团体意外险需要缴纳个税么
  • 收取招标代理费的规定
  • 营业外支出包括
  • 年度投资额看哪个科目
  • 仓库费用计入什么科目
  • 设置出纳权限的操作步骤
  • mysql深入理解
  • win7 32位旗舰版电脑城下载
  • ubuntu20.0.4安装
  • SmartExplorer.exe - SmartExplorer进程是什么意思
  • 进程lsass.exe
  • win7 手动输入用户名
  • 怎么在mac上看电视剧
  • win7不能自动启动
  • 239mbps是多少兆网速
  • unity跨脚本调用函数
  • awk fnr nr
  • 谈一谈js消息机制的理解
  • 使用二氧化碳灭火器时人应该站在什么位置
  • Intermediate Unity 3D for iOS: Part 2/3
  • angularjs4
  • Node.js中的http请求客户端示例(request client)
  • Python装饰器入门学习教程(九步学习)
  • 如何使用定向流量
  • jquery选择器大全
  • 基于python的应用
  • 猫的游戏视频
  • jquery实现原理
  • jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
  • 企业如何注册电子税务局账号
  • 单位名称变更后发票还能用吗
  • 江西省地税局官方网站
  • 深圳市国家税务局
  • 税务内控机制建设
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设