操作系统之进程与线程-多线程图像引出-学习笔记

操作系统的目标就是管理硬件

管理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 + 状态 + 队列

进程状态

  • 新建态
  • 就绪态
  • 运行态
  • 阻塞态
  • 终止态

多进程如何交替?

 schedule()
{
pNew = getNext(ReadyQueue); //调度 在就绪队列取出某一个进程
switch_to(pCur,pNew); //从一个PCB中切换到另一个PCB
} 
  • 交替的三个部分:队列操作 + 调度 + 切换
    • 就是进程调度
  • FIFO?
    • FIFO是公平的策略
    • 但是FIFO没有考虑进程执行的任务的区别
  • Priority?
    • 优先级调度
    • 但是优先级该如何?进程争夺该怎么办?可能会使某些进程无法得到执行

需要处理的问题

  • 进程的互相访问
  • 进程的通信、合作
  • 恶意地址的访问

如何形成多进程图像

  • 读写PCB,OS中最重要的结构,贯穿始终
  • 要操作寄存器完成切换
  • 要写调度程序
  • 要有进程同步与合作
  • 要有地址映射
# PCB

image