先阅读计算机硬件结构历史简介:
https://blog.csdn.net/starcraft501/article/details/100806378
操作系统层次结构
操作系统软件可以分为两部分:1. 平台型,包括内核,驱动,以及系统工具 2. 开发环境型,包括编译器,汇编器,链接器和运行库
计算机软件,包括系统软件,通常按层次结构设计,这种方式可以通过新加层来解决任何问题。(如虚拟机技术,在硬件和操作系统之间增加了一层虚拟层,使得一个计算机上可以同时运行多个操作系统)
Any problem in computer science can be solved by another layer of indirection.
底层提供接口,上层使用接口,接口尽量稳定并保持向后兼容。除了最底层的硬件和最上层的应用程序,都叫中间层; 由于中间层的存在,使得应用程序和硬件保持相对独立,应用程序可以在同一架构的芯片系列和操作系统(向后兼容设计)升级后运行,也可以很方便的移植到不同的平台,节省了大量应用程序的开发适配时间。
计算机系统软件体系结构
除硬件外,计算机系统主要分为用户态和内核态两个层次。应用程序,运行库都属于用户态程序:内核,驱动,系统调用都属于内核态程序
用 |应用程序:浏览器 播放器 字处理软件 邮箱客户端 图片浏览器 | 开发工具:编译器,汇编器,调试器,第三方库
户 |-----------应用程序API接口-----------
态 |运行库(linux用的是基于POSIX标准的Glibc),封装系统调用,给应用程序提供完整的功能,比如C语言的fread
--------|----------系统调用(linux,用户程序或运行库使用int 0x80作为软中断,进入内核态执行系统调用)-----------
内核态|操作系统内核,驱动(关注硬件规格,发挥硬件的最大能力, 将设备映射为/dev下文件,供应用软件操作)
|----------硬件规格接口----------(定义驱动程序如何操作硬件,比如CPU指令手册)
|硬件
可以看出,操作系统的一个功能是给上层提供抽象的接口,不感知硬件差异,另一个功能是管理硬件资源,能够充分利用硬件能力,在更短时间内处理更多的任务。下面重点讲一下操作系统充分利用硬件能力的设计。
充分利用计算机硬件性能
- 对CPU的充分利用
- 对I/O设备的充分利用
- 对内存的充分利用
- 多线程的设计及线程安全
1. 对CPU的充分利用
如果一个CPU只能运行一个程序,那么当程序在执行磁盘I/O时,CPU是空闲的。
最初始的优化方法:
多道程序设计 multiprogramming, 监控程序发现CPU空闲时就运行其他等待运行的程序;缺点是程序没有优先级,正在运行的程序不会主动让出CPU,也不能被抢占CPU,导致一些紧急的任务不能及时的运行。
改善后的方法:
Time-Sharing system,协作式分时系统,每个程序运行一段时间后主动让出CPU,使得其他程序有机会运行。缺点:如果一个重度计算的或恶意的程序一直占用CPU,那么其他程序还是没有机会运行; 死循环会导致系统死机。
当前的方法:
Multi-tasking, 多任务系统,操作系统接管了所有的硬件资源,运行在一个受硬件保护的级别(内核态)。所有的应用程序都以进程的方式运行在用户态(比内核态级别低),每个进程都有独立的地址空间(虚拟地址空间0~4G),映射到不同的物理地址空间,使得进程地址空间相互隔离,不会发生地址冲突的情况。CPU的时间片由操作系统根据当前进程优先级统一分配给某个进程,当进程运行超出时间片,操作系统就暂定执行该进程,将时间片分配给其他等待CPU的进程,这种方式是抢占式分配(preemptive), 操作系统可以强制剥夺CPU资源并分配给它认为目前最需要的进程。由于每个时间片很短,CPU在多个进程间快速切换,从用户程序的角度来看,是很多进程同时运行,支持多任务。目前所有流行的操作系统都时这种方式,包括UNIX,linux, Windows, Mac OS X.
2. I/O驱动利用设备
操作系统对硬件进行管理和抽象,应用程序不需要关心具体的硬件型号,它们需要一个统一的硬件访问接口。比如读写硬