设为首页 加入收藏

TOP

操作系统学习笔记4 | CPU管理 && 多进程图像(二)
2023-07-23 13:30:27 】 浏览:41
Tags:习笔记 CPU 管理 程图像
处理。

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

    image.png

  • 多进程如何交替/切换?

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

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

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

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

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

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

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

      交替的三部分:

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

  • 进程如何调度?

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

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

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

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

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

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

    互斥、锁的概念。

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

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

      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

    首页 上一页 1 2 下一页 尾页 2/2/2
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇.NET 6应用程序适配国产银河麒麟V.. 下一篇Linux iptables自定义链

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目