做应用层开发的这图都应该看过很多遍了。
1. 最底层是硬件层支撑所有软件层的运行以及特定功能的实现;像CPU、内存、鼠标、键盘、硬盘、光驱、网卡等等。
2. 在硬件之上的是设备驱动程序,用于驱动硬件设备;这一层相当于硬件对应的软件实现。
3. 再往上是操作系统内核层这是操作系统的最核心的部分。通常内核层会实现一套框架便于硬件驱动层的扩展,驱动层可以动态加载与删除;不然插个U盘、放个摄像头重启一下系统,大家就呵呵呵。。。
4. 继续往上是一层接口层俗称系统调用接口用于应用层与内核以及设备驱动层的交互;在linux中大约有两三百个接口,常用的也就是二三十个。
5. 最上面的就是应用层了,这个没啥好说的。
扩展下,说一下最近流行的虚拟化技术。像Docker之类虚拟化技术现在算是第二代了,呢第一代是什么,第一代是VM、V-Box之列的虚拟机。虚拟机虚拟了硬件层,在虚拟机中安装的操作系统看来独享整个硬件;容器更进一步虚拟了操作系统,在运行在容器中的应用程序看来独享整个操作系统。顾名思义,虚拟机相当于一套硬件的模拟,容器相当于一套操作系统的模拟。
上面说了这么多下面说一下我们今天的主题,其实就是三句话。
一个处理器在特定的时间点上面必然处于下面三种状态中的一种:
1. 运行于用户空间,执行用户进程;应用程序在干自己的事情,这是多数应用开发的主要任务。
2. 运行于内核空间,但是处于进程上下文,代表某个进程执行;应用层与内核交互,需要内核或者驱动层帮忙干一些事情,比如写文件等,应用层调用系统调用接口多数会陷入内核层代表进程去执行任务。
3. 运行于内核空间,但是处于中断上下文,与任何进程无关,在处理特定的中断程序;像网卡收到数据包、键盘输入等这种被动事件多数属于此种情况。
上面三种情况包含了处理器的所有状态,任何状态都不例外;比如处理器在空闲状态下,运行于内核空间,但是代表空闲进程执行(windows下面的System Idle Process)。
好了就说这么点吧,好像也没说出啥东西。