当前位置: 首页 > news >正文

三、操作系统——第2章:CPU

目录

2.1进程与线程

2.1.1进程的概念和特征

1.进程的概念

2.进程的特征

2.1.2进程的组成

1.进程控制块

2.程序段

3.数据段

2.1.3进程的状态与转换

2.1.4进程控制

1.进程的创建

2.进程的终止

3.进程的阻塞和唤醒

(1)进程阻塞的事件与时机

(2)进程唤醒的事件与时机

2.1.5进程的通信

1.共享存储

2.消息传递

3.管道通信

4.信号

2.1.6线程和多线程模型

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

2.线程与进程的比较

3.线程的属性

4.线程的状态与转换

5.线程的组织与控制

(1)线程控制块

(2)线程的创建

(3)线程的终止

6.线程的实现方式

(1)用户级线程(ULT)

 ( 2 ) 内核级线程(KLT)

( 3 ) 组合方式

7.多线程模型

1 )多对一模型。

2)一对一模型。

3 ) 多对多模型。

2.1.7 本节小结

2.2CPU调度

2.2.1 调度的概念

1.调度的基本概念

2.调度的层次

(1)高级调度(作业调度)

(2)中级调度(内存调度)

(3)低级调度(进程调度/处理机调度)

3.三级调度的联系

2.2.2调度的实现

1.调度程序(调度器)

2.调度的时机、切换与过程

3.进程调度的方式

4.闲逛进程

5.两种线程的调度

2.2.3调度的目标

1.CPU利用率。

2.系统吞吐量。

3.周转时间。

4.等待时间。

5.响应时间。

2.2.4进程切换

1.上下文切换时的操作

2.上下文切换的消耗

3.上下文切换与模式切换

2.2.5 CPU调度算法

1.先来先服务(FCFS)调度算法

2.短作业优先(SJF)调度算法

3.高响应比优先调度算法

4.优先级调度算法

5.时间片轮转(RR)调度算法

6.多级队列调度算法

7.多级反馈队列调度算法

8.基于公平原则的调度算法

(1)保证调度算法

(2)公平分享调度算法

2.2.6多处理机调度

1.亲和性和负载平衡

2.多处理机调度方案

2.2.7本节小结

2.3同步与互斥

2.3.1同步与互斥的基本概念

1.临界资源

2.同步

3.互斥

2.3.2实现临界区互斥的基本方法

1.软件实现方法

(1)算法一:单标志法

(2)算法二:双标志先检查法

(3)算法三:双标志后检查法

(4)算法四:Peterson算法

2.硬件实现方法

(1)中断屏蔽方法

(2)硬件指令方法——TestAndSet指令

(3)硬件指令方法—-Swap指令

2.3.3互斥锁

2.3.4信号量

3.利用信号量实现进程互斥

4.利用信号量实现同步

5.利用信号量实现前驱关系

6.分析进程同步和互斥问题的方法步骤

2.3.5经典同步问题

1.生产者-消费者问题

2.读者-写者问题

3.哲学家进餐问题

2.3.6管程

1.管程的特点

2.条件变量

2.3.7本节小结

2.4死锁

2.4.1死锁的概念

1.死锁的定义

2.死锁与饥饿

​编辑

(1)系统资源的竞争

(2)进程推进顺序非法

(3)信号量使用不当也会造成死锁。

4.死锁产生的必要条件

5.死锁的处理策略

2.4.2死锁预防

1.破坏互斥条件

2.破坏不可剥夺条件

3.破坏请求并保持条件

4.破坏循环等待条件

2.4.3死锁避免

1.系统安全状态

2.银行家算法

3.安全性算法举例

4.银行家算法举例

2.4.4死锁检测和解除

1.死锁检测

2.死锁解除

2.4.5本节小结


2.1进程与线程

2.1.1进程的概念和特征

1.进程的概念

在多道程序(是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为此引入了进程(Process)的概念:是动态的,是程序的一次执行过程

为了使参与并发执行的每个程序(含数据)都能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block,PCB)。系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。相应地,由程序段、相关数据段和PCB三部分构成了进程实体(也称进程映像)。所谓创建进程,就是创建进程的PCB;而撤销进程,就是撤销进程的PCB。从不同的角度,进程可以有不同的定义,比较典型的定义有:

1)进程是一个正在执行程序的实例

2)进程是一个程序及其数据从磁盘加载到内存后,在CPU上的执行过程

3)进程是一个具有独立功能的程序在一个数据集合上运行的过程

引入进程实体的概念后,我们可将传统操作系统中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。"

2.进程的特征

1)动态性。进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征。

2)并发性。指多个进程同存于内存中,能在一段时间内同时运行。引入进程的目的就是使进程能和其他进程并发执行。并发性是进程的重要特征,也是操作系统的重要特征。

3)独立性。指进程是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序,都不能作为一个独立的单位参与运行。

4)异步性。由于进程的相互制约,使得进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性,为此在操作系统中必须配置相应的进程同步机制。

5)结构性。每个进程都会配置一个PCB。结构上看,进程由程序段,数据段,PCB组成


2.1.2进程的组成

进程是一个独立的运行单位,也是操作系统进行资源分配和调度的基本单位。它由以下三部分组成,其中最核心的是进程控制块(PCB)。

1.进程控制块

进程创建时,操作系统为它新建一个PCB,该结构之后常驻内存,任意时刻都可以存取,并在进程结束时删除。PCB是进程实体的一部分,是进程存在的唯一标志。

进程执行时,系统通过其PCB了解进程的现行状态信息,以便操作系统对其进行控制和管理;进程结束时,系统收回其PCB,该进程随之消亡。

当操作系统希望调度某个进程运行时,要从该进程的PCB中查出其现行状态及优先级;在调度到某个进程后,要根据其PCB中所保存的CPU状态信息,设置该进程恢复运行的现场,并根据其PCB中的程序和数据的内存始址,找到其程序和数据;进程在运行过程中,当需要和与之合作的进程实现同步、通信或访问文件时,也需要访问PCB;当进程由于某种原因此暂停运行时,又需将其断点的CPU环境保存在PCB中。可见,在进程的整个生命期中,系统总是通过PCB对进程进行控制的,亦即系统唯有通过进程的PCB才能感知到该进程的存在。

表2.1是一个PCB的实例。PCB主要包括进程描述信息、进程控制和管理信息、资源分配清单和CPU相关信息等。各部分的主要说明如下:

1)进程描述信息。进程标识符:标志各个进程,每个进程都有一个唯一的标识号。用户标识符:进程所归属的用户,用户标识符主要为共享和保护服务。

2)进程控制和管理信息。进程当前状态:描述进程的状态信息,作为CPU分配调度的依据。进程优先级:描述进程抢占CPU的优先级,优先级高的进程可优先获得CPU。

3)资源分配清单,用于说明有关内存地址空间或虚拟地址空间的状况,所打开文件的列表和所使用的输入/输出设备信息。

4)处理机相关信息,也称CPU上下文,主要指CPU中各寄存器的值。当进程处于执行态时,CPU的许多信息都在寄存器中。当进程被切换时,CPU状态信息都必须保存在相应

的PCB中,以便在该进程重新执行时,能从断点继续执行。

在一个系统中,通常存在着许多进程的PCB,有的处于就绪态,有的处于阻塞态,而且阻塞的原因各不相同。为了方便进程的调度和管理,需要将各个进程的PCB用适当的方法组织起来。目前,常用的组织方式有链接方式和索引方式两种。链接方式将同一状态的PCB链接成一个队列,不同状态对应不同的队列,也可将处于阻塞态的进程的PCB,根据其阻塞原因的不同,排成多个阻塞队列。索引方式将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB,不同状态对应不同的索引表,如就绪索引表和阻塞索引表等。

2.程序段

程序段就是能被进程调度程序调度到CPU执行的程序代码段。注意,程序可被多个进程共享,即多个进程可以运行同一个程序。

3.数据段

一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生


2.1.3进程的状态与转换

进程在其生命周期内,由于系统中各个进程之间的相互制约及系统的运行环境的变化,使得进程的状态也在不断地发生变化。通常进程有以下5种状态,前3种是进程的基本状态。

1)运行态。进程正在CPU上运行。在单CPU中,每个时刻只有一个进程处于运行态。

2)就绪态。进程获得了除CPU外的一切所需资源,一旦得到CPU,便可立即运行。系统中处于就绪态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。

命题追踪   执行中断处理程序时进程的状态(2023)

3)阻塞态,也称等待态。进程正在等待某一事件而暂停运行,如等待某个资源可用(不包括CPU)或等待I/O完成。即使CPU空闲,该进程也不能运行。系统通常将处于阻塞态的进程也排成一个队列,甚至根据阻塞原因的不同,设置多个阻塞队列。

4)创建态。进程正在被创建,尚未转到就绪态。创建进程需要多个步骤:首先申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后将该进程转入就绪态并插入就绪队列。但是,若进程所需的资源尚不能得到满足,如内存不足,则创建工作尚未完成,进程此时所处的状态称为创建态。

5)终止态。进程正从系统中消失,可能是进程正常结束或其他原因退出运行。进程需要结束运行时,系统首先将该进程置为终止态,然后进一步处理资源释放和回收等工作。

区分就绪态和阻塞态:就绪态是指进程仅缺少CPU,只要获得CPU就立即运行;而阻塞态是指进程需要其他资源(除了CPU)或等待某一事件。之所以将CPU和其他资源分开,是因为在分时系统的时间片轮转机制中,每个进程分到的时间片是若干毫秒。也就是说,进程得到CPU的时间很短且非常频繁,进程在运行过程中实际上是频繁地转换到就绪态的;而其他资源(如外设)的使用和分配或某一事件的发生(如I/O完成)对应的时间相对来说很长,进程转换到阻塞态的次数也相对较少。这样来看,就绪态和阻塞态是进程生命周期中两个完全不同的状态。

下图说明了5种进程状态的转换,而3种基本状态之间的转换如下:

就绪态→运行态:处于就绪态的进程被调度后,获得CPU资源(分派CPU的时间片),于是进程由就绪态转换为运行态。

运行态→就绪态:处于运行态的进程在时间片用完后,不得不让出CPU,从而进程由运行态转换为就绪态。此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态,让更高优先级的进程执行。

运行态→阻塞态:进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如I/O操作的完成)时,它就从运行态转换为阻塞态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式。

阻塞态→就绪态:进程等待的事件到来时,如I/O操作完成或中断结束时,中断处理程序必须将相应进程的状态由阻塞态转换为就绪态。

需要注意的是,一个进程从运行态变为阻塞态是主动的行为,而从阻塞态变为就绪态是被动的行为,需要其他相关进程的协助。


2.1.4进程控制

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在操作系统中,一般将进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。

1.进程的创建

父进程与子进程的关系和特点允许一个进程创建另一个进程,此时创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程所拥有的资源。当子进程终止时,应将其从父进程那里获得的资源还给父进程。

创建新进程时的操作

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

2)为进程分配其运行所需的资源,如内存、文件、I/O设备和CPU时间等(在PCB中体现)。这些资源或从操作系统获得,或仅从其父进程获得。若资源不足(如内存),则并不是创建失败,而是处于创建态,等待内存资源。

3)初始化PCB,主要包括初始化标志信息、初始化CPU状态信息和初始化CPU控制信息,以及设置进程的优先级等。

4)若进程就绪队列能够接纳新进程,则将新进程插入就绪队列,等待被调度运行。

2.进程的终止

引起进程终止的事件主要有:①正常结束,表示进程的任务已完成并准备退出运行。②异常结束,表示进程在运行时,发生了某种异常事件,使程序无法继续运行,如存储区越界、保护错、非法指令、特权指令错、运行超时、算术运算错、I/O故障等。③外界干预,指进程应外界的请求而终止运行,如操作员或操作系统干预、父进程请求和父进程终止。

操作系统终止进程的过程如下(终止原语):

1)根据被终止进程的标识符,检索出该进程的PCB,从中读出该进程的状态。

2)若被终止进程处于运行状态,立即终止该进程的执行,将CPU资源分配给其他进程。

3)若该进程还有子孙进程,则通常需将其所有子孙进程终止(有些系统无此要求)。

4)将该进程所拥有的全部资源,或归还给其父进程,或归还给操作系统。

5)将该PCB从所在队列(链表)中删除。

3.进程的阻塞和唤醒

(1)进程阻塞的事件与时机

正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新任务可做等,进程便通过调用阻塞原语(Block),使自己由运行态变为阻塞态。可见,阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞态。阻塞原语的执行过程如下:

1)找到将要被阻塞进程的标识号(PID)对应的PCB。

2)若该进程为运行态,则保护其现场,将其状态转为阻塞态,停止运行。

3)将该PCB插入相应事件的等待队列,将CPU资源调度给其他就绪进程。

(2)进程唤醒的事件与时机

当被阻塞进程所期待的事件出现时,如它所期待的I/O操作已完成或其所期待的数据已到达,由有关进程(比如,释放该I/O设备的进程,或提供数据的进程)调用唤醒原语(Wakeup),将等待该事件的进程唤醒。唤醒原语的执行过程如下:

1)在该事件的等待队列中找到相应进程的PCB。

2)将其从等待队列中移出,并置其状态为就绪态。

3)将该PCB插入就绪队列,等待调度程序调度。

应当注意,Block原语和Wakeup原语是一对作用刚好相反的原语,必须成对使用。若在某个进程中调用了Block原语,则必须在与之合作的或其他相关的进程中安排一条相应的Wakeup原语,以便唤醒阻塞进程;否则,阻塞进程将因不能被唤醒而永久地处于阻塞态。


2.1.5进程的通信

进程通信是指进程之间的信息交换PV操作是低级通信方式高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三类。

1.共享存储

在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行读/写操作实现进程之间的信息交换,如下图所示。在对共享空间进行读/写操作时,需要使用同步互斥工具(如P操作、V操作)对共享空间的读/写进行控制。共享存储又分为两种:低级方式的共享是基于数据结构的共享;高级方式的共享则是基于存储区的共享。操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,而数据交换则由用户自己安排读/写指令完成。

注意,进程空间一般都是独立的,进程运行期间一般不能访问其他进程的空间,想让两个进程共享空间,必须通过特殊的系统调用实现,而进程内的线程是自然共享进程空间的。

简单理解就是,甲和乙中间有一个大布袋,甲和乙交换物品是通过大布袋进行的,甲将物品放在大布袋里,乙拿走。但乙不能直接到甲的手中拿东西,甲也不能直接到乙的手中拿东西。

            

2.消息传递

若通信的进程之间不存在可直接访问的共享空间,则必须利用操作系统提供的消息传递方法实现进程通信。在消息传递系统中,进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的发送消息和接收消息两个原语进行数据交换。这种方式隐藏了通信实现细节,使通信过程对用户透明,简化了通信程序的设计,是当前应用最广泛的进程间通信机制。在微内核操作系统中,微内核与服务器之间的通信就采用了消息传递机制。该机制能很好地支持多CPU系统、分布式系统和计算机网络,因此也成为这些领域最主要的通信工具。

1)直接通信方式。发送进程直接将消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。如下右图所示

2)间接通信方式。发送进程将消息发送到某个中间实体,接收进程从中间实体取得消息。这种中间实体一般称为信箱。该通信方式广泛应用于计算机网络中。

简单理解就是,甲要将某些事情告诉乙,就要写信,然后通过邮差送给乙。直接通信就是邮差将信直接送到乙的手上;间接通信就是乙家门口有一个邮箱,邮差将信放到邮箱里。

3.管道通信

管道通信允许两个进程按生产者-消费者方式进行通信,只要管道不满,写进程就能向管道的一端写入数据;只要管道非空,读进程就能从管道的一端读出数据。为了协调双方的通信,管道机制必须提供三方面的协调能力:①互斥,指当一个进程对管道进行读/写操作时,其他进程必须等待。②同步,指写进程向管道写入一定数量的数据后,写进程阻塞,直到读进程取走数据后再将它唤醒;读进程将管道中的数据取空后,读进程阻塞,直到写进程将数据写入管道后才将其唤醒。③确定对方的存在。

在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现如下:

1)限制管道的大小。管道文件是一个固定大小的缓冲区,在Linux中该缓冲区的大小为4KB,这使得它的大小不像普通文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用。

2)读进程也可能工作得比写进程快。当管道内的数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将被阻塞,等待某些数据的写入。

管道只能由创建进程所访问,当父进程创建一个管道后,管道是一种特殊文件,子进程会继承父进程的打开文件,因此子进程也继承父进程的管道,并可用它来与父进程进行通信。

注意:从管道读数据是一次性操作,数据一旦被读取,就释放空间以便写更多数据。普通管道只允许单向通信,若要实现两个进程双向通信,则需要定义两个管道。

4.信号

信号(Signal)是一种用于通知进程发生了某个事件的机制。不同的系统事件对应不同的信号类型,每类信号对应一个序号。例如,Linux定义了30种信号,分别用序号1~30表示。

在进程的PCB中,用至少n位向量记录该进程的待处理信号,如Linux使用一个32位的int型变量表示。若给某个进程发送一个信号,则把该类信号对应的位修改为1。一旦该信号被处理,就把对应的位修改为0。此外,还用另一个n位向量记录被阻塞(被屏蔽)的信号。当某个位为1时,表示该位对应的信号类型将被进程忽略,无须响应。

接下来探讨信号是如何发送的,主要有两种方式:

1)内核给某个进程发送信号。当内核检测到某个特定的系统事件时,就给进程发送信号。例如,若进程使用非法指令,则内核给该进程发送SIGILL信号(序号为4)。

2)一个进程给另一个进程发送信号。进程可以调用kill函数,要求内核发送一个信号给目的进程(需要指明接收进程的PID和信号的序号)。当然,进程也可给自己发送信号。

当操作系统把一个进程从内核态切换到用户态时(如系统调用返回时),会检查该进程是否有未被阻塞的待处理信号,若有,则强制进程接收信号,并立即处理信号(若有多个待处理信号,则通常先处理序号更小的信号)。信号的处理方式有两种:

1)执行默认的信号处理程序。操作系统为每类信号预设了默认的信号处理程序。例如,收到SIGILL信号的默认操作就是终止进程。

2)执行进程定义的信号处理程序。进程可为某类信号自定义信号处理程序。例如,进程可以定义收到SIGILL信号时输出“hello world”,而不是终止进程。信号处理程序运行结束后,通常会返回进程的下一条指令继续执行。


2.1.6线程和多线程模型

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

引入进程的目的是更好地使多道程序并发执行,提高资源利用率系统吞吐量;而引入线程(Threads)的目的则是减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。

引入线程后,进程的内涵发生了改变,进程只作为除CPU外的系统资源的分配单元,而线程则作为CPU的分配单元。由于一个进程内部有多个线程,若线程的切换发生在同一个进程内部,则只需要很少的时空开销。下面从几个方面对线程和进程进行比较。

2.线程与进程的比较

1)调度。在传统的操作系统中,拥有资源和独立调度的基本单位都是进程,每次调度都要进行上下文切换,开销较大。在引入线程的操作系统中,线程是独立调度的基本单位,而线程切换的代价远低于进程。在同一进程中,线程的切换不会引起进程切换。但从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。

2)并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,一个进程中的多个线程之间也可并发执行,甚至不同进程中的线程也能并发执行,从而使操作系统具有更好的并发性,提高了系统资源的利用率和系统的吞吐量。

3)拥有资源。进程是系统中拥有资源的基本单位,而线程不拥有系统资源(仅有一点必不可少、能保证独立运行的资源),但线程可以访问其隶属进程的系统资源,这主要表现在属于同一进程的所有线程都具有相同的地址空间。要知道,若线程也是拥有资源的单位,则切换线程就需要较大的时空开销,线程这个概念的提出就没有意义。

4)独立性。每个进程都拥有独立的地址空间和资源,除了共享全局变量,不允许其他进程访问。某个进程中的线程对其他进程不可见。同一进程中的不同线程是为了提高并发性及进行相互之间的合作而创建的,它们共享进程的地址空间和资源。

5)系统开销。在创建或撤销进程时,系统都要为之分配或回收进程控制块(PCB)及其他资源,如内存空间、I/O设备等。操作系统为此所付出的开销,明显大于创建或撤销线程时的开销。类似地,在进程切换时涉及进程上下文的切换,而线程切换时只需保存和设置少量寄存器内容,开销很小。此外,同一进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信非常容易实现,甚至无须操作系统的干预。

6)支持多处理器系统。对于传统单线程进程,不管有多少个CPU,进程只能运行在一个CPU上。对于多线程进程,可将进程中的多个线程分配到多个CPU上执行。

3.线程的属性

线程所拥有资源的特点

1)线程是一个轻型实体,它不拥有系统资源,但每个线程都应有一个唯一的标识符和一个线程控制块,线程控制块记录线程执行的寄存器和栈等现场状态。

2)不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用时,操作系统将它们创建成不同的线程。

3)同一进程中的各个线程共享该进程所拥有的资源。

4)线程是CPU的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中,各线程可交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,若各个CPU同时为一个进程内的各线程服务,则可缩短进程的处理时间。

5)一个线程被创建后,便开始了它的生命周期,直至终止。线程在生命周期内会经历阻塞态、就绪态和运行态等各种状态变化。

4.线程的状态与转换

与进程一样,各线程之间也存在共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。相应地,线程在运行时也具有下面三种基本状态。

①执行态:线程已获得CPU而正在运行。

②就绪态:线程已具备各种执行条件,只需再获得CPU便可立即执行。

③阻塞态:线程在执行中因某事件受阻而处于暂停状态。

线程这三种基本状态之间的转换和进程基本状态之间的转换是一样的。

5.线程的组织与控制

(1)线程控制块

线程的特点

与进程类似,系统也为每个线程配置一个线程控制块TCB,用于记录控制和管理线程的信息。线程控制块通常包括:①线程标识符;②一组寄存器,包括程序计数器、状态寄存器和通用寄存器;③线程运行状态,用于描述线程正处于何种状态;④优先级;⑤线程专有存储区,线程切换时用于保存现场等;⑥堆栈指针,用于过程调用时保存局部变量及返回地址等。

同一进程中的所有线程都能访问进程的地址空间和全局变量。但是,每个线程都拥有自己的堆栈,且互不共享(可以这么理解:线程的堆栈被包含在进程的地址空间内,因此同一进程中的各个线程事实上可以访问彼此的堆栈,但编程规范通常不推荐这么做)。

(2)线程的创建

线程也是具有生命期的,它由创建而产生,由调度而执行,由终止而消亡。相应地,在操作系统中就有用于创建线程和终止线程的函数(或系统调用)。

用户程序启动时,通常仅有一个称为初始化线程的线程正在执行,其主要功能是用于创建新线程。在创建新线程时,需要利用一个线程创建函数,并提供相应的参数,如指向线程主程序的入口指针、堆栈的大小、线程优先级等。线程创建函数执行完后,将返回一个线程标识符。

(3)线程的终止

当一个线程完成自己的任务后,或线程在运行中出现异常而要被强制终止时,由终止线程调用相应的函数执行终止操作。但是有些线程(主要是系统线程)一旦被建立,便一直运行而不会被终止。通常,线程被终止后并不立即释放它所占有的资源,只有当进程中的其他线程执行了分离函数后,被终止线程才与资源分离,此时的资源才能被其他线程利用。被终止但尚未释放资源的线程仍可被其他线程调用,以使被终止线程重新恢复运行。

http://www.dtcms.com/a/297970.html

相关文章:

  • 数学专业转型大数据发展指南
  • Linux网络框架分析
  • 用毫秒级视频回传打造稳定操控闭环之远程平衡控制系统技术实践
  • Qt 多媒体开发:音频与视频处理
  • DNS 协议
  • 服务器安装虚拟机全步骤
  • MRDIMM对服务器总体拥有成本(TCO)影响的系统性分析
  • Oracle不完全恢复实战指南:从原理到操作详解
  • OpenCV 图像变换全解析:从镜像翻转到仿射变换的实践指南
  • Undertow 可观测性最佳实践
  • 医疗器械:DFEMA和PFEMA
  • 【嵌入式汇编基础】-ARM架构基础(二)
  • 锁相环技术简介(面向储能变流器应用)
  • 从Taro的Dialog.open出发,学习远程控制组件之【事件驱动】
  • Langchain学习——PromptTemplate
  • Class21卷积层的多输入通道和多输出通道
  • 基于纳米流体强化的切割液性能提升与晶圆 TTV 均匀性控制
  • 轻量级音乐元数据编辑器Metadata Remote
  • [NPUCTF2020]ReadlezPHP
  • iOS —— 天气预报仿写总结
  • SQL164 2021年11月每天新用户的次日留存率
  • ReAct Agent(LangGraph实现)
  • 去除视频字幕 2, 使用 PaddleOCR 选取图片中的字幕区域, 根据像素大小 + 形状轮廓
  • MCP 与传统集成方案深度对决:REST API、GraphQL、gRPC 全方位技术解析
  • react 内置hooks 详细使用场景,使用案例
  • 轮盘赌算法
  • Python爬虫实战:研究Talon相关技术构建电商爬虫系统
  • ZLMediaKit 源代码入门
  • Java排序算法之<选择排序>
  • IT领域需要“落霞归雁”思维框架的好处