操做系统是将咱们的硬件CPU、内存和各类外部的IO设备进行抽象和调用给上层应用程序的操做平台。缓存
若是没有操做系统,某一个应用程序要想在这个主机或着说硬件上运行,那么他须要本身去管理CPU调用、内存的使用以及IO设备的使用,从哪儿都数据?数据输出的时候写到哪儿去?都须要进程本身进行管理。这太麻烦不是吗?任何一我的本身开发一个应用程序,都这这么写,并且也不方便让多个应用同时进行工做,为何呢?由于你们看见的CPU和内存都是所有的,在相互运行的时候必定会形成资源争用,必定会相互打架。因此基于这样需求,就出现了这样的一个东西,资源管理层,他什么也不干,主要工做就是将咱们的硬件资源进行一次抽象。这么抽象呢?把全部硬件资源的使用都虚拟成了系统调用,术语叫作System Call。网络
因此有了这个东西以后呢,咱们的应用程序须要用到的内存以及但凡须要跟硬件打交道,都须要进过操做系统的System Call。好比说我须要调用CPU,应用程序会向操做系统发起系统调用,在操做系统当中,有一个系统调用是向CPU进行抽象调用的,操做系统会使用该调用将CPU的资源分配给该应用程序使用。因此咱们的应用程序只要要用到硬件资源,它只须要向操做系统的内核发起系统调用便可,这就是为何咱们在进行系统性能调优和监控的时候,会发现咱们系统的某一进程会不断的向操做系统发起系统调用。这大大的方便了应用程序。ide
随着操做系统的发展,操做系统又将多个不一样的系统调用按照某种机制分配到不一样的进程上去,从而使得咱们的应用程序具有多种的功能。操做系统在这里其实也是相似于一种进程监控器的存在,是一个特殊组件。咱们能够称之为Process Monitor。它可以监控着每个进程的运行。进程运行在操做系统之上,他看到的仅仅是操做系统,或着是操做系统分配给他的CPU时间片,内存存储空间以及IO设备,他可以或得某一个IO设备的使用权的时候,就意味着他占用了这个IO的总线,咱们姑且能够这样理解。咱们的IO设备真正的要跟CPU通信,跟应用程序通讯,那就意味着IO设备会使用总线跟CPU或着内存进行通讯。性能
由此,操做系统负责其上运行的应用程序的每个对硬件资源的申请,因此使得第一个进程在使用CPU的时候,第二个进程就只能等待,假设咱们的电脑就一颗CPU。可是好在咱们的CPU速度很是快,而进程自己所须要的CPU时间有很是短,所以对于不少用户看来,咱们的多个应用程序是并行进行的。事实上若是只有一颗CPU的状况下并非并行的并且也没法并行。同时,每个进程在运行的时候都须要一段内存空间,并且这段内存是连续且平滑的。从低端内存地址到高端内存地址,高端地址是栈,低端地址的代码段、数据段,BSS段等等。可是咱们的内存老是有限的,不可能没一个应用程序都给它所须要的那么多的内存空间,由于一个应用程序虽说须要那么多的地址,可是在实际运行的时候。实际上是用不到那么可能是空间地址的。极可能只须要一点就足够了。由此,操做系统提供了一种管理机制,或者说结合CPU完成了一种管理机制。将每个进程所使用的线性地址空间转换成物理地址空间,这种映射是按照页面的方式进行映射的,其实进程所使用的地址,分为rss常驻内存级、Page Cache,以及anon Page匿名页,页缓存等等,那么什么是rss常驻内存级呢?就是咱们的进程启动的时候这段地址必须是位于物理内存空间的地址。是绝对不能够被交换出去的。那么什么是页缓存呢?页缓存就是咱们打开的文件,这些文件一般都保存在咱们的Page Cache中,Page Cache能够交换到交换分区当中,也能够被清除出去,由于他就是缓存,没有的时候咱们再打开一次文件不就完了嘛。上面匿名页?匿名页就是咱们的进程在运行过程当中所产生的一些中间数据,好比咱们堆中的数据,一般都是匿名页或着说有一部分是匿名页。因此,当第一个进行打开了文件,占据了很大的内存空间,第二个进程须要在使用内存的时候内存空间不够了,那怎么办呢?把第一个文件打开的文件都通通的清除出去,就腾出空间给第二个进程打开文件所须要的空间了。这时若是第一个进程发现打开的文件没了咋办?这个时候就会产生一个东西,名叫缺页中断。然后,系统会重新将第一个进程所打开的文件重新调用回来。要想完成线性地址都物理地址的转换,须要使用到一个技术,名叫MMU。可是MMU没一次转换都须要实现一级页面的查找,二级页面的查找,而后在实现平移,在实现中断,才可以获得内存空间。这是很是麻烦的。为了加速这个过程,因而有了一个技术,叫TLB。spa
还有,IO设备是怎么实现和CPU交互的,CPU怎么知道他那一次是和哪个IO设备打交道的呢?当前系统中咱们可能存在不少的IO设备,可是咱们的总线是否是只有一个,处理机制也只有一个。IO设备在启动的时候必需要向整个系统注册他本身的IO端口,在操做系统当中,IO设备的端口也是连续的,一个IO设备可使用一片连续的IO设备端口。端口通常也是从0-65535这个范围内。那么若是某一个端口被其实IO设备注册使用了,那么别的IO设备在注册的时候就只能使用剩余的其余端口了。可是通常来说咱们的端口是用不完的。同时,为了让CPU知道在哪个时刻IO设备产生了那些事件,每一个IO设备还须要向CPU注册中断,必需要注册使用中断号。因此CPU只须要知道那个IO端口注册使用的是哪个IO设备,就么就能实现IO设备和CPU之间的准确交互。而中断是IO设备和CPU之间创建的紧急沟通平台。就比如说中美关系,在正常状况下都是经过管理外部事务的部门进行官方之间的信息沟通,可是在状况比较紧急的状况下,领导人与领导人之间须要有专线进行紧急事件的沟通,以免紧急事件照成误判而发生战争或者其余影响。有了中断,一旦某个IO设备向CPU来了一个IO中断信息,好比说网卡,有人ping过来了一个报文,你们知道这个报文在计算机的底层其实表现的就是一电信号,报文不当即处理的话就会当即消失的。这个报文保存在内存的网络缓存区中。若是是磁盘IO发送过来的中断信息呢?要把他读进来放在磁盘缓存区当中,因此操做系统中,每一个设备都会有缓存区的。通常来说,一旦某个IO设备产生中断了,意味着这个事件比当前运行的进程更紧急,因此操做系统对于中断的处理应该是很优先的。那么咱们的系统在上面时候才会产生中断呢?容许中断呢?在任何一个时钟中断到来以前,可以实现对CPU的抢占。所以当咱们的系统有一个设备接入进来的时候,该设备会向中断控制器发起一个中断请求,中断控制器产生请求以后,CPU立刻就可以意识到有设备进来了,那么CPU是怎么意识到的呢?CPU里面有一种东西叫作针脚,这个针脚一旦有了电压,CPU立刻就意识到了。CPU一旦产生中断,CPU就会告诉内核中断产生,这个时候内核必需要完成模式切换,而这个时候内核可能正在运行着一个进程,那这个进行就会被清除出去的。让内核处理该中断,将信息读进内存当中。操作系统
若是咱们须要从磁盘上读取不少文件进来,咱们的CPU必需要一个一个的指挥着,那这样的话,咱们的CPU大量的时间都消耗在数据交换上了,为了不这种状况,CPU能够在内存中开辟一段空间,来存储这段数据,然后CPU吧这个控制权交给这个设备的DMA,由DMA负载取数据。数据取完以后放到内存里面,DMA告诉CPU数据取完了。DMA是怎么告诉CPU呢?又是一次中断。综合来讲就是一个外部的硬件须要和CPU打交道的时候,必需要经过中断来完成。CPU必需要知道没一次的中断都是什么,他的IO端口是什么。而后才能当前的这些动做和IO设备关联起来,而且在须要的时候将这个IO设备附加到进程上面。进程