文章目录
- 磁盘 - 内存 - 中央处理器缓存
- 用户缓存区 - 内核缓存区
- 零拷贝
- 意义
这些概念比较常用,涉及到物理设备 - 操作系统概念,操作系统概念 - 数据结构的区分。记录一下以供后人取笑。
磁盘 - 内存 - 中央处理器缓存
这些是计算机中比较常用的物理设备。
1,磁盘:可以代表计算机中所用的固态硬盘、机械硬盘,也可以表示某些嵌入式设备中的flash等大容量存取设备。挂载到总线上,被操作系统调度。掉电之后,内容不丢失。
2,内存:内存条等硬件设备。一般语义下,内存就是速度更快、容量较小的存储设备。内存也挂载到总线上,由操作系统调度。它的工作频率高,访问速度快,更适合搭配中央处理器使用。掉电之后,内容丢失;
3,中央处理器缓存:装机时常说的一级缓存、二级缓存就是这个东西;物理上来说,这个缓存就是cpu的一部分,不需要通过总线就可以访问。速度非常快,容量非常小。掉电后,内容丢失。为了简化某些问题的讨论,将处理器缓存和内存等同起来。
4,寄存器:cpu的一部分。如果将cpu视为一个状态机,那么所有寄存器中的值就组成了一个又一个的状态。寄存器不能担当“存储文件”的任务,和缓存、内存不同。掉电后内容丢失。
用户缓存区 - 内核缓存区
这两个概念属于操作系统 - 编程中的。我们结合上面的物理结构来说。
首先需要清楚物理内存 - 虚拟内存的联系。
见上图。开了一个程序,每隔100s打印一个hello world。该虚拟机总内存只有2G,被系统分配4G内存的进程依然起来了,这就是虚拟内存的功劳 — 虚拟内存4G,当进程需要时再分配物理内存给它,同时将进程中暂时用不到的部分放进磁盘内,参数swap指代的就是虚拟内存中已用值和剩余值。
通过vmsize可知,该进程占用的内存仅有4512kb,这一内存的大小也就是代码段+数据段+bss段+堆+栈的大小;通过vmrss可知,打印hello world的进程实际占用的物理内存仅有792kb。也就是说相当部分的内容被存在了磁盘中。
1,用户缓存区:以c语言为例,就是临时变量或者malloc出来的变量。这里的内容存在内存中,可能被交换到磁盘中。
2,内核缓存区:同样是存在内存中的。但是是由操作系统内核控制的,一般情况下用户无法访问这部分内存。
零拷贝
零拷贝是在干嘛?是为了满足两个需求
1,减少内核态和用户态的切换(操作系统进程和用户进程间的切换);
2,减少拷贝的次数(拷贝一定是由处理器完成的,这一操作节省了cpu操作);
没有零拷贝时,read流程是:(操作)系统将设备d1中的数据拷贝进内核缓存k1(操作系统控制的内存区域)中,再由内核缓存拷贝到用户缓存u1(用户控制的内存)中;
write流程是:系统将u1的内容拷贝到内核缓存k2中,再将k2中的内容拷贝到设备d2中。
采用零拷贝则是:调用特定接口,将d1中的数据拷贝到k1中,再将k1的内容拷贝到d2中。这样,原来原来的4次拷贝变成2次,4次内核-用户态的转换也变成2次(用户态调用系统调用接口有调用 - 返回必然有两次状态切换)
意义
1,理清楚计算机中各个硬件设备,在嵌入式开发中很重要,不至于出现沟通问题。
2,理解缓冲区的知识,可以帮助立即free输出和 /proc/pid/status输出的含义。
3,零拷贝为我们在两个设备间交换数据提供了优化思路。