关于存储系统、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 处理输入和输出,这个也是属于八股的部分,需要掌握。