烹饪肉类视频地址:
我们讨论了操作系统如何扮演裁判,魔术师和粘合剂的角色以及裁判是指资源保护的管理;魔术师意味着我们希望它看起来像我们非常干净易用的 - 使用资源抽象。目的是使用无统一接口的实际物理资源。粘合剂是一组通用服务,使得编写程序更易于编写在操作系统上,例如文件系统服务,网络服务等。
今天,我们将讨论操作系统的四个基本概念:我们将开始讨论哪些线程(线程)。该线程将完全描述程序状态或线性执行上下文。堆栈等。包括地址空间和一个或多个线程。在本课程的早期阶段,我们将讨论特别重要的硬件机制,即双模式操作,即典型处理器至少具有两种不同的模式。我们可以将其作为内核模式(内核模式)和用户模式放松。我们需要学习如何编写和编译为可执行文件,然后从文件系统中取出这些可执行文件并建立操作过程。将文件加载到存储器上。修饰传输控制(传输控制)意味着处理器的程序计数器将指向该过程的用户代码中的指令,然后该程序将开始执行。操作系统需要为这些过程提供各种系统服务,并且操作系统需要保护操作系统和过程免受其他流程和其他用户的影响。LET回忆CS61B + CS61C课程的内容:开头的处理器具有程序计数器(PC,程序计数器)以及可以读取的内存,并且内存中有一组说明。程序计数器将指向内存中的说明,让处理器读取下一条指令。我们拉了指令从内存中解码,然后将其输入运行线。我们在CS61C中经常谈论的是风险 - 型处理器(风险样式处理器),并具有五个运行的汇编行。他们的解码,他们进入一组注册表和ALU进行实际操作, 然后增加程序计数器并继续下一个指令。
我们的第一个操作系统概念是控制线。该线程实际上是唯一的执行上下文。它具有程序表,寄存器,执行符号,线程堆栈,内存状态。线程就像您在上一个幻灯片中看到的处理器的虚拟版本一样。一个线程在处理器或核心上执行。顺便说一下,我现在将处理器和核心的两个概念混合在一起,我们可以更清楚地了解两个概念之间的区别。但是仅在处理器寄存器是居民(居民)时才执行线程上下文(上下文)或根状态。有些事情在寄存器中,保留在内存中:
这是执行过程(von noonman系统)的另一个视图。这是一组地址。我们将其称为稍后从0到2^32 -1的地址空间。有一组要执行的说明,pink是您的处理器。该过程具有保护状态。处理器包括寄存器和装配线的集合。建筑和重复此执行周期。
那么,我们如何有多个处理器的错觉?我们上次说是在笔记本电脑上制作PS -AUX或其他操作。如果仔细观察,您会发现数百个过程正在运行,其中大多数是休眠的。但是它们可以在您当前的处理器上使用,因此它如何工作?让我们假设只有一个物理处理器,只有一个核,在任何给定的时间上仅在硬件上执行一个执行线程。但是现在我们需要多个CPU,或同时使用多个CPU的幻觉,因此我们可以同时使用多个线程。查看,我有很多正在运行的东西,它们都共享内存。每个线程是虚拟核心。我们这里有三个线程,红色线,青色螺纹和黄线,这会导致它们同时运行的幻觉。通过我们反复使用硬件,我们运行红色线程一段时间,然后将蓝色线程延长一段时间,然后运行黄线一段时间以循环。线程内容包括什么?显然,每个线程都需要一个程序计数器和一堆指针以及所有寄存器。如果线程正在运行,则寄存器状态在处理器寄存器中;如果不运行,这些状态在内存中,称为线程控制块(TCB,线程控制块)
让我们举个例子:VCPU1在T1处运行,而VCPU2在T2处运行。当T1和T2时,发生比赛开关。在底部,这是一个事件。指针,所有其他寄存器都存储在内存中的相应线程控制块中。我们从VCPU2加载程序计数器,堆栈指针等,然后运行VCPU2。
一些问答:
然后是什么触发上下文开关?全局倒计时时间即将到来,或者是自愿触发诸如CPU之类的内容。例如,如果要执行某些I/O,则操作系统将安排其他线程。
我们可能有一堆内存(蓝色代表性内存)。我们可以想象,这些虚拟过程中的每个线程都有其自己的堆栈,堆,数据和代码。它们以某种方式分布在内存中。我们必须做到这一点。这是以某种方式记录所有事物的位置。线程控制块就是一切所在。当我们从绿色转到黄色时,我们要做的第一件事就是将所有绿色线的寄存器保存到其线程控制块中。顺便说一句,它是内核内存。
我们今天正在谈论的第二个操作系统概念是地址空间:它是一组可访问的地址和相关状态,这只是观众对可用地址的视图。对于32-位处理器,可以访问的地址空间在32中约为40亿。对于64位处理器,2的第64侧为18万亿美元。但这并不意味着所有空间都有相应的物理DRAM内存,并且只有一些空间具有相应的物理DRAM。您阅读或阅读或在地址空间中写地址,也许像普通内存一样运行,或者完全忽略了写作操作;或者可能导致系统引起I/O操作,这称为内存映射I/O;或可能导致异常。如果您尝试在此处显示的堆栈和堆之间读取或写入某个位置,但是如果没有分配给此过程的物理内存,则会出现页面错误(页面故障);或写作记忆的行为是与另一个程序进行通信。
操作系统必须保护自己免受用户程序的影响。这件事情是由很多原因导致的:
操作系统必须保护用户程序之间的安全性,并防止用户拥有的线程会影响对方用户拥有的线程。因此,硬件可以帮助操作系统保护自己免受程序的侵犯。这里有一个非常简单的想法。实际上,这很简单。我将此概念称为基础和边界(B&B,基础和界限):
我们要做的是我们有两个寄存器,一个基本登记册和一个绑定寄存器。这两个寄存器记录了对内存访问的一部分的黄线。程序运行时,将磁盘上的文件加载并移至内存。因此,当程序开始执行时,它可与程序计数器一起使用。例如,在1010的范围内,这是代码所在的地方。硬件将快速比较该程序的计数器是否大于基础,以及它是否小于界限。
此方法非常简单,但是访谈中的每个内容都必须记录一个长的地址。,您可能需要将当前的黄色部分复制到内存中剩余空间较大的地方。要优化这些问题,我们通常不会直接访问物理内存,而是添加地址空间翻译机制(地址空间转换):::::::
一种翻译设计被添加到硬件加法器中:地址实际上是动态转换。所有地址实际上都是偏移。操作系统记录每个过程的内存基础地址。偏移是实际的物理内存地址。
另一种方法是使用段。在x86硬件中,我们有各个段,例如代码段,堆栈部分等。每个部分都有不同的基础和长度,也就是说,在本节中,不同的基础和边界绑定了硬编码。代码段具有物理起点(也就是说,基础)和长度(即,绑定),实际说明指针是该段中的偏移。
最后一个更常用于我们的实际情况。我们要做的是,我们必须将地址空间(即所有DRAM)划分为一堆相等大小的页面。硬件使用页面表(页表)才能从虚拟内存地址传达到硬件DRAM内存地址。
我们今天要谈论的第三个操作系统概念是过程:该过程实际上是受限制的执行环境。我们已经说过简单的虚拟线程存在这样的问题,每个线程都可以访问每个线程的内存。内存翻译机制可以保护我们可以访问的内存,即受保护的内存块。它仅由操作系统中的实体。该实体称为该过程。它包含一个有限的地址空间和一个或多个线程,并且具有一些文件描述符和文件系统上下文。
该过程提供了抽象的内存保护。保护与效率之间存在基本交易。如果您在相同的过程中有一堆线程,则它们可以在它们之间轻松进行交流,因为它们共享相同的内存。在内存中写下,而另一个则读取内存以进行通信,但它们可能会互相覆盖并引起并发安全问题。您需要高性能并改善并行性,您将需要很多线程,但是当您要保护时,您想限制过程之间的通信,因此过程之间的通信变得更加困难。这就是我们受到保护的方式。
这是一个单个线程过程和一个多线程过程。对于单个线程进程,只有一组寄存器和堆栈内存。对于多线程进程,代码段,数据和文件,都可以共享线程有一个独立的寄存器和一个堆栈。当我们从一个线程切换到另一个线程时,为了使人们对多重处理的幻觉,我们需要从第一个线程切换寄存器,以便我们可以从第二个线程加载它们线。
线程并联封装。为什么该过程使用多线程?
那么,为什么我们需要一个流程来确保可靠性,安全性和隐私?
该保护主要通过翻译机制实施。每个过程地址空间都通过翻译机制映射到物理内存。此翻译本身不可控制。因此,操作系统如何确保该过程无法修改页面表并影响翻译?这引入了下一个主题:双模式操作(双模式操作)
硬件至少提供两种模式:内核模式或管理模式主管模式和用户模式。在用户模式下运行时,将禁止某些操作。例如,当您处于用户模式时,您无法更改使用的页面,只能在内核模式下在操作系统中完成。不可能在用户模式下停止中断。这样,如果要计算出PI的最后位的过程无法阻止其他过程在计时器结束时获得CPU时间。在用户模式下,您也可以直接与硬件进行交互,因此您无法销毁磁盘上的文件。
我们仔细控制的用户模式和内核模式之间的转换是什么?包括系统呼叫,中断,异常等等。如上图所示,我们有一个用户进程,该系统可以使用系统调用内核系统,从用户模式切换到内核模式,可以在系统调用中执行相应的操作,请在完成后退出内核模式,然后返回系统调用。
这是典型的Unix系统结构包含的表:
例如,我们具有硬件和内核模式和用户模式。Hardware可能会创建一个新的进程。在用户模式下,系统调用将进入内核模式,并在执行操作后返回用户模式。该中断可能会导致用户模式进入输入内核,然后将硬件(例如I/O)准备就绪,最后从中断返回。在零或页面错误中,将发生异常,导致进入内核模式,然后返回。
有三种类型的操作类型可能会触发用户模式到内核模式转换:
如果您在这里注意到两个过程,一个绿色,一个黄色。灰色表示操作系统的内存。
原始:https://juejin.cn/post/710443737337303547935