操作系统之二:进程与线程

进程与线程

一、进程概述

1.1进程的概念

在我们的计算机发展中,自从引入多道程序技术之后,我们的计算机可以并发的执行多个程序。

既然内存中同时放入了多道程序,并且各个程序的代码、运算数据存放的位置不同,那么我们的操作系统要怎样才能找到各程序的存放位置?

我们在运行过程中,每个正在运行的程序当前被分配了哪些系统资源,这些信息也是需要记录下来的,这样才可以方便操作系统管理,因此引入了进程和进程实体的概念。

为了方便操作系统管理,完成各程序并发执行,引入了进程、进程实体概念。

PCB、程序段、数据段三部分构成了进程实体(进程映像)。
在这里插入图片描述

  • 进程的定义

一般情况下,我们把进程实体就简称为进程,例如,所谓创建进程,实质上是创建进程实体中的PCB;而撤销进程,实质上是撤销进程实体中的PCB。

所以说:PCB是进程存在的唯一标志!

从不同的角度,进程可以有不同的定义,比较传统的定义:

1、进程是程序的一次执行过程。

2、进程是一个程序及其数据在处理器上顺序执行时所发生的活动。

3、进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

上述几个定义都强调了进程的"动态性"

引入进程实体的概念后,我们可以把进程定义为:

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

  • 进程和程序的区别与联系
    • 1、进程是动态的,程序是静态的
    • 2、进程有独立性,能并发执行;程序不能并发执行
    • 3、二者无对应关系
    • 4、进程异步运行,会相互制约;程序不具备此特征
    • 5、组成不同:进程包含PCB、程序段和数据段。程序包含数据和指令代码。
    • 6、程序是一个包含了所有指令和数据的静态实体。本身除占用磁盘的存储空间外,并不占用系统如CPU、内存等运行资源。
    • 7、进程由程序段、数据段和PCB构成,会占用系统如CPU、内存等运行资源。
    • 8、一个程序可以启动多个进程来共同完成。
    • 联系:进程不能脱离具体程序而虚设,程序规定了相应进程所要完成的动作。
1.2进程的组成

进程由程序段、数据段、PCB三部分组成。最重要的是进程控制块PCB
在这里插入图片描述

  • PCB简介

PCB中记录了操作系统所需的,用于描述进程的当前情况以及控制进程运行的全部信息。

PCB的作用是使一个在多道程序环境下不能独立运行的程序,包含数据,成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。

或者说,OS是根据PCB来对并发执行的进程进行控制和管理的

例如,当OS要调度某进程执行时,要从该进程的PCB中查处其现行状态及优先级;在调度到某进程后,要根据PCB中所保存的处理机状态信息,设置该进程恢复运行的现场,并根据其PCB中的程序和数据的内存始址,找到其程序和数据;

进程在执行过程中,当需要和与之合作的进程实现同步,通信或者访问文件的时候,也需要访问PCB

当进程由于某种原因而暂停执行时,又需要将器断电的处理机环境保存在PCB中

可见,在进程的整个生命周期中,系统总是通过PCB对进程进行控制,即系统是根据进程的PCB而不是任何别的什么而感知到该进程的存在。

所以说,PCB是进程存在的唯一标志。

  • PCB包含的内容
    在这里插入图片描述
1.3进程的组织

在一个系统中,通常有数十百千乃至上千个PCB,为了能够对他们加以有效的管理,应该用适当的方式把这些PCB组织起来。

注:进程的组成讨论的是一个进程内部由哪些部分构成的问题,而进程的组织讨论的是多个进程之间的组织方式问题。

在这里插入图片描述

  • 链接方式
    在这里插入图片描述

  • 索引方式

在这里插入图片描述

1.4进程的特征

进程和程序是两个截然不同的概念,相比于程序,进程拥有以下特征:
在这里插入图片描述

二、进程的状态与转换

2.1进程的状态

进程是程序的一次执行;在这个执行过程中,有时进程正在被CPU处理,有时又需要等待CPU服务,可见,进程的状态是会有各种变化。为了方便对各个进程的管理,操作系统需要将进程合理地划分为几种状态。

  • 1、运行态:占有CPU,并在CPU上运行

    • 注意:在单核处理机环境下,每一时刻最多只有一个进程处于运行态。(双核环境下可以同时有两个进程处于运行态)
  • 2、就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行

    • 进程已经拥有了除处理机之外所有需要的资源,一旦获得处理机,即可立即进入运行态开始运行。
  • 3、阻塞态:因等待某一事件而暂时不能运行

    • 例如:等待操作系统分配打印机、等待读磁盘操作的结果。CPU是计算机中最昂贵的部件,为了提高CPU的利用率,需要先将其他进程需要的资源分配到位,才能得到CPU的服务。
  • 4、创建态:进程正在被创建,操作系统为进程分配资源、初始化PCB

  • 5、终止态:进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销PCB

2.2进程状态的转换

在这里插入图片描述

就绪态->运行态:进程被调度

运行态->就绪态:时间片到,或者CPU被其他高优先级的进程抢占

运行态->阻塞态:等待系统资源分配,或等待某事件发生(主动行为)

阻塞态->就绪态:资源分配到位,等待的事件发生(被动行为)

三、进程控制

  • 思维导图
    在这里插入图片描述

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。

进程控制就是要实现进程状态转换。
在这里插入图片描述

  • 进程控制的图解
    在这里插入图片描述

调度:指决定资源分配给哪个进程的行为,是一种决策行为

切换:指实际分配的行为,是执行行为

一般来说,先有资源调度,后有进程切换

  • 如何实现进程控制?

我们用原语实现进程控制。原语的特点是执行期间不允许中断,只能一气呵成。

这种不可被中断的操作即为原子操作。

原语采用关中断指令开中断指令实现。
在这里插入图片描述

显然,关/开中断指令的权限非常大,必然是只允许在核心态下执行的特权指令

  • 与进程控制相关的原语

进程控制会导致进程状态的转换,无论哪个原语,要做的无非三类事情:

1、更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境。)

​ 所有的进程控制原语一定都会修改进程状态标志

​ 剥夺当前运行进程的CPU使用权必然需要保存其运行环境

​ 某进程开始运行前必然要恢复其运行环境

2、将PCB插入合适的队列

3、分配/回收资源

  • 进程的创建原语
    在这里插入图片描述

  • 进程的终止原语

在这里插入图片描述

  • 进程的唤醒和阻塞原语
    • 进程的阻塞和唤醒原语是成对存在的,必须成对使用
    • 阻塞原语是由被阻塞进程自我调用实现的
    • 唤醒原语是由一个被唤醒进程合作或被其他相关的进程调用实现的

在这里插入图片描述

  • 进程切换原语

在这里插入图片描述

四、进程通信

  • 什么是进程通信?

顾名思义,进程通信就是指进程之间的信息交换。

进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。

在这里插入图片描述

为了保证安全,一个进程不能直接访问另一个进程的地址空间。

但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法。

在这里插入图片描述

4.1共享存储

两个进程对共享空间的访问必须是互斥的,即一次只有一个进程可以进行读或写操作。

在这里插入图片描述

  • 1、基于数据结构的共享:比如共享空间中只能放一个长度为10的数组,这种共享方式速度慢、限制多,是一种低级通信方式。
  • 2、基于存储区的共享:在内存中画出一块共享存储区;数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
4.2管道通信

“管道”是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区。

在这里插入图片描述

细节:

1、管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道

2、各进程互斥地访问管道。

3、数据以字符流的形式写入管道,当管道写满后写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。

4、如果没写满,就不允许读,如果没读空,就不允许写。

5、数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

4.3消息传递

进程间的数据交换以格式化的消息为单位。进程通过操作系统的“发送消息/接收消息”两个原语进行数据交换。

即发送信息的进程将消息头写好,接受信息进程根据消息头读取信息或寻找信封是哪一个。

在这里插入图片描述

五、线程概念和多线程

5.1为什么要引入线程?

在这里插入图片描述

打开我们的任务管理器,可以更直观的看到我们的Chrome进程下的各个线程情况。
在这里插入图片描述

5.2什么是线程?

我们可以把线程理解为“轻量级进程”。

线程是一个基本的CPU执行单元,也是程序执行流的最小单位。

引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件等)。

引入线程后,进程只作为除CPU之外的系统资源的分配单元()。

5.3引入线程机制后,有什么变化?

在这里插入图片描述

5.4线程的属性

在这里插入图片描述

5.5线程的实现方式

线程的实现分为两类:用户级线程内核级线程。内核级线程又称为内核支持的线程

  • 1、用户级线程
    在这里插入图片描述

用户级线程由应用程序通过线程库实现。

所有的线程管理工作都由应用程序负责(包括线程切换)

用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。

在用户看来,是有多个线程。但是在操作系统内核看来,意识不到线程的存在。(用户级线程对用户不透明,对操作系统透明)

所以我们可以这样理解:用户级线程就是从用户视角能看到的线程

  • 2、内核级线程

在这里插入图片描述

内核级线程的管理工作由操作系统内核完成。

线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下完成。

理解:内核级线程就是从操作系统内核视角看能看到的线程

  • 3、组合线程

在同时支持用户级线程和内核线程的系统中,可采用二者组合的方式:将n个用户级线程映射到到m个内核级现呈上。(n>=m)

在这里插入图片描述

操作系统只看得见内核级线程,因此只有内核级线程才是处理机分配的单位。

上边的模型中,该进程由两个内核级线程,三个用户级线程,在用户看来,这个进程中有三个线程。但即使该进程在一个4核处理机的计算机上运行,也最多只能被分配到两个核,最多只能有两个用户线程并行执行。

5.6多线程模型

在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的问题引出了“多线程模型”。

  • 1、多对一模型

多个用户级线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
在这里插入图片描述

  • 2、一对一模型

一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
在这里插入图片描述

  • 3、多对多模型

n个用户级线程映射到m个内核级线程,每个用户进程对应m个内核级线程。

克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值