操作系统进程与线程

Posted 桃陉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统进程与线程相关的知识,希望对你有一定的参考价值。


1.进程基础

1.1相关知识

程序是具有特定功能的一组指令的有限序列,是处理器(CPU)执行操作的步骤。程序的执行可以分为顺序执行并发执行两种方式。(注意这里讨论的是单核CPU,所以不存在并行执行操作)

∙ \\bullet 顺序执行:系统所有资源为这个程序独占,具有顺序性封闭性可在现性的特点。通俗的讲就是挨个执行,分别单独占用CPU。

∙ \\bullet 并发执行:它们共享资源,但是存在资源的共享与竞争,具有间断性无封闭性不可再现性的特点。通俗的讲就是相当于流水线工作模式,实际上我们可以认为它在宏观上是并行的,在微观上是串行的。

1.2进程定义与特征

∙ \\bullet 首先我们得知道为什么要引入进程:因为操作系统需要一个能描述程序的执行过程以及共享资源的基本单位,这个单位就是“进程”。

∙ \\bullet 定义:进程是并发执行的程序在一个数据集上的执行过程。

特征含义
动态性一个进程是程序的一次执行,具有生命周期。
并发性为了描述程序并发执行的特性才引入了进程,没有并发就没有进程。
独立性每个进程都是一个独立运行、独立获得资源、独立调度的基本单位。
异步性进程各自独立 。

∙ \\bullet 结构特征:由程序段数据段进程控制块(PCB) 三部分组成。

PCB是感知进程的唯一标志,系统利用它来管理和控制程序,进程与PCB是一一对应的。

∙ \\bullet PCB的组成内容

组成部分举例
描述信息进程标识符(PID)、进程名、用户标识符
控制信息当前状态、优先级、程序外存地址…
资源使用情况虚拟地址空间现状、打开文件列表
CPU现场保护信息寄存器值、指向赋予该进程的段/页表的指针

1.3进程的状态以及转换

∙ \\bullet 进程一共有五个状态:初始态、就绪态运行态阻塞态和终止态。中间三个为基本状态。

状态特点
初始态进程刚被创建时处于初始态,系统为它创建了PCB,但是还未加载到内存中
就绪态具备执行的所有条件,等待系统分配处理器(CPU)后执行
运行态进程占有处理器,正在执行
阻塞态进程等待某个时间的发生,一般等待 I/O 操作的完成。
终止态进程执行结束或被取消,但其PCB等信息还未释放。

∙ \\bullet 基本状态图如下,注意对于单核CPU来说,运行的进程只有一个,但是就绪和阻塞的进程可以有多个,并且它们存放在队列中:

∙ \\bullet 在具有虚拟存储器管理的系统中,引入了“挂起”这个概念。“挂起”就是将内存中某个进程的一部分或全部换出到磁盘中。此时状态图如下:

其中就绪/挂起可以被称为静止就绪,就绪可以被称为活动就绪。阻塞同理。

∙ \\bullet 挂起原因

∙ \\bullet 终端用户请求
∙ \\bullet 父进程请求
∙ \\bullet 负荷调用的需要
∙ \\bullet 操作系统的需要


2.进程控制

2.1进程执行模式

处理器执行模式分为用户态系统态

∙ \\bullet 系统态:又叫控制态或者内核态,具有对处理器以及所有指令、寄存器和内存的控制能力。

∙ \\bullet 用户态:只能执行规定的指令,访问指定的寄存器和存储区。

2.2进程切换

一个正在运行的进程被切断,操作系统指定另一个进程作为运行态。

∙ \\bullet 触发条件

(1)中断:时钟中断或者 I/O 中断

(2)陷阱:与当前运行进程所产生的错误或者异常有关。

(3)系统调用

∙ \\bullet 过程

(1)保存CPU上下文环境。

(2)更新当前运行进程的PCB。

(3)将进程控制块移入相应队列。

(4)选择另一进程运行。

(5)更新所选进程的PCB。

(6)恢复被选择进程的处理器上下文环境。

∙ \\bullet 注意:只有运行到阻塞为主动行为,其他都是它动行为。进程之间的状态装换并非都为可逆的。

2.3进程创建

借助创建原句实现创建一个新进程。
∙ \\bullet 创建原因

(1)操作系统准备接纳一批新的作业。

(2)终端用户登录到系统

(3)操作系统为用户创建一个服务进程,比如用户需要打印一个文件,操作系统为其创建一个打印进程。

(4)现有操作系统可以派生子进程,并与其并行执行操作

∙ \\bullet 创建过程

(1)给新进程分配一个唯一的进程标识符,并申请一个空白 PCB(PCB有限)。若申请失败则创建失败。

(2)给进程分配空间包括程序、数据、用户栈等。

(3)将新进程插入就绪队列和进程隶属关系族群中。

(4)创建或扩充其他数据结构。

∙ \\bullet 流程图

2.4进程撤销

∙ \\bullet 原因

(1)正常完成。

(2)异常终止。

(3)父进程终止时,操作系统终止其后代进程。

(4)父进程请求终止其后代进程。

∙ \\bullet 撤销过程

(1)从PCB队列中检索到被终止进程的PCB,修改其状态。

(2)若该进程有子孙进程,将其子孙进程终止。

(3)释放该进程的所有资源。

(4)将该进程的PCB从系统PCB队列中删除。

∙ \\bullet 流程图

2.5进程的阻塞与唤醒

∙ \\bullet 阻塞流程

∙ \\bullet 唤醒流程


3.线程

3.1线程的引入

∙ \\bullet 原因:为了减少进程创建和切换时的开销,提高系统吞吐率和资源利用率。

∙ \\bullet 定义线程又被称为轻型进程,是一个可以独立执行和调度的基本单位,但不再是拥有资源的独立单位,它可以与同属一个进程的线程共享还进程拥有的所有资源。它是CPU调度的基本单位

∙ \\bullet 特点:传统的进程等效于只有一个线程的进程。

3.2与进程的区别与联系

线程进程
线程是调度和分派的基本单位进程是资源分配的基本单位
同一个进程中的线程可以并发执行,具有更好的并发性进程之间可以并发执行
线程只有少量的资源,因此其创建、终止和切换时系统开销比进程小进程是拥有资源的独立单位
同一进程的线程共享内存和文件,因此在同一个地址空间中,它们之间的通信无需调用内核

4.进程与线程其他内容

4.1相关技术

∙ \\bullet 写时复制

Unix/Linux系统中使用fork()函数创建父进程的子进程,fork()会为进程创建一个父进程地址空间的副本,复制属于父进程的页面。在fork()之后和exec()之前,两者虚拟空间不同,其对应的物理空间是同一个。exec()后,内核会给子进程的代码段分配单独的物理空间,此时两者都有自己的进程空间,并且互不影响。

∙ \\bullet 线程池

产生原因:由于大多数网络服务器都需要面临单位时间内处理数目巨大的连接请求,但处理时间却相对较短的情况,此时需要频繁的创建和销毁线程。

工作原理:首先生成一批(N个)空线程放入阻塞队列中,当任务来临时选择一个空线程进行运行,当N个线程都在处理任务时,再生成一批新线程。执行完任务的线程也不销毁,而是继续放在池中等待下一次任务,当系统较为空闲时,就选择销毁一批线程,回收系统资源。

∙ \\bullet Linux系统中的fork()和vfork()

(1)vfork()创建的子进程和父进程共享地址空间,fork()中则是复制。知道调用exec()或者exit()之后才会结束共享。

(2)vfork()创建的子进程必须调用exit()函数来结束它。

(3)vfork()创建的子进程总会在父进程执行之前执行,而fork()创建的子进程与父进程的执行顺序由调度器决定。

以上是关于操作系统进程与线程的主要内容,如果未能解决你的问题,请参考以下文章

[转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...

LINUX操作系统知识:进程与线程详解

Linux系统进程的知识总结,进程与线程之间的纠葛...

线程浅析

多线程编程

什么是Java多线程编程?