操作系统是一门重要的基础知识,了解这门基础知识不仅能帮助我们写出更优秀的程序,还能提高我们的学习能力。当我发现有时候经常看不懂大佬的文章,听不懂大佬间谈话,看不懂项目文档的时候,我想我是时候补充一下基础知识了。本系列篇章内容基于Operating Systems: Three Easy Pieces的读后感,是一份操作系统知识的归纳总结。
“共享”CPU
我们的电脑使用一块CPU“同时”运行着各式各样的应用程序,操作系统通过分时共享的方式,让每个程序轮流使用CPU,就好像每个程序都有自己的CPU一样(就好像共享单车那样)。为了使CPU能够被各进程分时共享,操作系统要掌握分配CPU使用权的权利,同时也要履行服务好各项进程的义务。本篇文章就操作系统如何行使“权利”与履行“义务”做了一些归纳总结——操作系统如何掌握系统的控制权?操作系统如何协调各项进程“共享”CPU?
限制用户进程行为
操作系统是有“被害妄想症”的(事实上,它必须要有被害妄想症...),它不信任用户进程,总想着用户进程充满恶意,会阻碍系统的正常运作。于是乎,只有操作系统才有权限直接访问诸如内存,硬盘,以及其他系统资源。一但有用户进程试图越过操作系统执行这些“危险”的访问操作,该进程就会被杀死。让用户进程直接访问内存,硬盘等资源的确也是很危险的一件事,试想一下如果一个进程可以任意读取和修改其他进程的内存数据,那么基本上所有的进程都不能正常运行了。所以操作系统必须要限制用户进程的行为。
用户态(user mode)与内核态(kernel mode)
操作系统通过划分用户态和内核态来限制用户进程的行为:
- 用户态:用户进程运行在用户态,只能执行部分低权限的指令。
- 内核态:操作系统运行在内核态,具备执行所有指令的权限。
CPU硬件支持
为了区分用户态和内核态,操作系统需要硬件的帮助。CPU要提供某种权限机制,来区分用户态和内核态的访问权限。例如,x86 CPU提供4种特权级别