操作系统的目标就是管理硬件
管理cpu最简单的方法
-
设置PC初始值,然后让他自动递加PC执行即可
-
会不会产生什么问题?
-
众所周知,执行IO指令,会比cpu计算指令慢很多,老师的程序算下来的比值是10的6次方,这真是一个恐怖的数字
-
这样的话,cpu等待IO执行会耗费大量的执行时间
-
如果cpu,按照这种方式去执行的话,利用率将会下降到0%,这真是非常恐怖的事了
-
-
然后,要如何做?
- 然后,cpu就悲剧了
- 切来切去,交替执行,拼死拼活
- 当然,还有难兄难弟的其他设备都变得忙起来了,当然,最我们人类来说,这真是极好的
- 一个cpu上交替执行的多个程序:并发
切换中间需要做的事情
- 将正在运行的程序指令地址(PC)与寄存器(ax,bx,…)中的数据等先保存起来
- 然后切换到另一个程序
- 做完之后同上面一样,保存数据,然后切换到另一个
- 每个程序都有一个存放信息的结构:PCB Process Control Block
- 这样做的话,正在运行着的程序和存放着的静态程序就不一样了…
- 所以,出现了“进程”这个概念
“进程”的概念
需要描述多个程序运行的样子,程序运行中和静态的不一样,就用进程来描述。所有不一样的地方就存在了:PCB中
进程是进行中的程序
- 进程有开始、有结束,程序没有
- 进程会走走停停,走停对程序无意义
- 进程需要记录ax,bx,… ,程序不用
- 让cpu工作就是启动进程,而让cpu效率更快,同时运行更多,就是多进程
多进程图像
启动了的程序就是进程,所以是多个进程推进
》 操作系统只需要把这些进程记录好,要按照合理的次序推进(分配资源、进行调度)
多进程的组织:PCB + 状态 + 队列
进程状态
- 新建态
- 就绪态
- 运行态
- 阻塞态
- 终止态
多进程如何交替?
[php] schedule()
{
pNew = getNext(ReadyQueue); //调度 在就绪队列取出某一个进程
switch_to(pCur,pNew); //从一个PCB中切换到另一个PCB
} [/php]
- 交替的三个部分:队列操作 + 调度 + 切换
- 就是进程调度
- FIFO?
- FIFO是公平的策略
- 但是FIFO没有考虑进程执行的任务的区别
- Priority?
- 优先级调度
- 但是优先级该如何?进程争夺该怎么办?可能会使某些进程无法得到执行
需要处理的问题
- 进程的互相访问
- 进程的通信、合作
- 恶意地址的访问
如何形成多进程图像
- 读写PCB,OS中最重要的结构,贯穿始终
- 要操作寄存器完成切换
- 要写调度程序
- 要有进程同步与合作
- 要有地址映射