操作系统 - 进程&线程

一. 进程基本概念

1. 程序顺序执行特征

  • 顺序性 :处理及严格按照程序所规定的顺序执行
  • 封闭性:程序在执行时独占系统的全部资源,因此,系统资源状态的改变只与执行的程序有关,而不受外界影响
  • 可再现性:只要初始条件相同,一个程序的多次重复将执行得到相同的结果

2. 程序的并发执行特征

  • 间断性:由于资源共享和相互合作,并发执行的程序间形成了相互制约的关系,程序会出现 “执行 - 暂停 - 执行”的现象
  • 失去封闭性:程序在执行时与其他并发执行的程序共享系统的资源,因此资源的改变还有其他程序有关,及程序本身的执行环境要收到外界程序的影响
  • 不可再现性:同样的初始条件,一个程序的多次重复执行可能会得到不同的结果

3. 进程特征

动态性:进程是程序的一次执行过程,因此是动态。进程的动态性还表现在进程具有一定的生命期,它必须由创建而产生、由调度而执行、由撤销而消亡。动态性是进程的一个最基本的特征

  • 并发性:并发性是指多个进程实体同存于内存中,且能在一段时间内同时执行。只有为程序创建进程后,多个程序才能正确地并发执行。并发是引入线程的目的,也是进程的另一个最基本的特征
  • 独立性:进程实体是一个能够独立运行、独立分配资源和独立接收调度的基本单位
  • 异步性:进程可按各自独立的、不可预知的速度向前推进。虽然进程具有异步性,但操作系统必须保证进程进程并发执行的结果是可再现的

4. 进程控制块(PCB)

定义

  1. 为了描述和控制进程的运行,系统为每个进程定义了一个数据结构——进程控制块,即PCB
  2. PCB是进程实体的一个组成部分,PCB中记录了OS所需的、用于描述进程当前情况以及控制进程的全部信息
  3. PCB的作用是将程序编程可并发执行的进程,系统根据进程的PCB感知到进程的存在,并通过PCB对进程进行控制,因此PCB是进程存在的唯一标识
  4. 由于PCB被系统频繁的访问,因此PCB中的信息必须全部或者部分常驻内存
  5. 在一个系统中通常有许多PCB,它们构成PCB集合,为了便于管理,系统通常用线性方式链接方式索引方式将这些PCB组织起来

PCB包含的信息

  1. 进程标识符:唯一的标识系统中的每个进程,另外,还可以用父进程的标识符,子进程的标识符来描述进程的家族关系
  2. 处理机状态:处理机状态信息主要由处理机中各种寄存器的内容组成,它用于CPU切换时保存线程信息和恢复线程信息
  3. 线程调度信息:进程调度信息主要包括进程状态、优先级、等待和使用CPU的时间总和等信息,用作进程调度和对换的依据
  4. 进程控制信息:进程控制信息用于进程的控制,具体包括程序和数据的地址、进程同步和通信信息,资源清单和进程队列指针等

5. 线程的状态(重点)

基本状态

  • 就绪状态:进程已获得除CPU意外的所有必要资源,只要得到CPU,便可立即执行
  • 执行状态:进程已获得CPU,其程序正在CPU上执行
  • 阻塞状态:正在执行的进程因某种事件(如I/O请求)的发生而暂时无法继续执行,只有等相应时间完成后,才能去竞争CPU

在这里插入图片描述

进程的挂起状态

挂起的实质是进程不能继续执行,因此即使挂起后处于就绪状态,也无法参与CPU竞争,因此称被挂起的进程处于静止状态,相反,没被挂起的线程就属于激活状态

在这里插入图片描述

二. 进程控制

1. 操作系统内核

  1. 进程的控制是操作系统的内核通过原语来实现的,(控制主要包括进程的创建、终止、状态切换)
  2. 现代OS一般分为若干层次,再将O不同功能分别设置在不同层次中。通常将一些与硬件紧密相关的模块(如中断处理程序等)、**各种常用设备的驱动程序以及运行频率较高的模块(如时钟管理,进程调度和许多模块所共用的一些基本操作)**安排在紧靠硬件的软件层次中,他们将常驻内存,这部分通常被称为OS内核
  3. 为了使操作系统内核代码和数据不会受到用户程序的破坏,通常将处理机的执行状态分为系统态和用户态两种不同的状态
  • 系统态:也叫管态或内核态,具有较高特权,能执行一切指令,访问所有寄存器和存贮器
  • 用户态:也叫目态,具有较低特权的执行状态,只能执行规定的指令,访问规定的寄存器和存贮器
    通常,操作系统内核运行在系统态,用户程序运行在用户态
  1. 原语是指由若干条指令组成、用来实现某个特定操作的一个过程原语的执行具有原子性,即不可被中断。原语常驻内存,且在系统态下执行

2. 进程的创建

  1. 导致一个进程去创建另一个进程的典型事件是分时系统中的用户登录批处理系统中的作业调度,程序本身也可以根据需要去创建新的进程
  2. 创建新进程是通过创建原语完成的,被创建的进程称作子进程,创建者叫父进程
  3. 进程创建原语的主要任务是创造进程控制块PCB
  • 先从PCB集合重申请一个空间的PCB
  • 为新进程分配内存等资源
  • 根据父进程提供的参数和分配到的资源对PCB进行初始化
  • 将新进程插入到就绪队列

3. 进程的终止

  1. 通过进程终止原语来终止进程
  2. 终止进程的实质是收回PCB
  • 找到要终止进程的PCB
  • 如果该进程正在执行则终止它的执行,并设置重新调度标志
  • 终止属于该进程的所有子孙进程
  • 释放终止进程所拥有的全部资源
  • 将终止进程移除它所在的队列并回收PCB

4. 进程的阻塞和唤醒

阻塞

  1. 当正在执行的进程需要等待某种事件的完成本身无新工作可做时,应调用阻塞原语将自己从执行状态转换为阻塞状态
  2. 具体操作过程:停止进程的执行,将其状态改为阻塞状态,并把它的PCB插入相应的阻塞队列,转调度程序重新调度

唤醒

  1. 当阻塞进程所等待的事件完成时,应调用唤醒原语将该进程的状态从阻塞状态转换成就绪状态
  2. 具体的操作过程:在阻塞队列中移出该PCB,将其设置成就绪状态,并把它插入就绪队列

5. 进程的挂起与激活

挂起

  1. 系统可利用挂起原语将一指定的进程挂起
  2. 具体的操作过程是:
  • 若进程处于活动阻塞状态,则将它的状态转换成静止阻塞状态,否则,将它转换成静止就绪状态
  • 将PCB复制到指定的内存区域供用户或父进程考查
  • 若挂起前进程正在执行,则调度程序重新进行进程调度
  • 如果挂起是为了对换,则在挂起进程时还必须将它移出到外存中

激活

  1. 系统可以利用激活原语激活一指定进程
  2. 具体的操作过程是:
  • 若进程属于静止阻塞状态,则将它的状态转换成活动阻塞状态,否则,将它转换为活动就绪状态
  • 若进程转换成活动就绪状态,而系统又采用抢占调度策略,则应该检查该进程是否有权抢占CPU,若有则应该进行进程调度
  • 如果挂起是为了对换,则在激活被挂起的进程时还必须将它调入内存

三. 进程同步

进程同步是指对多个相关进程在执行次序上进行协调,目的是是系统中诸进程之间能按照一定的规则或时序共享资源和相互合作,从而使程序的执行具有可再现性,用来实现同步的机制被称为同步机制

1. 进程同步的概念

两种形式的制约关系

  1. 间接相互制约:如资源共享,A,B同时请求,B抢到资源,A阻塞直到B释放资源
  2. 直接相互制约:主要源于进程合作:如有一进程D通过缓冲区向C输入信息,当缓冲区空时C阻塞,当缓冲区满时D阻塞

临界资源和临界区

  1. 临界资源:计算机许多资源一次只能允许一个进程使用,如果多个进程同时使用这些资源,则有可能造成系统的混乱,这些资源就是临界资源
  2. 多个进程同时使用一个共享变量,即临界资源,会使结果具有不可再现性
  3. 临界区:每个进程中,访问临界资源的那段代码被称作临界区
  4. 为了使多个进程能够有效地共享临界资源,并使程序的执行具有可再现性,系统必须保证进程互斥的使用临界资源,即保证它们互斥的进入自己的临界区
  5. 因此,必须在临界区前加一段代码,从来检查对应的临界资源是否被其他进程访问,这段代码被称为进入区
  6. 相应的,在临界区后也要加一段称为退出区的代码,用于将临界区从正被访问的标志恢复为未被访问的标志

同步机制应遵循的规则

用来实现互斥的同步机制必须遵循下述四条规则:

  1. 空闲让进:临界资源空闲时,应允许一个请求进入临界区的进程立即进入自己的临界区,有效地利用资源
  2. 忙则等待:当临界区资源正被访问时,其他要求进入临界区的进程必须等待,以保证对临界资源的互斥使用
  3. 有限等待:任何要求访问临界资源的进程应能在有限的时间内进入自己的临界区,以免死等
  4. 让权等待:不能进入临界区的进程应立即释放CPU,以免忙等

2. 信号量机制

信号量机制已由早起的整型信号量发展为记录型信号量,进而发展为信号量级

整型信号量

在这里插入图片描述

  • 整型信号量的 wait 操作表示申请一个资源,signal表示释放一个资源
  • 主要问题:只要S<=0 会一直申请,没有遵循让权等待

记录型信号量

记录型信号量中除了一个需要用于代表资源数目的整型变量value外,还增加了一个进程链表指针list,用于链接所有等待该资源的线程
在这里插入图片描述

  • 当S.value > 0 时,S.value表示系统中当前资源可用的数目
  • 当S.value < 0时,S.value的绝对值表示系统中因申请该资源而阻塞在 S.list队列上的进程数目
  • 记录型信号量的wait操作中,当 S.value-- 后,结果小于0时,即系统中没有资源分配,此时进程调用block原语自我阻塞,其PCB被插入信号量的等待队列list中,遵循了让权等待规则

3. 同步例子

生产者消费者

在这里插入图片描述

哲学家进餐

在这里插入图片描述

读者 - 写者问题

读读不互斥;读写,写写互斥
在这里插入图片描述

  • rmutex:读者之间互斥的修改mutex变量
  • mutex:读者写者之间互斥的整型变量
  • 读者获取锁后,只有当 readcount=0,即没有读者时,才会释放mutex

四. 管程机制

使用信号量来处理同步问题时,同步操作wait(s)和signal(s)分散在各个进程中,遍布整个程序,不仅给系统的管理和程序的维护和修改带来麻烦,还会因同步操作的使用不当造成死锁。为了解决上述问题,又产生了新的进程同步工具——管程

1. 管程的定义

  1. 管程利用共享数据结构抽象的表示系统中的共享资源,并且对该共享数据结构实施的特定操作定义为一组过程
  2. 换句话说,管程是由一组局部的共享变量、对局部变量进行操作的一组过程以及对局部变量进行初始化的语句够成功的一个软件模块
  3. 保证进程互斥的进入管程是编译器负责的,也就是说管程是一种编程语言的构建,它的实现需要得到编译器的支持
  4. 语法描述如下
    在这里插入图片描述

管程的特点

  1. 管程内的局部变量只能被局部于管程内的过程所访问,反之, 局部于管程内的过程只能访问管程内的变量和形式参数
  2. 任何进程只能通过调用管程提供的过程入口进入管程
  3. 任一时刻,最多只能有一个进程在管程中执行

2. 条件变量

  1. 在任何时刻,最多只有一个进程在管程中执行,因此用管程很容易实现互斥,只要将互斥访问的资源用数据结构描述,并将该数据结构放入管程中便可
  2. 若要用管程来实现同步,则在相应条件不满足时(如临界资源得不到时)必须能够将在管程内执行的进程阻塞
  3. 由于阻塞的原因不同,为了将它们区分开,引入了局部于管程的条件变量,其定义格式为

condition x,y

  1. 对局部的条件变量只执行两种操作
  • wait操作:如x.wait()用来将执行进程挂到与条件变量x响应的等待队列上
  • signal操作:如x.signal()用来唤醒与x条件变量响应的等待队列的一个进程(值得注意的是,若没有等待进程,则x.signal()不起任何作用)

3. 用管程解决生产者 - 消费者问题

  1. 定义管程
    在这里插入图片描述
    在这里插入图片描述
  2. 生产 - 消费

在这里插入图片描述

五. 进程通信

1. 定义

  1. 进程通信是指进程之间的信息交换
  2. 进程之间的互斥和同步,可在进程间交换一定的信息,可看作是一种进程通信,但由于信息量少,通行效率低,对用户不透明,被归为低级通信
  3. 高级通信是用户可以直接利用操作系统所提供的的一组通信命令(原语),高效的传送大量数据的一种通信方式
  4. 高级通信被分为共享存储器系统管道通信消息传递系统客户机 - 服务器系统

2. 通信类型

- 2.1 共享存储器系统

  1. 高级通信中的共享存储器系统是指进程之间通过对共享存储区的读写来交换数据
  2. 需要通信的进程在通信之前,先向系统申请获得共享存储区中的一个分区,并将其附加到自己的地址空间中,便可对其中的数据进行正常的读、写,读写完成或不再需要该分区时,将其归还给共享存储区
  3. 共享存储区的另一种方式是利用共享的数据结构来进行进程通信,但是这种方式对共享数据结构的设置及进程间的同步都必须由程序员来处理,且只能进行少量的数据交换,因此属于低级通信方式

- 2.2 管道通信

  1. 所谓“管道”是指连接两个进程的一个共享文件
  2. 发送进程以字符流的形式将大量的信息写入管道,接收进程则在需要时从管道中读出数据
  3. 为了协调双方的通信,管道通信机制必须对发送进程和接收进程,在利用管道进行通信时实施同步和互斥,并且只有在确定对方存在时才能进行通信

- 2.3 消息传递系统

  1. 消息传递系统中,进程间的数据交换以格式化的消息(网络中称作报文)为单位,根据实现方式,它又可分为直接通信间接通信两类
  2. 在直接通信方式中,源进程可以直接将消息发送给目标进程,此类操作通常提供 send(receiver,message)receive(sender,message) 两条通信命令(原语)供用户使用
  3. 在间接通信方式中,进程间需要通过某种中间实体,即信箱来通信,发送将消息投入信箱,而接受进程则从信箱中取得消息,因此,它不仅能实现实时通信还能实现非实时通信,此类操作系统通常提供若干条原语分别用于信箱的创建、撤销和消息的发送和接收等

- 2.4 客户机 - 服务器系统

  1. 客户机 - 服务器系统的通信机制,在网络环境的各种应用领域已成为当前主流的通信实现机制
  2. 其主要的实现方式分为三类:套接字远程过程调用远程方法调用

2.4.1 套接字

  1. 一个套接字就是一个通信标识类型的数据结构,包含了目的地址、通信使用的端口号、通信网络的传输层协议进程所在的网络地址、以及针对客户或服务器程序提供的不同系统调用(或API函数),是进程通信和网络通信的基本构件
  2. 套接字是为客户/服务器模型而设计的,通常包括基于文件型基于网络型
  3. 套接字的优势在于不仅适用同一台计算机内部的进程通信,也适用于网络环境中不同计算机的进程通信
  4. 由于每个套接字拥有唯一的套接字号,这样系统中所有的链接都持有唯一的一对套接字及端口连接
2.4.1.1 基于文件型

通信进程都运行在同一台机器的环境中,套接字是基于本地文件系统支持的,一个套接字关联到一个特殊的文件,通信双方通过对这个特殊文件的读写实现通信,其原理类似于前面所讲的管道

2.4.1.2 基于网络型
  1. 通常采用非对称方式通信,即发送者需要提供接收者命名
  2. 通信双方的进程运行在不同主机的网络环境下,被分配了一对套接字,一个属于接收进程(服务器端),一个属于发送进程(客户端)
  3. 发送进程发出连接请求时,随机申请一个套接字,主机为之分配一个端口与该套接字绑定,该端口不再分配给其他进程
  4. 接收进程拥有全局公认的套接字和指定的端口,并通过监听端口等待客户请求。因此,任何进程都可以向它发出链接请求和信息请求
  5. 通信结束时,系统通过关闭接收进程的套接字撤销链接

2.4.2 远程过程调用和远程方法调用

  1. 远程过程(函数)调用 - RPC,是一个通信协议
  2. 该协议允许运行于一台主机(本地)系统上的进程调用另一台主机(远程)系统上的进程
  3. 负责处理远程调用的进程有两个,一个是本地客户进程,另一个是远程服务器进程,这两个也被称为网络守护进程,主要负责网络间的消息传递,一般情况下这两个进程都是处于阻塞状态,等待消息
  4. 为了使远程过程调用看上去与本地过程调用一样(即RPC透明性),RPC引入一个存根的概念
2.4.2.1 存根(适配器?)
  1. 在本地客户端,每个能够独立运行的远程过程都拥有一个客户存根,本地进程调用远程过程实际是调用该过程关联的存根
  2. 于此类似,在每个远程进程所在的服务端,其所对应的实际可执行进程也存在一个服务器存根与其关联
  3. 本地客户存根与对应的远程服务存根一般也是出于阻塞状态,等待消息
2.4.2 远程调用实际步骤
  1. 本地过程调用者以一般方式调用远程过程在本地关联的客户存根,传递响应的参数,然后将控制权转移给客户存根
  2. 客户存根执行,完成包括过程名和调用参数等信息的消息建立将控制权转移给本地客户进程
  3. 本地客户进程完成与服务器的消息传递,将消息发送到远程服务进程
  4. 远程服务器接收消息后转入执行,并根据其中的远程过程名找到对应的服务器存根,将消息转给该存根
  5. 该服务器存根接到消息后,由阻塞转入执行状态,拆开消息取出过程调用的参数,然后以一般方式调用服务器上关联的过程
  6. 在服务器端的远程过程运行完毕后,将结果返回给与之关联的服务器存根
  7. 该服务器存根获得控制权运行,将结果打包为消息,并将控制权转移给远程服务器进程
  8. 远程服务器进程将消息发送回客户端
  9. 本地客户进程接收到消息后根据其中的过程名将消息存入关联的客户存根,再将控制权转移给客户存根
  10. 客户存根从消息中取出结果,返回给本地调用者进程,并完成控制权的转移,至此,本地调用者再次获得控制权,并且得到了所需的数据,继续运行
2.4.3 存根小总结

将客户过程的本地调用转化为客户存根,再转化为服务器过程的本地调动,对服务器和客户端来说,它们的中间步骤是不可见的因此,调用者在整个过程中并不知道该过程的执行是在远程,而不是在本地

3. 消息传递通信的实现方式

- 3.1 直接消息传递系统

3.1.1 直接通信原语

  1. 对称寻址方式:要求发送进程和接收进程都必须以显示方式提供对方的标识符,如以下两个例子
  • send( receiver, message) --> send(P2,m1)
  • receive( sender, message) --> receive(P1,m1)
  1. 非对称寻址方式:接收进程的原语中,不需要命名发送进程,只填写表示源进程的参数
  • send( P, message)
  • receive( id, message)

3.1.2 消息的格式

在消息传递系统中所传递的消息,必须具有一定的消息格式

3.1.3 进程的同步方式

  1. 不论是发送进程还是接收进程,在完成消息的发送或接收后,都存在继续发送(或接收)或者阻塞,由此可得三种情况
  2. 发送进程阻塞,接收进程阻塞:这种情况主要用于进程间紧密同步,进程间无缓冲
  3. 发送进程不阻塞,接收进程阻塞:这种情况应用最广,不发送时进程做别的事,而接收进程则处于阻塞状态直到接收消息
  4. 发送进程不阻塞,接收进程不阻塞:这也比较常见,平时发送和接收进程都在忙于自己的事情,仅当某事件使它无法继续运行时,才把自己阻塞起来

3.1.4 通信链路

为使在发送进程和接收进程之间能进行通信,必须在两者之间建立一条通信链路,有两种方式建立通信链路

  1. 发送进程在通信之前用 显示的“建立连接”命令(原语) 请求系统位置建立一条通信链路,在链路使用完后拆除链路,该方式主要用于计算机网络
  2. 发送进程无须明确提出建立链路的请求,只需利用系统提供的发送命令(原语),系统会自动地为之建立一条链路,这种方式主要用于单机系统

根据通信方式的不同,又可把链路分成两种

  • 单向通信链路
  • 双向通信链路

- 3.2 信箱通信

3.2.1 信箱的结构

信箱定义为一种数据结构,逻辑上可分为两个部分

  1. 信箱头:用以存放有关信箱的描述信息,如信箱标识符、信箱的拥有者、信箱口令、信箱的空格数等
  2. 信箱体:由若干个可以存放消息(或消息头)的信箱格组成,信箱格的数目以及每格的大小是在创建信箱时确定的

3.2.2 信箱通信原语

系统为邮箱通信提供了若干条原语,分别用于

  1. 邮箱的创建和撤销
  2. 消息的发送和接收

3.2.3 信箱的类型

邮箱可由操作系统创建,也可由用户创建,创建者是邮箱的拥有者,据此可把邮箱分为以下三类

  1. 私有邮箱:用户进程创建,邮箱的拥有者有权从邮箱中读取消息,其他用户则只能将自己构成的消息发送到该邮箱中
  2. 公有邮箱:操作系统创建,提供给系统中的所有核准进程使用,核准进程既可以把消息发送到邮箱中,也可以从邮箱中读取发送给自己的消息
  3. 共享邮箱:由某进程创建,在创建时或创建后指明它是可共享的,同时必须指出共享进程的名字。拥有者和共享者都可读写

4. 直接消息传递系统实例

4.1 消息缓冲队列通信机制中的数据结构

  1. 消息缓冲区:在消息缓冲队列通信方式中,主要利用的数据结构是消息缓冲区

在这里插入图片描述
2. PCB中有关通信的数据项:在操作系统中采用了消息缓冲队列通信机制时,除了需要为进程设置消息缓冲队列外还应该在进程的PCB中增加消息队列队首指针,用于对消息队列进行操作,以及用于实现同步的互斥信号量mutex和资源信号量sm

在这里插入图片描述

4.2 发送原语

  • 发送进程在利用发送原语发送消息之前,应先在自己的内存空间设置一个发送区a,将一些信息填入

在这里插入图片描述

  • 发送原语可描述如下

在这里插入图片描述

  1. 根据a所设置的消息长度a.size 申请缓冲区i,并将a的数据复制到i
  2. 获取接收进程PCB(j)中的mq的指针(j.mq)
  3. 然后将 i 挂在 j.mq上

4.3 接收原语

在这里插入图片描述

六. 线程

1.定义(为什么需要线程)

1.1 进程的两个基本属性

  1. 进程是一个可拥有资源的独立单位,一个进程要能独立运行,它必须拥有一定的资源
  2. 进程同时又必须是一个可以独立调度和分派的基本单位,每个进程中有唯一的PCB,系统可以根据其PCB感知进程的存在,也可以根据其PCB中的信息,对进程进行调度,还可将断点信息保存在其PCB中,反之再利用进程PCB中的信息来恢复进程运行的现场

1.2 程序并发执行所需付出的时空开销

  1. 创建进程:系统创建一个线程时,必须为他分配器所必需的、除处理及意外的所有资源,如内存空间、I/O设备,以及建立相应的PCB
  2. 撤销进程:系统撤销进程时,又必须先对其所占有的资源执行回收操作再撤销PCB
  3. 进程切换:对进程进行上下文切换时,需要保留当前进程的CPU环境,设置新选中进程的CPU环境,须花费不少的处理及时间

2. 线程和进程的比较

2.1 调度的基本单位

  1. 在引入线程的OS中,线程作为调度和分派的基本单位,因此线程是独立运行的基本单位
  2. 当线程切换时,仅需保存和设置少量的寄存器内容,切换代价远低于进程
  3. 同进程内线程切换不会引起进程切换,不同进程内线程切换会引起进程切换

2.2 并发性

  1. 不仅进程之间可以并发执行,一个进程中的多个线程也可以并发执行

2.3 拥有资源

  1. 进程可以拥有资源,并作为系统中拥有资源的一个基本单位
  2. 线程本身并不拥有资源,而是仅有一点必不可少的,能保证独立运行的资源,如线程控制块TCB,用于指示被执行指令序列的程序计数器,保留局部变量,少数状态参数和返回地址等的一组寄存器和堆栈
  3. 线程除了拥有自己的少量资源外,还允许多个线程共享该进程所拥有的资源:属于统一进程的所有线程都具有相同的地址空间,这意味着线程可以访问该地址空间的每个虚地址
  4. 线程可以访问进程所拥有的资源:如已打开的文件、定时器等内存空间和线程申请到的I/O设备

2.4 独立性

  1. 同一进程中的不同线程之间的独立性比进程之间低很多
  2. 进程拥有独立地址空间和其他资源,除了全局共享变量外,不允许其他进程访问
  3. 线程共享进程的内存地址空间和资源,一个线程的堆栈可以被其他线程读、写,甚至完全清除

2.5 系统开销

  1. 进程创建和撤销时,系统都要为之分配、回收进程控制块,分配、回收其他资源如内存空间和I/O设备
  2. 线程创建或撤销时开销要小很多

2.6 支持多处理机系统

  1. 对于传统的单线程进程,不管有多少处理机,该进程只能运行在一个处理机上
  2. 对于多线程进程,可以将一个进程中的多个线程分配到多个处理机上,是它们并发执行

3. 线程的状态和线程控制块

3.1 线程运行的三个状态

  1. 执行:线程以获得处理机而正在运行
  2. 就绪:线程已具备了各种执行条件,只需在获得CPU就可执行
  3. 阻塞:线程在执行中因某件事而受阻而处于暂停状态,如一个线程执行从键盘读入数据的系统调用时

3.2 线程控制块TCB

用于控制和管理线程的信息

  1. 线程标识符:为每个线程赋予唯一的线程标识符
  2. 一组寄存器:包括程序计数器PC、状态寄存器和通用寄存器的内容
  3. 线程运行状态:用于描述线程正处于何种运行状态
  4. 优先级:描述线程执行的优先程度
  5. 线程专有存储区:用于线程切换时存放现场保护信息,和与该线程相关的统计信息
  6. 信号屏蔽:对某些信号加以屏蔽
  7. 堆栈指针:在线程运行时,会进行过程调用,且通常会出现多重嵌套,此时需要将每次过程调用中所使用的局部变量及返回地址保存起来,相应的TCB也必须设置两个指向栈堆的指针
  • 指向用户自己栈堆的指针:当前线程运行在用户态时,使用用户自己的用户栈来保存局部变量和返回地址
  • 指向核心栈的指针:当线程运行在核心态时使用系统的核心栈

3.3 多线程OS中的进程属性(P78)

  1. 进程是一个可拥有资源的基本单位
  2. 多个线程可并发执行
  3. 进程已不是可执行的实体 ,线程作为独立运行(或称调度)的基本单位。但是线程仍具有与执行相关的状态,如把某个进程挂起时,会把所有的线程挂起

七. 线程的实现

A

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值