操作系统介绍
哈Ha! 我想提请您注意一系列文章-我认为是OSTEP的有趣文献的翻译。 本文相当深入地讨论了类Unix操作系统的工作,即处理组成现代OS的进程,各种调度程序,内存和其他类似组件。 您可以
在这里看到所有材料的原始材料。 请注意,翻译是非专业地进行的(相当自由),但是我希望我保留了一般的含义。
有关此主题的实验室工作可以在这里找到:
其他部分:
您可以通过
电报查看我的频道=)
考虑操作系统为用户提供的最基本的抽象:一个过程。 定义过程非常简单-这是一个
有效的程序 。 程序本身是位于磁盘上的毫无生气的东西-它是一组指令以及可能需要等待启动的某种静态数据。 是OS接收这些字节并启动它们,将程序转换为有用的东西。
通常,用户希望一次运行多个程序,例如,您可以在笔记本电脑上运行浏览器,游戏,媒体播放器,文本编辑器等。 实际上,典型的系统可以同时运行数十个和数百个进程。 这个事实使系统更易于使用,您不必担心CPU是否空闲,只需运行程序即可。
这就提出了一个问题:如何提供多个CPU的错觉? 即使您只有一个物理CPU,OS也会如何产生几乎无限数量的CPU的幻觉?操作系统通过CPU虚拟化创造了这种错觉。 通过启动一个进程,然后停止它,再启动另一个进程,依此类推,OS可以支持存在许多虚拟CPU的错觉,尽管实际上它将是一个或多个物理处理器。 此技术称为
CPU时间共享 。 该技术允许用户根据需要运行多个同步进程。 这种解决方案的成本是性能-因为如果多个进程共享CPU,则每个进程的处理速度都会变慢。
为了实施CPU虚拟化,尤其是要做好,虚拟化操作系统需要低层和高层支持。 低级支持称为
机制 -这些是实现功能必要部分的低级方法或协议。 这种功能的一个示例是上下文切换,它使OS能够停止一个程序并在处理器上运行另一个程序。 在所有现代操作系统中都实现了这种时分。
这些机制的顶部是操作系统中嵌入的一些逻辑,形式为“策略”。
策略是操作系统的某种决策算法。 例如,这样的政客首先决定要运行哪个程序(从命令列表中)。 因此,例如,称为
调度策略的策略将解决此问题,并且在选择解决方案时将以以下数据为指导:启动历史记录(哪个程序在最近几分钟内运行时间最长),此过程执行的负载类型(启动了哪种类型的程序) ),性能指标(系统是否针对互动交互或针对带宽进行了优化)等等。
抽象:过程
操作系统执行的正在运行的程序的抽象就是所谓的
过程 。 如前所述,在任何瞬时时间段,过程都只是一个工作程序。 一个程序,借助该程序,我们可以从系统的各种资源中获取摘要信息,并且该程序可以在该程序中执行或对其进行处理。
要了解过程的组成部分,您需要了解系统的状态:程序在其运行期间可以读取或更改。 在任何时候,您都需要了解系统的哪些元素对于程序执行很重要。
进程包括的系统状态的明显要素之一是
内存 。 指令在内存中。 程序读取或写入的数据也位于内存中。 因此,进程可以寻址的存储器(所谓的地址空间)是进程的一部分。
寄存器也是系统状态的一部分。 许多指令旨在更改寄存器的含义或读取其含义,因此寄存器也成为该过程的重要组成部分。
应当指出,机器的状态也由某些特殊寄存器组成。 例如,
IP-指令指针 -指向程序当前正在执行的指令的指针。 还有一个
堆栈指针和关联的
帧指针 ,用于控制:函数参数,局部变量和返回地址。
最后,程序经常访问ROM(只读存储器)。 有关“ I / O”(输入输出)的信息应包括该进程当前打开的文件列表。
流程API
为了增进对过程的理解,让我们研究应该包含在操作系统的任何接口中的系统调用示例。 在任何操作系统上都可以使用一种或多种形式的这些API。
●
创建 :操作系统必须包括一些允许您创建新进程的方法。 当您在终端中输入命令或通过双击图标启动应用程序时,将向操作系统发送请求以创建新进程,然后启动指定的程序。
●
删除 :一旦有了用于创建进程的界面,操作系统还应具有强制删除进程的功能。 大多数程序自然会在执行时自行启动和完成。 否则,用户希望能够杀死它们,因此停止该进程的界面将不是多余的。
●
等待 :等待过程有时很有用,因此提供了一些提供等待功能的接口。
●
杂项控制 (杂项控制):除了终止进程和等待进程外,还有多种其他控制方法。 例如,大多数操作系统都具有冻结进程(将其停止一段时间)然后恢复(继续执行)的功能。
●
状态 :有多种接口可用于接收有关进程状态的某些信息,例如进程的持续时间或当前处于什么状态。

流程创建:详细信息
有趣的事情之一是如何将程序准确地转换为过程。 尤其是操作系统如何启动并运行程序。 流程是如何精确创建的。
首先,操作系统必须将程序代码和静态数据加载到内存中(在进程地址空间中)。 程序通常以某种可执行格式位于磁盘或固态驱动器中。 因此,将程序和静态数据加载到内存的过程要求操作系统从磁盘读取这些字节并将它们放置在内存中的某个位置。
在早期的OS中,启动过程急于执行,这意味着代码是在程序启动之前完全加载到内存中的。 现代OS懒惰地执行此操作,也就是说,仅在程序在执行过程中需要时才加载代码或数据段。
将代码和静态数据加载到OS的内存后,您需要做一些其他事情,然后再开始该过程。 应该为堆栈分配一定数量的内存。
程序将堆栈用于局部变量,函数参数和返回地址 。 操作系统分配该内存并将其分配给进程。 堆栈也可以分配一些参数,特别是它用argc和argv数组填充main()函数的参数。
操作系统还可以为程序堆分配一定数量的内存。
程序将堆用于显式请求的动态分配的数据 。 程序通过调用
malloc()函数请求此空间,并通过调用
free()函数显式清除该空间。 数据结构(例如,链接表,哈希表,树等)需要堆。 最初,在堆下分配了少量内存,但是随着时间的流逝,在程序运行期间,堆可能会通过库API调用malloc()请求更多的内存。 操作系统参与分配更多内存的过程,以帮助应对这些挑战。
操作系统还将执行初始化任务,特别是与I / O相关的任务。 例如,在UNIX系统上,每个进程默认都有3个打开的文件描述符,用于标准输入,输出和错误流。 这些描述符允许程序从终端读取输入,并在屏幕上显示信息。
因此,OS将代码和静态数据加载到内存中,创建并初始化堆栈,并执行与I / O任务执行相关的其他工作,OS为该过程准备了站点。 最后,剩下的最后一项任务是:通过名为main()函数的入口点运行程序。 继续执行main()函数,OS将CPU控制权转移到新创建的进程,因此程序开始运行。
工艺状态
现在,我们已经了解了什么是流程以及如何创建流程,我们列出了可以存在的流程的状态。 以最简单的形式,过程可以处于以下状态之一:
●
运行 。 在运行状态下,该进程在处理器上运行。 这意味着指令正在执行。
●
准备就绪 。 在就绪状态下,该过程已准备好开始,但是由于某些原因,操作系统无法在给定的时间点执行该过程。
●
已阻止 。 在锁定状态下,该过程将执行一些操作,以防止其准备好执行直到事件发生。 一个常见的示例是,当某个进程启动IO操作时,它被阻塞,因此其他进程可以使用该处理器。

您可以以图形的形式想象这些状态。 如图所示,进程的状态可以在OS的决定下在RUNNING和READY之间更改。 当进程的状态从“就绪”变为“正在运行”时,表示该进程已被调度。 相反的方向-从布局中移除。 例如,当进程变为BLOCKED时,我启动IO操作,操作系统会将其保持在此状态,直到发生某些事件(例如IO完成)为止。 此时,如果OS决定,则转换为READY状态,并可能立即转换为RUNNING状态。
让我们看一下两个过程如何经历这些状态的示例。 首先,假设两个进程都在运行,并且每个进程仅使用CPU。 在这种情况下,它们的状态将如下所示。

在下面的示例中,一段时间之后,第一个进程请求一个IO并进入BLOCKED状态,从而使另一个进程能够启动(图1.4)。 OS看到进程0不使用CPU并启动了进程1。在执行进程1的过程中-IO结束,进程0的状态变为READY。 最后,过程1完成,最后,过程0开始,执行并结束其工作。

资料结构
OS本身是一个程序,并且与其他任何程序一样,它具有一些跟踪各种相关信息的关键数据结构。 要跟踪OS中每个进程的状态,将支持所有处于READY状态的进程的特定
进程列表 ,以及一些用于跟踪当前正在运行的进程的其他信息。 另外,操作系统必须跟踪和阻止进程。 完成IO后,操作系统必须唤醒所需的过程并将其置于准备启动状态。
因此,例如,操作系统必须保存处理器寄存器的状态。 在过程停止的那一刻,寄存器的状态保存在过程的地址空间中,并且在其继续时,可以恢复寄存器的值,从而继续进行该过程。
除了就绪,阻塞,运行状态之外,还有其他一些状态。 有时,在创建时,进程可以具有INIT状态。 最后,当一个进程已经完成时,可以将其置于FINAL状态,但是尚未清除有关该进程的信息。 在UNIX系统上,此状态称为“
僵尸进程” 。 例如,当父进程想知道其后代的返回代码时,此状态很有用,通常0表示成功完成,1表示错误,但是程序员可以制作其他输出代码,表示各种问题。 完成后,父进程将进行最后一个系统调用(例如,wait())以等待后代进程完成,并向OS发出信号,通知可以清除与已完成进程关联的任何数据。

演讲重点:
●
进程 -操作系统中正在运行的程序的主要抽象。 在任何时候,都可以通过状态来描述一个进程:其地址空间中的内存内容,处理器寄存器的内容(包括指令指针和堆栈指针)以及有关IO的信息,例如,打开或读取的文件。
●
Process API包含程序可以对流程进行的调用。 通常,这些是创建,删除或其他的调用。
●进程处于多种状态之一,包括运行,就绪,已阻止。 各种事件(例如计划,计划外的排除或期望)可以将流程的状态从一个状态转换为另一个状态。
●
进程列表包含有关系统中所有进程的信息。 其中的每个条目都称为过程控制块,实际上是一个结构,其中包含有关特定过程的所有必要信息。