cpp 选手备战秋招学习笔记 day36

关于存储系统、IO 相关的知识

1.介绍一下 write (send)过程发生了什么?

write 系统调用会首先 cpu 从用户态转向内核态,然后把数据从用户缓冲区拷贝到内核缓冲区,对于一般的文件描述符就是对应的缓冲区,对于 socket 套接字就是 socket 发送缓冲区,然后对于调用者来说就结束了,不代表数据发送到对端或者写到磁盘上。

在普通文件描述符就是等待后台刷盘,send 就是首先是缓冲区会在 TCPIP 协议栈下,根据包括流量窗口拥塞窗口控制可以发送的信息,包装,然后由网卡异步驱动发送,在接收到接收端的确认后对于确认的部分可以从 socket 缓冲中删除。

2.系统调用的过程是什么?

首先是把参数和系统调用号存入寄存器,然后 syscall cpu 由用户态切换到内核态,在内核态会根据注册的系统调用的入口地址找到对应的系统调用函数然后执行,在结束之后会通过 sysrset 恢复用户态的上下文。

fsync 是刷盘操作,要求即刻存入磁盘。

3.mmap 是什么,和普通的 write/read 的区别是什么?

mmap 是把 page cache 映射到进程的虚拟地址空间,减少了从内核缓存到用户缓存的显示数据拷贝,提高了效率。

mmap 也叫做零拷贝,提高了速度。

4.顺序 IO 和随机 IO 相比的优势是什么

对于顺序 IO,可以预先取得数据,如果 设备是磁盘就可以避免过多的磁盘寻道时间和旋转等待时延,其次如果是 SSD 也可以预先把数据读取提高效率。

HDD hard diskdrive sddsolidstatedrive

5.cpu 处理输入设备和输出设备的方法

主要有四种模式分别是轮询模式、中断、dma、通道方式,其中轮询模式 cpu 自己判断是否能运算数据自己移动数据,中断方式 cpu 可以去处理其他指令然后由 cpu 移动数据,dma 方式可以由高速设备处理更大量的数据而 cpu 只在处理完成后,按照批次的处理不需要去移动数据亲力亲为,通道方式有单独的处理器可以执行指令,dma 不具备执行指令的能力仍然需要 cpu 去配置。

6.计网分层设计的原因

层与层之间独立可以独立的去发展,层次之间实现了解耦去解决不同的问题,物理层解决传输比特的问题,链路层负责差错控制,成帧,网络层负责异构网络通信,传输层保证了可靠传输拥塞控制,应用层负责应用层协议,层与层之间通过接口通信,对等的层是通过协议实现通信,计算机网络的层次设计实现了抽象解耦和标准化。

总结:send 这部分掌握的比较差之前,总之记忆就是六步:内核态、拷贝数据、根据窗口去给 TCP、TCP 包装处理、网卡驱动发送、收到确认之后处理;另一个就是 cpu 处理输入和输出,这个也是属于八股的部分,需要掌握。

相关推荐
誰能久伴不乏37 分钟前
桌面客户端的运行日志系统:SQLite 分块 + 独立写线程 + 文本降级
数据库·c++·qt·架构·sqlite
choumin10 小时前
C++中万能引用与std::forward的作用和用法
c++·万能引用·std forward
下一站春风里11 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
努力努力再努力wz14 小时前
【C++高阶系列】C++20 协程底层原理:函数为什么能暂停?从状态机到 Task,彻底串起挂起、恢复与协程调度
开发语言·c++·c++20·1024程序员节
划破黑暗的第一缕曙光14 小时前
[C++]:4.模板
c++·template·模板·函数模版·类模版
十五年专注C++开发14 小时前
pybind11:一个跨C++和Python平台的编程库
开发语言·c++·python·pybind11
CodeYp201914 小时前
第11讲:stack 和 queue
开发语言·c++·queue·stack
沫璃染墨15 小时前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3
hetao173383715 小时前
2026-10-25 hetao1733837 的刷题记录
c++·算法
fqbqrr15 小时前
2610C++,UI复合技术在窗口中绘画字体图标
c++·ui