进程的定义
一个具有独立功能的程序,在一个数据集合上的一次动态执行过程。讲人话,就是一个程序跑了起来,就叫做进程。
进程主要由两部分组成:
- 程序代码,代码是静态的部分。
- 程序处理的数据,而程序处理的数据使得进程具有多样性。
总结:程序是静态的,进程是动态的。这两者可以比喻成,菜谱和菜的关系,菜谱是死的,但你每次做菜的时候放的配料都可以不一样。
但二者也不是包含关系,进程具有核心态、用户态,进程在执行过程中会向操作系统发出请求,也包含了一些控制信息等,这些都是程序所不具备的。
进程的特点
- 动态性,可以动态地创建、结束进程。
- 并发性,进程可以被独立调用并占用处理机运行。做菜 -》刀切到手上、伤了 -》 挂起做菜 -》 去处理伤口 -》 回来继续做菜。ps,并行是说可以同时处理两个进程。
- 独立性,不同的进程工作互不影响。
- 制约性,因访问共享数据、资源或进程同步而产生的。
进程控制结构
进程控制块:操作系统管理、控制进程运行所用的信息集合。OS用PCB描述进程的基本情况以及运行变换的过程,PCB是进程存在的唯一标志。
包含三大类信息:
- 进程标识信息,如本进程标识、产生者标识等。
- 处理机状态信息保存区,保存进程的运行现场信息,如PC指针、堆栈位置等等。
- 进程控制信息,如:
实现方式:通常组织成链表,方便进行动态的插入、删除功能。
进程状态
进程的生命期管理
创建:
- 系统初始化时
- 用户请求创建一个新进程
- 正在运行的进程申请创建了一个新进程
运行:
内核选择一个就绪的进程运行
等待:
满足一些情况,如等服务,等结果,即所需的资源被别人占用了。
进程只能自己阻塞自己。
唤醒:
满足了进程的资源要求,可以进入等待队列。
进程只能由别的进程唤醒。
结束:
四种情况:
- 正常退出,自愿的。
- 错误退出,自愿的。
- 致命错误,非自愿的,例如偷窥别人的地址空间,操作系统看不下去了就关了他。
- 被其他进程所杀,非自愿的,例如占用过大的空间,被杀毒软件关了。
进程状态变化模型
running转换为ready的原因:分时调用。
进程挂起
进程没有占有内存空间,映像在内存当中。
阻塞挂起状态:进程在外存等待某件事出现。
就绪挂起状态:进程在外存,但只要进入内存,就可执行。
实现:
维护多组队列,维护每种状态。
例如事件1是打印机资源来了,而队列1表示在等待打印机资源的进程,那么就可以放一些出来到就绪队列中去。
线程
MP3播放软件,三个核心功能:
- 读数据
- 解压
- 播放
单进程实现为
问题:要从IO读半天,才可以开始解压,再播放完才可以继续读下一个东西。各个功能之间不能并发的去进行。
改进为多进程实现:
问题:通信如何进行?进程创建、切换等等操作都要消耗大量资源。
这就引出了线程的概念,可以解决这些问题:可并发,可共享地址空间实现通信。
我们把进程分为两部分,一是由进程掌控的资源,二是由进程的一条执行流程,我们在这里称之为线程。线程有自己的控制块,称之为TCB。
资源分配
优点:线程可以并发执行、各个线程之间可以共享地址空间和文件等资源。
缺点:一人崩溃,全家完蛋。
在资源分配方面,线程也可以有自己独立的资源,如寄存器和栈。
与进程的比较:
- 创建、终止的时间更短,因为不必要向os申请内存等资源,这些内容由进程管理。
- 切换时间更短,共享地址空间,不需要切换页表什么的。
- 由于各线程共享内存资源、文件资源,可以不通过内核进行通信。
线程的实现
用户线程
线程由线程管理库来实现,操作系统不直接参与线程管理,也感知不到线程的存在,只看得到线程所属的进程的存在。
缺点:
- 一个线程发出系统调用而阻塞,那么整个进程都进入阻塞。
- 除非线程主动交出cpu使用权,否则它所在的进程中的其他线程将无法运行。因为其他线程无打断其他线程执行的特权。与之相对比的是,操作系统有打断线程执行的权力,例如采用时钟中断的方法。
- 由于时间片是分给进程的,进程又要再分给线程,每个线程得到的时间片就很少,执行较慢。
内核线程
操作系统可以看得见的线程称之为内核线程。
- 内核线程是在操作系统内核中实现的线程机制,由操作系统内核来完成线程的创建、终止和管理。
- 由于都由内核来执行,所以系统开销较大。
- 若某个内核线程被阻塞,并不会影响其他内核线程的运行。
轻量级线程
上下文切换
停止当前运行进程,并且调度其他进程,要求:
- 必须在切换之前存储许多部分的进程上下文,如栈指针,PC,CPU寄存器等。
- 必须能够在之后恢复
- 必须快速
一般通过PCB实现保存信息,同时这部分功能通常使用硬件实现。