第2章 进程的描述与控制

Posted 可能自洽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第2章 进程的描述与控制相关的知识,希望对你有一定的参考价值。

第2章 进程的描述与控制

一、进程的描述

1.进程的定义与特征

1.1 进程的定义

定义1:进程是允许并发执行的程序在某个数据集合上的执行过程
定义2:进程是由用户数据、系统数据和程序构成的实体

1.2 进程的特征

◼ 并发性:多个进程实体,同存于内存中,能在一 段时间内同时运行。
◼ 动态性:进程是进程实体的执行过程(有创建、执行、状态变化和运行终止被撤消的过程)
◼ 独立性:独立运行和资源调度的基本单位。
◼ 异步性:以不同的、不可预知的速度向前推进。
◼ 结构特征:进程包括用户数据、程序、系统数据。

例 什么是进程?比较进程与程序

进程的定义

定义1:进程是可以并发执行的程序在一个数据集合上的运行过程
定义2:进程是由正文段、用户数据段以及进程控制块共同组成的一个执行环境比较进程与程序

进程与程序区别 :

程序是静态的概念,进程是动态的概念
程序是永久的,进程是暂时存在的
程序与进程的存在实体不同。程序是指令的集合,进程是由正文段、用户数据段、系统数据段构成的实体

进程与程序联系 :

进程是程序的一次执行,进程总是对应一个特定的程序,执行程序的代码,一个进程必然对应至少一段程序。
一个程序可以对应多个进程。同一个程序段可以在不同的数据集合上运行,因而构成若干个不同的进程

2.进程控制块 (Process Control Block)

2.1 PCB概念

进程控制块是进程实体的一部分,是操作系统中最重要的记录型数据结构,PCB中记录了操作系统所需要的用于描述进程情况及控制进程运行所需的全部信息

2.2 进程控制块中的信息

◼ 进程标识符信息
① 外部标识符
② 内部标识符
③ 父进程标识符
④ 子进程标识符
◼ 处理机状态信息
①通用寄存器
②指令计数器
③程序状态字PSW
④用户栈指针
◼ 进程调度信息
①进程状态信息
②进程优先级
③进程调度所需要的其他信息
④事件
◼ 进程控制信息
①程序和数据的地址
②进程同步和通信机制
③资源清单
④链接指针

2.3 Linux的进程控制块

进程描述符和进程内核栈的存放

current宏(由esp的值获取当前进程控制块的地址)

movl $0xffffe000, %ecx
andl %esp, %ecx ( esp 的低位置0,结果送ecx)
movl %ecx, p (p指针指向当前进程)

例 进程存在的标志是什么?

进程存在的标志是:进程控制块 (PCB)

例 举例说明操作系统是如何利用进程控制块中的信息来管理进程的?

Linux2.6.11内核进程控制块 task_struct 的 time_slice 字段用来记录进程在CPU上的运行时间,当进程被进程调度程序选中开始运行时,内核为 time_slice 赋初值,每当产生一次时钟中断,当前运行进程的time_slice 值减1,当 time_slice 值减为0时,内核为进程设置调度标志,并重新进行一次进程调度。内核利用进程控制块的 time_slice 字段跟踪和控制进程在CPU上的执行时间,以防止进程超时使用CPU,独占CPU资源。

3.进程的基本状态

3.1 进程的三种基本状态

◼ 就绪状态:进程一但获得CPU就可以投入运行的状态。
◼ 执行状态:进程获得CPU正在运行的状态。
◼ 阻塞状态:进程由于等待资源或某个事件的发生而暂停执行的状态。

3.2 进程状态的转换

3.3 Linux的进程状态

Linux2.4.30进程状态

可运行状态(TASK_RUNNING)
可中断的等待状态(TASK_INTERRUPTIBLE)
不可中断的等待状态(TASK_UNINTERRUPTIBLE)
暂停状态(TASK_STOPPED)
僵死状态(TASK_ZOMBIE)

Linux2.4.30状态定义

#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 4
#define TASK_STOPPED 8
(定义文件:include/linux/sched.h)

Linux2.6.11进程状态

◼ 可运行状态(TASK_RUNNING )
◼ 可中断的等待状态(TASK_INTERRUPTIBLE )
◼ 不可中断的等待状态(TASK_UNINTERRUPTIBLE )
◼ 暂停状态(TASK_STOPPED )
◼ 跟踪状态(TASK_TRACED)
◼ 僵死状态(TASK_ZOMBIE )
◼ 僵死_撤消状态(EXIT_DEAD)

Linux2.6.11状态定义

#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_STOPPED 4
#define TASK_TRACED 8
#define EXIT_ZOMBIE 16
#define EXIT_DEAD 32
(定义文件:include/linux/sched.h )

4.进程的组织

当系统中有很多进程时,可以用队列把进程控制块组织起来,形成进程队列。把具有相同状态的进程放在同一个队列中,具有不同状态的进程就可形成不同的进程队列。处于就绪状态的进程构成的进程队列称为就绪队列,处于阻塞状态的进程构成的进程队列称为阻塞队列。

4.1 链接方式

把具有相同状态的PCB用其中的链接字,链接成一个队列。

4.2 Linux的进程链表

进程链表

Pidhash表及链表

4.3 结构数组

二、进程的控制

1.进程的创建

1.1 引起操作系统创建进程的事件

用户登录、作业调度、提供服务、应用请求

1.2 进程创建

调用创建新进程的原语来创建进程,一般步骤为:
申请空白PCB
为新进程分配资源
初始化进程控制块
将新进程插入就绪队列

1.3 Linux2.6.11进程创建系统调用和函数

① Clone() 系统调用
② Fork() 系统调用
③ Vfork() 系统调用
④ do_fork() 内核函数
⑤ Copy_process 内核函数

2.进程的阻塞

2.1 引起进程阻塞和唤醒的事件

①请求系统服务,如:打印服务。
②启动某种操作,如:启动I/O或启动打印机。
③ 新数据尚未到达,如:一个计算进程,如果新的输入数据还没有到达,则计算进程需要阻塞等待

2.2 进程阻塞的简化过程

①暂停进程的执行,将进程的状态改为阻塞态
②将进程插入相应的阻塞队列
③转进程调度例程,重新进行进程调度

3.进程的唤醒

3.1 进程唤醒过程

①将进程从阻塞队列中移出
②将进程状态由阻塞改为就绪
③将进程插入就绪队列

4.进程的终止

4.1 引起进程终止的事件

①正常结束
②异常结束
③外界干预

4.2 进程终止过程

①从进程PCB中读进程状态
②若进程正在执行则终止进程的执行
③若进程有子孙进程则终止子孙进程*(不一定)
④释放资源
⑤将终止进程的PCB“移”出

5.操作系统的启动和系统中进程的出现

三、操作系统内核

例 什么是操作系统内核?操作系统内核主要完成什么功能?

操作系统内核是计算机硬件的第一次扩充,内核执行OS与硬件关系密切,执行频率高的模块,常驻内存。
不同的OS内核包括的功能不同,多数OS内核包括下述功能:
支撑功能:中断处理、时钟管理、原语操作
资源管理功能:进程管理、存储器管理、设备管理

1.中断

1.1 中断的定义

中断是改变处理器执行指令顺序的一种事件。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应
计算机在执行程序的过程中,当出现中断时,计算机停止现行程序的运行,转向对这些中断事件的处理,处理结束后再返回到现行程序的间断处。

1.2 为什么需要中断

引入中断机制后,CPU可以与其它设备并行工作,能有效提高CPU的利用率,改善系统性能,支持系统的异步性。

1.3 中断类型

内部中断(同步中断或异常)

除法出错、调试、溢出、浮点出错、页故障 …
(内部异常的产生与当前执行指令相关,内部异常的检测由CPU内部逻辑实现,内部异常的响应发生在指令执行过程中)
(对于非法指令、除数为零等异常,无法通过异常处理程序恢复故障,因此不能回到原断点执行,必须终止进程的执行)

外部中断(异步中断)

I . 外部可屏蔽中断(I/O设备产生的中断)
II. 外部不可屏蔽中断(紧急事件引起的中断,如硬件故障)
(处理外部中断过程,PC值由中断隐指令自动保存,而通用寄存器内容由操作系统保存)

中断屏蔽
I/O设备发出的所有中断请求(IRQ)都产生可屏蔽中断。可屏蔽中断可以处于两种状态:屏蔽的(masked)或非屏蔽的(unmasked);
一个屏蔽的中断只要还是屏蔽的,控制单元就忽略它。在Intel体系结构的CPU中,当eflags寄存器的IF标志被清0时,由PIC发出的每个可屏蔽中断都由CPU暂时忽略。Linux中用cli和sti汇编指令分别清除和设置该标志

1.4 引起中断的原因

人为设置中断:在程序中人为设置中断
程序性事故:计算中出现除数为0
硬件故障:插件接触不良、电源掉电等
I/O设备:I/O设备被启动以后,一旦其准备就绪或I/O结束,便向CPU发出中断请求
外部事件:如用户通过键盘来中断现行程序

1.5 中断响应

响应外部中断的条件:开中断
响应外部中断的时机:CPU每执行完一条指令
内部中断:随时可能产生

1.6 单重中断的执行



注:现在的计算机系统大多允许中断嵌套,在这样的系统中,保护完现场后就可以打开中断,允许响应新的中断

1.7 中断服务子程序

(1) 中断向量的定义:

对不同中断源到来的信号编号,编号是一个无符号整数,称之为中断向量。(0-255)。不可屏蔽中断的向量和异常的向量是固定的,而可屏蔽中断的向量可以通过对中断控制器的编程来改变

(2) 中断向量表

中断向量表:(Interrupt Descriptor Table,IDT)是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中有相应的中断或异常服务子程序的入口地址信息。
内核在允许中断发生前,必须正确地初始化IDT。

(3) IRQ线与中断向量的关系

每个能够发出中断请求的硬件设备控制器都有一条名为IRQ(Interrupt ReQuest)的输出线。所有现有的IRQ线(IRQ line)都与一个名为可编程中断控制器的硬件电路的输入引脚相连。
IRQ线是从0开始顺序编号的,因此,第一条IRQ线通常表示成IRQ0。与IRQn 关联的Intel的缺省向量是n+32。但是,通过向中断控制器端口发布合适的指令,就可以修改IRQ和向量之间的映射。<<ULK 第四章>>

(4) 中断向量与中断向量表(中断描述符表)

在Linux中 IDT每一项对应一个中断或异常向量,每个表项由8个字节(64位)组成。因此,最多需256×8=2048字节来存放IDT。
IDT表的起始地址由操作系统执行lidt汇编指令加载到CPU的idtr寄存器中。idtr 寄存器使IDT可以位于内存
的任何地方,它指定IDT的线性基地址及其限制(最大长度)。在允许中断之前,必须用lidt汇编指令初始化idtr。(这段描述针对Intel体系结构)

(5) 如何找到中断服务子程序

cpu在响应中断前会保护主程序当前指令下面的一条指令的地址。就是将当前的IP和CS的内容入堆栈。cpu响应中断之后,将指令地址从堆栈中取出即可找到中断服务子程序入口地址。
CPU响应中断做如下动作:
①将中断类型码放入暂存器保存;
②将标志寄存器内容压入堆栈,以保护中断时的状态;
③将IF和TF标志清0,目的是防止在中断响应的同时又来别的中断,而将TF清0是为了防止CPU以单步方式执行中断处理子程序。这时要特别提醒,因为CPU在中断响应时自动关闭了IF标志,因此用户如要进行中断嵌套时,必须在自己的中断处理子程序中用开中断指令来重新设置IF;
④保护断点,断点指的是在响应中断时,主程序当前指令下面的一条指令的地址。因此保护断点的动作就是将当前的IP和CS的内容入栈,保护断点是为了以后正确地返回主程序;
⑤根据取到的中断类型码,在中断向量表中找出相应的中断向量,将其装入IP和CS,即呆自动转向中断服务子程序。

(6) 如何找到中断服务子例程

不同中断源对应不同的中断向量
根据中断向量查找中断向量表
从中断向量表中读取中断服务子程序的入口地址相关信息

例 中断处理和子程序调用都需要压栈以保护现场,中断处理一定会保护而子程序调用不需要保存其内容是

A、程序计数器
B、程序状态字寄存器
C、通用数据寄存器
D、通用地址寄存器
(子程序调用只需保存程序断点,即该指令的下一条指令的地址;
中断调用子程序不仅要保存断点(PC的内容),还要保存程序状态寄存器(PSW)的内容。在中断处理中,最重要的两个寄存器是PC和PSWR)

1.8 关于中断, OS要做的事情

初始化中断描述符表
初始化中断描述符表寄存器
执行中断处理程序
(当CPU检测到中断信号后,由硬件自动保存被中断程序的断点(即程序计数器PC),之后,硬件找到该中断信号对应的中断向量,中断向量指明中断服务程序入口地址(各中断向量统一存放在中断向量表中,该表由操作系统初始化)。接下来开始执行中断服务程序,保存PSW、保存中断屏蔽字、保存各通用寄存器的值,并提供与中断信号对应的中断服务,中断服务程序属于操作系统内核。)
需要了解的硬件:
不同中断源对应的中断向量值
可编程中断控制器接口
与中断相关的寄存器名称及其用途

2.时钟

2.1 时钟的重要性

定时测量
编译程序
防止进程垄断CPU或其他资源
与时钟相关的软件需要时钟支持

2.2 计算机系统中的时钟

大部分PC机中有两个时钟源,分别叫做RTC和OS时钟。RTC时钟也叫CMOS时钟,是一块时钟芯片,靠电池供电,为计算机提供计时标准,是最原始、最底层的数据。OS时钟产生于PC主板上的定时/计数芯片,在开机时有效。

2.3 时钟运作机制

2.4 操作系统的时钟机制

操作系统内核需要完成的定时测量功能:
1.保存当前的日期和时间;
2.维持定时器。
如何实现?
1.操作系统依靠时钟硬件(可编程间隔定时器)
2.时钟软件(时钟驱动程序)

(1) OS时钟硬件(可编程间隔定时器PIT)

◆功能:按指定的时间间隔产生时钟中断,测量逝去的时间,并触发与时间有关的操作。
◆ 组成:OS时钟由三个元件组成:晶振、计数器、保持寄存器。

(2) 时钟软件(时钟驱动程序)

时钟驱动程序做的几件事:
①维护日期、时间
②递减时间片并检查是否为零,防止进程运行超时
③对 CPU的使用情况记帐
④递减报警计数器

2.5 Linux时钟

Linux(2.4)的设计者将两次时钟中断的时间间隔定义为10ms(每秒产生100次时钟中断)。
时钟中断的频率取决于硬件体系结构。较慢的机器的节拍大约10ms(每秒产生100次时钟中断),而较快的机器节拍为大约1ms。
Linux用全局变量jiffes表示自系统启动以来的时钟中断次数

3.系统调用

3.1 系统调用定义

系统调用是一群预先定义好的模块,它们提供一条管道让应用程序或一般用户能由此得到核心程序的服务。系统调用是核心程序与用户程序之间的接口,在类UNIX系统中,系统调用多使用C语言所提供的函数库接口。如:在程序中,使用C的函数printf( )

3.2 系统调用与一般函数的区别

系统调用运行在系统态(核心态)而一般函数运行在用户态。
系统调用与一般函数调用的执行过程是不同的。当系统调用执行时,当前进程被中断,由系统找相应的系统调用子程序,并在系统态下执行,执行结果返回进程。
系统调用要进行“中断处理”比一般函数调用多了一些系统开销。

3.3 执行系统调用的过程

在用户程序中,需要请求操作系统服务的地方安排一条系统调用。
当程序执行到这一条命令时,正在运行的进程先传递系统调用参数,然后由陷入(trap)指令负责将用户态转为内核态,操作系统的访管中断处理程序得到控制权,它将按系统调用的功能号,借助例行子程序入口地址表转到相应的例行子程序去执行,在完成了用户所需要的服务功能后,退出中断,返回到用户程序的断点继续执行。

四、线程

1.线程的描述

1.1 线程概念

线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程只拥有在运行中必需的资源,包括程序计数器、一组寄存器和栈,但它可以与同属一个进程的其他线程共享进程的全部资源。

1.2 进程与线程的关系

1.3 线程的三种基本状态

就绪,运行,阻塞三种状态

1.4 线程控制块TCB

线程控制块
每个线程都由一个数据结构表示,包括它的基本状态、标识以及记账信息。
线程控制块中的信息
①线程标识符信息
②处理机状态信息
③线程调度信息
④线程控制信息
线程控制块的组织方式

1.5 线程与进程的关系

①资源和调度
②地址空间资源
③通信关系
④并发性
⑤系统开销

2.线程的控制

(1) 线程的创建
(2) 线程的终止
(3) 线程的调度与切换
(4) 线程的阻塞与唤醒
(5) 线程的同步

以上是关于第2章 进程的描述与控制的主要内容,如果未能解决你的问题,请参考以下文章

操作系统原理-图书主题

操作系统-第6章习题解析

第6章 进程控制_waitexec和system函数

第7章 进程关系_守护孤儿和僵尸进程

第26章 错误报告与应用程序恢复

计算机操作系统实验指导 (第3版) 第四篇 操作系统学习指导和习题解析 第17章:进程与线程 习题和答案