深入理解Linux之Linux操作系统是如何工作的?破解操作系统的奥秘
SA12226242 施健
一、操作系统的基础 (500字总结放在最下面)
1.存储程序计算机
由美籍匈牙利数学家冯·诺依曼于1946年提出的,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。冯·诺依曼和同事们依据此原理设计出了一个完整的现代计算机雏形,并确定了存储程序计算机的五大组成部分和基本工作方法。冯·诺依曼的这一设计思想被誉为计算机发展史上的里程碑,标志着计算机时代的真正开始。
虽然计算机技术发展很快,但“存储程序原理”至今仍然是计算机内在的基本工作原理。自计算机诞生的那一天起,这一原理就决定了人们使用计算机的主要方式——编写程序和运行程序。
存储程序计算机主要的特点有:
- 在执行程序和处理数据时必需将程序和数据装入存储器中,然后才能使计算机在工作时能够自动地从存储器中取出指令并加以执行。
- 用二进制形式表示数据和指令。
- 对计算进行集中的顺序控制。
- 计算机系统由运算器、存储器、控制器、输入设备、输出设备等5大部件组成。
冯·诺依曼“存储程序”工作原理的核心包含两层含义:首先,将编写好的程序和原始的数据存储在计算机的存储器中,即“存储程序”;其次,计算机按照存储的程序逐条取出指令加以分析,并执行指令所规定的操作,即“程序控制”。
2.堆栈(函数调用堆栈)机制
Linux操作系统是由大量的C语言和少量的汇编完成的。在操作系统中整体是有栈和堆构建起来的,具体栈的变化情况参见 深入理解Linux之计算机是怎样工作的 的二、C程序的运行。
3.中断机制
中断是CPU提供的允许其他模块打断处理器正常处理过程的机制。常见的中断类别有:
类别 | 说明 |
程序中断 | 在某些条件下由指令的结果产生,例如算术溢出、除数为0、试图执行一条非法的机器指令和访问到用户不允许的机器位置等。 |
时钟中断 | 由处理器内部的计时器产生,允许操作系统以一定的规律执行函数。 |
IO中断 | 由IO控制器产生,用于发信号通知一个操作的正常完成或各种错误条件。 |
硬件故障中断 | 由诸如掉电或者存储器奇偶错误之类的鼓掌产生。 |
因此,在CPU执行周期中,要加入一个中断周期用于检测是否发生了中断。
在操作系统中,操作系统内核实现中断处理程序。而CPU与操作系统通过“默契”协作完成对中断的处理。当有中断发生时,CPU进入中断处理流程,保存现场,查找中断向量表,进入对应的中断处理例程,并且调用。
同时,在操作系统中存在一些软中断,tasklet和工作队列:由于中断是随机发生的,其需要能被快速的处理。因此一些复杂耗时的操作就交由内核线程实现的软中断和tasklet、工作队列来完成。
二、操作系统是如何工作的
操作系统可以看成是一系列的进程在交替运行,同时操作系统内核会在进程切换期间做一些事情。
在进程之间会有一些内核处理的动作:
操作系统的简化理解就可以如上所述。而进程切换中的动作是由switch_to宏完成的,具体涉及到进程的task队列的修改和寄存器的保存和恢复等。
三、500字总结
操作系统是运行在硬件上的一个特殊的程序,操作系统的任务是资源管理和分配,进程的创建和调度等。操作系统和进程一样也是存储在内存中,并且需要CPU等资源去运行,只不过操作系统内核是在进程切换时完成大部分工作的。为了能定时的运行操作系统,硬件中的时钟会定时产生时钟中断,在时钟中断的处理函数中会进行决策是否该运行操作系统的内核了。在进程切换过程中,操作系统主要完成的事情是:中断处理、进程调度、信号量处理。而这些是对用户隐藏的,在用户的视角来看,操作系统就是一系列的进程交替运行。
同时,计算机并非是线性的执行下去的,否则就无法与用户进行交互。在计算机运行的时候,会存在一系列的中断,中断是硬件的功能,操作系统则提供了中断处理例程。在CPU周期中,会检测中断,当有中断发生时,计算机会优先处理中断。而这些中断处理例程,实在计算机开机时就已经在内存中注册好了,CPU会去对应的位置找到入口进行调用。由于中断是随机产生,对中断的处理必须非常块。因此,有时中断的处理只是将某个需要处理的任务加入到队列中。如加入到tasklet和工作队列。这些任务有内核线程运行。他们的运行时间就是在上图中的进程切换期间。在进程切换期间还有很多其他的事情,比如信号量处理,这是用来进程间通信的。