【底层原理】用户进程缓冲区和内核缓冲区

 

  经常听到有程序员会跟你讨论:“咱们在读写文件的时候,系统是有缓存的”。但实际上有一部分人把用户进程缓存区和系统空间缓存区的概念混淆了,包括这两种缓冲区的用法和所要解决的问题,还有其它相似的概念。本文就来区分一下不一样的缓冲区概念(主要针对类unix平台)。linux

  用户进程和操做系统的关系,首先我用一张图来解释“用户进程和操做系统的关系程序员

  这是一个计算机系统运行时的简化模型,咱们把全部运行在操做系统上的进程成为用户进程,它们都运行在用户空间(能够看到用户空间有不少进程)。把操做系统运行的空间成为系统空间shell

  为何将进程分为用户进程和系统进程,首先你必定据说过内核态和用户态(kernel mode和user mode),在内核态能够访问系统资源,好比:编程

处理器cpu:cpu控制着一个程序的执行。windows

输入输出IO:linux有句话叫“一切都是流”,也就是全部输入输出设备的数据,包括硬盘,内存,终端均可以像流同样操做。数组

进程管理:相似对进程的建立,休眠,唤醒,释放之类的调度。好比linux下的fork和windows下的CreateProcess()函数。缓存

内存:包括内存的申请,释放等管理操做。网络

设备:这个就是经常说的外设了,好比鼠标,键盘。函数

计时器:计算机能计时是由于晶体振荡器产生的电磁脉冲。那么全部的定时任务都是以它为基础的。性能

进程间通讯IPC:进程之间是不可以互相访问内存的,因此进程与进程之间的交互须要通讯,而通讯也是一种资源。

网络通讯:网络通讯能够看作是进程见通讯的特殊形式。

  而上面所说的这些系统资源,在用户进程中是没法被直接访问的,只能经过操做系统来访问,因此也把操做系统提供的这些功能成为:“系统调用”。

好比下图,展现一个用户经过shell控制计算机所通过的数据流向:文件读写和终端控制,都是经过内核进行的。

  提供这些限制的基础就是cpu提供的内核态和用户态。好比intel x86 CPU有四种不一样的执行级别0-3,linux只使用了其中的0级和3级分别来表示内核态和用户态。

  在用户态,不只仅是系统资源了,就是别的进程的内存对于你来讲,都是“透明的”(并非没办法访问,不然游戏做弊器怎么实现?)

用户进程缓存区

前面提到,用户进程经过系统调用访问系统资源的时候,须要切换到内核态,而这对应一些特殊的堆栈和内存环境,必须在系统调用前创建好。而在系统调用结束后,cpu会从核心模式切回到用户模式,而堆栈又必须恢复成用户进程的上下文。而这种切换就会有大量的耗时。

你看一些程序在读取文件时,会先申请一块内存数组,称为buffer,而后每次调用read,读取设定字节长度的数据,写入buffer。(用较小的次数填满buffer)。以后的程序都是从buffer中获取数据,当buffer使用完后,在进行下一次调用,填充buffer。因此说:用户缓冲区的目的是为了减小系统调用次数,从而下降操做系统在用户态与核心态切换所耗费的时间。除了在进程中设计缓冲区,内核也有本身的缓冲区。

内核缓存区

当一个用户进程要从磁盘读取数据时,内核通常不直接读磁盘,而是将内核缓冲区中的数据复制到进程缓冲区中。

但如果内核缓冲区中没有数据,内核会把对数据块的请求,加入到请求队列,而后把进程挂起,为其它进程提供服务。

等到数据已经读取到内核缓冲区时,把内核缓冲区中的数据读取到用户进程中,才会通知进程,固然不一样的io模型,在调度和使用内核缓冲区的方式上有所不一样,下一小结介绍。

你能够认为,read是把数据从内核缓冲区复制到进程缓冲区。write是把进程缓冲区复制到内核缓冲区。固然,write并不必定致使内核的写动做,好比os可能会把内核缓冲区的数据积累到必定量后,再一次写入。这也就是为何断电有时会致使数据丢失。因此说内核缓冲区,是为了在OS级别,提升磁盘IO效率,优化磁盘写操做。

流程

在《Unix网络编程》中的五种io模型,也提到过进程缓冲区和内核缓冲区。由于这个并非此篇文章的重点,因此这里只对比阻塞模型和非阻塞。

  对比阻塞和非阻塞,在阻塞io中,直到数据从内核缓冲区拷贝到用户缓冲区才通知用户进程调用完成并唤醒,而非阻塞,在轮训得知数据准备好后,数据仍是在内核缓冲区中,等你去读取,这也就是说数据准备好,并不表明已经读好可使用。固然也不表明必定能读。

缓存区和缓存

还有一部分人把缓冲区和缓存混淆,后来我明白这也是由于翻译致使的把两种东西进行混淆。缓冲区的英文是buffer,而缓存的应为是cache。

  CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,由于cpu的计算速度要比内存的读写速度快不少,而把这些可能会被重复访问到的数据存储于cpu缓存中,就会提升读取速度。能够说缓存是cpu和内存之间的临时存储器。

  也就是说,buffer是由于减小调用次数,集中调用,提升系统性能。而cache是将读取过的数据保存起来,从新读取时若命中(找到须要的数据)就不要去读硬盘了,若没有命中就读硬盘。

相关文章
相关标签/搜索