1.进程和线程的区别
举个例子来说把,比如说你现在电脑上打开了QQ,微信,浏览器这三个应用。那么这三个应用,每一个就可以看做是一个进程。线程则可以看做是一个进程内部,有多个执行此程序的程序。而一个进程如果只用一个线程去执行的话,那么效率太低,系统的资源也没法利用。就好像同样是搬东西,两个人搬总比一个人搬要搬的快,这个多人搬东西的过程,就可以类比为多线程。
进程是操作系统分配资源的基本单位,线程是操作系统调度的基本单位
2.并发和并行的区别
这个我认为是比较容易搞混的一点。借用小林图解里面的一副图来说把,很直观
并发本质上还是单线程,只是顺序且周期地执行任务一和任务二,任务一和任务二并不能在同一时间被同时执行。而并行,则是任务一和任务二由两个线程来分别执行,这两个任务可以在同一时刻被同时执行。
3.进程的状态
进程的状态可分为:创建状态,就绪状态,运行状态,阻塞状态,结束状态,挂起状态
各个状态之间的转换过程如下:
1)NULL -> 创建状态 :⼀个新进程被创建时的第⼀个状态;
2)创建状态 -> 就绪状态 :当进程被创建完成并初始化后,⼀切就绪准备运⾏时,变为就绪状态;
3)就绪态 -> 运⾏状态 :处于就绪状态的进程被操作系统的进程调度器选中后,就分配给 CPU 正式运⾏该进程;
4)运⾏状态 -> 结束状态 :当进程已经运⾏完成或出错时,会被操作系统作结束状态处理;
5)运⾏状态 -> 就绪状态 :处于运⾏状态的进程在运⾏过程中,由于分配给它的运⾏时间⽚⽤完,操作系统会把该进程变为就绪态,接着从就绪态选中另外⼀个进程运⾏;
6)运⾏状态 -> 阻塞状态 :当进程请求某个事件且必须等待时,例如请求 I/O 事件;
7)阻塞状态 -> 就绪状态 :当进程要等待的事件完成时,它从阻塞状态变到就绪状态
补充:
对于阻塞状态的进程,其会占用不必要的系统资源,此时操作系统采取的做法是将这个进程对应的物理内存空间换到硬盘中,等到这个进程重新进入就绪状态时,再将其换回内存。这样做可以减少阻塞进程对系统资源的浪费。
此时进程没有实际的占用系统内存的,这个状态被称为挂起状态。而挂起状态又可以近一步细分为以下两种:
阻塞挂起状态:进程在外存(硬盘)并等待某个事件的出现;
就绪挂起状态:进程在外存(硬盘),但只要进⼊内存,即刻⽴刻运⾏;
加上挂起状态的关系图如下:
4.进程的控制结构(PCB)
进程的控制通过进程控制块(PCB)完成的,它是进程唯一的标识符,如果它消失了,进程也就随之结束。
PCB中包含着以下的信息:
1)进程描述信息:
进程标识符:标识各个进程,每个进程都有⼀个并且唯⼀的标识符;
⽤户标识符:进程归属的⽤户,⽤户标识符主要为共享和保护服务;
2)进程控制和管理信息:
进程当前状态,如 new、ready、running、waiting 或 blocked 等;
进程优先级:进程抢占 CPU 时的优先级;
3)资源分配清单:
有关内存地址空间或虚拟地址空间的信息,所打开⽂件的列表和所使⽤的 I/O 设备信息。
4)CPU 相关信息:
CPU 中各个寄存器的值,当进程被切换时,CPU 的状态信息都会被保存在相应的 PCB 中,以便进程重新执⾏时,能从断点处继续执⾏。
PCB的连接方式:
操作系统通常把具有相同状态的进行通过链表的方式连接在一起。比如对于所有运行状态的进程可以组成一个链表。对于所有阻塞状态的进行也可以组成一个链表。
5.进程创建/结束/阻塞/唤醒的过程
1)创建过程:
1.为进程分配一个PCB,若PCB分配失败,则进程创建失败。
2.为进程分配资源,若资源不足,则进程创建失败。
3.初始化PCB。
4.将创建的进程加入到就绪队列中,等待调度。
2)结束过程:
1.查找需要终止的进程对应的PCB
2.立即终止当前进程
3.查找当前进程是否具有子进程,如有,一并终止。
4.将该进程及其子进程所占有的资源一并交还给父进程或者操作系统
5.将该进程从就绪队列中移除
3)阻塞过程
1.找到要阻塞的进程的PCB
2.保存当前进程的执行进度
3.将该进程加入到阻塞队列中去
4)唤醒过程
1.找到对应进程的PCB
2.将其从阻塞队列中取出,并将其状态调整为就绪状态
3.将该进程加入到就绪队列
6.进程的上下文切换
所谓进程的上下文切换,指的是一个进程切换到另一个进程。
在进程切换之前,必须要知道当前进程执行到哪一个位置,这样进程切换回来之后才可以找到这个位置继续执行,这需要CPU寄存器和程序计数器。CPU寄存器用来存放进程要进程处理的数据,程序计数器则是存储 CPU 正在执⾏的指令位置、或者即将执⾏的下⼀条指令位置,即要执行哪一行代码。
CPU 上下⽂切换就是先把前⼀个任务的 CPU 上下⽂(CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下⽂到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运⾏新任务。系统内核会存储保持下来的上下⽂信息,当此任务再次被分配给 CPU 运⾏时,CPU 会重新加载这些上下⽂,这样就能保证任务原来的状态不受影响,让任务看起来还是连续运⾏。