有没有好奇过计算机程序是怎样运行的呢?在这里就简单介绍一下下。
首先是利用“高级程序设计语言”,例如C、C++、Java等,进行编程,但是计算机并不认识高级语言编写的程序,编好的程序必须通过编译器和汇编器编译成计算机能够识别的语言。其次,机器语言程序需要加载到内存,形成一个运动中的程序,即“进程”这需要操作系统的帮助。进程需要在计算机芯片CPU上执行才算真正在执行,而将进程调度到CPU上由操作系统完成。另外,在CPU上执行的机器语言指令需要变成能够在一个个时钟脉冲里执行的基本操作,这需要指令集结构和计算机硬件的支持,而整个程序的执行过程需要操作系统提供的服务和程序语言提供的执行环境。
从上述描述可以看出,程序的运行至少需要如下四个因素:
- 程序设计语言;
- 编译系统;
- 操作系统;
- 指令集结构(计算机硬件系统)。
那么操作系统又是什么呢?操作系统是掌控计算机上所有事情的软件系统。操作系统通过分块对CPU、内存、磁盘等进行管理,使用户更好的利用这些硬件资源。把硬件分块出来给应用程序使用,关键原则是有效和公平,有效指的是不能浪费资源,公平指的是每个人都有享有资源的可能,既不能有不公平的现象。
根据管理的资源不同,操作系统的具体功能包括:
- CPU管理,即如何分配CPU给不同的应用和用户,也就是进程管理。进程管理的主要目的有三个:第一个是公平,即每个程序都有机会使用到CPU;第二个是非阻塞,即任何程序不能无休止的阻挠其他程序的正常推进;第三个是优先级。
- 内存管理,即如何分配内存给不同的应用和用户,主要是管理缓存、主存、磁盘、磁带等储存介质所形成的内存架构。内存管理的另一个目的是让很多程序共享同一个物理内存。
- 外存管理,即如何分配外存(磁盘)给不同的应用和用户。存储管理就是众所周知的文件系统,其目的是将磁盘变成一个很容易使用的存储媒介提供给用户使用。这样我们在访问磁盘时无需了解磁盘的物理属性或数据在磁盘上的精确位置,诸如磁道、磁柱、扇面等。
I/O管理,即如何分配输入输出给应用和用户,其目的有两个:一是屏蔽不同设备的差异性,即用户用同样的方式访问不同的设备,从而降低编程的难度;二是提供并发访问,即将那些看上去并不具备共享特性的设备,如打印机,变得可以共享。
另外还有批处理管理,其目的是要达到吞吐量最大化,单位时间完成的任务最多。
除了对上述资源进行管理和抽象外,操作系统本身的设计还需包括如下两项:
健壮性管理,即如何确保操作系统自身的正常运作;
- 安全性管理,即如何防止非法操作和入侵。
接下来先说一下操作系统的核心概念——进程。它指的是一个运动中的程序。
PCB利用双向循环链表用来记录进程主体的PPID,方便插入和删除。先产生PCB,再产生进程主体,因为通过PCB才能找到进程主体;先释放进程主体,再释放PCB,由于释放两者的的时间差,会产生将死进程(僵尸进程),即只有PCB而进程主体被释放掉了。
进程的运行状态有:创建、就绪、运行、终止、挂起(就绪/阻塞)、阻塞,其转换关系如下:
终止有以下四种情况:
- 寿终:进程运行完成而退出;
- 自杀:进程因错误而自行退出;
- 他杀:进程被其他进程强行“杀死”;
- 异常:进程因异常而强行终结。
进程加载:以简单“分页”加载。由于每次分配的空间不固定所以产生了外部碎片,为了消除,将内存分为可以被整除的很多页,每一次分配一页给进程。用页表记录位置等信息。
为了提高效率,只将当前需要的页面放在内存上,其他暂时不用的放到虚拟内存上,即磁盘上开辟一块空间以内存方式管理。这样操作系统可以驻留更多的程序,也可以运行比内存大得多的程序。