目录
一、进程
1、进程的简介:
2、进程的组成:
3、进程的状态
4、进程控制:
5、进程的创建:
6、进程的终止
7、进程的阻塞和唤醒
8、进程上下文切换
二、线程
1、线程:
2、线程的优缺点:
三、进程与线程 比较
1、简单理解
2、整体理解:
一、进程
1、进程的简介:
(1)进程是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位;
(2)通俗讲:进程就是程序的一次执行过程。
(3)进程包括:正在运行的程序实体+所占用的所有资源(CPU+内存+网络资源等…)
2、进程的组成:
(1)进程控制块PCB:进程存在的唯一标识,是操作系统用来记录和刻画进程状态及环境信息的数据结构,也是操作系统掌握进程的唯一资料结构和管理进程的主要依据;
进程描述信息:会分配身份证号:PID(进程ID)+UID(用户ID)
3、进程的状态
- 运行态(running):进程占有 CPU 正在运行。
- 就绪态(ready):进程具备运行条件,等待系统分配 CPU 以便运行。
- 阻塞态 / 等待态(wait):进程不具备运行条件,正在等待某个事件的完成。
正常是3态
有些系统会新增2态:新建态和结束态
从上图可以发现,只有就绪态和运行态可以相互转换,其它的都是单向转换。
4、进程控制:
对系统中的所有进程实施有效的管理,实现进程状态转换功能
(1)包括:创建进程、阻塞进程、唤醒进程、终止进程等
(2)操作系统通过原语来实现进程控制;
(3)原语:是一种特殊的程序,执行具有原子性。
也就是说:程序的运行必须一气呵成,不可中断。
为什么进程控制过程要一气呵成?
答:如果进程状态转换的过程不能一气呵成,就有可能导致操作系统中的某些关键数据结构信息不统一,会影响操作系统进行别的管理工作。
5、进程的创建:
(1)操作系统初始启动时会创建承担系统资源分配和控制管理的一些系统进程,同时还会创建一个所有用户进程的祖先,其他用户进程是在应用程序运行时创建的。
(2)操作系统允许一个进程创建另一个进程,而且允许子进程继承父进程所拥有的资源,当子进程被终止时,其在父进程处继承的资源应当还给父进程。同时,终止父进程时同时也会终止其所有的子进程。
创建进程的过程,也就是创建原语包含的内容如下:
(1)在进程列表中增加一项,从 PCB 池中申请一个空闲的 PCB(PCB 是有限的,若申请失败则创建失败),为新进程分配一个唯一的进程标识符;
(2)为新进程分配地址空间,由进程管理程序确定加载至进程地址空间中的程序;
(3)为新进程分配各种资源;
(4)初始化 PCB,如进程标识符、CPU 初始状态等;
(5)把新进程的状态设置为就绪态,并将其移入就绪队列,等待被调度运行。
什么事件会触发进程的创建呢?有如下四种情况:
- 用户登录:分时系统中,用户登录成功,系统会为其建立一个新的进程
- 作业调度:多道批处理系统中,有新的作业放入内存中,会为其建立一个新的进程
- 提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求
- 应用请求:由用户进程主动请求创建一个子进程
6、进程的终止
进程的终止也称为撤销,进程完成特定工作或出现严重错误后必须被终止。引起进程终止的事件有三种:
- 正常结束:进程自己请求终止(exit 系统调用)
- 异常结束:比如整数除 0,非法使用特权指令,然后被操作系统强行终止
- 外界干预:Ctrl + Alt + delete 打开进程管理器,用户手动杀死进程
终止(撤销)进程的过程,也就是撤销原语包含的内容如下:
- 从 PCB 集合中找到终止进程的 PCB;
- 若进程处于运行态,则立即剥夺其 CPU,终止该进程的执行,然后将 CPU 资源分配给其他进程;
- 如果其还有子进程,则应将其所有子进程终止;
- 将该进程所拥有的全部资源都归还给父进程或操作系统;
- 回收 PCB 并将其归还至 PCB 池。
7、进程的阻塞和唤醒
- 进程阻塞是指进程让出 CPU 资源转而等待一个事件,如等待资源、等待 I/O 操作完成等。
- 进程通常使用阻塞原语来阻塞自己,所以阻塞是进程的自主行为,是一个同步事件。
- 当等待事件完成时会产生一个中断,激活操作系统,在系统的控制下将被阻塞的进程唤醒,也就是唤醒原语。
进程的阻塞和唤醒显然是由进程切换来完成的。
进程的阻塞步骤,也就是阻塞原语的内容为:
- 找到将要被阻塞的进程对应的 PCB;
- 保护进程运行现场,将 PCB 状态信息设置为阻塞态,暂时停止进程运行;
- 将该 PCB 插入相应事件的阻塞队列(等待队列)。
进程的唤醒步骤,也就是唤醒原语的内容为:
- 在该事件的阻塞队列中找到相应进程的 PCB;
- 将该 PCB 从阻塞队列中移出,并将进程的状态设置为就绪态;
- 把该 PCB 插入到就绪队列中,等待被调度程序调度。
阻塞原语和唤醒原语的作用正好相反,阻塞原语使得进程从运行态转为阻塞态,而唤醒原语使得进程从阻塞态转为就绪态。如果某个进程使用阻塞原语来阻塞自己,那么他就必须使用唤醒原语来唤醒自己,因何事阻塞,就由何事唤醒,否则被阻塞的进程将永远处于阻塞态。因此,阻塞原语和唤醒原语是成对出现的。
8、进程上下文切换
(1)所谓进程的上下文切换,就是说各个进程之间是共享 CPU 资源的,不可能一个进程永远占用着 CPU 资源,不同的时候进程之间需要切换,使得不同的进程被分配 CPU 资源,这个过程就是进程的上下文切换,一个进程切换到另一个进程运行。
(2)因为进程是由内核进行管理和调度的,所以进程的上下文切换一定发生在内核态。
(3)进程上下文的切换也是一个原语操作,称为切换原语,其内容如下:
- 首先,将进程 A 的运行环境信息存入 PCB,这个运行环境信息就是进程的上下文(Context)
- 然后,将 PCB 移入相应的进程队列;
- 选择另一个进程 B 进行执行,并更新其 PCB 中的状态为运行态
- 当进程 A 被恢复运行的时候,根据它的 PCB 恢复进程 A 所需的运行环境
- 引起进程上下文切换的事件,也就是某个占用 CPU 资源运行的当前进程被赶出 CPU 的原因有如下:
- 当前进程的时间片到
- 有更高优先级的进程到达
- 当前进程主动阻塞
- 当前进程终止
二、线程
1、线程:
(1)线程是进程中一个实体,是被系统独立分配和调度的基本单位。
(2)线程是CPU可执行调度的最小单位。
(3)也就是说,进程本身并不能获取CPU时间,只有线程才可以。
(4)一个进程中可以有多个线程,它们共享这个进程的资源。
(5)引入线程前,进程是资源分配和独立调度的基本单位。
(6)引入线程后,进程是资源分配的基本单位,线程是独立调度的基本单位。
(7)线程又称为迷你进程,但是它比进程更容易创建,也更容易撤销。
用严谨的语言描述来说就是:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,需要较大的时空开销,限制了并发程度的进一步提高。为减少进程切换的开销,把进程作为资源分配单位和调度单位这两个属性分开处理,即进程还是作为资源分配的基本单位,但是不作为调度的基本单位(很少调度或切换),把调度执行与切换的责任交给线程,即线程成为独立调度的基本单位,它比进程更容易(更快)创建,也更容易撤销
2、线程的优缺点:
(1)线程的特征和进程差不多,进程有的他基本都有,比如:
- 线程具有就绪、阻塞、运行三种基本状态,同样具有状态之间的转换关系;
- 线程间可以并发执行
- 在多 CPU 环境下,各个线程也可以分派到不同的 CPU 上并行执行
(2)线程的优点:
- 一个进程中可以同时存在多个线程,这些线程共享该进程的资源。进程间的通信必须请求操作系统服务(因为 CPU 要切换到内核态),开销很大。而同进程下的线程间通信,无需操作系统干预,开销更小。
- 引入了线程,尽量减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能;
不过,需要注意的是:从属于不同进程的线程间通信,也必须请求操作系统服务。
- 线程间的并发比进程的开销更小,系统并发性提升。
同样,需要注意的是:从属于不同进程的线程间切换,它是会导致进程切换的,所以开销也大。
(3)线程的缺点:
- 当进程中的一个线程奔溃时,会导致其所属进程的所有线程奔溃。
举个例子,对于游戏的用户设计,就不应该使用多线程的方式,否则一个用户挂了,会影响其他同个进程的线程。
三、进程与线程 比较
1、简单理解
(1)进程:是一个应用程序被操作系统拉起来加载到内存之后从开始到执行结束的这样一个过程。
进程是程序(应用程序,可执行文件)的一次执行。
(2)线程:线程是进程中一个实体,是被系统独立分配和调度的基本单位。
线程是CPU可执行调度的最小单位。
也就是说,进程本身并不能获取CPU时间,只有线程才可以。
2、整体理解:
(1)线程参与操作系统的调度,参与CPU的竞争,得到分配的时间片,获得处理机(CPU)运行。而进程负责获取操作系统分配的资源,如内存。
(2)引入线程前,进程是资源分配和独立调度的基本单位。
(3)引入线程后,进程是资源分配的基本单位,线程是独立调度的基本单位。
总结:
操作系统的设计,从进程和线程的角度来说,可以归结为三点:
- 以多进程形式,允许多个任务同时运行;
- 以多线程形式,允许单个任务分成不同的部分运行;
- 提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。