进程与线程:06 操作系统之“树”

操作系统核心知识回顾与思维训练

在之前的学习中,我们深入探讨了CPU管理相关内容。

  • CPU管理内容回顾:我们学习了CPU直观管理方法,了解如何让简单程序执行,分析了CPU效率低下的原因及处理办法,即实现多程序执行。接着引出进程概念,深入探讨多进程图像以及操作系统实现多进程所需的准备工作,其中核心是交替执行,包括用户级线程和内核级线程的交替执行实现方式与相关源码。
  • 学习难点与课程目的:目前所学内容是操作系统中最核心的部分,理解起来难度较大。每年讲到此处,很多同学会感到吃力。为激励大家,同时帮助大家训练思维能力,掌握构建复杂系统的方法,我们引入本堂课。本堂课旨在让大家明白操作系统从初始想法逐步发展成复杂系统的过程,培养大家研究和构建复杂系统的决心与能力。

复杂系统与操作系统

复杂系统的时代意义

霍金曾指出,在21世纪,复杂系统将成为科学发展的核心。如今,像操作系统、互联网、大脑神经网络、豪华汽车、石油管道、宇宙、生物群落、生命循环等都属于复杂系统。当前,对这些复杂系统的研究备受关注,例如脑科学领域对大脑工作机制的探索。若人类能深入了解这些复杂系统,如大脑工作原理、人体运作机制,将极大推动科学发展,甚至攻克癌症等难题。

操作系统的发展历程

操作系统作为复杂系统的典型代表,其发展并非一蹴而就。就像一棵大树是从一颗种子逐渐生长而成,操作系统也是从一个初始想法,历经不断发展与完善,才形成如今庞大复杂的系统。我们接下来将梳理操作系统从简单到复杂的发展思路,帮助大家理解其构建过程。
在这里插入图片描述

学习的本质与思维培养

学习的正确方式

在这里插入图片描述

哲学家曾说:“人的头脑不是一个盛水的装满水的器皿,而是一团需要点燃的火。”这意味着学习不应仅仅是知识的机械记忆,像将知识简单填充进大脑,只为应付考试。这种学习方式虽能记住知识,但无法将其转化为思考和解决问题的能力,知识也就失去了实际价值。真正的学习应从一个点出发,激发思考,不断向外探索,如同火焰燃烧般,将知识转化为解决问题的动力。
在这里插入图片描述

操作系统学习的启示

操作系统的构建过程充分体现了这种学习和思维方式。它从一个初始的小想法,不断拓展思维,逐步实现复杂功能,最终形成完整系统。我们在学习操作系统时,也要培养这种从点到面、不断深入思考的能力,学会运用已有知识解决实际问题,点燃思维的火焰,而不是被动接受知识。
在这里插入图片描述

操作系统的构建思路

从简单想法到多程序切换

管理CPU的最初想法是设置PC初值,使其取指执行,让CPU运转起来,但这种方式导致CPU利用率低。
在这里插入图片描述

为解决此问题,借鉴生活中烧水时可同时做其他事的智慧,提出在CPU执行到需要等待时,切换执行其他程序,从而实现多个程序切换。由于程序切换类似于跳转,我们利用栈来实现这一功能,通过实践和思考,不断改进和完善实现方式。
在这里插入图片描述
在这里插入图片描述

解决切换中的问题

在使用栈实现程序切换过程中,出现了混乱问题,一个栈无法满足需求,于是自然想到使用两个栈。
在这里插入图片描述

进一步明确在业务切换时,需先切换栈,再根据栈进行其他操作,如找到TCB(任务控制块),切换新栈等,从而实现用户多个执行序列之间的切换。
在这里插入图片描述
但此时仅能在用户态实现,为实现在内核态的切换,通过思维递进,考虑到内核也有栈,进而思考从用户栈到内核栈,再到TCB之间的切换关系,最终形成两套栈的切换机制。
在这里插入图片描述
在这里插入图片描述

实现想法的具体目标与实践

有了上述想法后,我们需要在实际计算机上实现这些切换。以在屏幕上交替打出a和b为具体目标,该目标能体现多个执行序列在内核中的交替切换,若能实现,说明我们的想法具有可行性。
在这里插入图片描述
Linux 0.01最初就是在屏幕上交替打出a和b,这是Linux操作系统发展的起点,如同小树的种子发芽。
在这里插入图片描述

为实现此目标,我们创建两个进程,每个进程在死循环中分别循环打出a和b。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

具体实现过程涉及系统调用fork,fork执行int 0x80,在内核中通过一系列操作,如执行CS_call、cs_folk,最终跳转到copy_process,在该函数中创建新的PCB(进程控制块)和栈,设置相关参数,如eip指向打印a或b的函数地址,ax设为0等。父进程创建完子进程后,调用wait将自身状态变为阻塞态,然后调用schedule进行进程调度。

调度算法与切换实现

在这里插入图片描述
在这里插入图片描述

schedule负责选择进程,初始可采用简单算法选择第一个进程,后续可根据需求优化。选择进程后,通过switch_to进行切换,切换过程基于对硬件手册的研究,利用TSS(任务状态段)完成,即将当前进程的CPU寄存器内容保存到TSS,再将下一个进程TSS中的内容恢复到CPU。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当a进程执行时,eip指向打印a的函数地址,开始打印a。此时为实现a和b的交替打印,需要引入调度点调用schedule,而进入内核调用schedule靠中断实现,经思考选择时钟中断。初始化时钟中断后,在每次时钟中断时,让当前进程的counter减一,当counter减为0时,调用schedule,从而实现a和b进程的交替执行,在屏幕上交替打出a和b。

总结与展望

通过梳理操作系统从初始想法到实现屏幕上交替打出a和b的过程,我们串联起之前所学知识,清晰呈现了一个想法如何通过程序逐步实现的思维过程。如果大家能根据上述思路,独立编写代码实现该功能,就相当于拥有了操作系统的0.01版,这是操作系统构建的良好开端。即便大家未来不想开发操作系统,理解这一思维过程对研究和构建其他任何系统都具有重要意义。希望大家在学习中培养这种从点到面、不断探索的思维能力,点燃思维火焰,创造出属于自己的“大树”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio Profiler

1.我们想要查看自己方法的调用链,或者分析方法耗时的情况,可以选择Android Studio的Profiler,比较方便快捷。如下: 2.基本的面板参数讲解: 3.可以通过搜索,查看对应的方法,以及方法的调用链…

33、VS中提示“以下文件中的行尾不一致。是否将行尾标准化?“是什么意思?

在Visual Studio(VS)中遇到提示“以下文件中的行尾不一致。是否将行尾标准化?”时,意味着当前打开或正在编辑的文件内部存在行尾符(EOL,End-Of-Line)格式不统一的情况。以下是详细解释和应对建议…

头歌实验 库、表、数据的创建管理与备份迁移

第1关:创建db_ebank数据库 drop database IF EXISTS db_ebank;/********** Begin **********/ create database db_ebank; /********** End **********/show databases; 第2关:创建数据表并设置约束 1.任务要求 在 db_ebank 数据库中创建相应8个数据…

同城跑腿小程序帮取帮送接单抢单预约取件智能派单同城配送全开源运营版源码优创

一、源码描述 这是一套同城跑腿小程序,基于FastadminUniapp框架,全开源无加密,可私有化部署,包含用户端、骑手端和运营端(后端),支持帮取/帮送模式,支持一键接单/抢单,主…

利用无事务方式插入数据库解决并发插入问题

一、背景 由于项目中同一个网元,可能会被多个不同用户操作,而且操作大部分都是以异步子任务形式进行执行,这样就会带来并发写数据问题,本文通过利用无事务方式插入数据库解决并发插入问题,算是解决问题的一种思路&…

Nuxt3还能用吗?

Nuxt3还能用吗? 前一段时间,我完成了整个产品,从Nuxt到Next的迁移,因为面临了一些在框架层面就无法解决的问题。 payload json化 在所有的的Nuxt中,我们都能看到有这样一个东西。 其实有这个东西也很正常&#xff0…

Dify 获取天气数据并以echarts图表显示

Dify 获取天气数据并以echarts图表显示 1. 创建一个 Chatflow2. 创建一个 HTTP 请求节点3. 创建一个代码执行节点4. 创建一个直接回复节点5. 发布并预览 1. 创建一个 Chatflow 2. 创建一个 HTTP 请求节点 请求地址:https://weather.cma.cn/api/climate?stationid5…

计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 02.OpenGL图像管线

1. OpenGL图像管线 OpenGL(Open Graphics Library)是一个跨平台的、功能强大的图形渲染API,用于开发2D和3D图形应用程序。它由Khronos Group维护,广泛应用于游戏开发、图形设计、虚拟现实等领域。 1.0.1. OpenGL的特点&#xff…

Linux架构篇、第1章_02源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62

Linux_基础篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.01 适用环境: Centos7 文档说明 本文…

算法基础学习|03二分

一、思路 (1)mid(lr1)/2 if(check(mid)):1.true [mid,r] lmid 2.false [l,mid-1] rmid-1 (2)mid(lr)/2 if(check(mid)):1.true [l,mid] rmid 2.false [mid1,r] lmid1 二、模板 如何选择模…

18. LangChain分布式任务调度:大规模应用的性能优化

引言:从单机到万级并发的进化 2025年某全球客服系统通过LangChain分布式改造,成功应对黑五期间每秒12,000次的咨询请求。本文将基于LangChain的分布式架构,详解如何实现AI任务的自动扩缩容与智能调度。 一、分布式系统核心指标 1.1 性能基准…

Java泛型(补档)

核心概念 Java 泛型是 Java SE 1.5 引入的一项重要特性,它的核心思想是 参数化类型(Parameterized Types),即通过将数据类型作为参数传递给类、接口或方法,使代码能够灵活地处理多种类型,同时保证类型安全性…

LeetCode 热题 100:普通数组

53. 最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输…

【kafka系列】消费者组

目录 消费者组功能点 1. 动态负载均衡 2. 容错高可用 3. 消费进度管理 4. 并行消费能力 5. 消费隔离性 其他要点 1. Rebalance过程详解 2. 位移提交的精确语义 3. 消费者限速策略 4. 跨机房消费设计 消费者组功能点 1. 动态负载均衡 核心机制:通过Rebal…

黑马点评day01(基于Redis)

1.7 Redis代替session的业务流程 1.7.1、设计key的结构 首先我们要思考一下利用redis来存储数据,那么到底使用哪种结构呢?由于存入的数据比较简单,我们可以考虑使用String,或者是使用哈希,如下图,如果使用…

Python爬虫实战:获取优美图库各类高清图片,为用户提供设计素材

一、引言 在互联网时代,高清壁纸资源丰富多样,而优美图库作为一个提供大量精美壁纸的网站,吸引了众多用户。通过 Python 爬虫技术,可以自动化地从该网站获取所需的壁纸资源,为用户节省时间和精力。然而,网站通常会采取反爬措施来防止数据被恶意抓取,因此需要在爬虫程序…

Go反射-通过反射调用结构体的方法(带入参)

使用反射前,我们需要提前做好映射配置 papckage_struct_relationship.go package reflectcommonimport (api "template/api" )// 包名到包对象的映射 var structMap map[string]func() interface{}{"template/api": func() interface{} { re…

Git_.gitignore文件简介及使用

.gitignore 这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中。实际项目中,很多文件都是不需要版本管理的,比如Python的.pyc文件,Git会根据这个文件里配置的这些规则来判断是否将文件添加到版本控制中。 注意,直接新建文…

HarmonyOS ArkUI安全控件开发指南:粘贴、保存与位置控件的实现与隐私保护实践

目录 安全控件1. 粘贴控件1.1 约束与限制1.2 开发步骤 2. 保存控件2.1 约束与限制2.2 开发步骤 3. 位置控件3.1 约束与限制3.2 开发步骤 安全控件 安全控件是系统提供的一组系统实现的ArkUI组件,其中保存控件在用户首次使用时,会弹出通知弹窗&#xff0…

C++笔记之接口`Interface`

C++笔记之接口Interface code review! 一个简洁简短的 C++ 接口实现示例: #include <iostream>// 1. 定义接口(抽象类) class Shape {public: