最近在面试,进程与线程模型几乎必问,所以就想来整理整理。
定义
进程:具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。
线程:是进程中的一个运行实体,是CPU调度的单位。
前几天面试的时候,面试官问我进程是资源调度的独立单位,线程是CPU调度的基本单位,难道CPU不属于资源吗?我当时就蒙了,好像是啊。后来我专门查了一下。
注意:这两个说法都没有毛病,只是线程是后来引入的,线程继承了进程是CPU调度单位的属性,但是进程仍然是资源的拥有者,线程不拥有资源,而是和处于同一进程内的其他线程共享资源。
进程控制块
在操作系统中,进程由一个叫进程控制块(PCB)的数据结构来管理和控制。
进程控制块:进程描述信息、进程控制信息、所拥有资源和使用情况和CPU现场信息。
进程控制块组织方式:线性方式、链接方式(不同状态的进程队列)、索引方式(根据不同的状态建立不同的索引表)。
进程状态及状态转换
(1)三状态模型
三状态是基本状态,分别是
运行态:占有CPU,并在CPU上运行
就绪态:具备运行条件,但由于没有空闲CPU,暂时不能运行
阻塞态:因等待某一事件而暂时不能运行
状态转换:
(2)五状态模型
再三状态之外,还有两个状态:
创建:已完成创建一进程所必要的工作,但尚未同意执行该进程。
终止:终止执行后,进程进入该状态,可完成一些数据统计工作和资源回收。
状态转换:
(3)七状态模型
许多操作系统中还引入了一个对进程的重要操作–挂起操作,执行挂起操作后,系统就会进入挂起状态,在挂起状态时,进程不占用内存空间, 其进程映像交换到磁盘上。
挂起状态有两种,一种就绪时进入挂起状态,叫做静止就绪;另一种是阻塞时进入挂起状态,叫做静止阻塞。
所以就会有了七状态转换模型:
进程控制
进程控制操作完成各状态之间的转换,由具有特定功能的原语完成。
原语:完成某种特定功能的一段程序,具有不可分割性或不可中断性,也即原子性操作。
进程控制原语类型:
创建原语、撤销原语、阻塞原语、唤醒原语、挂起原语、激活原语等
UNIX中的进程控制操作:
fork():通过复制调用进程来建立新的进程,是最基本的进程建立过程
exec():包括一系列系统调用,它们都是通过一段新的程序代码覆盖原来的地址空间,实现进程执行代码的转换
wait():提供初级进程同步操作,能使一个进程等待另外一个进程的结束
exit():用来终止一个进程的运行
进程与程序的区别
进程是动态的,程序是静态的。
进程是有生命周期的,有诞生有消亡的,程序是长久的。
程序执行时可以以进程的方式执行。
进程空间分布
栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。
堆 (Heap):存储动态内存分配,需要程序员手工分配,手工释放.注意它与数据结构中的堆是两回事,分配方式类似于链表。
未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据。
初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。
程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。
为什么引入线程
- 应用需要
Web服务器:分派线程和工作线程可以同时工作 - 开销考虑
进程的创建、撤销、通信、切换开销比较大,而线程的创建撤销,切换,通信(共享资源)开销小 - 性能考虑
多个线程,计算线程,I/O线程各司其职,提高性能。
线程分类
1.用户级线程
- 在用户空间建立线程库:提供一组管理线程的过程
- 运行时系统:完成线程的管理工作
- 内核管理的还是进程,不知道线程的存在
- 线程切换不需要内核态特权
- 例子:UNIX系统
2.核心级线程 - 内核管理所有线程管理,并向应用程序提供API接口
- 内核维护进程和线程的上下文
- 线程的切换需要内核支持
- 以线程为基础进行调度
-例子:windows系统
进程和线程的比较
1.调度基本单位
传统的OS中,进程是调度和分派的基本单位,进程是能独立运行的基本单位。
引入了线程的OS中,线程是调度和分派的基本单位,线程是能独立运行的基本单位。
调度时,线程切换(保存和设置少量寄存器)的开销要远小于进程切换(上下文切换)。
2.并发性
引入了线程之后,进程内,进程间的贤臣都可以并发执行,使得OS具有更好的并发性,提高了系统资源的利用率和系统的吞吐量。
3.拥有资源
进程可以拥有资源,是系统中拥有资源的一个基本单位。而线程不拥有系统资源,仅有一点不可少保证独立运行的资源。
位于同一个进程中的多个线程共享进程所拥有的资源,表现在多个线程具有相同的地址空间。
4.独立性
同一进程中的多个线程的独立性远低于不同进程之间的独立性。这和线程共享进程资源和地址空间有关。
5.系统开销
进程创建和撤销时涉及到资源分配和回收,切换时要进行上下文切换,而线程创建、撤销、切换和通信的开销要远低于进程。
6.支持多处理机系统
线程对多处理机系统提供了很好的支持。