• MOOCOS李志军——L8CPU管理的直观想法L9多进程图像


    L8 CPU管理的直观想法

    CPU的工作原理——取址执行

    将程序读入内存,设置PC初值,CPU将地址从地址总线发出,读取内存,再将指令从总线返回,CPU执行指令,PC增加,接着下一个循环...

    存在的问题

    如果程序中包含IO(如scanf),CPU需要等待IO结果才可以继续往下执行,这个时间CPU处于空闲,效率低。

    :IO操作不占用CPU时间

    怎么解决——并发执行程序

    多道程序、交替执行

    在等待IO时CPU去执行别的指令

    怎么实现?

    除了修改PC,实现程序跳转,还需要记录程序(进程)的上下文信息的结构PCB)。

    这个上下文信息只有程序在运行时才会产生的。

    进程——运行中的程序

    L9多进程图像

    用户视角:多个进程同时运行

    CPU视角:将多个进程记录好、按照合理的次序推进(分配资源、进行调度

    多进程图像从操作系统启动到关机一直存在

    操作系统初始化的最后一条语句是

    if(!fork()){init();}
    

    相当于创建一个进程,这个进程执行init();init()的作用是启动一个shell,等待用户的命令。

    shell是以下程序

    while(1){
    	scanf("%s",cmd);
    	if(!fork()){
    	exec(cmd);
    	}
    	wait();
    }
    

    用户在shell输入一个命令,shell会创建一个新进程,在该进程内完成任务

    多进程如何组织?——PCB+状态+队列

    PCB记录进程信息

    操作系统维护多个PCB的队列

    进程状态图

    多进程如何交替?——队列操作+调度+切换

    • pCur.state=‘W’ 将进程状态设置为阻塞态

    • schedule() 负责切换进程

    • getNext(ReadyQueue) 从就绪队列里取一个进程,关于先取哪个进程涉及到“调度”后边会讲解。

    • pCur,pNew代表PCB

    • switch_to()涉及上下文切换

    调度

    • FIFO?priority?暂时不展开讲

    切换

    • 保存当前上下文,恢复新的上下文:利用PCB保存寄存器值

    多进程之间会不会彼此影响?

    存在的问题:多个进程的程序都在内存中,可能会使用相同的内存。

    注意

    • 不能用DPL=0的方法限制访问,因为只有内核DPL=0,用户进程的DPL,CPL都为3

    解决方法

    通过映射表实现多进程的地址空间分离(内存管理部分的内容

    同一个逻辑地址映射到不同物理地址。

    因此说进程管理连带内存管理形成多进程图像

    多进程如何合作?

    例子:生产者-消费者实例

    • 生产者进程、消费者进程、共享数据区

    • 生产者进程:向共享数据区放

    • 消费者进程:从共享数据区取

    • 共享数据区:counter满了不能放,counter为0不能取

    存在的问题

    将counter++;拆分成原子操作来看,发现问题。

    解决方案——进程同步

    上锁

    后边几章的内容

  • 相关阅读:
    hdu4846 最大子正方形(dp)
    hdu4847 水题
    hdu4847 水题
    hdu4848 DFS 暴搜+ 强剪枝
    hdu4848 DFS 暴搜+ 强剪枝
    洛谷 P4999 烦人的数学作业(数位DP)
    洛谷 P4317 花神的数论题(数位DP || 快速幂)
    洛谷 P2657 [SCOI2009]windy数(数位DP)
    洛谷 P2602 [ZJOI2010]数字计数(数位DP)
    HDU 2089 不要62(数位DP)
  • 原文地址:https://www.cnblogs.com/Ivan-Luo/p/11767647.html
Copyright © 2020-2023  润新知