目录
1.1 进程的概念
1.1.1 进程的作用和组织
1.1.2 进程的状态与转换
1.1.3 进程控制
1.1.4 进程的通信
1.2 线程的概念
1.2.1线程的概念
1.2.2用户级线程和内核级线程
1.2.3多线程模型
1.1 进程的概念
1.1.1 进程的作用和组织
在多道程序环境下,允许多个程序并发执行。传统的程序本身是一组指令的集合,是一个静态的概念。引入进程(Process)的概念来描述多个程序并发执行的动态过程。
-
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。注:存在内核级线程的系统,内核级线程是调度的基本单位。
进程实体(进程映像) 就是进程动态执行过程的一个静态切片,能够准确描述程序此刻的运行状态。它包括PCB、程序段、相关数据段。
PCB(Process Control Block,进程控制块)主要包括以下四种信息,是进程存在的唯一标志。
-
进程描述信息:进程标识符(PID)、用户标识符(UID)。
-
进程控制和管理信息:进程当前状态、进程优先级、代码运行入口地址、程序的外存地址、进入内存时间、处理机占用时间、信号量使用。
-
资源分配清单:代码段指针、数据段指针、堆栈段指针、文件描述符、键盘、鼠标。
-
处理机相关信息(上下文):通用寄存器值、地址寄存器值、控制寄存器值、标志寄存器值、状态字。
程序段就是能被进程调度程序调度到CPU执行的程序代码段。注:程序可以被多个进程共享,即多个进程可以运行同一个程序,如登入不同的QQ号。
数据段:一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。
补充 :
- 优先级分静态和动态两种,动态优先级是根据运行情况而随时调整的。
进程实体也可以分为:
- PCB
-
共享正文段,又可分为代码区:二进制代码;全局区:常量(字符串常量和全局常量)、全局变量、静态变量。
- 数据堆段:动态分配的存储区。
-
数据栈段 :存放临时使用的变量、局部常量。注:写代码时不要返回局部变量,栈区数据在函数执行完自动释放。
1.1.2 进程的状态与转换
-
创建态:进程正在被创建,操作系统为进程分配资源、初始化PCB。
-
就绪态:其他条件(√)CPU(×)
-
运行态:占有CPU,并在CPU上运行。
-
阻塞态(等待态):因等待某一事件而暂时不能运行。
-
结束态:进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销PCB
![](https://img-blog.csdnimg.cn/1c0752b084fc4c22b7ec9db025ab19d6.png)
-
不可能所有进程全处于就绪态,因为CPU空闲时会选择一个就绪态进程变为运行态。当然所有进程处于阻塞态是可能的。
-
程序的封闭性是指进程执行的结果只取决于进程本身,不受外界影响。而并行执行的进程是异步的,这会导致不同执行速度下程序的执行结果是不同的,即失去封闭性。
-
进程之间有可能具有相关性,也可能是相互独立的。注:独立性与进程之间相互独立不同,进程的独立性是指进程是接收调度和分配系统资源的独立单位且有独立运行的能力。
- 同一个系统的进程(或线程)可以由系统调用的方法被不同的进程(或线程)多次使用。如:系统动态DLL库中的系统线程被不同的进程所调用。
1.1.3 进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在操作系统中,一般把进程控制用的程序段称为原语。
进程的创建
创建原语:申请空白PCB→为新进程分配所需资源→初始化PCB→将PCB插入就绪队列。
引起进程创建的条件:
-
用户登录。分时系统中,用户登录成功,系统会为其建立一个新的进程。
-
作业调度。多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程。
-
提供服务。用户向操作系统提出某些请求时,会新建一个进程处理该请求。
-
应用请求。由用户进程主动请求创建一个子进程。注:创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程拥有的资源。子进程撤销时归还资源给父进程,父进程撤销时它的所有子进程撤销。
进程的终止
撤销原语:从PCB集合中找到终止进程的PCB→若进程正在运行,立刻将CPU给就绪态进程→终止其所有子进程→将该进程的资源归还给父进程或OS→删除PCB
引起进程终止的事件:
-
正常结束。表示进程的任务已完成并准备退出运行。
-
异常结束。如存储器越界、保护错、非法指令、特权指令错、运行超时、算术运算错、I/O故障等。
-
外界干预。操作员或操作系统干预、父进程请求或父进程终止
进程的阻塞
阻塞原语(Block):找到要阻塞的进程对应的PCB→保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行。→将PCB插入对应事件的等待(阻塞)队列。
引起进程阻塞的事件:
- 需要等待系统分配某种资源。
- 需要等待相互合作的其他进程完成工作。
进程的唤醒
唤醒原语(Wakeup):从事件等待队列中找到PCB→将PCB从等待队列移除,设置进程为就绪态→将PCB插入就绪队列,等待被调度。
引起进程唤醒的事件:引进进程阻塞的事件已解决。
阻塞原语和唤醒原语必须成对使用。如果在某进程中调用了Block原语,则必须在与之合作或其他相关的进程中安排一条相应的wakeup原语。否则,阻塞进程将因不能被唤醒而永久地处于阻塞状态。
进程的切换
切换原语:将运行态进程的运行环境信息存入其PCB并移入就绪队列→选择优先级最高的就绪态进程执行,并更新其PCB准备新进程所需的运行环境。注:切换原语可以完成运行态→就绪态和就绪态→运行态。
引起进程切换的事件:
- 当前进程时间片到。
- 有更高优先级的进程到达。
- 当前进程主动阻塞。
- 当前进程终止。
1.1.4 进程的通信
进程是分配系统资源的最小单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。
进程通信(Inter-Process Communication,IPC)是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三类。
一、共享存储
![](https://img-blog.csdnimg.cn/19b63ae3312b4154966c9162d8183149.png)
基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。
基于存储区的共享:操作系统在内存中划出一块共享存储区,数据的形式、存放位置都由通信进程控制,而不是系统。这种共享方式速度很快,是一种高级通信方式。
二、消息传递
进程间的数据交换以格式化的消息(Message)为单位。
直接通信方式
发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从信息缓冲队列中取得消息。
![](https://img-blog.csdnimg.cn/7267a349ab4e4b128eceef875ca2d0a7.png)
间接通信方式
发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。这种中间实体一般称为信箱。该通信方式广泛应用于计算机网络中。
两个通信原语:发送原语和接收原语。
![](https://img-blog.csdnimg.cn/9239b7f6072048d5a34660d2e53629d6.png)
三、管道通信
![](https://img-blog.csdnimg.cn/437fd7dad64c4d9fad68449873d4b5ad.png)
- 设置一个特殊的的共享文件(管道),其实就是一个内存缓冲区,只允许一边写入、另一边读入。
- 一个管道只能实现半双工通信。
- 实现双向同时通信要建立两个管道。
- 各进程要互斥访问管道(由OS负责实现互斥)
- 管道写满时,写进程阻塞。管道读空时,读进程阻塞。
![](https://img-blog.csdnimg.cn/38c6ca1233634ba89e39752036d89d24.png)
1.2 线程的概念
1.2.1线程的概念
线程(Thread)是一种“轻量级进程”。引入线程可以减小程序在并发执行时所付出的时空开销(一个进程内部若有多个线程,线程的切换只需要很少的时空开销)。
引入线程后,线程就是系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。
进程是系统进行资源分配的独立单位。
![](https://img-blog.csdnimg.cn/18c0825c2c2947c9bd247e8a36dca1bf.png)
![](https://img-blog.csdnimg.cn/11fc6d85dc884d848cd2ae963a6c9e9a.png)
![](https://img-blog.csdnimg.cn/6f8043807e0544fa8ec20a7118e51c4e.png)
1.2.2用户级线程和内核级线程
用户级线程由应用程序通过线程库实现,所有的线程管理工作和线程切换都由应用程序负责(包括线程切换)。
在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。用户级线程就是只能在用户视角看到的线程。
![](https://img-blog.csdnimg.cn/f812cb4b29444404b6c40461cc460036.png)
优点:用户级线程切换在用户态即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,降低并发度。多个线程依旧不可在多核处理机上并行运行。
内核级线程的调度、切换等管理工作由操作系统内核完成,因此内核级线程的切换必须在核心态下才能完成。
操作系统会为每个内核级线程建立相应的线程控制块(TCB),通过TCB对线程进行管理。内核级线程就是从OS视角能看到的线程。
![](https://img-blog.csdnimg.cn/e937f3b846c048899375d1b4b0d90992.png)
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多个线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到管态,因此线程管理成本高。
1.2.3多线程模型
有些系统同时支持用户级线程和内核线程,由于用户级线程和内核级线程的连接方式的不同,从而形成了下面三种不同的多线程模型。![](https://img-blog.csdnimg.cn/b50232cfd331496186996a4e71df675c.png)
-
多对一模型:线程的调度和管理在用户空间完成,仅当用户线程需要访问内核时,才将其映射到一个内核级线程上,但是每次只允许一个线程进行映射。
-
一对一模型:并发能力强,但线程管理成本高。
-
多对多模型:将n个用户线程映射到m个内核级线程上,要求n≥m。克服了多对一模型并发度不高的缺点和一对一模型用户进程占用太多内核级线程而开销太大的缺点。
补充:
- 整个系统只有一个键盘,而且键盘输入速度较慢,完全可以使用一个线程来处理整个系统的键盘输入。
- 进程中的线程共享进程内的全部资源,但进程中某线程的栈指针对其他线程是透明的,不能与其他线程共享。