操作系统总结整理
第一章
1.现代操作系统都支持多任务,并具有并发、共享、虚拟和异步性特征
- 并发和并行是两个不同的概念
- 并发:是指两个或多个事件在同一时间间隔内发生,并发强调“同一时间间隔”
- 并行:是指多个事件同时发生
- 共享
- 系统中的的资源可供内存中多个并发执行的进程共同使用
- 异步性
- 进程以不可预知的速度向前推进
- 虚拟
- 通过某种技术把一个物理实体变成若干逻辑上的对应物
2.在单CPU单核的系统中,用户可以感觉到两个不同程序似乎在同时工作,而且互不干扰,是因为操作系统使两个程序在CPU上快速地轮流交替执行,实现了“并发”的功能
3.在单CPU的电脑上用迅雷下载文件,同时用Excel做表格,这体现了操作系统的【并发】特性
4.现代操作系统具有并发的特性,主要是由于引入了“多道程序系统”
5.并发特征重点强调是【同一时间间隔】而不是并行多个事件【同一时间发生】
6.资源共享的方式
- 互斥共享
- 指任意时刻一种资源只能被一个进程访问
- 同时共享
- 指从宏观上看,资源可以被多个进程同时访问,如对磁盘的访问
7.并发与共享的关系
- 相互依赖
- 如果系统不支持并发,资源的使用都是独占的,不需要共享资源
- 另一方面,如果不能实现有效的资源共享,并发就不可能得到很好的支持
8.并发与共享的关系是相互依赖的
9.从宏观上看,某时段内office Word和Adobe Photoshop同时向打印机请求打印服务,这属于操作系统支持特征之间的【共享性】
10.从宏观上看,资源可以被多个进程同时访问,操作系统的这一特性被称为【共享】
11.如果系统不支持并发,则不需要共享资源,因为资源的使用都是独占的
12.虚拟不是实际存在的
13.物理实体是实际存在的,而虚拟仅仅是用户感觉到的
14.虚拟是指通过某种技术把一个物理实体变成若干逻辑上的对应物
15.虚拟可以使每个用户都感觉到自己独占了系统资源
16.操作系统的异步性是指程序的运行结果,运行次序以及多次运行的时间都不确定
17.操作系统的功能
- 内存管理
- 内存分配
- 内存分配的主要任务是【为每道程序分配内存空间】,使他们各得其所,提高存储器的利用率,以减少不可用的内存空间。
- 允许正在运行的程序申请附加的内存空间,以适应程序和数据动态增长的需要。
- 操作系统可以采用两种方式实现内存分配,即静态分配方式和动态分配方式
- 内存保护
- 一是使操作系统内核的控件不会被用户随意访问,以保证系统的安全和稳定
- 二是确保每道用户程序都在自己的内存空间中运行,互不干扰
- 实现方式可以采用界限寄存器存放允许程序访问的地址区间的上限和下限
- 地址映射
- CPU执行程序过程中访问内存时,需要把程序的逻辑地址转变为物理地址的功能,这个转换的过程叫地址映射
- 内存扩充
- 借助于虚拟存储技术,从逻辑上扩充内存容量,使系统能够向用户提供比物理内存大的存储容量
- 机制可以实现【请求调入】和【置换】功能
- 内存分配
- 进程管理
- 进程的描述与组织
- 进程控制块
- 进程控制
- 完成进程创建、撤销进程、唤醒进程和阻塞进程等操作
- 进程同步
- 完成多个进程(含线程)运行的协调与互斥
- 进程通信
- 用来实现进程之间的信息交换
- 进程调度
- 是从多个可执行的进程中选出一个进程,把处理机分配给它
- 进程的描述与组织
- 设备管理
- 缓存管理
- 管理各种缓冲区
- 设备分配
- 分配用户I/O所需要的设备
- 设备处理
- 由设备驱动程序来实现CPU与设备控制器之间的通信
- 设备独立性
- 设备独立性功能使应用程序独立于物理设备
- 虚拟设备
- 把一个物理设备变换为多个对应的逻辑设备,使一个物理设备能供多个用户共享
- 缓存管理
- 文件管理
- 文件存储空间的管理
- 目录管理
- 目录项包括文件名、文件属性及文件的地址等信息
- 文件的读、写管理和存取控制
- 防止未经核准的用户存取文件
- 防止冒名顶替存取文件
- 防止以不正确的方式使用文件
- 提供用户接口
- 操作系统向最终用户提供
- 命令行:分为联机用户接口(键盘操作命令和命令解释程序组成) 和 脱机用户接口(批处理用户接口)
- 图形用户接口
- 向程序员提供应用程序与操作系统之间的接口即系统调用
- 操作系统向最终用户提供
18.操作系统的功能有内存管理、进程管理、设备管理、文件管理和提供用户接口等功能
19.内存管理的目的是提高内存的利用率
20.内存管理的主要任务是为多道系统的运行提供良好的环境,方便用户使用内存,提高内存的利用率,以及从逻辑上扩充内存以实现虚拟存储
21.为了实现内存的分类,需要的数据接口和功能支持包括
- 用于内存分配数据结构
- 内存分配功能
- 内存回收功能
22.为了实现内存的分配,需要的数据结构和功能支持不包括【用于内存独占数据接口】
23.要使系统能够向用户提供比物理内存大的存储容量,需要【内存扩充】
24.内存扩充的任务是借助于虚拟存储技术,从逻辑上扩充内存容量,使系统能够向用户提供比物理内存大的存储容量
25.内存扩充机制可以实现【请求调入】和【置换】功能
26.属于内存管理的功能:内存分配、内存保护、内存扩充、地址映射
27.为了能将逻辑地址变换为物理地址,在系统中必须设置【地址映射】
28.操作系统的内存管理功能中,把程序的逻辑地址转变为物理地址的功能是【地址映射】
29.内存分配的主要任务是【为每道程序分配内存空间】,使他们各得其所,提高存储器的利用率,以减少不可用的内存空间。允许正在运行的程序申请附加的内存空间,以适应程序和数据动态增长的需要。操作系统可以采用两种方式实现内存分配,即静态分配方式和动态分配方式
30.内存映射不属于内存管理的功能
31.完成进程创建、撤销进程、唤醒进程和阻塞进程等操作,是进程管理中的【进程控制】
32.一个进程正常执行完毕时,需要对其进行撤销。完成这一工作的操作系统功能是【进程控制】
33.从多个可执行的进程中选中一个进程,把处理机分配给它指的是【进程调度】功能
34.用来实现进程之间的信息交换的是【进程通信】功能
35.完成多个进程(含线程)运行的协调与互斥是【进程同步】功能
36.有社保驱动程序来实现CPU与设备控制器之间的通信指的是设备处理功能
37.文件大小的管理不属于文件管理的功能
38.在类UNIX系统中,系统调用多用C语言所提供的【库函数】
39.在提供【图形用户接口】的操作系统中,用户可以轻松地通过选择窗口、菜单、对话框、滚动条、图标等简单的操作来完成对作业和任务的提交与控制
40.操作系统提供给【程序员】的接口是【系统调用】
41.操作系统提供给【应用程序】的接口是【系统调用】
42.操作系统内核与应用程序之间的接口是【系统调用】
43.操作系统提供的用户接口包括:命令接口、程序接口、图形用户接口
44.用户在系统中试图进行文件操作时,需要使用操作系统提供的【系统调用】
45.操作系统的体系结构是操作系统作为一种软件的体系结构,对操作系统的可靠性、灵活性和可移植性等方面都有重要的影响
46.软件体系结构是一个复杂软件系统的高层结构,为软件系统提供了一个结构、行为和属性的高级抽象,包括属性元素的结构、元素间的相互关系、以及指导元素集成的模式和约束三个方面
47.操作系统体系结构模型有:
- 简单的监控程序模型
- 这个阶段的典型代表是FMS和IB-SYS
- 单体结构模型
- 具有单体内核结构的典型操作系统有UNIX系统、MS-DOS、Linux、Mac OS X 和BSD等系统
- 由于各子程序间可以相互调用,系统结构关系复杂,容易引起循环调用和死锁。修改一个子程序往往会导致若干个相关部分的变动,系统的可修改性、可维护性比较差
- 层次结构模型
- 分层结构最经典的例子是Dijkstra的THE系统
- 基本思想是将操作系统分解为多个小的、容易理解的层,系统功能被隔离在不同的层中,每一层提供对系统功能的部分抽象,然后采用【单向调用】的顺序,形成一连串彼此连续的对系统功能的“抽象串”,最终形成对整个系统的完整抽象
- 客户/服务器模型与微内核结构
- 典型代表是卡内基梅隆大学研制的Mach操作系统、WindRiver公司的Vxworks、微软研发的Windows NT、我国自研的
- 微内核结构用一个【水平分层】的结构待体力传统的纵向分层的结构,这样带来的好处是系统结构清晰,具有较高的灵活性、可靠性和可维护性
- 在微内核操作系统中通过核心层到用户层服务的调用方式来实现扩展的技术指的是【UPCALL技术】
- 动态可扩展结构模型
- 这类结构的典型系统是MIT的Exokernel操作系统和Harvard大学的VINO操作系统
48.动态可扩展结构模型是适应当前应用变化的新一代操作系统体系结构模型,其应用前景十分广阔
49.微内核设计有一个严重的缺点就是【效率不高】:微内核采用消息传递机制来实现组件间的通信,消息收发的代价远比操作系统直接使用系统调用要大,因为任何消息传递潜在地都有可能跨越机器边界,那么参数就需要被复制而不是从发送者的堆栈进行引用
50.微内核更多的是起着信息交换的作用,有较高的灵活性、可靠性、可维护性,完全适宜于网络环境以及分布式计算模型
51.DOWNLOAD技术(核心扩展技术)是当前操作系统扩展性研究的主要方向
52.操作系统体系研究整个操作系统内各组成成分,以及成分间和成分内部存在的单体架构
53.程序是指令的集合,程序的执行就是按照某种控制流执行指令的过程
54.一个执行周期可以划分成两个步骤,分别是取值周期和执行周期
55.指令周期:一个单一指令需要的处理
56.指令执行的时候,需要先从【程序计数器】中取出指令,之后该值自动加1,取出的指令放到【指令存储器】中,CPU对他进行译码,进而开始执行
56.CPU中的【程序计数器】存放当前程序下一条要执行的指令在内存中的地址,CPU从该地址去到指令,并将该指令放入CPU的【指令寄存器】中
57.累加器是临时存储体,可进行累加操作,属于指令存储器
58.取指令和执行指令是【由硬件完成】的,不同硬件的体系结构支持不同的指令集合,为某一种硬件平台开发的操作系统不能直接在另一种体系结构的硬件上运行
第二章
59.操作系统中心最核心的概念是【进程】
60.从微观上,任意时刻一个CPU上只有一个程序在执行
61.程序并发执行是指在【同一时间间隔内】运行多个程序一个程序执行结束之前,可以运行其他程序
62.程序并发执行的特点
- 间断性
- 【资源的有限】使并发执行的程序呈现执行过程的【间断性】
- 失去封闭性
- 程序在并发执行时,由于他们共享资源或者合作完成同一项任务,系统的状态不再是只有正在执行的某一个程序可以[看见]和改变
- 不可再现性
- 指程序在并发执行时,由于失去了封闭性,也将导致失去执行结果的可再观性
- 同一个程序在输入完全相同的情况下多次运行,可能会出现不同的运行结果
63.使用12306买票时,每个用户提交订单,余票都会减少,这体现了程序并发执行的【失去封闭性】特点
64.程序并发执行时,由于他们共享资源,而资源数量又往往少于并发执行的程序数量,系统不能保证每个程序不受限制的占用资源,这是其【间断性】特点
65.程序顺序执行的特点
- 顺序性
- 前一操作结束后,才能执行后续操作
- 封闭性
- 程序在运行时独占全机资源,各资源的状态只有本程序才能改变
- 可再现性
- 当程序多次重复执行时,其执行结果相同
66.某计算圆周率的程序(无输入但输出值一样)在同一个Windows机器上第一次运行耗时3分钟,第二次运行耗时5分钟,这体现了程序并发执行的【间断性】特点
67.对于顺序执行指令,其执行后,PC(程序计数器)寄存器的变化为PC值加一
68.程序执行过程中,程序计数器(PC)的内容表示下一条要执行的指令的地址
69.程序在并发执行时,由于他们共享资源,导致程序的执行时时断时续的,因此失去了【封闭性】
70.为了对共享资源进行管理,操作系统引入了【信号量机制】
71.进程是允许并发执行的程序在某个【数据集合】上的运行过程
72.程序运行时,根据【指令计数器】的值,将指令从内存取到CPU的指令寄存器中,经过译码后完成各种操作
73.执行环境的动态变化表征程序的运行,一个进程对应了一个这样的环境。进程代表了程序的执行过程,是一个动态的实体,它随着程序中指令的执行而不断变化,在某个特定时刻的进程内容被称之为【进程映像】
74.进程的特征包括:
- 并发性
- 多个进程实体能在 一段时间间隔内同时运行
- 动态性
- 表现在因执行程序而创建进程,因获得CPU而执行进程的指令,因运行终止而被撤销的动态变化过程
- 独立性
- 在没有引入线程概念的操作系统中,进程是独立运行和资源调度的基本单位
- 异步性
- 指进程的执行时断时续,进程什么时候执行,什么时候暂停都无法预知,呈现一种随机的特性
- 结构特征
- 进程实体包括用户正文段,用户数据段和进程控制块
75.程序和进程的区别
- 程序
- 静态的
- 永久的存在的
- 指令的集合
- 进程
- 动态的
- 暂时存在的
- 包含了正文段、用户数段和进程控制块实体
76.在没有引入【线程】概念的操作系统中,【进程】是独立运行和资源调度的基本单位
77.在支持【线程】的操作系统中,线程是被系统【独立调度和分派】的基本单位(【线程】是【程序执行】的【基本单位】),进程是【拥有资源】的基本单位
78.进程的组成
- 正文段
- 存放被执行的机器指令
- 用户数据段
- 存放进程在执行时直接进行操作的用户数据
- 进程控制块
- 存放程序的运行环境
79.当操作系统支持程序并发执行时,并发执行的程序可能是同一个程序在不同数据集合上的执行,也可能是不同的程序在不同数据集合上的执行
80.在计算机内部,程序的执行过程实际上对应了一个执行环境的总和,这个执行环境包括【程序中的各种指令和数据、寄存器的值、用来保存临时数据的堆栈、被打开文件的数量、输入/输出设备的状态】等
81.进程标识符信息:进程标识符用于唯一标识一个进程。进程控制块中除了存有本进程的标识符外,还存放其父进程、子进程的标识符
82.操作系统所需要的,用于描述进程情况及控制进程运行所需的全部信息记录在【进程控制块】中
83.进程实体存在的标识是【进程控制块】
84.应用程序对应的进程由程序、用户数据和操作系统管理进程所需要的【进程控制块】构成
85.操作系统感知进程存在的唯一标志是[进程控制块]
86.进程控制块包含的信息
- 进程标识符信息
- 进程标识符用于唯一标识一个进程
- 处理机状态信息
- 进程控制块中保留的处理机状态信息通常包括通用寄存器、指令计数器、程序状态字PSW和用户栈指针
- 进程调度信息
- 进程状态信息、进程优先级和进程调度所需的其他信息
- 进程控制信息
- 程序和数据的地址、进程同步和通信机制、资源清单以及链接指针
87.为了方便管理,操作系统把具有相同状态的进程的进程控制块【PCB】组成一个进程队列,PCB的组织方式通常有【链接】和【索引】两种
88.进程控制块是进程实体的一部分,是操作系统中最重要的数据结构。
89.进程控制块中记录了操作系统所需要的,用于描述进程情况及控制进程运行所需要的全部信息
90.一个被创建的进程的初始状态应该是【就绪态】
91.进程控制块的状态字段由一组【标志】组成
92.当前进程的时间片是否用完是由操作系统的【时钟】机制进行检查的。当进程在CPU上运行的时间片长度递减为0时,系统把CPU分配给其他【就绪态】进程
93.进程所请求的一次【打印输出完成后】,进程是的状态会从【阻塞态变为就绪态】
94.进程有三种基本状态,不可能的状态转换是【执行态到就绪态、阻塞态到执行态】 -》口诀:执-》阻-》就 执和就可相互转换
95.进程的三种基本状态
96.唤醒过程和阻塞过程
97.一个进程完成打印后,释放打印机,将有可能导致另一个进程【由阻塞态变化为就绪态】,因为释放了资源
98.Linux不同版本的进程状态以及状态定义
- Linux2.4.30进程状态以及状态定义
- 可运行状态
- 可中断的等待状态
- 不可中断的等待状态
- 暂停状态
- 僵死状态
- Linux2.6.11进程状态以及状态定义
- 可运行状态
- 可中断的等待状态
- 不可中断的等待状态
- 暂停状态
- 跟踪状态
- 僵死状态
- 僵死_撤销状态
99.链接方式:把系统中具有相同状态的进程的进程控制块(PCB)用链接字链接成一个队列
100.操作系统对进程的组织是通过【定义数据结构】来实现的
101.操作系统索引进程的方式是建立【索引表】
102.索引方式:系统根据所有进程的状态,建立几张索引表,索引表的每一个表项指向一个PCB【进程控制块】的物理块
103.当系统中有很多进程时,可以把进程控制块用队列组织起来,形成进程队列
104.进程的控制包括进程的创建、进程的阻塞、进程的唤醒、进程的终止(撤销),故用于进程控制的原语有创建原语、阻塞原语、唤醒原语、撤销原语
105.在操作系统启动并正常工作后,系统中的已有进程在执行过程中都可以通过【系统调用】创建新进程
106.当新进程被创建时,有两种执行可能
- 父进程与子进程并发执行
- 父进程等待,直到某个或全部子进程执行完毕
107.需要创建进程的情况
- 用户登录
- 作业调度
- 提供服务
- 应用请求
108.调用创建新进程的系统调用来创建进程的一般步骤有
- 申请空白进程控制器【PCB】
- 为新进程分配资源
- 初始化进程控制块
- 将新进程插入就绪队列
109.操作系统在以下情况下可能进行进程的阻塞和唤醒操作
- 请求系统服务
- 启动某种操作
- 新数据尚未到达
- 无新工作可做
110.简述完成进程阻塞的过程
- 将进程状态改为阻塞态
- 将进程插入相应的阻塞队列
- 将进程调度程序,从就绪进程中选择进程为其分配CPU
111.简述进程的唤醒过程
- 将进程从阻塞队列中移出
- 将进程状态由阻塞态改为就绪态
- 将进程插入就绪队列
112.级联终止是指如果一个进程终止,那么他的【所有子进程】也被终止
113.操作系统通过系统调用完成进程终止的一般过程如
- 从进程PCB中读进程状态
- 若进程正在执行,则终止进程的执行
- 若进程有子孙进程,在大多数情况下需要终止子孙进程
- 释放资源
- 将终止进程的PCB移出
114.当硬盘被划分多个分区,同时安装了多个操作系统时,每个分区都有自己的引导扇区,但是整个硬盘有一个主引导扇区,主引导扇区就是硬盘的【0柱面0磁道1扇区】
115.启动操作系统时,通过执行【主引导扇区】的代码,判断当前被激活的分区,然后加载被激活分区的引导扇区,通过该引导扇区代码的执行加载该激活分区的操作系统
116.【操作系统内核】是计算机硬件的第一次扩充
117.操作系统内核功能
- 支撑功能
- 中断处理
- 时钟管理
- 原语操作(原子操作)
- 资源管理功能
- 进程管理
- 存储器管理
- 设备管理
118.引入中断机制前,当在CPU上执行的程序遇到I/O时,CPU采用【反复轮询】的方式,检测本次I/O是否结束
119.在Intel微处理器手册中,把同步中断和异步中断分别称为异常(Exception)和中断(Interrupt)
120.中断
- 中断描述符表
- 是一个系统表,每个中断或异常与常量相联系
- 中断向量
- 断向量是对不同中断源到来的信号进行编号,该编号是一个无符号整数(0~255)
- 同步中断(内部中断 或 异常)
- 当指令执行时[由CPU控制]单元产生
- 只有在一条指令终止执行(不一定已经执行完毕)后CPU才会发出中断(如:除法出错,调试,溢出、浮点出错等)
- 异步中断(外部中断)
- 是由【其他硬件设备】随机产生的
- 外部可屏蔽中断
- 由I/O设备产生的中断
- 外部不可屏蔽中断
- 由紧急事件引起的中断(如:硬件故障)
121. 响应中断
- 条件
- 对于可屏蔽中断,开中断是响应中断的前提
- 时机
- 对于外部中断,CPU每执行完一条指令都会检测是否有外部中断信号的到来,若有,这转中断处理过程
122.中断向量是对不同中断源到来的信号进行编号,该编号是一个无符号整数(0~255),称之为【中断向量】
123.中断子程序的入口地址相关信息在:内存中的地址 = idtr中的地址 + 8 * 中断向量的值 = 0 + 8 * 15 = 120
124.为了使CPU与I/O设备并行工作,引入了【中断机制】;当正在执行的进程P请求I/O时,CPU启动这次I/O,之后转去执行其他进程,期间,CPU与进程P的I/O是并行工作的。进程P完成I/O之后,转变为就绪状态
125.中断是改变处理器执行指顺序的一种事件,这样的事件与CPU芯片内外部硬件电路产生的电信号相对应
126.单重中断的处理过程
- 系统关闭中断
- 转中断处理程序
- 保护完现场
- 恢复现场
127.引起中断的原因
- I/O设备
- 硬件故障
- 程序性事故
- 人为设置中断
- 外部事件
128.Linux的时间基准是1970年1月1日凌晨0点
129.系统可以利用【时钟机制】限制一个用户进程在CPU上连续执行的时间
130.RTC时钟也称为CMOS时钟,是一块时钟芯片,靠电池供电,为计算机提供时标准,是最原始,最底层的数据
131.计算机开机加电后,操作系统通过BIOS获取当前RTC时钟的值作为系统的初始时间,操作系统初始化后启动自己的时钟硬件,既可编程间隔定时器PIT(Programmable Internal Timer)
132.PIT可以按照一定的频率产生【时钟中断】(Timer Interrupt),以告知内核有一个时间间隔过去了
133.【可编程间隔定时器】的功能是按指定的时间间隔产生时钟中断,测量逝去的时间,并触发与时间有相关的操作
134.可编程间隔定时器的晶振够产生固定频率的脉冲,每次产生一次脉冲,计数器的值减1,当计数器的值减为0时,产生一次时钟中断信号
135.由可编程间隔定时器产生的时钟中断信号送到【可编程中断控制器】的【时钟中断】信号引脚上
136.时钟驱动程序也称之为时钟中断处理程序,每产生一次时钟中断信号,操作系统内核要执行【时钟驱动程序】
- 时钟软件-时钟驱动程序(也称时钟中断处理程序)
- 时钟驱动程序的功能
- 维护日期和时间
- 递减当前进程在一个时间片内的剩余执行时间,并检查是否为零,防止进程运行超时
- 对CPU的使用情况记账
- 递减报警计数器
137.Linux用于全局变量jiffes表示自系统启动以来的【时钟滴答数】
138.OS时钟是由可编程定时/计数器输出脉冲触发中断而产生的,【输出脉冲的周期】称为一个【时钟滴答】
139.时钟源
- 应用程序有关时间的应用
- OS时钟:产生于PC主板上的定时/计数芯片,在开机时有效,由操作系统控制
- BIOS提供对RTC有关操作的固化程序
- 实时时钟(RTC):是最原始、最底层的数据
140.大部分PC中有两个时钟源,分别称为:OS时钟 和 实时时钟
141.操作系统内核完成的定时测量
- 保存当前的日期和时间
- 以便能通过系统调用把他们返回给用户程序
- 让用户程序获取当前的日期和时间
- 也可以由内核本身把当前时间作文件和网络包的时间戳
- 维持定时器
- 能够告诉内核或用户程序某一时间间隔已经过去了
142.操作系统完成定时测量功能需要依靠
- 时钟硬件(可编程间隔定时器PIT)
- 时钟软件(时钟驱动程序,也称之为时钟中断处理程序)
143.OS时钟管理硬件(可编程间隔定时器PIT)构成
- 晶振
- 计数器
- 保持寄存器
144.计算机的脉搏是【时钟】,计算机的很多活动都是有定时测量来驱动的(如:屏幕保护功能)
145.中断是改变处理器执行指令顺序的一种事件
146.进程是允许并发执行的程序在某个数据集合上的运行过程
147.系统调用是系统程序与用户程序之间的接口,在类UNIX系统中,系统调用多使用[C语言提供的库函数]作为接口
148.普通函数执行的过程中,在函数调用前后,进程都处于【用户态】
149.系统调用是一群预先定义好的模块,他们提供一条管道让应用程序或一般用户能由此得到核心程序的服务
150.系统调用的类型
- 进程控制类系统调用
- 创建、撤销进程
- 获得、改进进程属性
- 文件操作类系统调用
- 创建文件
- 打开文件
- 读/写文件
- 关闭文件
- 删除文件
- 设备管理类系统调用
- 请求设备
- 释放设备
- 通信类系统调用
- 打开连接
- 关闭连接
- 交换信息
- 信息维护类系统调用
- 返回系统当前日期、时间、版本号、用户数、空闲内存、磁盘大小等信息
151.用户态执行:用户空间是指用户进程所处的地址空间,一个用户进程不能访问其他进程的用户空间,只有系统程序才能访问其他用户空间,当CPU执行【用户空间的代码】时,称该进程在【用户态】执行
152.系统态执行:系统空间是指含有一切系统核心代码的地址空间,当CPU执行【系统核心代码】时,称进程处于【系统态】执行
153.系统调用与一般函数调用的区别
- 系统调用运行在核心,而函数调用运行在用户态
- 执行过程不同
- 系统调用要进行“中断处理”,比一般函数调用多了一些系统开销
154.Linux中的系统调用举例:
- fork创建一个新进程
- execve运行可执行文件
155.为了把系统调用号与相应的系统调用实现程序关联起来,Linux内核利用了一个系统调用【分派表】
156.系统调用的优点:使编程更加容易,把用户从学习硬件设备的低级编程特性中解放出来,极大地提高了系统的安全性
157.操作系统【同步机制】的主要任务就是要保证在多任务共享资源的情况下,程序执行能得到正确的结果
158.在多道程序环境下,进程之间可能存在资源共享关系和相互合作关系。进程同步两个任务
- 一是对具有资源共享关系的进程,保证诸进程以【互斥】的方式访问临界资源(临界资源是必须以互斥方访问的共享资源)
- 二是对具有相互合作关系的进程,保证相互合作的诸进程协调执行。相互合作的进程可能同时存在资源共享的关系
159.退出区代码在临界区代码之后执行,完成释放临界区访问权的功能
160.临界区是一段程序【临界区是进程中访问临界资源的那段代码,代码即是一段程序,访问临界资源是通过执行临界区代码实现的】
161.若系统中有4个并发进程涉及访问某个相同的变量A,则变量A的相关临界区至少有4个
162.同步机制应遵循的准则:
- 空闲让进
- 当没有进程处于临界区时,表明【临界资源处于空闲状态】,应【允许一个请求进入】临界区的进程【立即进入】自己的临界区,以有效地利用临界资源
- 忙则等待
- 当已有进程进入临界区时,表明【临界资源正在被访问】,因而其他试图进入临界区的进程【必须等待】,以保证对临界资源的【互斥访问】
- 有限等待
- 指对要求访问临界资源的进程,应保证在【有限时间】内能【进入】自己的【临界区】,以免进程陷入【无限等待】的状态
- 让权等待
- 当进程[申请不到]共性资源的【访问权】时,应[立即释放]处理机,以免进程陷入[忙等状态],浪费CPU资源
163.在信号量机制中,用某种类型的变量,以【信号量的取值】来表示资源的使用情况,或某种时间是否发生,以此为基础实现进程的同步
164.对于一次只允许一个进程访问的临界资源,可定义一个用于互斥的整型信号量,并将其初始化为1
165.用整型信号量实现进程互斥,需要为必须互斥访问的临界资源CS定义一个互斥信号量mutex,将初始化置为1,然后将CS放入【wait(mutex) 和signal(mutex)之间】
166.Linux2.4使用的【自旋锁】可以看做是【整型信号量机制】的一个应用实例
167.对整型信号量机制的总结
- 整型信号量的值只能由wait和signal操作改变【其他原子操作不能改变】
- wait和signal操作都是原子操作,即在这两个操作中对信号量的访问是不能被中断的
- 原子操作可以通过关中断来实现
- 整型信号量机制的实例:Linux中的自旋锁 SpinLock
- 不同的资源对应不同的信号量,并不是系统中所有的资源都用同一个信号量表示
168.信号量机制的类型
- 整型信号量机制
- 整型信号量的值只能由wait和signal操作改变【其他原子操作不能改变】
- wait和signal操作都是原子操作,即在这两个操作中对信号量的访问是不能被中断的
- 原子操作可以通过关中断来实现
- 整型信号量机制的实例:Linux中的自旋锁 SpinLock
- 不同的资源对应不同的信号量,并不是系统中所有的资源都用同一个信号量表示
- 记录型信号量机制
- 当s.value >= 0 时,s.value的值表示【资源数量】
- 当s.value < 0 时,s.value的【绝对值】等于某资源的等待队列中【阻塞进程的数量】,且资源分配完毕
- AND信号量机制
- 基本思想
- 将进程在整个运行过程中所需要的所有资源一次性的全部分配给进程,待该进程使用完后一起释放。
- 只要还有一个资源不能分配给该进程,其他所有可能为之分配的资源也不分配给他
- 基本思想
169.整型变量
- 整型量 > 0 ,说明有可用资源
- 整型量 ≤ 0 ,说明资源忙,进程必须等待
170.当数据库表被用户修改时,任何其他用户不能读或者写这一数据库
171.用【记录型信号量机制】解决生产者---消费者问题,对具有相互合作关系的进程,提供了解决问题的模型
172.进程同步问题中,生产者--消费者问题信号量的设置
- 设置一个互斥信号量mutex,用于实现对公共缓冲池的互斥访问,初始值为1
- 设置两个资源信号量,分别表示可用资源数
- empty:表示缓冲池中的空缓冲区数,初值为n
- full:表示装有消息的缓冲区数,初始值为0(一个缓冲区中放一个消息)
173.简述进程同步问题中,生产者---消费者问题需要解决的问题
- 实现任意两个进程对缓冲池的互斥访问
- 实现对生产者进程和消费者进程的协调
- 缓冲池中有空闲缓冲区时,生产者进程才能执行放消息的操作
- 无空间缓冲区时,阻塞生产者进程
- 即缓冲池中
- 有消息时,消费者进程才能执行取消的操作
- 无消息时,阻塞消费者进程
174.【管程】是描述共享资源的数据结构和在数据结构上的共享资源管理程序的集合
175.【管程】的说明
- 管程是可供程序员调用的软件包
- 每次只有一个进程调用管程执行
- 管程是一种编程语言的构件,所以编译器知道他们很特殊,并可以调用与其他过程不同的方法来处理他们
176.信号量机制的【缺陷】是每个访问共享资源的进程都必须自备wait(S)和signal(S)
177.为了进行并发处理,管程必须包含【同步工具】
178.建立的管程名为PC(Producer-Consumer),其中包括了两个过程
- 一个是enter(item)过程,生产者进程调用该过程向缓冲池中投放消息
- 另一个是remove(item)过程,消费者进程调用该过程从公共缓冲池中取消息
179.管程包括
- 变量的定义
- 变量的初始化代码
- 管理共享资源的过程
180.操作系统提供进程通信功能,以支持进程之间的信息交换。
181.进程之间的高级通信机制分为
- 共享存储器系统
- 基于【共享数据结构】的通信方式
- 在这种通信方式中,要求诸进程公用某些数据结构,已实现进程间的信息交换
- 例如:在生产者一消费者问题中,使用[有界缓冲区]这种数据结构来实现进程的通信
- 基于【共享存储区】的通信方式
- 为了传输大数据,在存储器中画出一块共享存储器,进程可以通过对共享存储区中的数据的读或写来实现通信
- 基于【共享数据结构】的通信方式
- 消息传递系统
- 直接通信方式
- 操作系统利用发送程序直接把消息发送给目标程序
- 间接通信方式
- 进程之间的通信需要通过用于暂存消息的【共享数据结构】来实现,如信箱,这体现了【间接】通信方式
- 直接通信方式
- 管道通信系统
- 发送进程通过管道(连接读写进程的一个特殊文件)把数据以字符流的形式将大量的数据发送给接收进程
- 消息缓冲队列
- 通过消息缓冲区(数据结构)、发送原语和接收原语通信
- 发送进程发送消息时,先申请一个【消息缓冲区】,将要发送的消息从发送进程的发送区放入消息缓冲区
- 消息缓冲区时一个结构性数据结构。通常包括发送进程标识符、消息长度、消息正文和指向下一个消息缓冲区的指针
- 消息队列机制广泛于本地进程之间的通信
- 通过消息缓冲区(数据结构)、发送原语和接收原语通信
182.共享存储器系统的进程通信方式分为两种类型:基于【共享数据结构】的通信方式和基于【共享存储区】的通信方式
183.在消息传递系统中,进程间通过【操作系统】提供的一组通信程序传递格式化的消息
184.管道文件存在于【外存】中,其中的消息没有固定长度,能用于进程间大量的信息通信
185.线程作为独立调度和分派的单位,且不独立拥有资源
186.引入线程作为独立调度和分派的单位,不独立拥有资源(仅有少量基本资源),而与其他线程共享同一进程的资源,减小了系统的时空开销
187.进程即是独立执行的基本单位,又是资源拥有者
188.线程的实质是把进程的任务划分成更小、具有【独立】功能的单位,以线程的形式来并发执行,以提高程序并发执行的程度
189.线程的三种基本状态是【就绪态】、【运行态】、【阻塞态】
190.线程控制块中的信息有【线程标识符信息】、【处理机状态信息】、【线程调度信息】、【线程控制信息】
191.【线程】是程序执行的基本单位,【进程】是拥有资源的基本单位,不同进程的地址空间是相互独立的
192.【就绪态】是线程一旦获取CPU就可以投入运行的状态
193.【运行态】是线程获得CPU正在运行的状态
194.【阻塞态】是线程由于等待某个时间的发生而暂停的状态
195.进程之间的通信必须使用操作系统提供的进程间通信机制
196.由于创建【进程】或撤销进程时,系统都要为之分配或回收【资源】,操作系统所付出的开销【远大于】创建或撤销【线程的开销】
197.线程只拥有在运行中必需的资源,包括【程序计数器】、【一组寄存器】和【栈】,但他可与同属一个进程的其他线程共享进程所拥有的全部资源
198.在内核中为线程创建【线程控制块】,内核根据该控制块【感知】线程的【存在】并对线程进行【控制】
199.【内核级线程】的调度程序运行在【系统态】,【用户级线程】的调度程序运行在【用户态】
200.线程控制块通常采用链接的方式来组织,把同一进程中具有相同状态的TCB用指针【链接】成队列
201.线程执行时间的分配
- 内核级线程
- CPU时间以【线程】为单位分配
- 每一个线程都可以独享一个CPU时间片
- 用户级线程
- CPU时间以【进程】为单位
- 同一进程的多个线程共享一个CPU时间片
202.线程控制块的定义:每个线程都由一个数据结构标识,包括他的【基本状态】、【标识】及【记账信息】。这个数据结构就是线程控制块
203.线程上下文切换时,只需要保存和设置几个寄存器内容,开销很小,同一进程内容的线程共享进程地址空间,切换更快
203.内核级线程调度由内核的线程调度完成,用户级线程则由用户线程包中的一个过程来完成,内核级线程切换慢,用户级线程切换快
204.如果进程中的一个内核线程被阻塞,内核可以调度【同一个进程中的另一个内核线程运行】
205.如果进程中的一个用户线程被阻塞,则【整个进程都必须等待】,即使还有其他用户线程可以在应用程序内运行
206.引起线程阻塞的事件有
- 请求系统服务
- 启动某种操作
- 新数据尚未到达
207.【线程控制】是线程实现中最基本的功能
208.阻塞和唤醒是一对作用相反的原语
209.线程的调度与切换
- 内核
- 用户线程
- 内核继续以【进程】为单位进行调度
- 内核线程
- 内核以【线程】为单位进行的
- 由【内核】来维护其上下文信息
- 用户线程
- 调度
- 用户线程
- 在应用程序内部进行,通常采用【非抢占式】和【更简单的规则】
- 内核线程
- 可以为一个进程中的多个内核程序分配CPU,使多个内核线程达到【并行】
- 用户线程
- 切换
- 用户线程
- 不需要内核模式特权,所以也【不需要】用户模式和内核模式之间的【切换】,【节省】了模式间切换的【开销】
- 内核线程
- 调度和切换都【需要】用户模式和内核模式之间的【切换】
- 用户线程
210.引起线程终止的原因
- 正常结束
- 异常结束
- 外界干扰
211.线程的控制包括
- 创建新线程
- 线程调度
- 线程切换
- 线程的阻塞和唤醒
- 终止线程
212.在线程终止过程中,若被终止线程正处于【运行状态】,应立即终止该线程的执行,并置调度标志为【真】,用于指示该线程被终止后应重新执行线程调度程序
213.由于内核一次只把一个CPU分配给一个进程,因此一个进程中只有一个用户线程可以自行,故多用户线程的应用程序无法充分利用【多CPU技术】带来的好处
214.【内核线程】的创建是由【内核】完成的,内核为新线程申请空白线程序控制块,并初始化现成控制块,然后将新线程插入其所属进程的就绪线程队列(主要是创建主体不一样,过程都一样)
215.【用户线程】的创建是由【实用程序】完成的,实用程序为新线程申请空白线程序控制块,并初始化现成控制块,然后将新线程插入其所属进程的就绪线程队列(主要是创建主体不一样,过程都一样)
216.终止过程分为3步
- 根据被终止的现成标识符,从TCB集合中检索出该线程的TCB,【读出该线程的状态】
- 若被终止线程正处于【运行状态】,应立即终止该线程的执行,并置调度标志为【真】,用于指示该线程被终止后应重新执行线程调度程序
- 将被终止的线程的【TCB移除】所在队列【或链表】中,等待其他程序来搜集信息
217.线程阻塞过程
- 用户线程
- 停止该线程的执行,将该【线程的状态】改为阻塞态
- 将该【线程控制块】插入响应的线程阻塞队列
- 将该线程所属【进程的状态】改为阻塞态
- 将该线程所属进程的【进程控制块】插入相应的进程阻塞队列
- 将控制传递给【进程调度程序】,重新进行进程调度
- 内核线程
- 停止该线程的执行,将该【线程的状态】改为阻塞态
- 将该【线程控制块】插入相应的线程阻塞队列
- 将控制传递给【线程调度程序】,重新进行线程调度
218.线程唤醒过程
- 用户线程
- 将该线程所属【进程的状态】由阻塞改为就绪
- 将该线程所属进程的【进程控制块】从进程阻塞队列中移出
- 将该线程所属进程的【进程控制块】插入进程就绪队列
- 将该【线程的状态】由阻塞改为就绪
- 将该线程的【线程控制块】从线程阻塞队列中移出
- 将该线程的【线程控制块】插入线程就绪队列
- 内核线程
- 将【线程状态】由阻塞态改为就绪态
- 将该线程的【线程控制块】从线程阻塞队列中移出
- 将该线程的【线程控制块】插入线程就绪队列
219.线程同步机制由原语操作和信号量机制
220.由于同一进程中线程间【共享内存和文件资源】,各线程间可以通过直接【读/写全局变量】来进行通信,甚至【无需】操作系统内核的参与
第三章
221.Linux内核中,进程调度功能的实现从调用内核函数【schedule()】开始
222.进程调度功能由操作系统内核的进程调度程序完成
223.进程调度的功能是按照某种策略和算法从【就绪态】进程(在Linux中是可执行进程)中为当前空闲的CPU选择在其上运行的新进程
224.系统重新进行调度的情况
- 当一个进程运行结束后(包括正常结束和异常结束)
- 进程阻塞(缺少资源)
- 中断返回
- 在支持抢占式调度的系统中有比当前运行进程【优先级更高】的进程到来
- 当前运行进程的时间片用完时等
225.就绪态 -》 进程调度算法:决定把CPU分配给就绪队列中的哪个进程 -》 执行态
226.【进程调度算法】和【输入设备】和【输出设备】的速度都会影响系统的【响应时间】
227.【响应时间】是指:从用户提交一个请求开始直到系统首次产生响应的时间为止的一段时间,他是衡量交互式系统性能的一个重要指标,它包括3部分时间
- 从输入设备(键盘和鼠标)输入的请求信息传送到处理机的时间
- 处理机队请求信号进行处理的时间
- 以及将所形成的响应信息回送到终端显示器的时间
228.【服务时间】是一个作业在CPU上执行的总时间
229.处理机【CPU】是计算机系统中影响时间性能的最重要的【硬件资源】
230.【周转时间】是指从作业被提交给系统开始,到作业完成为止的这段时间间隔
231.设某【作业在外存后备队列表上等待调度的时间】为T1,【进程在就绪队列上等待进程调度的时间】为T2,【进程在就绪队列上等待进程调度的时间】为T3,【进程等待I/O操作完成的时间】为T4,那么作业的【周转时间】是指【T1+T2+T3+T4】
232.【实时系统】计算的正确性取决于【计算的逻辑结果的正确】和【计算结果的时间】
233.【截止时间】指某个任务必须开始的【最迟时间】,或必须完成的最迟时间。是评价【实时系统性能】的重要指标
224.【吞吐量】是指是【单位时间】内完成的作业数,他是评价系统性能的重要指标之一
225.选择调度方式和算法的准则
- 周转时间短
- 响应时间快
- 截止时间的保证
- 系统吞吐量高
- 处理机利用率好
226.计算机系统的设计者和管理者使用【平均周转时间】和【带权平均周转时间】来衡量系统的时间性能
227.先来先服务调度算法(First-Come,First-Served,FCFS)是指从就绪队列的队首选择最先到达就绪队列的进程,为该进程分配CPU。也就是按照进程的到达就绪队列的先后次序来挑选进程
- 适合【长进程】和【CPU繁忙进程】
- 不利于【短进程】和【I/O繁忙进程】,短进程周转时间过长,系统的平均周转时间也比较长
228.【静态优先权值】通常可以根据【进程的类型】、【进程需要的资源数量】、【用户的要求】来设定
229.关于时间片轮转调度算法,在不考虑系统开销的情况下,以下说法正确的是:
- 系统允许的最大进程数一定时,系统要求的响应时间越短,时间片取值应该越小
- 系统最长响应时间一定时,时间片大小与系统允许的最大进程数成反比。
- 时间片大小一定时,系统进程越多,则系统响应的时间越长
- 系统响应时间为T,进程数目为N,时间片为q,由T=Nq,也就是说响应时间与进程数和时间片成比例
230.短进程优先调度算法(Shortest-Process-First,SPF)与FCFS算法相比,短进程优先算法能有效降低进程的平均等待时间,提高系统的吞吐量。算法的缺陷是对长进程不利,如果系统中不断有短进程到来,长进程可能长时间得不到调度。该算法不能保证紧迫进程的及时处理,因为该算法不考虑进程的紧迫程度
231.优先权调度算法(Priority-Scheduling Lgorithm)的一个主要问题是无穷阻塞【饥饿问题】。
- 这里的阻塞是指就绪态进程因得不到CPU而等待的状态。
- 优先权调度算法会使某个低优先权进程无穷等待CPU,
- 在一个重负载的计算机系统中,平稳的高优先权进程流可以阻止低优先权的进程无穷等待CPU,
- 低于优先权进程可能因得不到CPU进入饥饿状态
232.采用基于静态优先权的调度算法时(优先权调度算法的一类),若不断有高优先级进程进入就绪队列,低于优先权进程可能进入【饥饿状态】
233.采用基于动态优先权的调度算法时,是指进程的优先权随着进程或随其等待时间的增加而改变,可使系统获取更好的调度性能
234.Minix把进程按类型不同分为3类,对任务进程和服务进程采用基于【优先权】的非抢占式调度
- 优先权最高的【任务进程队列】
- 优先权次之的【服务进程队列】
- 优先权最低的【用户进程队列】
235.Minix操作系统对任务进程和服务进程采用基于【优先权】的非抢占式调度
236.【多级队列调度】是将就绪队列分成【多个独立队列】,根据进程的某些属性,如需要占用的内存大小、进程优先权和进程类型,进程会被永久地分配到一个队列。每个队列有自己的调度算法。不同的队列优先权不同,调度算法也可能不同。
237.时间片轮转调度算法(Round-Robin,RR)的性能很大程度上依赖于【时间片的大小】,目的:多个终端都能的得到系统的及时响应
238.多级反馈队列调度算法是相对灵活的 且 低优先权进程【不存在饥饿问题】的
239.进程调度算法
- 先来先服务调度算法(First-Come,First-Served,FCFS)
- 先来先执行
- 从就绪队列的队首选择最先到达就绪队列的进程
- 有利于长进程执行
- 短进程优先调度算法(Shortest-Process-First,SPF)
- 最短先执行
- 有效降低进程的平均等待时间,提高系统的吞吐量
- 优先权调度算法( )
- 优先权值最高先执行
- 有饥饿问题:长期没有调度
- 静态和动态
- 静态优先权:在创建时确定,在进程的整个运行期间保持不变。最有可能引起饥饿问题
- 动态优先权:是指进程的优先权随着进程或随其等待时间的增加而改变,可使系统获取更好的调度性能
- 抢占和非抢占
- 抢占:是指若新到的进程优先权高于当前正在运行进程的优先权,那么系统会抢占CPU分配给新进程
- 非抢占:是指高优先权进程一旦得到处理机便一直运行直到结束,即使有较高优先权进程进来也不能剥夺当前进程CPU的使用权
- 时间片轮转调度算法(Round-Robin,RR)
- 先按先来先服务原则,再按时间片时间执行,时间片结束到就绪队列队尾排队
- 多个终端都能得到及时响应
- 多级队列调度算法
- 是将就绪队列分成【多个独立队列】,根据进程的某些属性,如需要占用的内存大小、进程优先权和进程类型,进程会被永久地分配到一个队列。
- 每个队列有自己的调度算法,不同的队列优先权不同,调度算法也可能不同。
- 有饥饿问题:长期没有调度
- 多级反馈队列调度算法
- 建立多个优先权不同的就绪队列,为每个队列赋予大小不同的时间片
- 不存在饥饿问题
240.饥饿问题的其一解决方案是【老化技术】
241.【老化技术】:以逐渐增加在系统中【等待时间很长】的进程的优先权,使低优先权进程在等待时间很长的情况下,优先权变高而获得CPU执行
242.进程所需要的CPU服务总时间不会影响时间片调度算法中的时间片大小
243.【实时系统】
- 【实时系统】中,某个任务必须开始执行的【最迟时间】成为该任务的【开始截止时间】或者叫【保证截止时间】,他是评价实时系统性能的一个重要指标。
- 【实时系统】对【处理器操作】或者【数据流动】有着严格的【时间限制】
- 【实时系统】的【进程调度】对保证时间的要求具有重要的作用
- 【实时系统】会着重考虑以下调度算法选择准则重的【保证截止时间】
- 【实时系统】中,进程调度需要考虑【关键因素】是【对完成截止时间条件的满足】
244.【快速切换机制】具有【对外部中断的快速响应能力】和【快速切换进程能力】
245.为保证对截止时间要求较高的实时进程能及时运行,应具的能力
- 【对外部中断的快速响应】
- 要求系统具有快速的硬件中断机制
- 还应使禁止中断的时间间隔尽可能的短
- 【快速切换进程】
- 应使系统中的每个运行功能单位适当地小,以减少进程切换的时间开销
246.为实现实时调度,系统可能需要为调度程序提供以下信息
- 就绪时间
- 开始截止时间
- 完成截止时间
- 处理时间
- 资源要求
- 优先级
247.为了保证高优先权的进程能够得到及时的调度,系统应该采用【抢占式优先权调度算法】
248.在单处理机的情况下,实现实时调度必须满足的限制条件为
249.【抢占式调度算法】根据抢占【CPU】的时机不同,可以为【基于时钟中断的抢占】和【立即抢占】
- 基于时钟中断的抢占
- 在高优先权的实时进程到达后,虽然该进程的优先权大于正在执行的进程,系统也不立即抢占当前进程的处理机,而是等到最近一次时钟中断到来时系统才剥夺当前进程的CPU,将CPU分配给新到来的优先权更高的实时进程
- 在响应速度上要慢于立即抢占的优先权算法
- 立即抢占
250.实现【实时调度】的基本条件
- 提供必要的调度信息
- 系统处理能力强
- 采用抢占式调度机
- 具有快速切换机制
251.让实时调度进程能及时处理:可以提供处理机的处理能力以缩短每个实时进程的处理时间,或者可以进一步增加处理机的数量
252.【最低松弛度优先算法】:调度程序在调度时机到来时,每次选择松弛度L【最小的进程】,把【CPU】分配给进程。【松弛度】用来表示一个实时进程的【紧迫程度】
253.根据实时进程的【紧迫程度】来进行调度的算法是【最低松弛度优先算法】
254.实时系统用到的算法
- 最低松弛度优先算法LLF(Least Laxity First, LLF)
- 调度程序在调度时机到来时,每次选择松弛度L【最小的进程】,把CPU分配给进程。
- 【松弛度】用来表示一个实时进程的【紧迫程度】
- 如果一个进程的【完成截止时间】为T,【当前时间】为Tc,处理该完成任务【还需要的时间】为Ts,则【松弛度L的计算公式】为:L = T - Tc - Ts = 完成截止时间 - 当前时间 - 还需要时间
- 最早截止时间优先算法EDF(Earliest Deadline First, EDF)
- 该算法【根据】进程的【开始截止时间】确定进程的【优先级】
- 截止时间越早,进程的优先级越高,越优先获得处理机
- 抢占和非抢占式调度都可以使用该算法
255.选择新的进程替换原来的执行进程,这个过程称为【进程切换】
256.进程切换的步骤
- 保存包括【程序计数器】和【其他寄存器】在内的【CPU上下文环境】
- 【更新】被替换进程的【进程控制块】
- 【修改进程状态】,把【执行态】改为【就绪态】或者【阻塞态】
- 将被替换进程的【进程控制块】移动到【就绪队列】或者【阻塞队列】
- 执行通过【进程调度】程序选择的【新进程】,并更新该进程的【进程控制块】
- 【更新】内存管理的【数据结构】
- 【恢复】被调度程序选中的进程的【硬件上下文】
257. 以下已应用多处理器结构的系统有
- 大型主机系统
- 小型主机系统
- 网络服务器
- 高端工作站
- 个人微机
258.随着计算机性能的要求,尤其是对计算机速度、处理能力的要求越来越高,多处理器结构的系统得到更加广发的应用,各类大、中、小型主机系统,网络服务器,以及高端工作站都采用多处理器结构,甚至个人微机都是用双CPU
259.对处理器的多种不同的分类方式
- 根据处理器结构是否相同
- 对称多处理器系统
- 属于同构的多处理器系统,其中所包含的各处理单元,在功能和结构上都是相同的
- 进程到处理器的分配可以采用【静态分配】和【动态分配】两种方式
- 动态分配
- 基本特征是每个进程经过多次调度,每次获得的不一定是同一个处理器
- 为了实现动态分配,在系统中设置一个公共的就绪队列,系统中的所有就绪进程都被放在该队列中
- 这样就可以将进程分配到任何一个处理器上
- 静态分配
- 非对称多处理器系统
- 有多种类型的处理单元,他们的功能结构各不相同
- 进程分配方式采用【主-从式分配方式】,优点是系统处理比较简单
- 根据处理器的耦合程度
- 紧密耦合多处理器系统
- 通常通过【高速总线】或【高数交叉开关】实现多个处理器之间的互连
- 他们【共享主存储器系统】和【I/O设备】
- 并要求将主存储器划分为若干个独立访问的【存储器模块】,以便多个处理器能同时对主存进行访问
- 系统中的所有资源和进程都由操作系统【实施统一】的【控制】和【管理】
- 松弛耦合多处理器系统
- 通常通过【通道】或【通信线路】来实现多台计算机之间的互连。
- 每台计算机都有【独立的存储器】和【I/O设备】
- 并配置了操作系统来管理【本地资源】和在【本地运行的进程】
- 紧密耦合多处理器系统
260.在【成组调度】中,可以采用那两种方式为应用程序是【分配处理器时间】
- 面向所有的【应用程序】平均分配处理器时间
- 面向所有的【线程】平均分配处理时间
261.自调度算法的优缺点
- 优点
- 易移植
- 有利于提高CPU的利用率
- 缺点
- 瓶颈问题
- 低效性
- 进程切换频繁
262.多处理器调度方式
- 自调度
- 是当前处理器系统中【最常用】的调度方式之一,也是【最简单】的一种【调度方式】
- 采用【自调度】的系统中,设置有一个必须【互斥访问】的【公共的就绪队列】,任何一个【空闲的处理器】都可以自行从该就绪队列中选取一个【进程】或一个【线程】运行
- 优点
- 易移植
- 有利于提高CPU的利用率
- 缺点
- 瓶颈问题
- 低效性
- 进程切换频繁
- 成组调度
- 为应用程序是分配处理器时间
- 面向所有的【应用程序】平均分配处理器时间
- 面向所有的【线程】平均分配处理时间
- 优点
- 减少线程切换
- 减少调度开销
- 为应用程序是分配处理器时间
- 专用处理器分配
- 一个在应用程序执行期间,【专门】为该应用程序【分配一组处理器】,每个线程一个,这组处理器供该应用程序专用,【直至应用程序完成】
- 优点
- 加速了应用程序的运行速度
- 避免了进程切换
263.【死锁】产生的原因是,竞争共享资源且分配顺序不当,【多个进程竞争有限的资源】而引起的进程不能向前推进的僵死状态
264.产生死锁的必要条件
- 互斥条件
- 指一个进程在访问资源的过程中,其他进程不能访问该资源
- 请求和保持条件
- 系统要求所有进程执行前一次性地申请在整个过程中所需要的全部资源
- 不剥夺条件
- 已经获得的资源不能被剥夺,只能由进程自己释放
- 环路等待条件
- 指在发生死锁时,必然存在一个进程申请资源的【环形链】
265.避免死锁的方法是把系统的资源分配状态分为安全状态和不安全状态,只要资源分配使系统资源分配处于【安全状态】,【死锁就不会发生】
266.【不安全状态】不一定是死锁状态,但当系统进入不安全状态之后,【便可能进入死锁状态】,换句话说【死锁状态一定是不安全状态的】
267.预防死锁不可以通过【摒弃互斥条件】,其他三个条件都行
- 摒弃请求和保持条件
-
所有进程执行前一次性地申请在整个过程中所需要的全部资源
- 对某些进程【在申请其他资源前】要求该进程【必须释放】已分配到的【所有】其他资源
-
- 摒弃不剥夺条件
- 一个已保持了某些资源的进程,当他再提出新的资源要求而【不能立即得到满足】时,【必须释放它已经保持】的所有资源
- 摒弃环路等待条件
- 程序必须【按规定的顺序申请资源】
268.处理死锁的基本方法
- 预防死锁
- 对资源采用按序分配策略能防止死锁
- 通过保证至少一个条件不成立达到预防死锁
- 避免死锁
- 资源分配状态为安全状态或者不安全状态,只要安全状态就不会发生死锁
- 检测并解除死锁
- 资源分配图方式是主要用于检测死锁
- 解除
- 终止死锁
- 资源抢占
- 忽略死锁问题
269.【安全状态】是指系统能找到一个进程执行序列,使系统只要按此序列为每个进程分配资源,就不会发生死锁
270.设有两个进程共享3是同类资源,为使系统不会死锁,每个进程可以申请的资源数目最多为2个,公式:进程数(申请资源数 - 1)+ 1 ≤ 同类资源数/
271.对于所有资源,都可以通过破坏死锁四个必要条件中的任何一个条件,来【预防】系统进入死锁状态
272.【银行家算法】是一种能够【避免死锁】的【资源分配算法】,其基本思想是一个进程提出资源请求后,系统先进行资源的【试分配】。然后检测本次的试分配【是否】使系统处于【安全状态】,若【安全】则按试分配方案【分配资源】,【否则不分配资源】
273.当系统又同类资源m个,被n个进程共享,当m≤n时每个进程最多可以申请1个资源系统不会发生死锁,因为最坏的情况是每个进程都占用1个资源的情况下,系统仍然能剩余1个资源,即n(x-1)+1 ≤m,得到x≤1+(m-1)/n,因m≤n,故x=1
274.【解除死锁】的途径有两个
- 进程终止
- 【终止所有进程】或【一次只终止一个】处于死锁的进程,【直到】死锁解除
- 终止死锁的进程后,系统回收进程占有的【资源】
- 资源抢占
- 【逐步】从进程中【抢占资源】给其他进程使用,直到死锁环打破为止
275.【死锁定理】:【S为死锁状态】的充分条件是当且仅当S状态的【资源分配图】是【不可完全简化】的,所有的简化顺序都将得到相同的【不可简化图】
276.关于何时调用检测算法
- 开销相对小的方法是只在一个【不频繁】的时间间隔里调用【检测算法】
- 如每小时一次,或当CPU使用率低于40%时
- 调用【检测算法】的时机取决于死锁可能发生的【频率】和死锁发生时受影响的【进程数量】,也是因素
- 如果死锁经常发生,就应该调用【检测算法】
277.【资源分配图】方法主要用于【检测死锁】
278.【饥饿】是进程因长时间不能获得所需要的资源而无线等待的状态
279.系统死锁可利用资源分配图来描述,该图由一组【结点】和一组【边】组成
280.当检测到系统发生死锁之后,可采用剥夺某些【进程所占有的资源】、【终止处于死锁状态的进程】、【重新启动系统】等方法来解除死锁
第四章
281.内存管理的目标
- 实现【内存分配】、【内存回收】等基本内存管理的功能
- 【提高内存空间的利用率】和【内存的访问速度】。
282.当操作系统接收到运行某程序的命令后,要为该程序的运行【分配内存资源】,【创建进程】,并把进程的全部或部分调入【内存】
283.存储器的层次结构中
- L0是寄存器
- 少量的快速CPU寄存器
- L1是芯片内的L1高速缓存
- L2是芯片外的L2高速缓存
- L3是主存储器
- 是一个大的基于DRAM的【主存】,可以在几个【CPU时钟周期】内访问他们
- L4是本地二级存储器
- 慢速但容量很大的本地磁盘
- L5是远程二级存储器
- 有些系统可能还包括一层【附加】的远程服务器上的磁盘,还需要通过【网络】来访问他们
284.一段较短时间内,程序的执行仅限于某个部门,相应地,他所访问的【存储空间】也【局限于某个区域】,这种特性成为【局部性】
285.程序的执行遵循局部性原理。程序执行的局部性原理指出,程序在执行时呈现出局部性规律。即在一段较短的时间内,程序的执行仅局限于某个部分,相应地,他所访问的存储空间也局限于某个区域
286.具有良好【局部性】的程序会【经常】访问【相同的数据集合】或【相邻的数据集合】
287.【局部性原理】的表现为【时间局部性】和【空间局部性】
- 时间局部性
- 空间局部性是指如果程序中的某条指令一旦执行,则不久后该指令可能再次执行
- 空间局部性
- 时间局部性是指。一旦程序访问了某个单元,在不久之后,其附近的存储单元也将被访问
288.【存储器系统】是一个具有【不同容量】、【成本】和【访问时间】的存储设备的【层次结构】
- 在这个层次系统中,越是高层,其容量越小,速度越快,因此【最高层】的寄存器的容量最小、速度最快的设备
- 从高层到低层(L0~L5),较低层的存储设备速度更慢、容量更大、价格更便宜
289.具有良好【局部性】的程序比局部性差的程序能更好地利用处于【高层次】的存储器,因此运行速度更快
290.程序的执行遵循【局部性】原理
291.【CPU寄存器】保存最常用的数据
292.存储器层次系统中,在最高层,是【少量】的【快速】CPU寄存器,CPU可以在一个【时钟周期】内访问它们
293.高级语言程序必须经过【编译】、【链接】才能成为可执行程序,操作系统需要为程序的执行【分配内存空间】
294.【链接程序】要解决的问题是:将编译后的【目标模块】装配成一个【可执行的程序】,【根据】链接进行的【时间】和【实现方式】不同,可以把链接分为【静态链接】和【动态链接】
295.【静态链接】是在一个程序运行前,用链接程序将目标模块链接成一个完整的装入模块,静态链接程序完成【对逻辑地址进行修改】和【变换外部调用符号】功能
296.【动态链接】的优点就是节省【内存空间】和【外存空间】,方便了程序开发
297.【链接程序】不属于操作系统的【构成部分】,但是他为操作提供【可装入】的【程序模块】
298.使用【静态链接】的方式,程序开发不够灵活、方便、修改某一个模块会导致整个程序的重新链接
299.采用【动态链接】,可将某些【目标模块】的链接推迟到这些模块中的函数【被调用执行时】才进行
300.【静态链接】发生在【运行某段程序前】
301.程序prg.c中调用了两个外部模块M和N。采用GCC编译代码时,命令gcc prg.c -0prg1是采用动态链接的方式生成可执行文件prg1,命令gcc prg.c -static -o prg2命令是采用静态链接的方式生产可执行文件prg2.【则prg1文件比较大】
302.在静态链接中,某模块相对应地址范围从0~k-1,变成逻辑地址范围J~J+K-1,此工作属于【对逻辑地址进行修改】
303.链接程序将编译后的目标模块装配成一个可执行的程序。在静态链接中,调用外部模块指令CALL F1变为跳转到F1模块在逻辑地址空间中起始地址指令JSR XXX,此工作属于【变换外部调用符号】
304.采用GCC编译代码时,动态链接方式比静态链接方式的【运行速度更慢】
305.采用静态链接【变换外部调用符号】时,将每个模块中所用的【外部调用符号】都换成【逻辑地址】
306.根据行程在内存中物理地址的时机不同,把程序的装入方式分为以下3种
- 绝对装入方式(重定位)
- 重定位是在【程序装入时】对目标程序中的【指令】和【数据地址】的修改过程
可重定位装入方式(静态重定位)
- 编译时地址都是【逻辑地址】,在程序被【装入内存】时,再把这些【逻辑地址】映射为【物理地址】,【不需要】硬件支持
- 物理地址 = 有效逻辑地址 + 程序在内存中的起始地址
- 特点
- 编译程序使目标模块的起始地址从0开始
- 程序装入时,装入程序根据内存的使用情况,将装入模块装入到内存的某个位置,并对模块进行重定位
- 可从定位装入方式(动态重定位)
- 系统将进程装入内存后,由于进程在内存中的位置可能发生移动,所以此时并不计算物理地址,而是在进程运行访存的过程中才进行地址转换,这种方式需要重定位寄存器的支持
- 物理地址 = 有效逻辑地址 + 重定位寄存器的值
- 每个CPU有一个重定位寄存器
- 主要特点
- 在程序执行期间可动态地变换映像在内存空间的地址
307.将一个用户的源程序变为一个可在内存中执行的程序,通常要经过【编译】、【链接】和【装入】3个阶段
308.通常,可执行程序以【二进制可执行文件】的形式存储在【磁盘】上,为执行程序,操作系统需要把程序调入【内存】
309.在多道程序环境下,程序要运行必须为之【创建进程】,而创建进程后,不可避免的要为进程分配内存,并将进程的程序和数据装入内存
309.多数系统允许【操作系统】将用户进程放在【物理内存】的任意位置
310.源程序中的地址通常是【符号】表示(如:整形常量:counter),编译器将这些【符号地址】转变成【逻辑地址】,通常是相对于本模块开始位置的地址
311.绝对装入程序按照装入模块的【物理地址】将【程序】和【数据】装入【内存】
312.可执行程序中指令LOAD 1,3000,若采用【静态重定位方式】将该进程文件装入起始地址为20000的内存单位,则装入后该指令中的地址参数会【发生改变】,变为23000
313.可执行程序中指令LOAD 1,3000,若采用【动态重定位方式】调入内存后,重定位寄存器的值为20000,则装入后该指令中的地址参数【不会发生改变】,实际访问的物理地址是23000
314.采用可重定位装入方式将程序装入内存后,程序在内存中的实际【物理地址】与【逻辑地址】通常是【不同的】
315.连续分配方式的种类
- 单一连续区分配方式
- 单一连续区分配方式指的是:内存中只有一个用户区,【任意时刻】内存中【只能装入一道程序】,这种分配方式仅适用于单用户、单任务的系统
- 固定分区分配方式
- 将内存用户区划分成若干个固定大小的区域,每个区域中驻留一道程序
- 动态分区分配方式
- 动态分区分配方式是:系统动态地对内存进行划分,根据进程需要的空间大小分配内存
316.【连续分配】是指:操作系统分配内存时,每个进程分配一块物理地址连续的内存空间
317.【连续分配存储管理方式】发展为【分页存储管理方式】的主要推动力是【提高内存利用率】
318.静态分区分配方式【不属于】连续分配方式
319.内存分区情况
- 系统区
- 系统区仅供操作系统使用
- 【基址寄存器】中存放装入系统区的地址范围
- 用户区
- 用户区仅供用户使用
- 【界限寄存器】中存放装入用户区程序的地址范围
320.为了防止用户程序对操作系统的破坏,在操作系统中应该考虑设置存储器保护机制,在单用户,单任务操作系统中较为常见的方法是设置一个【基址寄存器】和一个【界限寄存器】
321.系统区用于驻留操作系统,用户区用于分配给用户进程使用
322.为了防止用户程序对操作系统的破坏,保证系统的安全,可靠,在操作系统中应该考虑设置【存储器】保护机制
323.【基址寄存器】中存放程序在【物理内存】中的【最小地址】
324.固定分区的过程为:需要为进程分配内存时,操作系统执行【内存分配】程序,搜索内存【分区使用表】。找到一个大小【大于或等于】进程需要的内存空间而且处于【空闲状态】的用户分区时,将该分区分配给进程,并将该分区状态改名为【已占用状态】
325.结构体
- 分区编号
- 分区大小
- 分区起始地址
- 分区状态
326.操作系统为了完成对固定分区的管理,必须定义一个记录用户分区带下和使用情况的【数据结构】
327.当进程运行结束后,系统要回收进程占用的分区。通过执行【内存回收】程序完成回收操作,只要把回收分区的使用状态改为【空闲】即可,即把上面数据结构中相应分区的state字段置0
328.固定分区分配方式划分分区方法
- 固定
- 分区数目固定,每个分区的大小也是固定的
- 不确定
- 每个分区的大小可以相等,也可以不相等
329.动态分区分配算法有以下三种
- 首次适应算法(FF)
- 在采用空间分区链作为数据结构时,【首次适应】算法要求空闲分区链以地址【递增】的顺序链接
- 循环首次适应算法(NF)
- 有首次适应算法【演变】而成的
- 循环首次适应算法的优点是【空闲区分布均匀】和查找【开销较小】
- 最佳适应算法(BF)
- 动态分区存储管理的【主存】分配算法中,分配的【空闲块】与【装入作业尺寸】最接近的是最佳适应
- 每次为作业分配内存,总是把大小与进程所请求的内存空间【大小最接近】的空闲分区分配给进程,其【优点】是为了【避免大材小用】,能【提高内存利用率】
- 为了加速寻找,最佳适应算法要求将所有的空闲区按【分区大小】递增的顺序形成一个【空闲区链】
330.为了实现【动态分区分配】,系统需要建立并维护记录【空闲分区】情况的【数据结构】,常用的数据结构有【空闲分区表】和【空闲分区链】
331.内存回收流程
- 释放一块连续的内存区域
- 如果被释放区域与其他空闲区相邻,则合并空闲区
- 修改空闲区链
332.如果被释放的内存区域(回收区)与其他任何空闲区【都不相邻】,则为该回收区建立一个【空闲区链】的【结点】。如果被释放区域于其他空闲区间【相邻】,需要进行【空间合并】。【合并空闲区】只需要【修改】空闲分区链,【不需要】新建结点
- 采用最佳适应算法内存管理动态分区分配方案,则对这两个进程分配内存后,系统的空闲区链表为(40,100)、(200,120)
- 若是采用首次适应算法内存管理动态分区分配方案,则对两个进程分配内存后,系统的空闲分区链为(100,40)、(200,120)、(400,60)
- 若采用循环首次适应算法内存管理动态分区分配方案,则对两个进程分配内存后,系统的空闲分区链为(60,80)、(240,80)、(400,60)
334.空闲分区表
- 分区编号
- 分区大小
- 分区起始地址
335.使用【空闲分区链】可以动态地为每个【空闲分区】建立一个【结点】,每个【结点】包括【分区大小】、【分区起始地址】、【指向前一个可空闲分区结点的指针】,以及【指向后一个空闲分区结点的指针】
336.数组大小根据系统管理的【最大分区数】确定
337.动态分区分配使根据进程的实际需要,为进程分配大小合适的内存区域
338.【空闲分区表】的【缺点】是:若设置太多表项,会浪费内存空间;设置太少的表项,当空闲分区较多时,无法记录所有空闲分区的情况,在实现时,结构数组的大小【不容易确定】
339.动态分区分配时内存分配的流程
- 检索空闲分区链
- 如果m.size - u.size <= size,则直接把该空闲分区分配给进程
- 将分配给进程的分区起始地址返回给内存分配程序的调用者
- 修改空闲分区链表
340.根据离散内存管理分配内存空间的基本单位的不同,将其分为3中不同的管理模式
- 分页存储管理
- 分段存储管理
- 段页式存储管理
341.把进程【离散存储】在内存中【物理地址】不连续的区域中,这种内存管理方式称为【离散内存管理方式】,为了支持【虚拟内存管理】,需要引入离散内存管理方式
342.基本分页存储管理方式中的逻辑地址结构包括:【页号P】和【页内偏移量W】,页大小用页内偏移量计算,用m为表示逻辑地址,页大小小为2n字节,则用n位表示页内偏移量,用m-n位获得页号,得到两个公式:【逻辑地址 = 页号 + 页内偏移量】 和 【页大小 = 2页内偏移量】
逻辑地址为16的图
343.采用基本分页存储管理方式的系统中,页的大小设置由机器体系结构和操作系统共同决定,如果32位的分页地址结构由【20位页号】和【12位偏移量】组成,那么页大为【2^12】字节
344.为了能将【用户地址】中的【逻辑地址】变换为【内存空间】中的【物理地址】,在系统中必须设置【地址变换机构】,该机构的基本任务是实现【逻辑地址】到【物理地址】的【变换】
345.【页表】在内存中【连续】存放
346.【页】是将一个进程的【逻辑地址空间】分成若干个【大小相等】的片
347.页大小一般是2的整数次幂,在目前的计算机系统中,大多数选择【4KB】大小的页。现在的交互系统大多数都选择4KB的页。
348.基本分页存储管理方式中的【逻辑地址结构】包括:【页号P】和【页内偏移量W】。旧版教材也称之为:【页号】和【页内地址】
349.进程的【最后一页】一般【装不满】一个【页框】,而行程了不可利用的碎片,称为【页内碎片】,是一种内部碎片
350.将【物理内存空间】分成与页【大小相同】的若干个【存储块】,称之为【页框】或【页帧】
351.【页表】是系统为【进程】建立的【数据结构】,【页表】的作用是实现【页号】到【页框号】的【映射】
352.进行【分页地址变换】时,PCB中【页表起始地址】和【页表长度】送CPU的【页表寄存器】
353.分页地址变换需要了解的名词
- 页
- 将一个进程的逻辑地址空间分成若干个大小相等的片
- 页框【页帧】
- 将物理地址空间分成与页大小相同的若干个存储块,或者称页帧
- 页表
- 系统为进程建立的数据结构,作用是实现从页号到页框号的映射
354.分页地址变换:实现逻辑地址到物理地址的变换
- 逻辑地址
- 用户程序经过编译或汇编形成的目标代码,通常采用相对地址形式,称为【逻辑地址】或【虚拟地址】
- 物理地址
- CPU调用执行的程序所对应的地址空间为【物理地址空间】
- I/O地址空间对应外部设备,绝对地址指的是物理地址
355.某分页存储管理系统,逻辑地址长度为24位,其中页号占10位,则页大小:2^14 字节 =》 页内偏移量 = 逻辑地址长度 - 页号 = 24 - 10 =14
356.逻辑地址为十进制的5201,系统页大小为4KB,该逻辑地址所在的页号P = INT(5201 / (4 * 1024))= 1 和页内偏移量W = MOD(5201 / (4 * 1024)) = 1105
- L为页大小
- P为页号
- W为页内偏移量
- A为逻辑地址大小
- INT为取整
- DOD为取余
- P = INT(A / L)
- W=MOD(A / L)
- A = P + W
- L = 2页内偏移量
- P = A - W
- 页表项数 = 2页号
- 一级页表内存 = 页表项数 * 页表项大小
- 2页表项位数 = 物理地址空间大小 / 页大小
- 物理地址 = 页框大小 * 页框 + 页内偏移量
- 页表项数量 = 页的数量 =逻辑地址空间
- 逻辑地址 = 页号 + 页内偏移量
- 页号对应的页表项起始地址 = 页表起始地址(页框号) + 页表项长度 * 页号(页表项中存在页框号)
357.【页内碎片】进程的最后一页一般装不满一个页框,而形成了不可利用的碎片,是一种内部碎片
358.在分页系统中,页的大小是由机器的体系结构和操作系统共同决定的,影响页大小设计的因素有【管理内存的开销】和【内存的利用率】。选择【较小的页】,有利于提高内存利用率,但内存管理时间【开销相对大】,选择【较大的页】,内存管理的时间【开销相对较小】,但【页内碎片大,空间利用率降低】
359.在分页存储管理方式中,【页表】的作用是实现从【页号】到【页框号】的映射
360.32位Linux采用分页存储方式管理内存,其中页的大小设为16KB,则逻辑地址0x0008C31E中的页内偏移量为16 * 1024 = 16384 = 214=14,因此14位页内偏移量,而0x0008C31E的后14位为00 0011 0001 1110,十六进制表示为31E,页号=32-14=18位,也就是0x0008C31E的前18位:0000 0000 0000 1000 11,去掉多余的0就为0010 0011,十六进制表示0x23
361.分页地址变换过程
- 进程执行,PCB中页表起始地址和页表长度送CPU的页表寄存器
- CPU访问逻辑单元A
- 有分页地址变换硬件自动将A分为页号和页内偏移量两部分
- 有硬件检索页表,得到A所在的也对应的页框号。页号对应的页表项起始地址 = 页表起始地址 + 页表项长度 *页号(页表项中存有页框号)。从该地址指示的内存单元中读取页框号
- 页框号和页内偏移量地址送物理地址寄存器,计算物理地址
- 物理地址 = 页框大小 * 页框号 + 页内偏移量
362.当【能在TLB中找到】所需要的页表项时,有效访存时间等绿一次访问TLB的时间加上一次访问内存的时间,当【没有在TLB中找到】所需要的页表项时,访存时间等于一次访问TLB的时间加上两次访问内存(一次访问内存页表,一次访问内存读写数据或指令)的时间。
- 当能在快表TLB中找到所需要的的页表项时:有效访存时间 = 一次访问内存时间 + 一次访问快表时间
- 没有找到的页表项的有效访存时间公式:(访问快表时间 + 访问内存时间)* 快表命中率 + (访问快表时间 + 2 * 访问内存时间)* (1 - 快表命中率)
- 如果快表命中率为85%,访问快表时间为30ns,访问内存时间为210ns,则有效访问时间 = (210 + 30) * 85% + (2 * 210 + 30)* (1- 85%) = 271.5ns
363.【快表】也称为【转换后援缓冲TLB】,是为了【提高CPU访存速度】而采用的【专用缓存】,快表中存放的内容是【最近被访问过的页表项】
364.操作系统使用【特权级】指令【装入】或【修改】页表寄存器的值
365.当能在快表TLB中找到所需要的的页表项时:有效访存时间 = 一次访问内存时间 + 一次访问快表时间
366TLB快表的条目由【键和值】组成
367.在采用分页存储管理方式的系统中,页表存放在内存,那么当CPU要访问内存读写数据或 指令时,需要访问内存的次数是2次
- 第一次访问内存,从内存页表中获取访存单元所在的页框号,以形成访存单元的物理地址
- 第二次访问内存,是根据计算出来的物理地址,实现对内存单元的访问,【读写数据】或【读取指令】
368.有些系统中【允许TLB中】的【某些条目】是【固定不变】的,这些被固定的TLB条目通常是与操作系统【内核代码】相关的条目
369.在TLB(快表)中找到某一个页号对应的页表项的百分比称为【TLB命中率】
370.引入快表【TLB】之后的地址变换过程
- CPU产生分页的逻辑地址【页号】和【页内偏移量】后,将该逻辑地址的【页号】提交给【TLB】
- 查找TLB,如果【找到】页号,则把该页所在的【页框号】用于【形成物理地址】。【否则】TLB(快表)失效,【查找内存页表】,从内存页表中找到相应的【页表项】,读取也所在的【页框号】,以【形成物理地址】
- 如果所查的页表项不在TLB中,在访问完内存页表后,要把找到的页表项中的【页号和页框号】写到【快表(TLB)】中,
- 如果TLB中的【条目已满】,系统会根据某种【策略(如最近最少使用替换)】选择一个TLB中的条目,用刚访问的页表项信息【替换选中】的这个TLB条目
371.页目录号P1实际上是一个【索引值】,根据P1从【页目录表】中查找到【页表】所在的【页框号】
372.使用【两级页表】的系统,当【进程切换时】,要运行的进程的【页目录表起始地址】被写入【CPU寄存器】,可以称之为【页表寄存器】
373.在两级页表中,页号【P2】是【页表】中的【偏移量】,根据P2可以知道应该从【页表】的第P2项中找到进程页所在的【页框号】
374.在二级分页系统中,为了能在地址映射时得到离散存放的页表在物理地址中的地址,需要为页表在建立一个【连续】存放的【外层页表】,又叫【页目录表】
375.对于64位的机器,使用二级页表,仍存在【连续占用大量内存】的问题,可以采用【多级页表结构】,将外层页表再分若干页,然后为外层页表建立连续存放的【索引表】
376.基本分页存储中有
- 每个进程有一个页表
- 每个页表至少包含与进程页数相同的页表项
- 页表必须连续存放
377.【页目录表】的表项中存放了每个页表在物理内存中所在的【页框号】
378.二级页表的逻辑地址结构
379.两级页表的寻址过程
- 对于给定的逻辑地址A,有硬件从中分离出来页目录号P1、页号P2和页内地址D
- 由页表寄存器的值和页目录号P1,从存放页目录的页框中找到页表所在的页框号。【页表所在的页框号在内存中的地址 = 页表的起始地址 + P1 * 页表项长度】,从该地址指示的物理内存单元中读取页表所在的页框号
- 由页表所在的页框号和页号P2,从存放页表的页框中找到进程页表所在的页框号。【进程页所在的页框号在内存中的地址 = 页表的起始地址 + P2 * 页表项长度】,【页表的起始地址 = 页表所在的页框块号 * 页框大小】
- A的物理地址 = 进程页所在的页框号 * 页框大小 + 页内地址d
380.两级页表是将页表进行分页,使每个页表分页的大小与内存页框的大小相同,并为他们编号,将这些页表分页分别放入不同的、不一定相邻的页框中,为离散分配的页表在建立一张外层页表,称之为【页目录表】,页目录表中的每个表项中记录了页表分页所在的页框号
381.操作系统综合题之“采用二级页表的分页存储管理方式,计算页目录号的位数 和 页的大小,给定页目录项大小计算页目录表大小,给定逻辑地址计算页内偏移量和物理地址”
- 根据进程号和页号找页框号
- 物理地址 = 页框号 * 页框大小 + 页内偏移量地址
- 离散性
- 多次性
- 对换性
- 【对换性】是指【内存】中的进程可以【换出】,以腾出内存空间【换入】外存中的进程
- 虚拟性
- 虚拟性是实现虚拟存储系统的最重要目标
- 提高内存利用率
- 提高多道程序度
- 把【逻辑地址空间】和【物理地址空间】分开,是程序员不用关心物理内存的容量对编程的限制