五天自学完 王道考研-操作系统 第二章 进程和线程

操作系统 - 第二章

一、进程的定义、组成、组织方式、特征

程序就是一个指令序列。
早期的计算机只支持单道程序。
··该程序 拥有 一切资源-CPU、内存、I/O设备等
··程序的代码放在程序段内,内存低地址部分;
··程序运行过程处理的数据放在数据段内,内存高地址部分。
引入多道程序技术之后:
··内存中同时放入多道程序
··系统为每个运行的程序配置一个数据结构,称为进程控制块PCB,用来描述进程的各种信息(如程序代码存放位置)
··为了方便操作系统管理,完成各程序并发执行,引入了进程、进程实体的概念
·PCB、程序段、数据段三部分构成了进程实体(进程映像),简称进程
·PCB是进程存在的唯一标志。对进程的创建和撤销,就是对进程实体中的PCB的创建和撤销。

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

严格来说,进程实体是静态的,进程是动态的。除非特意考察,一般默认二者一样。

·进程控制块PCB:系统为每个运行的程序配置一个数据结构,用来描述进程的各种信息。

·PCB是进程存在的唯一标志。

2.组成:进程(进程实体)由PCB、程序段、数据段三部分构成。

PCB的组成:进程的管理者(操作系统)所需的数据都在PCB中。

1.进程描述信息:

进程标识符PID - 当进程被创建时,操作系统会为该进程分配一个唯一的ID,用于区分不同的进程

2.进程控制和管理信息:

进程当前状态、优先级

3.资源分配清单:

程序段指针、数据段指针、其他外设

4.处理机相关信息:

各种寄存器值 - 切换进程时要保留之前现场

3.组织方式:多个进程之间的组织问题

链接方式:

按照进程状态将PCB分为多个队列、操作系统持有指向各个队列的指针

索引方式

根据进程状态建立几张索引表、操作系统持有指向各个索引表的指针

4.特征:

1.动态性 - 进程最基本的特征

2.并发性

3.独立性 - 进程是资源分配、接受调度的基本单位

4.异步性 - 异步性会导致并发程序执行结果的不确定性

5.结构性 - 进程由PCB、程序段、数据段三部分构成

————————————————————————————————————————————————

二、进程的状态和转换

三种基本状态

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

N核处理机环境下,可以同时有N个进程处于运行态

2.就绪态:已具备运行条件,等待CPU

万事俱备,只欠CPU

3.阻塞态:因等待某一事件而暂时不能运行

CPU是计算机中最贵的部件,为了提高CPU的利用率,只有资源分配到位,才能得到CPU的服务

另外两种状态

1.创建态:创建进程,操作系统为进程分配资源,创建、初始化PCB

2.终止态:进程运行结束,操作系统回收资源,撤销PCB

进程状态的转换

五状态模型

**加粗样式**

运行态 -》阻塞态 是进程的主动行为

进程在运行过程中,通过系统调用的方式,主动进入阻塞态

阻塞态 -》就绪态 是进程的被动行为

进程在阻塞过程中,等到操作系统分配资源或事件发生后,被动进入就绪态

不能由阻塞态直接转换为运行态,也不能由就绪态直接转换为阻塞态

在这里插入图片描述

七状态模型 - 多了一种挂起态(阻塞挂起、就绪挂起),具体见下一篇文章

三、进程控制:实现进程的状态转换

在这里插入图片描述

用原语实现进程控制。

原语是一种特殊的程序,处于操作系统的最底层,运行具有原子性,运行时不可中断。

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

原语采用“关中断指令”和“开中断指令”实现

“关中断指令”和“开中断指令”是只允许在核心态下执行的特权指令
在这里插入图片描述

进程创建相关的原语:

在这里插入图片描述

进程终止相关的原语:

在这里插入图片描述

进程阻塞和唤醒相关的原语:阻塞和唤醒原语要成对出现

在这里插入图片描述

进程切换相关的原语:

在这里插入图片描述

四、进程通信:进程之间的信息交换

1.各进程拥有的内存地址空间相互独立。

2.一个进程不能直接访问另一个进程的地址空间

1.共享存储:在两进程地址空间之外,另设一个共享空间

在这里插入图片描述

两个进程对共享空间的访问是互斥的。

基于数据结构的共享:低级通信

基于存储区的共享:高级通信

2.管道通信:在内存中开辟一个固定大小的缓冲区

在这里插入图片描述

“管道”是指用于连续读写进程的一个共享文件,又名pipe文件。

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

各进程要互斥的访问管道。

管道没写满,就不允许读;没读完,就不允许写。

一个管道的读进程只能有一个。

3.消息传递:进程通过原语发送和接收格式化的消息

直接通信方式:消息直接挂到 接收进程的 消息缓冲队列上

间接通信方式:消息先发送到中间实体中

在这里插入图片描述

五、线程概念、多线程模型

在一台电脑上,你可能想一边打游戏,一边听音乐,还挂着QQ,这样是三个不同的进程;
传统的进程是程序执行流的最小单位。
如果你用QQ发消息,传送文件,进行视频聊天,这样是一个进程里的三个不同的线程。
引入线程后,线程是程序执行流的最小单位。

引入线程后:

在这里插入图片描述

1.线程是调度的基本单位,进程是资源分配的基本单位

2.线程间也能并发,提高了并发度

3.并发所带来的系统开销减小

线程的属性

在这里插入图片描述

线程的实现方式

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

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

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

在这里插入图片描述

内核级线程 KLT :内核支持的线程

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

内核级线程的切换必须在核心态下才能完成

在这里插入图片描述

二者组合

只有内核级线程才是处理机分配的单位。

在这里插入图片描述

多线程模型

多对一模型

在这里插入图片描述

一对一模型

在这里插入图片描述

多对多模型

在这里插入图片描述

——————————————————————————————————————————————————————————————

听完网课之后:

前面大部分内容还是很显然的,虽然自己想不出来,但看一下就能理解,这样的发展是理所当然的。
只有用户级线程和内核级线程,以及多线程模型比较难理解。
我不知道为什么要分用户级线程和内核级线程,也不清楚为什么要把他俩组合起来。
而且视频中是先讲了线程的作用,属性,然后才讲了怎么实现,emmm,最后又讲了多线程模型的优缺点…
我可以理解,由进程 可以很自然的想到 线程,(拙见:这种套娃在计算机里很常见)
但是进程里也没用户级和内核级啊,怎么到线程里就要分户级线程和内核级线程?

插一句,这个王道考研,可能很多人都是听过课或者之前学过,为了考研才看的,所以有基础,这个视频肯定不会像授课视频一样讲的很细,绝对没说视频不好的意思哈。
只是本系列文章是为那些和我一样看不下去正经授课视频的小伙伴写的,就是记录一下我的学习心路历程,所以会很口语化的记录,见谅。
其实只要看最开始的目录索引就行,看不懂的再看下面的分析就行。

为什么要有线程?

我是这样想的,有了进程后,能并发执行多个进程,效率高,很棒;
但是进程里也会有很多任务啊,像我上面举得例子,
我在QQ的进程里,想发消息,传送文件,还想视频,难道只能等发完消息,再去传送文件,等传完文件,再去视频?
这不行,要提高效率,不如让它们也并行吧,于是线程就出现了!
———————————以上是我的理解————————————————————————以下是百度百科—————————————

百度百科:因为进程创建、撤销和切换的时空开销大,且多个进程并行的开销过大,所以出现了能独立运行的基本单位。

啊这,感觉好像和我想的不太一样啊,操作系统之线程 (九) ,这个博主和我的观点一样

再仔细想一想,好像可以理解

先回想一下,进程是怎么来的,
引入多道程序技术之后,内存中同时放入多道程序,为了方便操作系统管理,完成各程序并发执行,引入了进程的概念。
进程是程序的一次执行。进程是可以并行执行的计算。进程是一个程序与其使用的数据在处理机上顺序执行时发生的活动。进程是程序在一个数据集合上的运行过程。

我们先简化问题,一个程序对应一个进程。(实际上,进程和程序不是一一对应的)(进程和程序的区别?

可以这样理解,单道程序时,多个程序串行执行;
为了提高效率,引入多道程序,让各程序并发执行,引入进程的概念。
同理,虽然进程能并发执行了,但一个进程的mini进程(这词我编的)也是串行执行;
为了提高效率,引入多mini进程,让各mini进程并发执行,引入线程的概念。

进程是很大的东西,同一台电脑上,许多进程并发,开销很大,而且进程里是串行执行的,效率很低;
我们自然而然的会想把进程给切片,如果进程里有许多mini进程,让这些迷你进程也并发执行,那效率不就高了。
(更重要的原因是,一个进程的线程共用一个环境,不需要频繁切换)
所以线程就出现了。

为什么线程的实现方式要分用户级线程和内核级线程?

先看这个文章,比较通俗易懂

很久很久之前,线程的概念是出现了,但操作系统厂商不可能直接就去修改操作系统的内核,因为对他们来说,稳定性是最重要的。于是编写了一个关于线程的函数库,用函数库来实现线程!用户就可以通过调用这些函数来实现所需要的功能。

看了很多文章,我还是不太懂。可能是因为不应该想这个先有鸡还是先有蛋的问题,他俩可能是同时发生,并没有先后因果关系?

线程的3种实现方式–内核级线程, 用户级线程和混合型线程

对于用户级线程与内核级线程的映射,我很喜欢这个博主写的(用户级线程必须映射到内核级线程的原因探究

我们这样考虑:用户级线程本身只是一堆数据用户程序,位于用户空间。内核级线程是系统中“真正”的线程,因此对于用户级线程来说,用户程序运行用户级线程,必须要通过映射到内核级线程后,在内核级线程上运行它。

看视频不难,难的是思考,就最后的线程部分,从11点写到下午7点,还不是很清楚,等之后学习完再来补充吧。

下半部分新开一篇博客,第二章内容有点多,希望今天能把第二章搞完吧 ORZ

猜你喜欢

转载自blog.csdn.net/tfnmdmx/article/details/119203992