操作系统:进程运行的底层机制

简介: 操作系统:进程运行的底层机制

前文提到过,操作系统通过虚拟化CPU技术,提供了多个CPU的假象。要实现CPU的虚拟化,操作系统就需要一些低级【机制】和高级【策略】。本文主要谈谈,进程运行的一些机制。


1. 虚拟化


为了虚拟化CPU,操作系统需要以某种方式让许多任务共享物理CPU,让他们看起来是同时运行。


基本思想:运行一个进程一段时间,然后运行另外一个进程一段时间,如此轮换。通过这种时分共享CPU,就实现了虚拟化。


如图是一个最简单的时分共享示意图,不考虑调度策略。进程A、B、C在一个时间段内各自运行一小段时间。


image.png


理想和丰满,现实很骨感。然而在构建这样的虚拟化机制时,存在一些挑战。如何高效、可控的虚拟化CPU?


即在不增加系统开销情况下,有效的运行程序,同时保留对CPU的控制。


2. 直接执行机制


为了使程序尽可能快的运行,操作系统开发人员想出了一种技术:受限制的直接执行技术。直接在CPU上运行程序(没有任何限制)。


image.png


看起来很简单,但是这种方法产生了一些问题。


问题1:如果我们只运行一个程序,操作系统怎么能确保程序不做任何我们不希望它做的事?


问题2:当我们运行一个进程时,操作系统如何停下来并切换到另一个进程,从而实现时分共享?


2.1 受限的操作


直接执行的明显优势是快速。程序直接在硬件CPU上运行,因此执行速度与预期一样快。

但是,如果希望进程希望执行某种受限制的操作,该怎么办?


一个进程必须能够执行I/O 和其他一些受限制的操作,但又不能让进程完全控制系统。操作系统和硬件如何协作实现这一点?


答案是采用受保护的控制转移:【用户模式】和【内核模式


硬件通过提供不同的执行模式来协作操作系统。在用户模式下,应用程序不能完全访问硬件资源,在用户模式下的代码会受限制。在内核模式下,操作系统可以访问机器的全部资源。


另外操作系统还提供了陷入(trap)内核和从内核返回(return from trap),以及一些指令,让操作系统告诉硬件陷阱表(trap table)在内存中的位置。


如何用户希望执行某种特权操作(发出I/O请求等)。又该如何呢?


几乎所有的现代硬件都提供了执行系统调用的能力。通过系统调用,可以允许应用程序访问某些关键功能。


image.png


要执行系统调用,程序必须执行特殊的陷阱(trap)指令。


  • 该指令同时跳入内核并将特权级别提升到内核模式。


  • 一旦进入内核,系统就可以执行任何需要的特权操作(如果允许),从而为调用进程执行所需要的工作。


  • 完成后,操作系统调用一个特殊的从陷阱返回(return-from-trap)指令。返回到发起调用的应用程序中。同时将特权级别降低,回到用户模式。


我们在回过头再看这张经典的GNU/Linux 图,是不是理解更深,应用和内核的交互本质上是通过系统调用。有关系统调用过程分析可以见旧文


image.png


为什么系统调用看起来像C语言的过程调用一样,因为有关汇编部分的指令操作glibc中已经帮我们封装好了。事实上我们调用一个系统调用实际上是调用了syscall这条指令。


受限制直接运行策略如下,这里其实可以看出。main函数事实上不是程序的入口。


image.png


2.2 进程间切换


直接运行的另一个问题就是如何实现进程间的切换。在进程间切换,无非就是操作系统应该决定停止一个进程并开始另一个进程。这看起来很简单,但是事实上,当一个进程在CPU上运行,这就意味着操作系统没有运行,如果操作系统没有运行,那么显然是没有办法采取行动的。


那么操作系统是如何重获CPU的控制权的?


  • 协作方式:等待系统调用。在一些古老的系统中。OS通过等待系统调用,或某种非法操作,从而重新获取CPU的控制权。(容易进入无限循环)


  • 非协作方式:操作系统进行控制。利用【时钟中断】重新获取控制权。


时钟中断:时钟设备每隔几毫秒产生一个中断。当产生中断时,当前正在运行的程序停止,操作系统预先配置的中断处理程序(interrupt handler)会运作。


通过时钟中断,操作系统可以重新获得CPU的控制权,从而停止当前进程,并启动另一个进程。


当然当操作系统重新获取CPU的控制权后,必须决定是继续运行当前进程还是切换到另一个进程。这个策略是由【调度】决定的。这又是另一个话题了。


如图展示了整个进程切换的时间线:


image.png


注意:在这种方式中,有两种类型的寄存器保存/恢复。


  • 第一种是发生时钟中断的时候,在这种情况下,运行进程的用户寄存器由硬件隐士保存,使用该进程内核栈。


  • 第二种是当操作系统决定从A切换B。在这种情况下,内核寄存器被软件(OS)明确的保存,这次被存储在该进程的进程结构的内存中。


3. 并发问题


如果系统调用期间发生时钟中断或者处理一个中断时发生另一个中断,会发生什么情况?事实上这是并发引起的问题了。关于并发本文不做过多介绍,留待后续更新。


操作系统提供了一些处理策略,比如中断处理期间,屏蔽其他中断,加上各种复杂的锁,以保护对内部数据结构的并发访问等等。

相关文章
|
13天前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
6天前
|
消息中间件 安全 算法
深入理解操作系统:进程管理的艺术
【10月更文挑战第38天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是硬件与软件的桥梁,更是维持计算机运行秩序的守夜人。本文将带你走进操作系统的核心——进程管理,探索它是如何协调和优化资源的使用,确保系统的稳定与高效。我们将从进程的基本概念出发,逐步深入到进程调度、同步与通信,最后探讨进程安全的重要性。通过这篇文章,你将获得对操作系统进程管理的全新认识,为你的计算机科学之旅增添一份深刻的理解。
|
7天前
|
存储 消息中间件 算法
深入探索操作系统的心脏——内核机制解析
本文旨在揭示操作系统核心——内核的工作原理,通过剖析其关键组件与机制,为读者提供一个清晰的内核结构图景。不同于常规摘要的概述性内容,本文摘要将直接聚焦于内核的核心概念、主要功能以及其在系统管理中扮演的角色,旨在激发读者对操作系统深层次运作原理的兴趣与理解。
|
10天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
32 3
|
12天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
13天前
|
算法 调度 UED
深入理解操作系统的进程调度机制
本文旨在探讨操作系统中至关重要的组成部分之一——进程调度机制。通过详细解析进程调度的概念、目的、类型以及实现方式,本文为读者提供了一个全面了解操作系统如何高效管理进程资源的视角。此外,文章还简要介绍了几种常见的进程调度算法,并分析了它们的优缺点,旨在帮助读者更好地理解操作系统内部的复杂性及其对系统性能的影响。
|
11天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理的艺术
【10月更文挑战第33天】本文旨在揭示操作系统中进程管理的神秘面纱,带领读者从理论到实践,探索进程调度、同步以及通信的精妙之处。通过深入浅出的解释和直观的代码示例,我们将一起踏上这场技术之旅,解锁进程管理的秘密。
19 0
|
13天前
|
算法 Linux 调度
深入理解操作系统之进程调度
【10月更文挑战第31天】在操作系统的心脏跳动中,进程调度扮演着关键角色。本文将深入浅出地探讨进程调度的机制和策略,通过比喻和实例让读者轻松理解这一复杂主题。我们将一起探索不同类型的调度算法,并了解它们如何影响系统性能和用户体验。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇理解操作系统深层工作机制的大门。
23 0
|
14天前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
37 0
Vanilla OS:下一代安全 Linux 发行版
|
17天前
|
人工智能 安全 Linux

热门文章

最新文章