操作系统学习笔记4 | CPU管理 多进程图像

news/2024/5/10 13:07:58/文章来源:https://www.cnblogs.com/Roboduster/p/16607037.html

操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件。而通过学习笔记3的简史回顾,操作系统通过多进程图像实现对CPU的管理。所以多进程图像是操作系统的核心图像


参考资料:

  • 课程:哈工大操作系统(本部分对应 L8 && L9)
  • 实验:操作系统原理与实践_Linux - 蓝桥云课 (lanqiao.cn)
  • 笔记:操作系统学习导引 · 语雀 (yuque.com)

1. 从使用CPU开始直观理解CPU管理

要想管理CPU,就要知道如何使用CPU。

CPU的工作原理已经很熟悉:

  • 取指执行
    • 程序存放在内存中,每段指令对应一个地址
    • CPU发出取指命令,将想去地址通过地址总线传到PC
    • 内存根据地址取出对应地址的指令
    • 从总线传回,CPU解释执行

所以,管理CPU最直观的方法就是,设置PC的初值,CPU就能按照规则依次执行下去。

这一点在计组实验的前四周手摇实验室设备进行指令执行,也可以有类似的印象。

这样做有什么问题?

  • 来看下面一段程序

    int main(int argc,char* argv[]){int i,to,*fp,sum=0;to = atoi(agv[1]);for(i = 1; i <=to; i++){sum = sum + i;fprintf(fp,"%d",sum);}
    }
    
  • 如果要让CPU工作,就是要让PC指向这段程序的起始地址。

  • 但是!程序和程序之间是不一样的。例如将fprintf()替换为其他计算语句

    fprintf()是一个IO指令,而替换为计算语句则成为计算指令

  • 替换前后的运行时长进行比较,则前者:后者≈106:1

    说明,IO特别慢

  • 而假设我们遇到一种程序,有106个计算指令,然后一条IO指令,如果还是按照上面所说的设置PC初值,让其自动执行,那么对于CPU来说,其忙碌的计算指令只占到了总时长的一半(另一半在等待IO),利用率不高。

    而如果IO语句再多一点,CPU利用率就更低了。

怎么办?

2. CPU管理的核心:并发

  • 举一个烧水的例子,首先往烧水壶里倒水,然后放在插座上,然后就可以去做别的事情了,等烧水壶响了,这就是中断,这时我们就可以来用烧水壶里的热水了,烧水的过程就类似IO

  • 所以解决方案为:多道程序交替执行,一个CPU上交替执行多个程序,即并发

    这样一道程序执行到像IO这样慢的步骤时,CPU切换到另一个程序进行,而另一个程序进入等待后,再切换回来。

image

可见,上图两个程序A、B充分利用了CPU的计算资源,总时长从80降到了45.

注意两个名词:并行和并发:

并行多人同时工作,并发一个人交替工作。

并且这里一个隐含条件是切换程序的开销要小于运行程序的开销。

如何实现并发呢?

  • 即控制 PC 进行切换

  • 适当的时候修改PC,使得PC指向另一个程序的指令,但是只修改PC会有问题

  • 例如下图左右两个程序,当PC按照逻辑切换回地址53继续程序1的执行,那么ax和bx寄存器应当存储什么值?

    很显然,如果要继续程序1,当然应当为1 和 1,而不是 10 和 10.

    所以当程序切换时,除了切换PC,还要切换很多内容

  • 我们需要记录 切换前的上下文,保护现场。

  • 每个程序有一个存放信息的结构:PCB,process control block,进程控制块。

    就像我们正在看书,突然被人叫走做别的事,我们就应当停下来,记录当前页码以及故事情节,然后离开,这样回来后才能继续阅读。

    image

  • 这样,我们实际运行过程中的程序,就跟我们单纯汇编得到的代码不一样了。即运行程序和静态程序不一样。

    不同之处简单来说就在于需要PCB来记录程序运行起来的样子。

    而程序 + 所有这些不一样 ---> 进程

  • 如何描述这种不同呢?

!进程! 这个概念就用来刻画运行中的程序。比如上图中的程序1 和程序2,就是两个进程

也即进行中的程序,名字其实很形象。

  • 进程有开始、结束,程序没有;
  • 进程会走走停停,是动态的,有状态的,而程序没有;
  • 进程需要记录ax,bx..... 程序不用;

3. 简单总结1

  • 到这里,我们进程描述CPU的管理:

    • 使用CPU:启动一个进程,让CPU去执行这个进程;

    • 更高效的使用CPU:启动多个进程,让CPU去执行多个进程;

    • 跑多个程序/进程的样子,就是CPU管理的核心样子。

      这就是多进程图像。

4. 多进程图像

前文讲到,为了让CPU更好的工作,我们需要让CPU执行多进程,而这个过程如何表征呢?

  • 对于用户而言
    • 就是一个个 PID 进程号;
    • 可供用户查看各进程运行情况;
  • 对于下层操作系统而言
    • 负责管理 各个进程;具体为记录情况、按照合理的次序推进;
    • 分配资源、进行调度;

多进程图像从开机一直存在到关机结束。

4.1 开机到关机过程中的多进程图像

  • 系统启动时,最后启动的 main.c 中最后执行了fork()

    if(!fork()){init();}
    // fork,启动进程的接口
    

    代码意思是:启动一个进程,执行init() ,即执行 shell,接下来就能再 shell 里操作,这就是计算机提供给用户使用的界面(初代版本)。

    可以理解为,操作系统要让用户使用计算机,需要创建一个初始化的进程。

    补充1:

    shell是一个子进程,父进程(main函数)因为成功创建子进程,所以fork()>0 不进init 而子进程fork()==0 进入init,启动shell

    补充2:

    fork()函数返回值是0或1, 返回0代表当前进程是新fork出来的子进程, 非零(也就是为1)代表当前进程为父进程, if条件里的就是父进程的逻辑,一直等待用户输入命令, 然后执行, 一直重复进行

  • shell 再根据用户输入启动其他进程,执行用户的命令也是在创建进程;

    // shell 的核心代码
    int main(){while(1){scanf("%s",cmd);if(!fork()){exec(cmd);wait();}}
    }
    

    image

  • 此后,计算机每执行一个任务,就开启一个进程。

4.2 查看当前进程情况 | 任务管理器

在 win10 以上版本中,Ctrl + Shift + Esc 就可看到任务管理器。

  • 其中Explorer是整个Windows的文件系统,如果关掉整个进程,就只能看见背景了。
  • 如果感觉计算机特别慢,就可以打开任务管理器,查看占用CPU资源比例大的进程。
  • 操作系统就是通过管理进程,来管理用户对计算机的使用。

4.3 操作系统如何实现多进程图像

为了实现多进程图像,操作系统都应该解决哪些问题?

  1. 多进程如何组织?
  2. 多进程如何切换?
  3. 多进程交替时,如何相互影响?
  1. 多进程如何组织?也即多进程如何存放?

    • 操作系统感知进程依赖于PCB,组织和存放进程也靠PCB,通过PCB形成一些数据结构(队列),来组织多进程;如下图:

      PCB在这里相当于结构体,组成数据结构的基本单位。

    • 组织好多进程,才能合理推进多进程。

      image.png

  2. 如何推进多进程?

    • 一个进程正在执行

    • 另一些进程在排队(就绪队列)等待执行

    • 还有一些在等待触发事件,即使排到也不能调度执行

      比如上图中的第三列PCB,在等待磁盘操作。

      PCB是用来记录进程信息的数据结构

    • 总结:多进程对应的PCB分别放在不同的地方,执行不同的处理。

    • 把进程通过状态区分开来,通过操作系统对进程状态的转移控制,多进程就向前推进了。

      image.png

  3. 多进程如何交替/切换?

    这部分后续会详细讲解,下面还是简略的过程。

    • 情境:一个进程启动磁盘读写,等待时进行切换。

      下图展示了关键代码,代码注释见图中红色字体;

    • schedule()函数是重点,即调度函数;

    • 下图中的getNext从就绪队列中挑出下一个需要占用CPU的进程;

      选择哪一个进程合适,即进程调度问题,也会用一讲来讲解。

    • switch_to就是用 PCB 进行进程上下文的切换pCurpNew分别指当前进程的 PCB 和调度得到的下一个进程的 PCB ,即进行执行现场的更替。

      交替的三部分:

      • 队列操作+调度+切换
    • image.png

  4. 进程如何调度?

    • 这里先讲两个基础调度算法。
      • FIFO,First In First Out.
        • 显然是比较公平的策略,但是没有考虑进程执行的任务轻重缓急;
      • Priority.
        • 对进程赋予优先级,但如何赋予也是个问题。
  5. 切换进程

    • 调度找到下一个占用CPU的进程后,就要进行切换;

      这个过程需要精细控制,所以需要 汇编代码,下图为伪代码;

    • 做的事情也不难想象,先把将要停下的进程信息保存到PCB1中(将当前CPU的各种信息(寄存器等)保存到pCur中),

      再从将要进行的进程的PCB2中取出信息赋到对应寄存器/位置(将pNew中的寄存器等信息恢复到CPU中

    • image.png
  6. 多进程交替时,如何相互影响?

    互斥、锁的概念。

    • 多进程看似不打照面,但实际上它们同时在一个内存来存放。

      多个进程交替执行会相互影响,包括正面的多进程合作,负面的内存地址冲突等等

      image.png

    • 比如,进程1中,修改了某个地址的值,而这个地址,正好时进程2 包含的地址,这时就会引起进程2崩溃。

    • 如何解决进程间矛盾?

      限制对进程2地址的读写。即:!内存映射!

      其实涉及内存管理了,可见内存管理也服务于CPU管理的多进程图像。

      通过一个映射表,将真实物理地址转化为虚拟存储地址

      image.png

      两个进程的100内存地址,是虚拟逻辑地址,会映射到不同的物理内存;下图中展示了两个进程的100地址分别映射到了物理地址780和1260

      image.png

    • 还有一些时候,进程之间需要进行合作,如何进行进程间合作?

    • 举例1(浅显):

      • 不同的应用程序提交打印任务,打印任务会被放到“待打印文件队列”
      • 打印进程会从“待打印文件队列”中一个接一个的取出打印任务,控制打印机打印
      • 如果对存入打印进程的任务不进行管理,如任务1没放完,任务2就开始放,后面切换时就会出现顺序执行所不会遇到的乱序问题。
    • 举例2(稍深):生产者-消费者实例

      • image.png

      • 生产者和消费者通过共享数据buffer[]进行合作

      • 如果缓冲区满了,就不应该再放了,

        counter记录,如果==buffer_size,说明满了,死循环;没满则counter++

        如果要避免缓冲区满而还向里放的情况,counter 这个信号量必须要保持正确(我突然感觉这是工程代码调试的一个关键)

      • 如果多个进程都在内存中交替执行,counter可能就会出错。

        下面是个具体的例子:

        初始counter=5,生产者执行counter++,消费者执行counter--,在寄存器层面将会是:

        // 生产者P
        register = counter;
        register = register+1;
        counter = register;// 消费者C
        register = counter;
        register = register -1;
        counter = register;
        

        当生产者的程序执行到中间切换到消费者,可能的代码序列如右上角所示,counter 直接乱了。后续合作就也会乱套。

        image.png

      • 解决合作问题(合作各方的合理推进顺序)的核心在于 !进程同步!

        给 counter 上锁,即写 counter 时阻断其他进程访问 counter.

        image.png

5. 简单总结2

  • 理解CPU管理的基本想法

  • 直观感受了操作系统的多进程

  • 具体了解了多进程图像,探讨了操作系统如何实现多进程图像。

    补充操作系统 多进程图像的发展:

    批处理(顺序)--->多道程序处理---->分时系统

  • 这时多进程图像的大致轮廓,后续会一一展开:

image.png

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

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

相关文章

Hadoop十九

HDFS API操作在Windows上操作hadoop,需要添加hadoop依赖,我的hadoop是3.3.1版本的,我用的依赖是3.2.0的,需要配置环境变量 PATH添加如下路径: 然后双击依赖中的一闪而过就是成功的。 在maven项目中添加如下依赖<dependencies><!-- https://mvnrepository.com/a…

框架-逻辑层(逻辑层简介和注册程序)

逻辑层简介 小程序逻辑层 小程序开发框架的逻辑层是使用JavaScript编写的。 逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈。 在 JavaScript 的基础上,微信做了一些修改,以方便地开发小程序。增加 App 和 Page 方法,进行程序和页面的注册。 增加 getApp和g…

德飞莱 C51 学习笔记

《电子元件基础教程》 :数字集成电路 从结构上分为 : TTL 型 和 CMOS 型 《跟我学数字电子技术》: 数字电路分为 组合逻辑电路 和 时序逻辑电路

golang中GOPATH、GOROOT、GOBIN不生效等相关问题

比较重要的三个配置:GOPATH、GOROOT、GOBIN GOPATH : go项目开发的工程目录 GOROOT: go安装所在的目录 GOBIN: go项目编译完二进制程序目录 不生效问题,其实应该好好检查是否上面相关路径配置是否正确 编辑vim ~/.bash_profile 添加以下3个配置export GOROOT="/usr/loca…

高性能服务器之事件处理模式

I/O模型 对于一个套接字上的输入操作,通常存在以下两个步骤:等待分组到达,被复制到内核缓冲区中 将数据从内核缓冲区复制到应用进程的缓冲区中对于上述过程,在 Unix 下有 5 中基本的 I/O 模型可以对其进行处理:阻塞式 I/O 非阻塞式 I/O I/O 复用 信号驱动 I/O 异步 I/O1. …

算法总结

1.每日温度题(一道关于栈的问题) 请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 输入: temperatures = [73,74,75,71,69,72,76,73] 输出…

国内可使用chatGPT的十三种方式

国内AI 1. 开放猫 Chat机器人https://mirrorchat.extkj.cn/ chat机器人&#xff1a; Chat机器人https://mirrorchat.extkj.cn/ 3.免费学习测试 免费学习测试https://chat.wuguokai.cn/#/chat/1683348236237 4.AI文本工具站 AI文本工具站一个用于提高工作效率的文本工具网站,应用…

ChatGPT Plus用户专享:86款高效功能插件,详尽安装与使用全攻略

在前天的文章中&#xff0c;我们介绍了 ChatGPT 开放的全新模式 Web Browsing&#xff08;网页浏览&#xff09;&#xff0c;启用后 ChatGPT 就可以开始上网&#xff0c;收集最新的互联网资料进行作答。 其他关于chatgpt使用方面&#xff1a;请访问&#xff1a; 链接&#xf…

ChatGPT自然语言处理的新里程碑

ChatGPT中文网是一个面向中国用户的聊天机器人网站&#xff0c;旨在为国内用户提供一个自然的环境、有趣、实用的聊天体验。它使用最新的自然语言处理技术来帮助用户更好地理解他们的聊天对话&#xff0c;还可以帮助用户解决日常生活中的问题&#xff0c;提供有趣的谈话内容以及…

国内版ChatGPT最全使用方法及使用用途技巧汇总

ChatGPT人工智能技术的出现确实会让一些人担心自己的工作会不会被取代。但实际上&#xff0c;人工智能技术只会替代那些可以被程序自动化的重复性、标准化、无脑力的工作&#xff0c;而对于需要人类创意、想象力和复杂思维的工作来说&#xff0c;AI人工智能技术的发展对于人类来…

ChatGPT和Midjourney王炸组合,开启AI新时代

目录 序言 一&#xff1a;使用ChatGPT进行对话 二&#xff1a;调用newbies robot 三&#xff1a;举例说明 四&#xff1a;付费和使用限制 序言 随着人工智能技术的不断发展&#xff0c;越来越多的人开始使用人工智能工具来创作图画。在这里&#xff0c;我将分享如何结合Ch…

一文带你读懂什么是ChatGPT?

文章目录 前言ChatGPT的发展历史ChatGPT初体验ChatGPT的未来展望提高聊天机器人的对话能力改进聊天机器人的生成能力提高聊天机器人的个性化能力加强聊天机器人的安全性 总结福利彩蛋 前言 橙子送书第1期&#xff01;文末参与活动&#xff0c;即可包邮到家。为即将或正在使用Ja…

【ChatGPT】使用大型语言模型 (LLM) 进行特定领域语言(DSL)生成

使用大型语言模型 (LLM) 进行特定领域语言(DSL)生成,markdown格式,10000字左右。大纲如下:背景介绍,LLM的核心能力,DSL的本质特征,怎样 使用LLM 结合外部知识和领域特定约束,通过 Backus-Naur Form(BNF) 表示进行学习,实现 DSL 的生成。给出具体的实验实例。 文章目录…

漫画:ChatGPT的应用场景有哪些?

第一&#xff0c;文案创作 ChatGPT可以通过用户输入的提示&#xff0c;创作出相应的文本内容。 媒体作者可以给ChatGPT提出要求&#xff0c;让ChatGPT根据某一主题生成的媒体文案。 广告策划人员可以把要推广的商品信息输入给ChatGPT&#xff0c;让ChatGPT针对此商品生成一段广…

手机版ChatGPT app如何在国内使用【附完整教程】

手机版ChatGPT app如何在国内使用【附完整教程】 今天是一个比较有爱的日子520&#xff0c;祝福每位饱子身体健康&#xff0c;万事如意&#xff0c;我理解这应该是最朴实最美好的祝福了&#xff0c;因为我始终认为身体是革命的本钱&#xff01;言归正传&#xff0c;Openai在202…

人人实现ChatGPT自由,手把手教你零撸部署自己聊天私服

我们知道chat gpt最近非常的火爆&#xff0c;朋友圈啊&#xff0c;短视频到处都是chat gpt身影。 但是网上看到各种教程资源&#xff0c;都是不是百分一百的免费&#xff0c;毫无保留教给你的&#xff0c;要么是卖账号 要么是割韭菜的。其实没有什么可以学习的&#xff0c;使用…

讯飞星火认知大模型和ChatGPT在常用领域的效果对比(粗略评测)

对于大语言模型的日常使用&#xff0c;我个人倾向于将其总结为以下几个部分&#xff1a;总结内容&#xff0c;提取信息&#xff0c;文本转换&#xff0c;连续对话&#xff0c;代码生成&#xff0c;逻辑推理&#xff0c;文案生成。那么我接下来也将从这几个部分进行对比。同时&a…

ChatGPT平替-ChatGLM环境搭建与部署运行

ChatGLM-6B 是清华大学团队推出的一个开源的、支持中英双语的对话语言模型&#xff0c;基于General Language Model (GLM) 架构&#xff0c;具有62亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最低只需6GB 显存&…

【ChatGPT高端玩法】ChatGPT一分钟制作PPT

系列文章目录 第一章 ChatGPT一分钟制作PPT 第二章 ChatGPT生成Excel统计格式 第三章 ChatGPT生成Excel提取字符公式 第四章 ChatGPT生成思维导图 目录 实现步骤&#xff1a; 1.打开ChatGPT 2.搜索关键字 3.复制内容至MindShow网站 4.修改PPT内容与排版 5.预览PPT效果 6.导…