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

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

前文提到过,操作系统通过虚拟化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. 并发问题


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


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

相关文章
|
1月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
83 1
|
11天前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
1月前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
1月前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
1月前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
1月前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
7月前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
153 13
|
6月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
6月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
211 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
5月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。