1.CPU管理和多进程视图
有了进程的概念后,就可以用这个概念对CPU管理进行重新描述:CPU的工作原理就是取出指令,执行指令的过程。而执行起来的程序叫做进程。因此使用CPU和启动进程本质上是等价的。
为了提高CPU的工作效率,操作系统会启动多个进程,并在多个进程中来回切换从而提高CPU的利用率,实现高效管理。
多进程视图是操作系统的核心视图,操作系统从开机启动开始到最后关机的全部运行过程都是围绕着这个视图展开的。
具体来说,在操作系统启动的main()函数最后,进程0会被创建出来,然后通过执行fork()系统调用创建出1号进程,并且让1号进程执行shell程序(相当于Windows中的桌面);接下来shell会调用fork()来创建一个进程去执行用户输入命令后对应的程序。用户可以通过fork()创建出新进程来执行相应的任务。上层应用所做的每一件事,如编译一个.c文件,浏览一个网页,发一封邮件等等都要在操作系统中创建一个进程来完成。
一个进程会在执行完毕后调用exit()来退出自己,但shell不会调用exit()退出自己,除非关机。因此shell进程会一直执行,不断创建新的进程。在系统最终关机时,将会将所有的进程都杀死。这整个过程就是操作系统的多进程视图。
2. 多进程引起的基本问题
2.1多进程的组织和状态
操作系统通过管理进程相应的PCB来管理进程。所以要想组织多个进程就是用合适的数据结构来管理这些PCB。实际上,操作系统使用 队列 这种方式来管理PCB。
我们都知道,进程的三个基本状态分别是运行态,就绪态和阻塞态。因此也相应产生了三个PCB队列:运行队列,就绪队列和阻塞队列。
对于一个单核CPU(同一时间只有一个处于运行状态的进程)其PCB队列基本如下:
2.2多个进程的切换和调度
进程调度是一个很深刻的话题,我们会在之后的课程中详细描述。
2.3多进程导致的内存问题
多个进程同时存在在内存中,如果一个进程需要读取的数据地址里存放着另一个进程的代码数据,冒然读取就会造成错误。因此就产生了虚拟内存的概念,这个会在以后的课程中详细展开。
2.4 进程间的通信与合作
有些时候进程之间需要相互配合共同完成一些事情。
想一想打印工作过程
• 应用程序提交打印任务
• 打印任务被放进打印队列
• 打印进程从队列中取出任务
• 打印进程控制打印机打印
这些就是临界区的概念,详细论述会在之后的课程中给出。