足球一世77814 足球一世77814 足球一世77814

操作系统笔记 - 第 6 章进程和线程管理

1. 流程描述 - 静态表示部分 1.1 流程定义

具有某些独立功能的程序在数据集上的动态执行过程。

指令/程序是静态的。通过系统执行的指令,对通话数据进行处理,完成一定的功能。这是一个动态的执行过程,也就是一个进程。

1.2 工艺的组成

一个过程应该包括:

简而言之,一个进程包含了一个正在运行的程序的所有状态信息

1.3 进程与程序的关系 1.4 进程与程序的区别

在处理进程的过程中,CPU会根据不同进程的重要性进行进程切换。

1.5 工艺特点

程序 = 算法 + 数据结构

描述一个进程的数据结构:进程控制块(PCB)

操作系统为每个进程维护一个PCB,以保护与进程相关的各种状态信息。

1.6 过程控制结构

进程控制块:操作系统用来管理和控制进程操作的信息集合。操作系统使用PCB来描述进程的基本情况和运行转换的过程。PCB是工艺存在的唯一标志。

流程创建:为流程生成PCB;

终止工艺:回收工艺的PCB

流程的组织管理:通过PCB的组织管理实现

PCB具体包含哪些信息?如何组织?进程状态转换?

进程包含三种类型的信息:

处理机(CPU)状态信息保护区:保存进程的运行场景信息(进程状态信息)进程控制信息

PCB的组织方式

链表:同一状态的进程的PCB组成一个链表,多个状态对应多个不同的链表。(每个状态的进程形成不同的链表:就绪链表、阻塞链表) 使用链表可以使动态插入和删除更方便。

进程的组成_僵尸进程和孤儿进程_io进程和cpu进程优先级

索引表:将同一状态的进程分类为一个索引表(由索引指向PCB),多个状态对应多个不同的索引表。(每个状态的进度形成不同的索引表:就绪索引表、阻塞索引表) 如果没有频繁的插入和删除动作,索引表是一种快速组织的方式。

总结:根据操作系统的特性(通用的还是专用的?),PCB的进程模块会有不同的组织方式。

2. 进程状态(state)——动态表示部分 2.1 进程生命周期管理与运行:进程创建后可能无法执行,操作系统需要选择一个可执行进程(ready process)来执行。多个就绪进程需要操作系统根据调度算法等选择等待(阻塞):处于等待状态的进程不占用CPU;进程只能阻塞自己,因为只有进程自己知道何时等待某个事件发生。唤醒包括以下三种情况: 进程只能被其他进程或操作系统唤醒。包括三个结束原因: 以下四种情况,流程结束 2.2 流程状态变化模型

进程的三种基本状态:进程在生命结束前处于且仅处于三种基本状态之一,不同系统设置的进程状态数量不同

该过程的其他基本状态:

状态变化图

可能的状态变化如下:

2.3 进程暂停模型

当进程处于挂起状态时,表示进程不占用内存空间。挂起的进程在磁盘上进行映像。

目的:合理充分利用系统资源

暂停状态:

与挂起相关的状态转换

挂起:即将一个进程从内存转移到外部内存;可能有以下几种情况:

外部存储器中的状态转换

unhang/activate(激活):将一个进程从外部内存转移到内存;可能有以下几种情况

思考:OS如何通过PCB和定义的进程状态来管理PCB,帮助完成进程的调度过程?

状态队列

3.线程管理

(1960s) 独立运作的基本单位:流程

(1980 年代)可以独立运行的更小的基本单元:线程

3.1 为什么使用线程

单个进程中的函数不并发执行,影响资源使用效率

io进程和cpu进程优先级_僵尸进程和孤儿进程_进程的组成

--> 多进程实现单个程序多个函数的同时调用

–> 问题:进程之间如何通信和共享数据?

–> 需要提出一个新的实体:1)实体可以并发执行;2)实体共享相同的地址空间

--> 线程

3.2 什么是线程

线程:进程中的一个执行流程

一个进程可以有多个线程,多个线程共享进程提供的资源平台,线程可以直接访问进程的代码、数据、内存等。线程有自己的控制模块TCB,里面包含寄存器信息等,这部分是独立的。

线程 = 进程 - 共享资源

线程的优点:

线程的缺点:

需要根据节目的特点选择不同的节目设置方式。例如,谷歌浏览器使用处理方法。当一个网页崩溃时,它不会影响其他网页。

不同的操作系统不一定对线程有相同的支持。

线程所需的资源

线程与进程

3.3 线程的实现

线程的实现主要有以下三种方式:

用户线程与内核线程的对应关系

用户线程:操作系统看不到PCB,只能看到整个进程进程的组成,而操作系统看不到整个线程信息,而是由线程库调度和管理。也就是说,用户线程是在用户空间中实现的线程机制。它不依赖于操作系统的内核,由一组用户级线程库函数管理,包括线程的创建、终止、同步和调度。

用户线程的缺点

内核线程:PCB和TCB都放在内核中。是指在操作系统内核中实现的一种线程机制,线程的创建、终止和管理均由操作系统内核完成。

LightWeight Process:内核支持的用户线程。一个进程可以有一个或多个轻量级进程,每个进程都由一个单独的内核线程支持。

4.进程控制——进程的上下文切换

僵尸进程和孤儿进程_io进程和cpu进程优先级_进程的组成

停止当前正在运行的进程(从运行状态变为其他状态)并调度其他进程(变为运行状态)

需要存储什么上下文

操作系统的作用:

5. 流程控制——加载和执行流程

exec():使当前进程执行一个新程序。call 允许进程“加载”不同的程序并在 main 开始执行

叉子():

由于在调用 exec() 之后发生重写,因此 fork() 操作中的内存复制无效,并且子进程可能会关闭打开的文件和连接。那么如何将它们组合在一个电话中呢?

6. 进程控制——等待和终止进程

进程控制

执行 exec() 时进程可能处于不同的状态

父进程使用wait()系统调用等待子进程结束

进程执行完毕后,调用 exit() 系统调用:

清理所有等待的僵尸进程 7、进程互斥、同步和通信

从链接:

在多道程序系统中,可能同时存在多个进程,这些进程之间存在两种基本关系:竞争和合作。进程的互斥、同步和通信是基于这两种基本关系而存在的。

7.1 竞争关系

系统中的多个进程相互独立,它们不知道其他进程的存在,也不受其他进程执行的影响。例如,在批处理系统中建立多个用户进程,在分时系统中建立多个终端进程。由于这些进程共享一组计算机系统资源,必然存在多个进程竞争资源的问题。当多个进程竞争共享硬件设备、内存、处理器和文件等资源时,操作系统必须协调进程对资源的争用。

资源竞争存在两个控制问题:

操作系统需要确保进程可以互斥地访问关键资源,以解决饥饿问题和死锁问题。

进程互斥(mutual exclude)是解决进程间竞争关系(间接约束关系)的一种手段。进程互斥是指当多个进程想要使用同一个共享资源时,任何时候最多允许一个进程使用,其他想要使用该资源的进程必须等到占用该资源的进程释放该资源.

7.2 协作

有些流程需要分工合作才能完成相同的任务。由于每个合作进程都以不可预知的速度独立推进,因此合作进程需要在一定的协调点上协调各自的工作。当其中一个协作进程到达协调点时,它应该在得到伙伴进程发送的消息或信号之前阻塞自己,直到另一个协作进程发出协调信号或消息,然后唤醒并继续执行。这种协作进程等待彼此的消息或信号的协调关系称为进程同步。

进程的组成_僵尸进程和孤儿进程_io进程和cpu进程优先级

进程之间的合作可以是双方不知道对方名字的间接合作,例如,通过共享缓冲区的访问来进行松散合作;也可以是两个知道对方名字,直接通过通讯机制密切合作的当事人。允许进程一起工作有利于共享信息、加速计算和实现模块化编程。

进程同步(Synchronization)是解决进程间协作关系(直接约束关系)的一种手段。

进程同步是指两个或多个进程根据某种条件协调它们的活动。一个进程的执行依赖于来自另一个协作进程的消息或信号。当一个进程没有收到另一个进程的消息或信号时,它需要等到消息或信号到达才被唤醒。

不难看出,进程互斥关系是一种特殊的进程同步关系,即互斥共享资源的先后使用也是进程使用资源顺序的协调。

7.3 进程间通信

以下是根据《操作系统教程》3.5中的介绍组织的进程通信的概念。

并发进程之间的交互必须满足两个基本要求:同步和通信。

当进程竞争资源时进程的组成,应该实现互斥。互斥是一种特殊的同步。本质上就是要解决进程同步的问题。进程同步是一种进程通信。通过修改信号量,可以链接和协调进程运行和协同工作。但是信号量和PV操作只能传输信号,没有传输数据的能力。在某些情况下,虽然进程之间交换的信息量很小,例如只交换某种状态信息,但很多情况下,进程之间需要交换大量的数据,例如一批传输信息或整个文件,

进程之间的通信方式有很多种,包括:

1 mmap(文件映射)

2 个信号

3 管

4 共享内存

5 消息队列(重要)

6 信号量集(与信号无关)

7 网络(插座)

进程同步方式

如上所述,进程互斥关系是一种特殊的进程同步关系。下面是一种常用的进程同步方式,其实可以用于进程互斥(个人理解)。线程同步方法:

1.信号量

2.互斥体

3. 临界区

4. 活动

僵尸进程和孤儿进程_进程的组成_io进程和cpu进程优先级

同步机制:进程或线程同步和互斥的四种控制方式

1、临界区:通过多线程序列化访问公共资源或一段代码,速度快,适合控制数据访问。

2. Mutex:设计用于协调共同的个人对共享资源的访问。

3. 信号量:设计用于控制用户数量有限的资源。

4、事件:用于通知线程发生了一些事件,从而启动后续任务的启动。

科普:

1. 关键资源

关键资源是一次只允许一个进程使用的共享资源。每个进程采用互斥方式,共享资源称为关键资源。属于关键资源的硬件包括打印机、磁带机等;软件包括消息队列、变量、数组、缓冲区等,进程间采用互斥方式实现资源共享。

2.临界区:

在每个进程中访问关键资源的代码段称为关键部分。一次只允许一个进程进入临界区。进入后,不允许其他进程进入。无论是硬件关键资源还是软件关键资源,多个进程都必须互斥地访问它。多个进程涉及相同关键资源的关键部分称为相关关键部分。使用临界区时,一般不允许运行时间过长。只要运行在临界区的线程还没有离开,其他所有进入临界区的线程都会被挂起,进入等待状态,对程序有一定的影响。经营业绩。

临界区是一种轻量级的同步机制。与互斥体、事件等内核同步对象相比,临界区是用户态的对象,即线程互斥只能在同一个进程中实现。因为不需要在用户态和内核态之间切换,工作效率比互斥高很多。虽然临界区同步速度很快,但只能用于同步进程内的线程,不能同步多进程内的线程。

7.4 进程通信方式

进程间通信方式主要有管道、FIFO、消息队列、信号量、共享内存等。

1.管道,有命名管道和非命名管道(即匿名管道),非命名管道(即匿名管道)只能用于父子进程通信,命名管道可以用于非父子进程进程,命名管道是FIFO,管道是一种先进先出的通信方式。半双工管道仍然是 IPC 最常用的形式。

2.消息队列用于两个进程之间的通信。首先,在一个进程中创建一个消息队列,然后将数据写入消息队列,而另一个进程从该消息队列中获取数据。需要注意的是,消息队列是通过创建文件来建立的。如果一个进程向消息队列写入数据,另一个进程不会取出数据,即使向消息队列写入数据的过程已经结束。,存储在消息队列中的数据并没有消失,也就是说,下次你从这个消息队列中读取数据的时候,就是最后一个数据了!!!!

3、信号量,和WINDOWS下的信号量一样,不用多说

4、共享内存,类似于WINDOWS下DLL中的共享变量,但是LINUX下的共享内存区不需要DLL之类的东西,只要先创建一个共享内存区,其他进程按照一定的步骤就可以访问了共享内存区的数据,当然是可以读写的

上述方法的比较:

1.管道:速度慢,容量有限,只有父子进程可以通信

2、先进先出:任何进程都可以通信,但速度慢

3、消息队列:容量受系统限制,第一次读取时需要考虑上次没有读取数据的问题

4、信号量:不能传输复杂的消息,只能用于同步

5、共享内存区:容量容易控制,速度快,但必须同步。比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全。当然,共享内存区也可以用于线程间通信,但不是必须的。线程已经在同一个进程中共享一块内存。