硬件基本知识
总线结构:所有设备挂在总线上,通信均需通过总线,外部设备通过其控制器与CPU通信。
流水线结构:仿照工业流水装配线,将计算机的功能部件分为多个梯级,并将计算机的每条指令拆分为同样多个步骤,使每条指令在流水线上流动。
为了进一步提高计算机的效率,在流水线的基础上又发明了多流水线、超标量计算和超长指令字等多指令发射机制。这些机制的发明也极大地增加计算机结构的复杂度,并对操作系统和编译器提出了更高的要求。
从寄存器到磁带,每一级存储媒介的访问延迟和容量依次增大,而价格却依次降低。通过合理搭配,可以形成一个性价比颇高的存储架构。
中断是计算机里一个最为重要的机制,它是操作系统获得计算机控制权的根本保证。它的基本原理是设备在完成自己的任务后向CPU发出中断请求,CPU判断优先级,然后确定是否响应。如果响应,则执行中断服务程序,并在中断服务程序执行完后继续执行原来的程序。中断是一个很复杂的过程,中断处理过程中又可以发生中断,且还可以有所谓的软中断,即软件发出的中断。
内核态和用户态
如果程序运行在内核态,则该程序就可以访问计算机的任何资源,即它的资源访问不受限制。如果一个程序运行在用户态,则其资源需求将受到各种限制。由于内核态的程序可以访问计算机的所有资源,因此这种程序的可靠性和安全性就显得十分重要。
一般说,一个程序尽可能地运行在用户态,只有在迫不得已的情况下,才运行在内核态。凡是牵扯到计算机本体运行的事情都应该在内核态下执行,比如CPU的管理和内存管理、诊断与测试程序等。另外,对时序要求特别高的操作,也应该在内核态完成。
对于文件系统来说,用户数据的管理放在用户态,文件系统本身的管理放在内核态。
进程、内存、文件
操作系统对进程的管理通过进程表来实现。进程表里存放的是关于进程的一切信息。在任何时候,进程所占有的全部资源形成一个进程核core。核快照core image代表的是进程在某一特定时刻的状态。
如果在Linux或Unix操作系统下编写程序,在出现分段错误时,操作系统会自动进行核倒出core dump。核倒出把所有计算机的状态保存在一个文件中,通过阅读这个文件的内容可以得知溢出时进程状况,从而帮助调试程序。
进程与进程之间可以通信、同步、竞争,并在一定情况下可能形成死锁。
系统调用
系统调用按照功能可以划分为六大类:
- 进程控制类
- 文件管理类
- 设备管理类
- 内存管理类
- 信息维护类
- 通信类
系统调用分为3个阶段:
- 参数准备阶段
- 系统调用识别阶段
- 系统调用执行阶段
壳
用户程序通过调用操作系统提供的系统调用API来获得操作系统的各种服务。但使用API需要编程。为了向这些不编程的用户提供服务,操作系统提供了一个壳shell来与用户交互。这个壳是覆盖在操作系统服务上面的一个用户界面,可以是图形界面,也可以是文本界面。
Unix和Linux:壳是文本形式;只需要运行shell即可;可以同时启动多个壳
Windows:可同时启动多个文本命令壳Powershell;只能启动一个图形界面壳explore.exe
fork和execve是Unix操作系统提供的系统调用。fork的功能是创建一个子进程,并将自己的一切数据复制到子进程里。execve的功能是用另外一个程序的内容覆盖自己,即执行新的程序。
fork命令有两次返回:一次返回值为0,表明是子进程;另一次返回值不为0,表明是父进程,而返回值就是子进程的进程ID。因为fork的特殊功能使然,在fork完成后,我们面对的是两个进程,而这两个进程的程序代码完全一样。