《刨根问底系列》01:操作系统凭什么可以调度程序?

一、问题的提出

#include<stdio.h>int main()
{while(1){printf("hello word");}return 0;
}

上面的程序是一个死循环,不停的输出“hello world”,将这个程序在一个单核计算机上运行两个实例(进程),这两个进程会同时执行,都在不停的输出。另一方面,我们知道一个cpu同时只能执行一条指令,这个执行后就停不下来的程序,似乎没有任何代码能够打断它,那么操作系统是如何将cpu分给他们的呢?是在什么时候中断一个进程?怎么中断的呢?

二、计算机的本质

回答上面问题前,先了解一点基础。如上图,计算机的本质就是将指令放在内存中,cpu去内存中取出并执行,取哪一条指令,由CPU内部的一个寄存器IP确定,一般情况下IP会每次加一,即指令顺序执行。显然所有指令都顺序执行是不行的,所以IP的值也可以由上一条执行的指令主动修改,比如JMP跳转指令实际上是修改了IP,也就达到了跳转的效果。这样,顺序执行时的IP加一,配合上指令导致的IP修改,让程序可以根据内外状态在所有指令上跳来跳去的执行,也就构成了程序的整个执行逻辑。

如上图的三条指令,分别给A寄存器赋初值100、再对寄存器A加一、最后跳回第二条,从而形成一个循环,即不停的给寄存器A加一。

三、任务调度的原理

至此,还是没有回答为什么任务可以调度的问题,即一个进程正在执行,操作系统如何将它停下来,去执行另一个任务。其实答案很简单,就是cpu每执行下一条指令前,会去检查一下它内部的一个状态值,如果这个状态值为真,就代表我们需要中断一下当前的执行,进行一些管理操作。在这里是任务切换工作,即它会将指令指针设置为操作系统中的进程调度代码,后续交由操作系统来按一定的策略选择下一个需要执行的任务,也就是将IP指向该选中任务的指令,整个过程如下图。

四、中断状态值是谁设置的

上面提到,cpu在每执行一条指令后,都会去检查一个状态值(上面伪代码中的need_interrupt),用以决定是否将执行流跳转到管理代码中。其它这个状态值,就是中断信号,那么这个中断的信号是谁产生的呢,答案是它可以由任务代码自己产生,但是更重要的是,他是可以由cpu硬件来产生的,因为我们的任务调度代码是由中断信号来触发的,所以我们需要一个强制性的外部产生的信号,来无条件打断任务的正常执行流。

其实中断是实现操作系统的必要条件,不只任务的调度需要中断的参与,IO也需要中断,比如键盘上有按键按下、硬盘读取出了数据、网上收到了数据。而且中断的种类非常的多,系统上有专门管理中断的硬件。

五、进程切换后的状态保存问题

cpu的寄存器只有一套,但是每个任务都需要自己的寄存器,比如指令指针IP、栈指令SP,而且相互之前不能干扰。所以,操作系统进行任务切换时,会将换出任务的寄存器保存到内存中,将换入任务的寄存器从内存还原到寄存器。

六、小结:

  • cpu保证在每执行一个执行后,都会去检测中断标志,如果中断标志为真,则会将指令指针指向系统预设的一处代码,这段代码会挑选出下一个将执行的任务,并将IP指向它的代码,在下一个指令周期执行它。

  • 任务调度是cpu、操作系统一起配合完成的。

《刨根问底系列》01:操作系统凭什么可以调度程序?相关推荐

  1. 《刨根问底系列》:序言

    <刨根问底系列>00:序言 为什么会有这个<刨根问底系列>?一切源于我自己的学习历程.我在十几年前就开始编程,其间产生了不少大大小小的疑问,有宏观一点的,比如操作系统到底是怎么 ...

  2. vSphere 7 With Kubernetes系列01:随想

    vSphere 7 With Kubernetes系列01:随想 原创 李严省 虚实之路 7月28日 收录于话题 #vSphere with K8s 9个 大家好,好久不见,公众号停更差不多快有1年的 ...

  3. 认真学习系列:操作系统——视频+读书笔记

    此笔记分为两部分, 上部分是B站操作系统考研课程的知识点总结,包括:概述.进程与线程.处理机调度算法.进程同步.内存管理.文件管理.IO管理,共7部分. 下部分是阅读<现代操作系统>这本书 ...

  4. PHP扩展开发系列01 - 我要成为一名老司机

    PHP扩展开发系列01 - 我要成为一名老司机 1. 关于扩展的教程貌似挺全了,为啥还写? 记录下我写扩展的历程 自认为会写的更容易理解 我的宗旨就是 "先用再识" 代码写着写着就 ...

  5. JavaScript进阶系列01,函数的声明,函数参数,函数闭包

    本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...

  6. Windows Mobile系列手机操作系统

    与其它掌上型电子设备的操作系统不同的是,Windows Mobile系列操作系统是在微软计算机的Windows操作系统上变化而来的,因此,它们的操作界面非常相似,熟悉计算机Windows系列操作系统的 ...

  7. LLM系列 | 01: 亲测ChatGPT最强竞品Claude,且无需翻墙、注册简单、免手机号

    简介 春风桃李花开日,秋雨梧桐叶落时.小伙伴好,我是微信公众号<小窗幽记机器学习>的小编:卖核弹的小女孩.更多.更新文章欢迎关注微信公众号:小窗幽记机器学习.后续会持续整理模型加速.模型部 ...

  8. 【R语言系列01】烦人的拼贴操作 详述 paste and paste0

    R语言系列01 烦人的拼贴操作 paste 与 paste0 相信很多人在一开始使用R语言的paste, paste0的时候,总是拿捏不准,感到有些迷糊. 本期文章中,我将记录对比一些操作以及表现,加 ...

  9. 【MQTT从入门到提高系列 | 01】从0到1快速搭建MQTT测试环境

    这是机器未来的第24篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125532208 1. mosquitto概述 Ecl ...

最新文章

  1. 思念水饺吃成泡沫水饺(图)思念质量门
  2. 【Linux】备份与压缩命令命令
  3. 关于ActionBar的向下兼容
  4. Linux stty
  5. [沪江日语电台]ACG杂货铺02-乱唱地带
  6. php中页面平滑回到顶部代码,原生JS实现平滑回到顶部组件_javascript技巧
  7. PATH环境变量的相关操作
  8. Magento教程 7:客制化网站
  9. 太神奇!波士顿动力机器狗即将长出手臂,还能自己跑去充电
  10. 最耗性能的SQL语句
  11. Python程序设计语言基础04:程序的控制结构
  12. model存数据_数据库内核杂谈 存储
  13. python ssd目标检测_基于自注意力的SSD图像目标检测算法
  14. 你能给我的手机推荐一款安全软件吗?
  15. Info.plist信息
  16. 从游戏中学习产品设计05:反馈篇
  17. SpringCloud核心教程 | 第四篇:服务注册与发现 Consul篇
  18. 学画画软件app推荐_可以学画画的APP有哪些?
  19. MySQL基础(补充)
  20. 白鹭(egret)工具集介绍一

热门文章

  1. 当工厂走出“工厂”,直营店也不止于“店”
  2. MySQL数据库13——插入数据(INSERT)
  3. LSM 树(Log-Structured Merge-Tree) 原理
  4. Rainbow的站点流量统计分析
  5. C++游戏界面不流畅的问题
  6. 奇点临近:人类文明延续
  7. PHP获取表单方法总结
  8. 优达学城,基于激光的卡尔曼滤波器的C++实现。
  9. laradock配置laravel 报错 Connection refused tcp://127.0.0.1:6379
  10. java学习输出文档