将程序读入内存,设置PC初值,CPU将地址从地址总线发出,读取内存,再将指令从总线返回,CPU执行指令,PC增长,接着下一个循环...shell
若是程序中包含IO(如scanf),CPU须要等待IO结果才能够继续往下执行,这个时间CPU处于空闲,效率低。并发
注:IO操做不占用CPU时间操作系统
多道程序、交替执行code
在等待IO时CPU去执行别的指令blog
除了修改PC,实现程序跳转,还须要记录程序(进程)的上下文信息的结构(PCB)。队列
这个上下文信息只有程序在运行时才会产生的。进程
用户视角:多个进程同时运行内存
CPU视角:将多个进程记录好、按照合理的次序推动(分配资源、进行调度)资源
操做系统初始化的最后一条语句是get
if(!fork()){init();}
至关于建立一个进程,这个进程执行init();init()的做用是启动一个shell,等待用户的命令。
shell是如下程序
while(1){ scanf("%s",cmd); if(!fork()){ exec(cmd); } wait(); }
用户在shell输入一个命令,shell会建立一个新进程,在该进程内完成任务
PCB记录进程信息
操做系统维护多个PCB的队列
进程状态图
pCur.state=‘W’ 将进程状态设置为阻塞态
schedule() 负责切换进程
getNext(ReadyQueue) 从就绪队列里取一个进程,关于先取哪一个进程涉及到“调度”后边会讲解。
pCur,pNew表明PCB
switch_to()涉及上下文切换
调度
切换
存在的问题:多个进程的程序都在内存中,可能会使用相同的内存。
注意:
解决方法:
经过映射表实现多进程的地址空间分离(内存管理部分的内容)
同一个逻辑地址映射到不一样物理地址。
例子:生产者-消费者实例
生产者进程、消费者进程、共享数据区
生产者进程:向共享数据区放
消费者进程:从共享数据区取
共享数据区:counter满了不能放,counter为0不能取
存在的问题:
将counter++;拆分红原子操做来看,发现问题。
解决方案——进程同步
上锁