操作系统—概述

目录

一、

1.定义

2、用户与硬件系统的接口

3、四类资源管理者

4、操作系统的发展过程

5、单道批处理系统

6、多道批处理系统

7、分时系统

8、实时系统

9、计算机系统操作

10、硬件保护

11、两状态操作

12、系统调用

13、系统结构

二、进程

1、进程概念:

1、并发环境:

2、进程与程序

3、进程操作

1、进程创建

2、进程终止

3、进程阻塞

4、进程唤醒

5、生产者-消费者问题:

6、消息传递

7、直接通信

8、间接通信

9、缓冲

4、线程的引入

1、线程

2、进程和线程的比较

3、益处

4、内核线程

5、用户线程

三、多级队列

1、多级反馈队列

2、多级反馈队列调度

四、进程同步

五、有限缓冲区问题

1、生产者-消费者问题:

2、读者-写者问题

3、PV操作讨论信号量的物理含义

六、死锁问题

1、共享资源的获取和释放

2、死锁的原因

3、死锁的必要条件

4、资源分配图

5、死锁预防

1、处理死锁的方法

2、鸵鸟策略

3、抑制死锁发生的必要条件

6、死锁避免

7、银行家算法

1、银行家算法的数据结构


一、

1.定义

操作系统是一组控制和管理计算机硬件和软件资源、合理地对各类作业进行调度、以及方便用户使用的程序集合。

2、用户与硬件系统的接口

软件接口,给用户提供三种方式:

  1. 命令方式
  2. 系统调用方式
  3. 图形、窗口方式

3、四类资源管理者

处理机管理、存储器管理、设备管理、文件管理

4、操作系统的发展过程

  1. 无操作系统的计算机系统
  2. 单道批处理系统
  3. 多道批处理系统
  4. 分时系统
  5. 实时系统

5、单道批处理系统

过程:一批作业以脱机方式输入到磁带上,在监督程序的控制下连续处理。

特征:

  1. 自动性:无人工干预
  2. 顺序性:按进入内存的先后执行
  3. 单道性:内存中保持一道作业

6、多道批处理系统

  • 多道:内存中同时存放多个相互独立的程序
  • 多道技术是共享的基础
  • 通道:是用一种专门部件,负责外部设备与内存之间信息的传输。
  • 中断:指主机接到外界的信号(来自CPU外部或内部)时,立即终止原来的工作,转去处理这一外来事件,处理完后主机又回到原来的工作点继续工作。
  • 特征:
  1. 多道性:内存中有多道程序,可并发执行
  2. 无序性:完成时间与进入内存先后无关
  3. 调度性:作业从提交到完成经两次调度。作业调度  外存到内存(选多个),进程调度   分配处理机(选一个)
  • 优点:
  1. 资源利用率高:多道通过组织作业使得CPU总在执行其中一个作业,从而提高了CPU的利用率。
  2. 系统吞吐量大:吞吐量:单位时间内完成的总工作量。 原因:资源忙、完成或运行不下去时才切换。
  • 缺点:
  1. 平均周转时间长:作业周转时间:从作业进入系统开始到完成并退出系统经历的时间。
  2. 无交互能力:修改和调试极不方便
  • 多道程序对OS特点的要求
  1. 存储管理:系统必须为若干作业分派空间
  2. CPU调度:系统必须在就绪作业中挑选
  3. 资源竞争和共享
  4. 设备分配
  5. 系统提高I/O程序
  6. 文件管理

7、分时系统

  • 定义:一台主机上连接了多个终端,同时允许多个用户通过自己的终端,以交互方式使用计算机,共享主机中的资源。
  • 实现方式:通常按事件片分配:各个程序在CPU上执行的轮换时间。
  1. 多个用户分时:单个用户使用计算机的效率低,因此允许多个应用程序同时在内存中,分别服务于不同的用户。有用户输入时CPU执行,处理完一次用户输入后程序暂停,等待下一次用户输入。时走时停。
  2. 前台和后台程序分时:后台程序不占用终端输入输出,不与用户交互,现在的图形界面GUI,除当前交互的程序(输入焦点)之外,其他程序均作为后台。
  • 产生动力:
  1. 人机交互(边运行边调试)
  2. 共享主机(设备昂贵)
  3. 便于用户上机(再终端上输入、控制)
  • 特征:
  1. 多路性:即同时性,宏观上同时微观上轮流
  2. 独立性:每个用户感觉独占主机
  3. 及时性:较短时间响应
  4. 交互性:人机交互好
  5. 共享主机:多个用户同时使用。
  • 交互式计算:
  1. 作业直接进入内存
  2. 每个作业一次只运行很短的时间
  3. 分时技术:把CPU的响应时间分成若干个大小相等(或不等)的时间单位,称为时间片,每个终端用户获得CPU(获得一个时间片)后开始运行,当时间到,该用户程序暂停运行,等待下一次运行。

8、实时系统

  • 实时:及时响应外部事件请求
  • 应用需求:
  1. 实时控制:工业生产、武器控制飞机的自动驾驶
  2. 实时信息处理:订票系统。

9、计算机系统操作

  1. I/O设备与CPU可并行运行
  2. 每个设备控制器负责一个设备类型
  3. 每个设备控制器有一局部缓存
  4. CPU通过局部缓存与主存交换数据
  5. I/O从设备到设备控制器的局部缓存
  6. 设备控制器通过引起中断通知CPU操作已完成。
  • 中断机制:现代操作系统是中断驱动的(中断将控制权转移到中断服务程序)
  1. 硬件中断
  2. 软件中断(陷阱)trap:异常、系统调用

10、硬件保护

  • 单用户系统,程序员可完全控制系统。
  • 不断读取卡片
  • 多用户环境,需要保护磁盘上的文件数据。
  • 硬件陷入到OS,当发生:非法指令,或访问不属于自己的地址空间的内存;进程终止。

11、两状态操作

  • 共享系统资源要求操作系统确保有误程序不会引起其他程序的运行错误
  • 至少在两个状态间提供硬件支持:用户态代表用户执行;管态(特权模式或系统模式)代表操作系统执行。
  1. 模式位添加到计算机硬件,表示当前模式。
  2. 系统引导时,硬件处于管态。
  3. 在用户模式下执行用户进程。
  • 出现中断或陷阱,硬件切换到管态。
  • I/O保护:
  1. 所有的I/O指令都是特权指令(用户不能直接使用I/O指令,必须通过系统调用)
  2. 确保用户程序不能再管态下控制计算机。
  • 内存保护:
  1. 必须保护中断向量和中断服务程序
  2. 确定进程能访问的合法空间(基址寄存器、界限寄存器)
  • CPU保护
  1. 需防止用户程序陷入死循环或者不调用系统服务且不将控制权返回到OS
  2. timer定时器:设定计时器以便产生中断、定时器中断控制权会返回给OS。
  • 操作系统的目标:
  1. 提供服务
  2. 为用户和程序提供的接口
  3. 各组成部分及其相互连接
  • 操作系统服务
  1. UI:GUI
  2. 程序执行:调入一个程序进内存并运行之的系统能力。
  3. I/O操作:由于用户程序不能直接执行I/O操作,操作系统必须提供手段完成I/O操作。
  4. 文件系统操作:读写、创建和删除文件的能力。
  5. 通信:运行的进程在同一计算机或由网络连接的不同系统中交换信息。通过共享存储器或消息传递实现。
  6. 出错检测:探测在CPU与内存硬件中,在i/o设备中,或在用户程序的错误,确保正确运算。
  • 其他的功能不是用于帮助用户,而是为了系统效率
  1. 资源分配-把资源分配给多个用户或多个同时运行的作业
  2. 帐务-跟踪和记录用户对资源的使用,用于帐单和统计
  3. 保护-确保对资源的所有访问均在控制中

12、系统调用

系统调用提供在运行程序和操作系统之间的接口:

  1. 通常以汇编语言指令形式提供;
  2. 替代汇编语言的、供系统编程的语言,允许直接使用系统调用。

  1. 当用户使用系统调用时,产生一条相应的指令
  2. CPU在执行到该指令时发生中断,发出有关的信号给陷入处理机构
  3. 处理机构在收到了CPU发来的信号后,启动相关的处理程序去完成该系统调用所要求的功能
  4. 在处理系统调用之前,陷入处理机构还需保存处理机现场(PSWPC、系统调用号、用户栈指针、通用寄存器、用户定义的参数等)

  1. 如何找到实现系统调用功能的子程序:入口地址表每个入口地址与相应的系统程序对应
  2. 陷入处理程序用系统调用功能号查找入口地址表,得到该系统程序的入口地址,并执行之
  3. 系统调用处理结束后,要恢复处理机现场,从而用户程序可以继续执行

3种常用方式用于在运行程序和操作系统之间的参数传递

  1. 寄存器中的参数传递
  2. 参数存在内存的一张中,表地址作为寄存器的参数传递
  3. 程序把参数压入,由操作系统弹出

13、系统结构

  • 简单结构:MS-DOS-以最小的空间提供最多的功能

(不划分模块;尽管MS-DOS有某种结构,其接口和功能层没有划分清楚)

UNIX-受硬件功能限制,早期UNIX只是有限的结构化。UNIX包括2个分离的部分:系统程序、内核

  • 内核:包括了在物理硬件之上,系统调用之下的一切。提供文件系统,CPU调度,存储管理,和其他操作系统功能;每一层有大量的功能。
  • MS-DOS层次结构

例如,应用程序可直接访问BIOS例程,来直接操纵设备,当然这受限于当时的硬件,intel8088没提供双模式和硬件保护,这使得DOS别无选择只能任由应用程序访问BIOS.

  • 层次化结构
  1. 操作系统划分为若干层,在低层上构建高层。底层(0层)为硬件;最高层( N层)为用户层
  2. 考虑模块化,层的选择是每层只使用低层次的功能和服务
  3. 分层的基本原则:每一层都使用其底层所提供的功能和服务,以便于系统调试和验证。
  4. 困难:层次的划分和安排,要保证不出现双向依赖关系。
  • 微内核:典型系统如MACH和Windows NT(Mach 首先使用微内核结构)
  1. 通过划分系统程序和用户程序,把所有不必要的部件移出内核形成一个小内核
  2. 微内核提供最少量的进程管理、存储管理,以及通信功能
  3. 操作系统由两大部分组成:运行在核心态的内核、运行在用户态并以C/S方式运行的进程层

基于微内核结构的0S和传统OS相比,具有以下特点:

① 内核精巧。通常内核只由任务管理、虚存管理和进程间通信3个部分组成。传统0S内核中的许多部分都被移出内核,采取服务器方式实现;
② 面向多处理机和分布式系统。基于微内核的0S,在内核中引入了多处理机调度和管理机制,并引入了细粒度并发机制--线程,使得多个处理机可以在同一个任务中并行地执行

③ 基于客户/服务器体系结构。在微内核结构的0S中,任务间通信机制-- 消息机制是系统的基础,OS的各种功能都以服务器方式实现,向用户提供服务。用户对服务器的请求是以消息传递的方式传给服务器的。

二、进程

1、进程概念:

OS的基本特性是并发与共享,即在系统中同时存在几个相互独立的程序他们交叉地运行,并共享资源。

问题:资源的竞争、程序之间的合作和协同、程序之间的通信

顺序环境计算机系统只有一个程序在运行,该程序独占系统中所有资源,其执行不受外界影响

顺序执行的特征:

  1. 顺序性:按照程序结构所指定的次序(可能有分支或循环 )
  2. 封闭性:独占系统的资源
  3. 可再现性:初始条件相同则结果相同。如:可通过空指令控制时间关系。

1、并发环境:

一定时间内,物理机器上有两个或两个以上的程序同处于开始运行但尚未结束的状态,并且次序不是事先确定的。

  • 并发执行的特征:
  1. 间断(异步)性:"走走停停",一个程序可能走到中途停下来,失去原有的时序关系;
  2. 失去封闭性:共享资源,受其他程序的控制逻辑的影响。如:-一个程序写到存储器中的数据可能被另一个程序修改失去原有的不变特征。
  3. 失去可再现性:失去封闭性->失去可再现性;外界环境在程序的两次执行期间发生变化,失去原有的可重复特征。

多道程序设计对0S的要求:

  1. 引入进程及其状态:如何描述并发程序的执行
  2. 进程控制与调度:如何实现并发程序运行
  3. 并发控制与通信:如何处理资源的竞争与程序间的合作
  4. 死锁策略:如何解决死锁

  1. 为了描述程序在并发执行时对系统资源的共享,我们需要一个描述程序执行时动态特征的概念,这就是进程。
  2. 进程-在执行中的程序:
  3. 一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
  4. A program is a passive entity, a process is a active entity.
  5. 引入多进程,提高了对硬件资源的利用率,但又带来额外的空间和时间开销,增加了Os 的复杂性;

2、进程与程序

  • 进程是动态的,程序是静态的

程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件、静态和可以复制

  • 进程是暂时的,程序是永久的

进程是一个状态变化的过程,程序可长久保存。

  • 进程与程序的组成不同

进程的组成包括程序、数据和进程控制块(即进程状态信息)。

  • 进程与程序的对应关系

通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。

  • 特征:
  1. 结构特征:进程实体=程序段+相关的数据段PCB。
  2. 动态性:进程的实质是进程实体的一次执行过程,因此动态性是进程的最基本的特征。
  3. 并发性:多个进程实体同存在于内存中,且能在一段时间内同时运行。是最重要的特征。
  4. 独立性:指进程实体是一个能独立运行、独立分配资源和独立接受调度的基本单位。
  5. 异步性:进程按各自独立的、不可预知的速度向前推进。
  • 进程存在意味着:
  1. 处于某种状态(运行、就绪、等待)
  2. 进程控制块PCB(数据结构)
  3. 进程的执行程序(一个可执行文件)
  4. 进程位于某个队列(就绪、等待某事件队列)
  5. 占用某些系统资(内存,打开某些文件、处理机、外设)
  • 进程状态:进程执行时,改变状态
  1. 新建:在创建进程
  2. 就绪:进程等待分配处理器
  3. 运行:指令在执行
  4. 等待:进程等待某些事件发生
  5. 终止:进程执行完毕

  • 进程状态变迁:进程的状态不是固定不变的,而是在不断变换。
  1. 创建( 新new)状态

        OS 已完成为创建一进程所必要的工作

                已构造了进程标识符;已创建了管理进程所需的表格;

        还没有允许执行该进程

  • 进程的基本状态
  1. 就绪状态(Ready):存在于处理机调度队列中的那些进程,它们已经准备就绪,一旦得到CPU,就立即可以运行(有多个进程处于此状态)
  2. 运行状态(Running):当进程由调度/分派程序分派后得到CPU控制权它的程序正在运行(在系统中,总只有一个进程处于此状态)
  3. 等待状态( Waiting):进程正在等待某个事件的发生(如等待I/0的完成),而暂停执行即使给它CPU时间,它也无法执行
  4. 终止(退出exit)状态:

        终止后进程移入该状态;
        它不再有执行资格;
        表格和其它信息暂时由辅助程序保留例子:为处理用户帐单而累计资源使用情况的帐务程序;
        当数据不再需要后,进程(和它的表格)被删除:

  • 进程控制块

>PCB (Process Control Block):一个专门的数据结构,系统用它来记录进程的外部特征,描述进程的运动变化过程
>PCB是进程管理和控制的最重要的数据结构,在创建进程时,建立PCB,并伴随进程运行的全过程,直到进程撤消而撤消。
>PCB是系统感知进程存在的唯一标志,进程与PCB是-一对应的
>PCB经常被系统访问,如,调度程序、资源分配程序、中断处理程序等,所以PCB应常驻内存。

  • 同进程有关的信息:

进程状态、程序计数器、CPU寄存器、CPU调度信息、内存管理信息、计账信息、I/O状态信息

  • 进程标识符 name:

每个进程都必须有一个唯一的标识符可以是字符串,也可以是一个数字。UNIX系统中就是一个整型数。在进程创建时由系统赋予。

  • 进程当前状态 status:说明进程当前所处的状态。
  • 程序计数器:指向执行程序的下个指令的地址
  • CPU现场保护区 cpu status当进程因某种原因不能继续占用CPU时(如:等待打印机),释放CPU,这时就要将CPU的各种状态信息保护起来,为将来再次得到处理机恢复CPU的名种状态,继续运行。
  • CPU调度信息:包括CPU优先级,调度队列指针等
  1. 内存管理信息:包括基址寄存器界限寄存器以及页表或段表等
  2. 记账信息:包括CPU时间,实际使用时间,作业或进程数量等
  3. I/O状态信息:包括分配给进程的IO设备列表,打开文件列表等
  4. 通信信息:是指某个进程在运行的过程中要与其它进程进行通信,该区记录有关进程通信方面的信息。
  • PCB的组织方式:

>PCB表:系统把PCB组织在一起,并放在内存的固定区域,就构成了PCB表

>PCB表的个数决定了系统中最多可同时存在的进程个数,称为系统的并发度

>PCB表的组织方式:链接方式,索引方式

  • 进程调度队列:在各种队列之间进程的迁移
  1. 作业队列-在系统中的所有进程的集合
  2. 就绪队列-在主内存中的,就绪并等待执行的所有进程的集合
  3. 设备队列-等待某一I/O设备的进程队列
  • Schedulers调度

长程调度(或作业调度)-选择可以进入就绪队列的进程

短程调度(或CPU调度)-选择可被下一个执行并分配CPU的进程

  • 调度(Cont.)

短程调度切换频率高、长程调度不快、长程调度控制了多道程序的“道”。

进程可以用下列方式描述:

I/O型进程-花费I0 时间多于计算许多短CPU处理

CPU 型进程-花费更多时间于计算,许多长CPU处理

长调度控制进程:I/O型进程 和 CPU 型进程 混合

  • 中程调度

为了缓和内存紧张的情况,将内存中处于阻塞状态的进程换至外存上(挂起),降低多道程序的度。当这些进程重新具备运行条件时,再从外存上调入内存。

  • 上下文切换
  1. 当CPU切换至另一个进程时,系统必须保存旧进程状态并为新进程调入所保留的状态
  2. 上下文切换的时间开销较重;在切换时,系统没有做有用的工作
  3. 时间取决于硬件的支持

3、进程操作

》进程是有生命周期的:产生、运行、暂停、终止。对进程的这些操作叫进程控制。

》进程控制的职责是对系统中进程实施有效的管理,它是CPU管理的一部分(还有进程同步、通信和调度)。
》当系统允许多进程并发执行时,为了实现共享、协调并发进程的关系,处理机管理必须对进程实行有效的管理。

1、进程创建

进程何时创建?

  1. 作业调度:批处理系统中,作业调度程序调度到某个作业以后就把这个作业装入内存,并分配必要的资源,创建进程,插入就绪队列。
  2. 用户登录:在分时系统中,用户在终端键入登录命令后,若是合法用户,系统建立一个进程,并插入就绪队列。

  1. 提供服务:用户向系统提出请求后,系统专门建立一个进程为用户服务。(如打印请求)
  2. 应用请求 :应用进程的需要,由它自己创建一个新进程,使新进程以并发运行方式完成特定任务。(输入数据并将处理结果输出到表格上)

典型UNIX系统中的进程树:

        父进程创建子进程,如此轮流创建进程下去,构成一个进程树。

资源共享:

  1. 父进程子进程共享所有的资源
  2. 子进程共享父进程资源的子集
  3. 父进程和子进程无资源共享

执行:

父进程和子进程并发执行、父进程等待,直到子进程终止

地址空间:

子女复制双亲、子女有一个程序被调入

2、进程终止

进程执行最后一项并询问操作系统作出决定(退出):

  1. 从子进程向父进程输出数据)(通过等待)
  2. 操作系统收回进程的资源

父进程可中止子进程的执行(终止):

  1. 子进程超量分配资源
  2. 赋予子进程的任务不再需要
  3. 父进程终止:若父进程终止,不允许子进程继续;级联终上

3、进程阻塞

一个处在运行状态的进程,因等待某个事件的发生(如等待打印机、同步事件等)而不能继续运行时将调用阻塞原语,把进程置为阻塞状态,并转进程调度程序(等于让出处理机)。

调用进程阻塞操作是在进程处于运行状态下执行的。它的执行将引起等待某事件的队列的改变。

4、进程唤醒

  1. 当进程所等待的事件发生时该进程将被唤醒(由进程唤醒操作完成)。
  2. 唤醒一个进程有两种方法

                由系统进程唤醒。
                由事件发生进程唤醒。

5、生产者-消费者问题:

生产者进程生产供消费者进程消费的信息

6、消息传递

若P与Q要通信,需要建立诵信连接、通过send/receive交换消息。

诵信连接的实现:物理的(如,共享存储,硬件总线)、逻辑的(如,逻辑特性 )

实现中的问题:

连接如何建立 ?连接可同多于两个的进程相关吗 ?每对通信进程有多少连接 ?
一个连接的容量是多少?连接可使用的固定或可变消息的大小?连接是无向的还是双向的 ?

7、直接通信

  1. 进程必须显式的命名:P向进程P发消息; Q从进程Q收消息
  2. 通信连接的特性:连接自动建立;连接精确的与一对在通信的进程相关;在每一对之间就存在一个连接;连接可以无向,但通常是双向的

8、间接通信

  1. 消息导向至信箱并从信箱接收(被视作端口):每一个信箱有一个唯-的id;仅当共享一个信箱时进程才能通信
  2. Primitives are defined as:send(A,message);receive(A,message)
  3. 通信连接的特性:仅当进程共有一个信箱时连接才能建立;连接可同多个进程相关;每一对进程可共享多个通信连接;连接可是无向或双向的
  4. Operations操作:创建新的信箱;通过信箱发送和接收消息;销毁信箱

  1. 允许一个连接最多同2个进程相关
  2. 只允许一个时刻有一个进程执行接受操作
  3. 允许系统任意选择接收者。发送者被通知谁是接收者,

9、缓冲

消息队列附加在连接上;有以下三种实现方案

  1. 零容量-0消息:发送者必须等待接收者;
  2. 有界容量-n个消息有限长度:若连接满了发送者必须等待
  3. 无界容量-无限长度:发送者从不等待

4、线程的引入

进程具有二个基本属性:

》是一个拥有资源的独立单位:它可独立分配虚地址空间、主存和其它

》又是一个可独立调度和分派的基本单位。
》这二个基本属性使进程成为并发执行的基本单位
》在一些早期的OS中,比如大多数UNIX系统、Linux等,进程同时具有这二个属性。

由于进程是一个资源的拥有者撤销、调度切换时,因而在进程创建、系统需要付出较大的时空开销。
进程的数目不宜过多,进程切换频率不宜过高限制了并发程度。

操作系统的设计目标:提高并发度、减小系统开销

将进程的两个基本属性分开:对于拥有资源的基本单位,不对其进行频繁切换,对于调度的基本单位,不作为拥有资源的单位,“轻装上阵”

引入线程以小的开销来提高进程内的并发程度。

进程:资源分配单位(存储器、文件)和CPU调度(分派)单位。又称为“任务(task)”

线程 :作为CPU调度单位,而进程只作为其他资源分配单位。

》只拥有必不可少的资源,如:线程状态、程序计数器、寄存器上下文和栈
》同样具有就绪、阻塞和执行三种基本状态
》与同属一个进程的其它线程共享进程拥有的全部资源
》可并发执行

  • 线程的优点:

减小并发执行的时间和空间开销(线程的创建、退出和调度),因此容许在系统中建立更多的线程来提高并发程度。

线程的创建时间比进程短
线程的终止时间比进程短:
同进程内的线程切换时间比进程短;
由于同进程内线程间共享内存和文件资源,可直接进行不通过内核的通信

1、线程

  • 线程(轻型进程)是CPU运用的一个基本单元,包括。program counter 程序计数器。register set 寄存器集。stack space 栈空间
  • 一个线程与它的对等线程共享:·
  1. code section 代码段
  2. data section 数据段
  3. ·operating-system resources 操作系统资源
  4. such as open files and signalscollectively know as a task.总体作为一个任务
  • 传统的或重型进程等价于只有一个线程的任务

2、进程和线程的比较

  • 并发性:在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,因而使OS具有更好的并发性,从而能更有效地使用系统资源和提高系统吞吐量。
  • 拥有资源:进程是拥有资源的独立单位
  • 系统开销:在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、IO设备等。因此,0S所付出的开销将明显地大于在创建或撤消线程时的开销。
  • 地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线程间共享--某进程内的线程在其他进程不可见,
  • 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信--需要进程同步和互斥手段的辅助,以保证数据的一致性调度:线程上下文切换比进程上下文切换要快得多

3、益处

  1. 响应度高:一个多线程的应用在执行中即使其中的某个线程阻塞,其他的线程还可继续执行,从而提高响应速度
  2. 资源共享:同一进程的多个线程共享该进程的内存等资源
  3. 经济性:创建和切换线程的开销要低于进程。比如,Solaris中进程创建时间是线程创建的30倍,进程切换时间是线程切换的5倍。
  4. MP体系结构的运用多线程更适用于多”处理机结构。

内核支持的线程

用户级线程;在内核之上,通过用户级的库调用

4、内核线程

由内核支持,在内核空间执行线程创建、调度和管理

依赖于OS核心,由内核进行创建、Wimndows NT和OS/2支持内核线程。

内核维护进程和线程的上下文信息
线程切换由内核完成:
一个线程发起系统调用而阻塞,不会影响其他线程的运行时间片分配给线程,所以多线程的进程获得更多CPU时间。

5、用户线程

由用户级线程库进行管理的线程

线程库提供对线程创建\调度和管理的支持,无需内核支持。

不依赖于OS核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,所以速度特别快。

》用户线程的维护由应用进程完成;
》内核不了解用户线程的存在;
》用户线程切换不需要内核特权;
》DRAWBACKS:

  1. 如果内核是单线程的,那么一个用户线程发起系统调用而阻塞,则整个进程阻塞
  2. 时间片分配给进程,多线程则每个线程就慢。
  • 用户线程与内核线程

调度方式:内核线程的调度和切换与进程的调度和切换十分相似,用户线程的调度不需OS的支持。

调度单位:用户线程的调度以进程为单位进行,在采用时间片轮转调度算法时,每个进程分配相同的时间片。对内核级线程,每个线程分配时间片。

  • 多线程模型:多对一、一对一、多对多。

多对一:

  1. 多个用户级线程映像进单个内核线程
  2. 用于不支持内核线程的系统中
  3. 任一时刻只能有一个线程可以访问内核(并发性低)
  4. 一个用户线程发起系统调用而阻塞,则整个进程阻塞

一对一:

  1. 每个用户级线程映像进内核线程
  2. 提供了更好的并发性,一个用户线程发起系统调用而阻塞时允许另一个线程运行
  3. 每创建一个用户级线程需创建一个相应的内核线程,带来了额外开销,所以许多系统限制应用中的线程数目

多对多:

  1. 多对一模型的缺点:不能实现真正的并发
  2. 一对一模型的缺点:需限制应用中的线程数目
  3. 多对多模型:不限制应用的线程数、多个线程可以并发

两级模型:

通过多道程序设计得到CPU的最高利用率

(CPU-I0脉冲周期-进程的执行包括进程在CPU上执行和等待IO)进程的执行以CPU脉冲开始,其后跟着IO脉冲.进程的执行就是在这两个状态之间进行转换

  • cpu-burst:

CPU脉冲的分布,在系统中,存在许多短CPU脉冲,只有少量的长CPU脉冲。

比如:IO型作业具有许多短CPU脉冲而CPU型作业则会有几个长CPU脉冲这个分布规律对CPU调度算法的选择是非常重要的。

  • cpu调度:

当CPU空闲时,0S就选择内存中的某个就绪进程,并给其分配CPU

  • cpu调度器:

CPU调度可能发生在以下情况下:

从运行转到等待、从运行转到就绪、从等待转到就绪、终止运行

从运行转到等待、从等待转到就绪 的调度称为非抢占式调度。

从运行转到就绪、终止运行 称为抢占式调度。

非抢占方式:

把处理机分配给某进程后,便让其一直执行,直到该进程完成或发生某事件而被阻塞时,才把处理机分配给其它进程,不允许其他进程抢占已经分配出去的处理机。
优点:实现简单、系统开销小,适用于大多数批处理系统环境
缺点:难以满足紧急任务的要求,不适用于实时、分时系统要求

抢占方式:

允许调度程序根据某个原则,去停止某个正在执行的进程,将处理机重新分配给另一个进程。

  • 抢占的原则
  1. 时间片原则:各进程按时间片运行,当一个时间片用完后,便停止该进程的执行而重新进行调度。这个原则适用于分时系统。
  2. 优先权原则:通常对一些重要的和紧急的进程赋予较高的优先权。当这种进程进入就绪队列时,如果其优先权比正在执行的进程优先权高,便停止正在执行的进程,将处理机分配给优先权高的进程,使之执行
  3. 短作业优先原则:当新到达的作业比正在执行的作业明显短时,将暂停当前长作业的执行,将处理机分配给新到的短作业,使之执行。

调度程序采用什么算法选择一个进程(作业)?

如何评价调度算法的性能 ?

调度准则:

  1. CPU利用率-使CPU尽可能的忙碌
  2. 吞吐量-单位时间内运行完的进程数
  3. 周转时间-进程从提交到运行结束的全部时间
  4. 等待时间-进程在就绪队列中等待调度的时间片总和
  5. 响应时间-从进程提出请求到首次被响应的时间段[在分时系统环境下不是输出完结果的时间]

调度算法影响的是等待时间,而不能影响进程真正使用CPU的时间和IO时间

最大的CPU利用率、最大的吞吐量、最短的周转时间、最短的等待时间、最短的响应时间

  • 调度算法

先来先服务(FCFS)
短作业优先(SJF)
优先权调度(Priority Scheduling)
时间片轮转(Round Robin)
多级队列调度(Multilevel Queue)
多级反馈队列调度算法(Multilevel Feedback Queue)

  • 先来先服务

最简单的调度算法
可用于作业或进程调度
算法的原则是按照作业到达后备作业队列(或进程进入就绪队列)的先后次序来选择作业(或进程)

护航效应:

假设有一个CPU进程和许多IO型进程
当CPU进程占用CPU运行时,IO型进程可能完成了其IO操作回到就绪队列等待CPU,IO设备空闲
CPU进程释放CPU后,IO型进程陆续使用CPU,并很快转为I/O操作,CPU空闲

  • 调度算法

关联到每个进程下次运行的CPU脉冲长度,调度最短的进程

非抢占式调度:一旦进程拥有CPU,它的使用权限只能在该CPU 脉冲结束后让出

抢占式调度-发生在有比当前进程剩余时间片更短的进程到达时,也称为最短剩余时间优先调度

 SJF是最优的-对一组指定的进程而言,它给出了最短的平均等待时间 

其长度只能估计 

可以通过先前的CPU脉冲长度及计算指数均值进行

采用SJF有利于系统减少平均周转时间,提高系统吞吐量

-般情况下SJF调度算法比FCFS调度算法的效率要高一些,但实现相对要困难些。

如果作业的到来顺序及运行时间不合适,会出现饥饿现象例如,系统中有一个运行时间很长的作业JN,和几个运行时间小的作业,然后,不断地有运行时间小于JN的作业的到来,这样,作业JN就因得不到调度而饿死。另外,作业运行的估计时间也有问题。

每个进程都有己的优先数[整数]

CPU分配给最高优先级的进程[假定最小的整数≡最高的优先级]

抢占式 、非抢占式

SJF是以下一次CPU脉冲长度为优先数的优先级调度

静态优先权在进程创建时确定,且在整个生命期中保持不变。

静态优先权的问题 :问题=饥饿-低优先级的可能永远得不到运行

动态优先权是指进程的优先权可以随进程的推进而改变以便获得更好的调度性能。

改变优先权的因素:进程的等待时间、已使用处理机的时间、资源使用情况

Round Robin (RR):

(每个进程将得到小单位的CPU时间「时间片1,通常为10-100毫 秒。时间片用完后,该进程将被抢占并插入就绪队列末尾)

(一般来说,RR的平均周转时间比SJF长,但响应时间要短一些)

一组进程的平均周转时间并不一定随着时间片的增大而降低。一般来说,如果大多数(80%)进程能在一个时间片内完成就会改盖平均周转时间

三、多级队列

1、多级反馈队列

按进程的属性来分类,如进程的类型、优先权、占用内存的多少,每类进程组成一个就绪队列,每个进程固定地处于某一个队列,如

(就绪队列分为):(前台)交互式、(后台)[批处理]

(每个队列有自己的调度算法):RR、FCFS

调度须在队列间进行

固定优先级调度,即前台运行完后再运行后台。有可能产生饥饿。

给定时间片调度,即每个队列得到一定的CPU时间,进程在给定时间内执行;如,80%的时间执行前台的RR调度,20%的时间执行后台的FCFS调度

2、多级反馈队列调度

存在多个就绪队列,具有不同的优先级,各自按时间片轮转法调度。

各个就绪队列中时间片的大小各不相同,优先级越高的队列时间片越小。

允许进程在队列之间移动。

当一个进程执行完一个完整的时间片后被抢占处理器,被抢占的进程优先级降低一级而进入下级就绪队列,如此继续,直至降到进程的基本优先级。而一个进程从阻塞态变为就绪态时要提高优先级

最后会将I0型和交互式进程留在较高优先级队列

进程能在不同的队列间移动:可实现老化

多级反馈队列调度程序由以下参数定义:

队列数;

每一队列的调度算法;

决定进程升级的方法;

决定进程降级的方法;

 定需要服务的进程将进入哪个队列的方法。

四、进程同步

操作系统原理:

生产者消费者问题

采用共享内存解决生产者消费者问题时,N个缓冲区最多只能用N-1个。

背景:

对共享数据的并发访问可能导致数据的不一致性

要保持数据的一致性,就需要一种保证产进程的正确执行顺序的机制 

解决有界缓冲区问题的共享内存方法在类数据count 上存在竞争条件

race condition竞争条件:

若干个并发的进程(线程)都可以访问和操纵同一个共享数据,从而执行结果就取决于并发进程对这个数据的访问次序为了保证数据的一致性,需要有同步机制来保证多个进程对共享数据的互斥访问。

进程类型:协作进程、独立进程

进程间资源访问冲突:共享变量的修改冲突、操作顺序冲突。

  • 进程间的制约关系:

间接制约:有些资源需要互斥使用,因此各进程进行竞争--独占分配到的部分或全部共享资源,进程的这种关系为进程的互斥。

直接制约:进行协作--具体说,一个进程运行到某一点时要求另一伙伴进程为它提供消息,在未获得消息之前,该进程处于等待状态获得消息后被唤醒进入就绪态.进程的这种关系为进程的同步

  • 进程间的交互关系

互斥,指多个进程不能同时使用同一个资源:

同步,进程之间的协作;

死锁,指多个进程互不相让,都得不到足够的资源;

  • 临界区的访问过程

对于临界资源,多个进程必须互斥的对它进行访问。
幅界区icriiiculsesiinm):进程中访问临界密汇的一段代码。
实现进程对临界资源的互斥访问一各进程互斥的进入自己的临界区
假定一个系统有n个进程(P0,P1,..,Pn-1},每个进程有一个代码段称为临界区,在该区中进程可能修改共享变量|更新一个表\写一个文件等.
当一个进程在临界区中执行时,其他进程都不能进入临界区

临界区的执行在时间上是互斥的,进程必须请求允许进入临界区

进入区(entry scction):在进入临界区之前,检査可否进入临界区的一段代码。如果可以进入临界区,通常设置相应“正在访问临界区”标志。

退出区(exit section):用于将"正在访问临界区"标志清除。

剩余区(remainder section):代码中的其余部分。

  • 临界区问题的解决方案

 互斥:假定进程Pi在其临界区内执行,其他任何进程将被排斥在自己的临界区之外。

有空让进:临界区虽没有进程执行,但有些进程需要进入临界区,不能无限期地延长下一个要进入临界区进程的等待时间。

有限等待:在一个进程提出进入临界区的请求和该请求得到答复的时间内,其他进程进入临界区的次数必须是有限的。

如何实现进程间的互斥 ?轮流?申请?

轮流的缺点:强制轮流进入临界区,没有考虑进程的实际需要,容易造成资源利用不充分:在进程1让出临界区之后,进程2使用临界区之前,进程1不可能再次使用临界区;

申请的优点:不用交替进入,可连续使用

        缺点:两进程可能都进入不了临界区,Pi和Pi在切换自己flag之后和检查对方iag之前有一段时间如果都切换flag,都检査不通过。

》可以用临界区解决互斥问题,它们是平等进程间的一种协商机制
》OS可从进程管理者的角度来处理互斥的问题,信号量就是OS提供的管理公有资源的有效手段。
》1965年,由荷兰学者Diikstra提出(所以P、V分别是荷兰语的test(proberen)和increment(verhogen)),是一种卓有成效的进程同步机制。
》用于保证多个进程在执行次序上的协调关系的相应机制称为进程同步机制。
信号量代表可用资源实体的数量。

一种不需要忙等待的同步工具 

S是与临界区内所使用的公用资源有关的信号量

P(S):表示申请一个资源V(S):表示释放一个资源。
》初始化指定一个非负整数值,表示空闲资源总数在信号量经典定义下,信号量S的值不可能为负
>S0 可供并发进程使用的资源数
>S<0其绝对值就是正在等待进入临界区的进程数

利用信号量实现互斥:为临界资源设置一个互斥信号量,其初值为1;Semaphore S;// initialized to 1
在每个进程中将临界区代码置于P(S)和V(S)原语之间
P(S);
CriticalSection()

V(S);

利用信号量来描述前趋关系:

》前趋关系:并发执行的进程P1和P2中,分别有代码C1和C2要求C1在C2开始前完成

》为每个前趋关系设置一个同步信号量S12,其初值为0

  • 信号量
  1. 同步、互斥的约束条件
  2. 临界资源的抽象
  3. 初始条件
  4. 正确的P-V操作

哲学家就餐问题、有限缓冲区问题 、读者写者问题

(由Diijkstra首先提出并解决)5个哲学家围绕一张圆桌而坐桌子上放着5支筷子,每两个哲学家之间放一支;哲学家的动作包括思考和进餐,进餐时需要同时拿起他左边和右边的两支筷子,思考时则同时将两支筷子放回原处。如何保证哲学家们的动作有序进行?如:不出现相邻者同时进餐

可能会出现死锁,五个哲学家每人拿起了他左边的筷子

  1. 最多允许四个哲学家同时就坐
  2. 同时拿起两根筷子
  3. 非对称解决

五、有限缓冲区问题

1、生产者-消费者问题:

问题描述:若干进程通过有限的共享缓冲区交换数据。其中,"生产者"进程不断写入,而"消费者"进程不断读出;共享缓冲区共有N个;任何时刻只能有一个进程可对共享缓冲区进行操作。

采用信号量机制:

  1. full是"满"数目,初值为0,empty是"空"数目,初值为N。实际上,fll +empty == N
  2. mutex用于访问缓冲区时的互斥,初值是1
  3. 每个进程中各个P操作的次序是重要的:先检查资源数目,再检查是否互斥--否则可能死锁

2、读者-写者问题

问题描述:对共享资源的读写操作,任一时刻“写者”最多只允许一个,而“读者’则允许多个。

采用信号量机制:
·信号量Wmutex表示“允许写",初值是1。
·公共变量Rcount表示“正在读”的进程数,初值是0:
·信号量Rmutex表示对Rcount的互斥操作,初值是1。

3、PV操作讨论
信号量的物理含义

S>0表示有S个资源可用
S=0表示无资源可用
S<0则|S |表示S等待队列中的进程个数
P(S):表示申请一个资源
V(S):表示释放一个资源。
信号量的初值应该大于等于0

PV操作必须成对出现,有一个P操作就一定有一个V操作

当为互斥操作时:它们处于同一进程

当为同步操作时:则不在同一进程中出现

对于前后相连的两个P(S1)和P(S2),顺序是至关重要的:同步P操作应该放在互斥P操作前。

六、死锁问题

死锁Deadlock:计算机系统中多道程序并发执行时,两个或两个以上的进程由于竞争资源而造成的一种互相等待的现象(僵局),如无外力作用,这些进程将永远不能再向前推进。
(一组等待的进程,其中每一个进程都持有资源,并且等待着由这个组中其他进程所持有的资源 )

1、共享资源的获取和释放

每一个进程如下的利用资源:

  1. Request(申请):如果申请不能立即被允许,那么进程必须等待直到能获取资源。(通过系统调用或者信号量来进行资源的申请和释放)
  2. Use(使用):进程使用资源进行相关操作
  3. Release(释放):进程释放资源

2、死锁的原因

  • 竞争资源引起死锁

·当系统中供多个进程所使用的资源,不足以同时满足它们的需要时,引起它们对资源的竞争而产生死锁

  • 进程推进顺序不当引起死锁

在多道程序系统中,并发执行的进程推进序列不可预测
有些推进顺序,进程可以顺利完成
有的推进顺序会引起进程无限期地等待永远不会发生的条件而不能向前推进,造成死锁。

3、死锁的必要条件

四个条件同时出现,死锁将会发生

互斥一次只有一个进程可以使用一个资源

(占有井等待:一个至少持有一个资源的进程等待获得额外的由其他进程所持有的资源)(请求与保持)

(不可抢占:一个资源只有当持有它的进程完成任务后,自由的释放)(非剥夺)

(循环等待:等待资源的进程之间存在环)

4、资源分配图

一组集合E

V被分为两个部分:P:含有系统中全部的进程;R:含有系统中全部的资源

(请求边:直接P,→>R;)、分配边:R;→>P;

  • 如果图没有环,那么不会有死锁
  • 如果图有环 :如果每一种资源类型只有一个实例,那么死锁发生。

                                如果每种资源类型有多个实例,可能死锁。

5、死锁预防

1、处理死锁的方法

忽略、预防、避免、检测、解除

  1. 忽略这个问题,假装系统中从未出现过死锁。这个方法被大部分的操作系统采用,包括UNIX)鸵鸟策略
  2. (确保系统永远不会进入死锁状态)预防死锁,避免死锁
  3. (允许系统进入死锁状态,然后恢复系统)死锁检测
2、鸵鸟策略
  1. 像鸵鸟一样对死锁视而不见
  2. 处理死锁的代价很大,而且常常给用户带来许多不便的限制。
  3. 大多数用户宁可在极偶然的情况下发生死锁,也不愿限制每个用户只能创建一个进程、只能打开一个文件等等。
  4. 于是不得不在方便性和正确性之间作出折衷。
3、抑制死锁发生的必要条件

互斥:共享资源不是必须的,必须保持非共享资源。

  • 占有并等待:必须保证进程申请资源的时候没有占有其他资源
  1. 要求进程在执行前一次申请全部的资源
  2. 没有资源时,可以申请资源。在申请更多其它资源之前,需要释放已有资源
  3. 利用率低,可能出现饥饿
  • 非抢占
  1. 如果一个进程的申请没有实现,它要释放所有占有的资源
  2. 抢占的资源放入进程等待资源列表中
  3. 只有进程能够重新得到旧的资源和新申请的资源时,才可以重新开始
  • 循环等待:将所有的资源类型放入资源列表中,并且要求进程按照资源表申请资源
  1. 所有进程对资源的请求必须严格按资源序号递增的次序提出,
  2. 总有一个进程占据了较高序号的资源,它继续请求的资源必然是空闲的,可以一直向前推进,
  3. 在资源分配图中不可能出现环路,因而摒弃了“环路等待”条件
  4. 这种策略可以提高资源利用率,但在进程使用各类资源的顺序与系统规定的顺序不同时会造成资源浪费的情况。

上述预防死锁的方法通过限制资源请求来打破死锁的四个必要条件之一,从而预防死锁的发生。
其可能的副作用:
·降低设备利用率和吞吐量
·可能有进程饥饿

6、死锁避免

  1. 允许进程动态地申请资源,系统在进行资源分配之前先计算资源分配的安全性
  2. 若此次分配不会导致系统从安全状态向不安全状态转换,便可将资源分配给进程;否则不分配资源,进程必须阻塞等待。
  • 处理死锁的方法

安全状态是指系统的一种状态,在此状态下,系统能按某种顺序(例如P、P....P.)来为各个进程分配其所需资源,直至最大需求,使每个进程都可顺序地一个个地完成。这个序列(P、P..P)称为安全序
列。
(如果存在一个安全序列系统处于安全态
若某一时刻不存在一个安全序列,则称系统处于不安全状态。

  • 基本事实

如果一个系统在安全状态,就没有死锁

如果系统死锁,则处于不安全状态

如果一个系统处于不安全状态,就有可能死锁

避免:确保系统永远不会进入不安全状态

资源有单个实例:资源分配图

资源有多个实例:银行家算法

  • 资源分配图算法
  1. claim edge 需求边P;→R,代表进程Pi可能会申请资源Ri,表示为虚线
  2. 一个进程申请资源的时候,需求边转化为请求边
  3. 当资源被进程释放的时候,分配边转化为需求边
  4. 系统中的资源必须被事先声明

当一个进程Pi 申请资源Ri时,由循环检测算法来检查:

如果把图中的需求边P;→R转为分配边→P;,图中是否会出现环路,只有不出现环路,才实施资源分配。

7、银行家算法

多个实例 

每一个进程必须事先声明使用的最大量

当一个进程请求资源,它可能要等待

当一个进程得到所有的资源,它必须在有限的时间释放它们 

1、银行家算法的数据结构

n为进程的数目,m为资源类型的数目

如果available[il=k,那么资源Rj有k个实例有效

如果Max[i,j]=k,那么进程P河可以最多请求资源R的k个实例

如果Alocation[i,j]=k,那么进程Pj当前分配了k个资源Ri的实例 

如果Need[i,j]=k,那么进程Pi 还需要k个资源Ri的实例

8、死锁检测和恢复

1、一个资源类型的多个实例

可用:一个长度m的向量代表每种资源类型的有效数目

分配:一个"x… 的矩阵定义了当前分配的每一种资源类型的实例数目

请求:一个"xm的矩阵申明了当前的进程请求。如果Request[i,ji]=k那么进程Pi请求k个Ri资源的实例

2、检测算法

让Work和Finish作为长度为m和n的向量)

找到下标i

3、死锁发生后,如何处理死锁 ?

操作员人工处理
进程终止
资源抢占

4、从死锁中恢复:进程终止

  1. 终止所有的死锁进程
  2. 一次终止一个进程直到死锁环消失
  3. 选择终止顺序:进程的优先级、进程计算了多少时间,还需要多长时间

5、从死锁中恢复:资源抢占

逐步从进程中抢占资源,直到打破死锁

选择一个牺牲品:最小化代价

回退:返回到安全的状态,然后重新开始进程

饥饿:同一个进程可能总是被选中,包括在回退时

  1. 程序必需放入内存并放入一个进程才能被执行
  2. 输入队列- 磁盘上等待进入内存并执行的进程的集合
  3. 用户程序在执行之前必需经历很多步骤

指令和数据绑定到内存地址可以在三个不同的阶段发生。

  1. 编译时期:如果内存位置已知,可生成绝对代码;如果开始位置改变,需要重新编译代码
  2. 装入时期:如果存储位置在编译时不知道,则必须生成可重定位代码)
  3. 执行时期:如果进程在执行时可以在内存中移动,则地址绑定要延迟到运行时。需要硬件对地址映射的支持,例如基址和限长寄存器 

逻辑地址空间的概念同物理地址空间相关联,它是正确内存管理的中心。

  1. 逻辑地址由CPU产生;也叫做虚拟空间。
  2. 物理地址-内存设备所读入的地址

在编译时期和装入时期的地址绑定策略生成的逻辑地址和物理地址是相同的,而在执行时的地址绑定策略是不同的。

9、地址重定位

将程序装入到与其地址空间不一致的物理空间,所引起的一系列地址变换过程,

  1. 静态地址重定位:

在装入一个作业时,把作业中的指令地圳全部转换为绝对地址,在作业执行过程中就无须再进行地址转换工作。

  1. 动态地址重定位

动态地址重地位是在程序执行过程中,在CPU访问内存之前,将要访问的程序或数据地址转换成内存地址。动态重定位依靠硬件地址变换机构完成。

  1. 硬件把虚拟地址映射到物理地址 
  2. 在MMU策略中基址寄存器中的值被加入到用户进程所产生的每个地址中,在其送入内存的时候。
  3. 用户程序所对应到的是逻辑地址,物理地址对它从来都不可见。

10、存储管理方式

连续分配方式:为一个程序分配一段连续的内存空间,主要有:

  1. 单一连续区管理方式;
  2. 多分区管理方式,是一种可用于多道程序的较简单的存储管理方式:固定分区方式、可变分区方式

主存通常被分为两部分

为操作系统保留的部分,通常用中断矢量保存在内存低端。

用户进程保存在内存高端。

单独分区分配

用户区只能容纳一道作业

  1. 基址寄存器策略由来保护用户进程(同其他进程和改变的操作系统代码和数据分开)。
  2. 基址寄存器包含最小物理地址的值;限长寄存器包含逻辑地址的范围,每个逻辑地址必需比限长寄存器的值小。

11、固定分区(Fixed Partitioning)分配

》固定式分区是在作业装入之前,内存就被划分成若干个固定大小的连续分区。
》划分工作可以由系统管理员完成,也可以由操作系统实现。
》一旦划分完成,在系统运行期间不再重新划分,即分区的个数不可变,分区的大小不可变,所以,固定式分区又称为静态分区。

》划分分区的方法如下:

分区大小相等:只适用于多个相同程序的并发执行(处理多个类型相同的对象),缺乏灵活性。

分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。

一般将内存的用户区域划分成大小不等的分区,可适应不同大小的作业的需要

系统有一张分区说明表,每个表目说明一个分区的大小、起始地址和是否已分配的使用标志。

优点:易于实现,开销小。

缺点:1.分区大小固定:内碎片2.分区总数固定:限制并发执行的进程数目。

采用的数据结构:分区表记录分区的大小和使用情况

七、动态分区分配

多分区分配

分区的划分是动态的,不是预先确定的

  1.  分区一可用的内存块,不同大小的分区分布在整个内存中。
  2.  当一个进程到来的时候,它将从一个足够容纳它分区中分配内存。
  3.  操作系统包含以下信息):a)allocated partitions(分配的分区)b)fee partitions (hole)(空的分区)
  • 可变分区分配

分区分配算法:寻找某个空闲分区,其大小需大于或等于程序的要求。若是大于要求,则将该分区分割成两个分区,其中一个分区为要求的大小并标记为“占用”,而另一个分区为余下部分并标记为“空闲”。分区的先后次序通常是从内存低端到高端。

分区释放算法:需要将相邻的空闲分区合并成一个空闲分区。(这时要解决的问题是:合并条件的判断)

  • 怎样从一个空的分区序列中满足一个申请需要。
  1. First-fit(首先适应):分配最先找到的合适的分区。
  2. Best-fit(最佳适应):搜索整个序列,找到适合条件的最小的分区进行分配。
  3. Worst-fit(最差适应):搜索整个序列,寻找最大的分区进行分配。

在速度和存储的利用上,首先适应和最佳适应要比最差适应好。

1、首次适应算法(First Fit )

从空闲分区表的第一个表目开始查找,把找到的第一个满足要求的空闲区分配给作业,目的在于减少查找时间。通常将空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。

特点:

  1. 分配和释放的时间性能较好,较大的空闲分区可以被保留在内存高端。
  2. 随着低端分区不断划分而产生较多小分区每次分配时查找时间开销会增大。
  3. 在系统不断地分配和回收中必定会出现一些不连续的小的空闲区,称为外碎片。虽然可能所有碎片的总和超过某一个作业的要求,但是由于不连续而无法分配。

2、最佳适应算法(Best Fit )

》从全部空闲区中找出能满足作业要求的、且最小的空闲分区》能使碎片尽量小
》为提高查找效率,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配,
>特点

从个别来看,外碎片较小但从整体来看会形成较多无法利用的碎片。

较大的空闲分区可以被保留。

1、动态分区分配算法举例

可变式分区的碎片问题:在系统不断地分配和回收中,必定会出现些不连续的小的空闲区,称为外碎片。虽然可能所有碎片的总和超过某一个作业的要求,但是由于不连续而无法分配。
解决碎片的方法是拼接(或称紧凑),即向一个方向(例如向低地址端)移动已分配的作业,使那些零散的小空闲区在另一方向连成一片。
分区的拼接技术,一方面要求能够对作业进行动态重定位,另一方面系统在拼接时要耗费较多的时间。

外碎片、内碎片、通过紧缩来减少外碎片,把一些小的空闲内存结合成一个大的块。

只有重定位是动态的时候,才有可能进行紧缩,紧缩在执行时期进行

I/O问题:当I/O的时候,把工作锁定在内存中。只对操作系统的缓冲区进行I/O。

2、动态分区产生外碎片的原因是什么?

》这是因为这种分配要求把作业必须安置在一连续存储区内的缘故。>
》如果允许物理地址空间非连续,是否可以解决?
》分页存储管理是解决存储碎片的一种方法,要避开连续性要求,允许进程的物理地址空间不连续。

  1. 进程的物理地址空间可以是不连续的,如果有可用的物理内存,它将分给进程。
  2. 把物理内存分成大小固定的块。
  3. 把逻辑内存也分为固定大小的块,叫做页。
  4. 保留所有空闲帧的记录。
  5. 运行一个有N页大小的程序,需要找到N个空的页框读入程序。
  6. 建立一个页表,把逻辑地址转换为物理地址。
  7. 内碎片。

3、CPU产生的地址被分为

页号:它包含每个页在物理内存中的基址,用来作为页表的索引。

偏移:同某址相结合,用来确定送入内存设备的物理内存地址。

  • 纯分页的特点
  1. 没有外碎片,每个内碎片不超过页大小。
  2. 一个程序不必连续存放。
  3. 程序全部装入内存。

  1. 页表被保存在主存中
  2. 页表基址寄存器指向页表
  3. 页表限长寄存器表明页表的长度
  4. 在这个机制中,每一次的数据/指令存取需要两次内存存取,一次是存取页表,一次是存取数据
  5. 通过一个联想寄存器,可以解决两次存取的问题

3、基本的地址变换机构

实现从逻辑地址到物理地址的转换:将用户程序中的页号变换成内存中的物理块号

  1. 有效地址寄存器( 逻辑地址寄存器)
  2. 页表
  3. 页表寄存器
  4. 物理地址寄存器
  5. PCB中增加存放页表始址和页表长度的项

1、地址变换过程

  1. 按页的大小分离出页号和位移量,放入有效地址寄存器中
  2. 将页号与页表长度进行比较,如果页号大于页表长度,越界中断
  3. 以页号为索引查找页表:将页表始址与页号和页表项长度的乘积相加便得到该表项在页表中的位置,于是可从中得到该页的物理块号;
  4. 将该物理块号装入物理地址寄存器的高址部分
  5. 将有效地址寄存器中的位移量直接复制到物理地址寄存从而形成内存地址。

八、分段

支持用户观点的内存管理机制。

一个程序是一些段的集合,一个段是一个逻辑单位。

一个逻辑地址是两个向量的集合

段表-映射二维物理地址,每个表项包括

基址-包括内存中段物理地址的起始地址。

限长-指定段的长度。

段表基址寄存器指向段表在内存中的地址。

段表限长寄存器表明被一个程序所使用的段的数目。

九、虚拟内存

基本要求:进程必须全部放入内存后方可运行

如果进程大于内存的容量或者内存中同时运行多个进程

覆盖和动态加载

虚拟存储技术所要解决的主要问题:从物理上扩充内存容量、从逻辑上扩充内存容量

常规存储器的特征:

一次性:作业在运行前需要一次性的全部装入内存

驻留性:作业装入内存后,便一直驻留在内存中,直到作业结束。

正是由于一次性和驻留性,使得程序中暂时不用的数据占用了大量的内存空间,从而需要运行的作业无法装入内存。

  1. 程序通常有处理异常错误的代码,很少执行
  2. 数组、链表和表通常分配了比实际需要更多的内存
  3. 程序的某些选项或特点可能很少使用
  4. 即使需要完整的程序,也并不是同时需要所有的程序

1、局部性原理

在一段时间内,程序的执行仅局限于某个部分;相应地,它所访问的存储空间也局限于某个区域内。

  1. 程序在执行时,除了少部分的转移和过程调用指令外,大多数仍是顺序执行的。
  2. 子程序调用将会使程序的执行由一部分内存区域转至另一部分区域。
  3. 程序中存在许多循环结构,循环体中的指令被多次执行。
  4. 程序中还包括许多对数据结构的处理,如对连续的存储空间--数组的访问,往往局限于很小的范围内。

1、局部性表现为

时间局部性:

》如果程序中的某条指令一旦执行,则不久的将来时间局部性:

》该指令可能再次被执行;
》如果某个存储单元被访问,则不久以后该存储单元可能再次被访问。空间局部性:
》产生时间局限性的典型原因是在程序中存右量的循环操作。

空间局部性:

》一旦程序访问了某个存储单元,则在不叫将来其附近的存储单元也最有可能被访问。 即程序在一段时间内所访问的地址,可能集中在一定的范围内其典型原因是程序是顺序执行的。

2、虚拟内存

虚拟内存是一种允许进程部分装入内存就可以执行的技术

  1. 局部性原理:时间局部性,空间局部性
  2. 只有运行的部分程序需要在内存中
  3. 逻辑地址空间能够比物理地址空间大
  4. 必须允许页面能够被换入和换出

1、虚拟存储器的特征:

  1. 离散性:在内存分配时采用离散的分配方式,是虚拟存储器的最基本的特征。
  2. 多次性:一个作业被分成多次调入内存运行,即在作业运行时没有必要将其全部装入,只须将当前要运行的那部分程序和数据装入内存即可。是虚拟存储器最重要的特征。
  3. 对换性:作业运行过程中信息在内存和外存的对换区之间换进、换出。
  4. 虚拟性:从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。

3、请求调页

实现虚拟存储器要解决:

程序部分运行可以吗?》取页--将所需的部分装入内存

发现程序不在内存时,如何将其装入后继续运行?》请求调页一缺页时,产生缺页中断,将外存上的页调入内存

内存无空间时怎么办?》页面置换--内存不足时,将哪些页换出内存

1、页面调入策略

为能使进程运行,事先需将一部分要执行的程序和数据调入内存

预调页策略:主动的页面调入策略,即把那些预计很快会被访问的程序或数据所在的页面,预先调入内存。
预测的准确率不高(50%),主要用于进程的首次调入。也有的系统将预调页策略用于请求调页

请求调页策略:当进程在运行中发生缺页时,由系统将缺页调入内存。目前虚拟存储器系统大多采用此策略。在调页时须花费较大的系统开销,如需频繁启动磁盘I/O,

  • 只有在一个页需要的时候才把它换入内存
  1. 需要很少的I/O 
  2. 需要很少的内存)
  3. 快速响应
  4. 多用户

需要页→查阅此页 、不在内存=>换入内存

  1. 对进程页表的修改
  2. 缺页中断的支持

2、请求分页中的硬件支持

1)请求分页的页表机制

它是在纯分页的页表机制上形成的,由于只将应用程序的一部分调入内存还有一部分仍在磁盘上,故需在页表中再增加若干项,供程序(数据)在换进、换出时参考。在请求分页系统中的每个页表项如图所示。

3、各字段说明如下

状态位(存在位P):用于指示该页是否已调入内存,供程序访问时参考。

访问字段A:用于记录本页在一段时间内被访问的次数,或最近已有多长时间未被访问,提供给置换算法选择换出页面时参考。

修改位M:表示该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本,因此,若未被修改,在置换该页时就不需将该页写回到外存上,以减少系统的开销和启动磁盘的次数;若已被修改,则必须将该页重写到外存上,以保证外存中所保留的始终是最新副本。

外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时使用。

4、缺页中断机构

在请求分页系统中,每当所要访问的页面不在内存时,便要产生一缺页中断,请求OS将所缺页调入内存。与一般中断的主要区别在于>缺页中断在指令执行期间产生和处理中断信号,而一般中断在一条指令执行完后检查和处理中断信号。
>缺页中断返回到该指令的开始重新执行该指令,而一般中断返回到该指令的下一条指令执行。

>一条指令在执行期间,可能产生多次缺页中断。

  1. 查找页表来确定此次地址访问是否合法
  2. 如果不合法,则中止该进程,否则如果有效但不在内存,即发生了缺页,则需要将其调入内存
  3. 所需页在外存,找到该页
  4. 找到一个空闲物理块,启动磁盘,把该页读入内存
  5. 读磁盘结束后,修改页表以指出该页已在内存中
  6. 重新开始执行刚才发生缺页中断的指令,这时它可以访问刚才调入的页

主要的动作是:

>处理缺页中断

>从磁盘读入所需的页

>重新开始被中断的进程

其中最大的一部分时间开销为从磁盘读入所需的页

5、缺页率:

假定作业Ji共有m页,系统分配给它的主存块为n块,这里m>n。如果作业Ji执行过程中总的内存访问次数为A,成功访问的次数为S,不成功的访问次数为F(产生缺页中断的次数),则:

A=S+F            缺页率: p=F/A

存取内存的时间、交换页的时间

十、页面置换

终止用户进程

交换进程,释放其所有帧,降低多道程序的度

页面置换

页置换一找到内存中并没有真正使用的一些页,换出

如果没有空闲帧,需要两个页面传输,一个换出,一个换入。
可以通过修改位来降低额外开销。
修改(脏)位来防止页面转移过多一只有被修改的页面才写入磁盘)
页置换实现了逻辑内存和物理内存的划分一在一个较小的物理内存基础之上可以提供一个大的虚拟内存

页面置换算法:

在进程运行过程中,如果发生缺页,而内存中又无空闲块时,怎么办?

将内存中的某一页换到磁盘的对换区

将哪个页面调出?

根据页面置换算法来确定

置换算法的好坏将直接影响系统的性能,不适当的算法可能会导致进程发生“抖动”(Thrashing)。

》选择哪些帧进行置换 ?
》缺页率
》从理论上讲,应将那些以后不再被访问的页面换出,或把那些在较长时间内不会再被访问的页面换出。
》存在多种置换算法,都是试图更接近理论上的目标

需要一个最小的缺页率

通过运行一个内存访问的特殊序列(访问序列),计算这个序列的缺页次数来评估算法

1.最佳算法(OPT, optimal)
2.先进先出算法(FIFO)
3.最近最久未使用算法(LRU,Least Recently Used)
4.LRU近似算法(clock)

被置换的页将是之后最长时间不被使用的页

使用离过去最近的情况作为不远将来的近似,可以选择最近最少使用的页进行置换。
LRU选择最长时间没有使用的页。

LRU近似算法,没有足够的硬件支持

每个页都与一个位相关联,初始值为0

当页是访问页时设位1 

如果存在的话,置换位为0的页。然而我们并不知道这个置换顺序

二次机会 :

需要访问位:如果>将要(以顺时针)交换某页的访问位是1,则)

把访问位设为0)
(把页留在内存中)。
(以同样的规则替换下一个页 )
如果所有页的访问位都为1,则此算法退化为FIFO算法

十一、帧分配

页帧分配

如何给进程分配一定的空闲内存 ?

每个进程所需要的最少的页的数目

保证进程正常运行所需的最小物理块数
若系统为某进程所分配的物理块数少于此值时,进程将无法正常运行(频繁发生缺页)
·这个数目取决于指令的格式、功能和寻址方式。

最多能分配多少帧?

主要的分配策略

  1. 平均分配
  2. 按比例分配
  3. 优先分配 

平均分配

按比率分配:根据每个进程的大小来分配

根据优先级而不是大小来使用比率分配策略

如果进程Pi产生一个缺页:

有空闲帧时可以从空闲帧链表中选择一个帧分配,当没有空闲帧可用时,从哪里分配帧?

进程在所有的页中选择-个替换页面;一个进程可以从另一个进程中获得页面。

如果进程Pi产生一个缺页

有空闲帧时可以从空闲帧链表中选择一个帧分配,当没有空闲帧可用时,从哪里分配帧?

全局替换:进程在所有的页中选择个替换页面:一个进程可以从另一个进程中获得页面

同部替换:每个进程只从属于它自己的页中选择 

局部置换时,分配给每个进程的帧的数量不变

全局置换时,进程的帧数量会增加,但是无法控制页错误率

相对而言,全局替换会带来较高的系统吞吐

  • 固定分配&局部置换策略:

基于进程的类型(交互型或批处理型等),或根据程序员、系统管理员的建议为每个进程分配固定数目的物理块,在整个运行期间都不再改变
如果进程在运行中发生缺页,只能从该进程已在内存的页面中选一页换出,然后再调入另一页,保证分配给该进程的内存空间不变。

  • 可变分配&全局置换策略:
  1. 系统为每个进程分配一定数目的物理块,OS本身也保持一个空闲物理块队列
  2. 当某进程发生缺页时,系统从空闲物理块队列中,取出一物理块分配给该进程并将欲调入的缺页装入其中。
  3. 当空闲物理块队列中的物理块用完时,0S才从内存中选择一页调出,该页可能是任一进程的页。
  4. 根据进程的类型或程序员的要求,为每个进程分配一定数目的内存空间,并且在进程运行期间可根据情况(缺页率)适当增加或减少所分配的物理块数
  5. 当某进程发生缺页时,只允许从该进程已在内存的页面中选出一页换出,而不影响其它进程的运行

如果进程分配到的帧数量小于计算机体系结构所要求的最小数量,那么必须暂停进行执行。并将其置换出去,使其所有分配帧空闲。
》如果进程没有这些必需的帧,那么很快会出现缺页,此时需置换某个页然而,其所有页都在使用,置换出去的页立刻又需要置换进来,因此会不断的产生缺页。
》这种频繁的调页行为称作颠簸,也叫抖动。

  • 如果一个进程没有足够的页,那么缺页率将很高,这将导致:
  1. CPU利用率低下
  2. 操作系统认为需要增加多道程序设计的道数
  3. 系统中将加入一个新的进程
  4. 当进程个数达到一定数量时,内存紧张,采用全局置换算法会引起更多的缺页错误
  5. 进程在磁盘等待队列等待换页,导致更长的等待队列,而就绪队列变空
  6. CPU利用率进一步降低,会继续增加多道程序的程度,出现颠簸

颠簸:一个进程的页面经常换入换出,花在换页上的时间要大于进程执行时间。

  1. 》局部置换能限制系统颠簸
  2. 》但也会增加进程的有效访问时间
  3. 》因此,为了防止颠簸,应该给进程提供足够多的帧

局部模型:

  1. 一个locality 是一个进程目前的活跃页面的集合
  2. Locality取决于程序的结构和它的数据结构
  3. Process migrates from one locality toanother(进程从一个局部移到另一个局部).
  4. Localities may overlap(局部可能重叠)

给每个进程分配的最小物理块数不能少于locality 的大小。这样,就可以使进程在把它的locality 页全部装入内存之后,不再发生缺页。

  1. 工作集理论是在1968年由Denning提出来的。它正是基于局部的假设。
  2.  工作集窗:是指对于给定的访问序列选取定长的区间,落在工作集窗口中的页面集合称为工作集
  3. 正确选择工作集窗口的大小,对存储器的有效利用和系统吞吐量的提高,都将产生重要的影响。

具体实现:

  1. OS跟踪每个进程的工作集,并为其分配大于其工作集的物理块数。
  2. 如果还有空闲物理块,则可启动另外的进程。
  3. 如果所有进程的工作集之和超过了可用物理块的总数,则OS会选择暂停一个进程,该进程被换出,所释放的物理块可分配给其他进程。

十二、文件、文件逻辑结构

文件概念:

连续的逻辑地址空间 ;

文件是记录在外存上的具有名字的相关信息的集合。
Types:(类型)
√Data(数据):Numeric(数字)、Character(字符)、Binary( 二进制)
√Program(程序)

1、按用途分类:

系统文件:由系统软件构成的文件,大多数系统文件只允许用户调用,而不允许用户去读或修改它。

库文件:指由系统提供给用户使用的各种标准子程序库。这类文件允许用户调用,但不允许用户修改。

用户文件 :用户委托文件系统保存的文件。如源程序,目标程序,原始数据等。

按信息保存期限分类:临时文件;永久文件;档案文件

按文件的保护方式分类:只读文件;读写文件;只执行文件

按文件的逻辑结构分类:流式文件;记录式文件

按文件的物理结构分类:顺序(连续)文件;链接文件;索引文件

按信息流向分类:输入文件;输出文件;输入/输出文件(存储设备)

按文件中的数据分类:源文件;目标文件;可执行文件

按文件的性质分类:普通文件;目录文件;特殊文件

  • 文件属性:

文件名:唯一的以人们可以理解的方式保存的信息

类型:需要可以支持多种类型的系统

位置:指向文件在设备上的存储位置的指针

大小:当前文件的大小

保护:控制对文件的读取,改写和执行的权限

时间,日期和用户身份:保护和安全需要的数据

文件的属性信息保存在磁盘上的目录结构中

  • 文件结构

用户和文件系统往往从不同的角度对待同一个文件

用户:从使用的角度,按信息的使用和处理方式组织文件。

文件系统:从文件的存储和检索的角度,根据用户对文件的存取方式和存储介质的特性组织文件,决定用户文件存放在存储介质上的方式。

文件有两种形式的结构:文件的逻辑结构和文件的物理结构、

  • 逻辑结构:用户对文件的组织结构
  1. 物理结构:文件在外存储器上的存储结构
  2. 物理结构直接影响存储空间的使用和检索文件信息的速度
  3. 逻辑文件保存到存储介质上的工作由文件系统来做,这样可减轻用户的负担。
  • 文件从逻辑结构上分成二种形式,一种是无结构的流式文件,另一种是有结构的记录式文件。
  1. 流式文件是指对文件内信息不再划分单位,它是依次的一串字符流构成的文件。
  2. 记录式文件是用户把文件内的信息按逻辑上独立的含义划分信息单位,每个单位称为一个逻辑记录(简称记录)。记录的长度可分为定长和不定长记录两类。
  3. 记录文件有顺序、索引、索引顺序文件几种,
  • 文件的逻辑结构-顺序文件
  1. 存取顺序文件的所有记录按键值的约定次序组织
  2. 记录可以是定长的,也可以是变长的
  3. 顺序文件常用于批量记录读取>
  4. 对于定长记录文件,若要查找第i个记录,可根据下式得到相对于第一个记录首址的地址:A:=i*d(d为记录的长度)
  5. 对于非定长记录文件,若要查找第i个记录,则需要有每个记录的长度:A;-∑d:(d为记录的长度)。不支持直接,
  • 文件的逻辑结构.索引文件

为解决这类问题,往往建立一张索引表,记录下每个记录的长度及指向该记录的指针,从而方便了直接存取

  1. 索引文件对主文件中的记录按需要的数据项(一个或几个 )建索引表。
  2. 为每个记录设置一个表项
  3. 索引文件本身是顺序文件组织
  • 文件的逻辑结构-索引顺序文件
  1. 索引顺序文件先将顺序文件中的所有记录分为若干个组:再为顺序文件建立-张索引表,表中记录每个组的第一个记录,该索引项包含记录的键值和指向该记录的指针。它是顺序文件和索引文件的结合。
  2. 检索时,先根据关键字去检索索引表,找到该记录所在组的第一个记录的位置然后再利用顺序查找法去查找主文件,找到所需记录

2、文件访问方式

  1. 与文件的组织方式有关
  2. 常用的存取方法:顺序存取、直接/随机存取

按照文件信息的逻辑顺序依次存取

  1. 在记录文件中:按记录的排列顺序来存取
  2. 在流式文件中:反映为当前读写指针的变化,在存取完一段信息后,读写指针自动加上这段信息的长度,以便指出下次存取时的位置

  1. 随机存取是根据记录的编号来直接存取文件中的任意一个记录而无需存取其前面的记录。
  2. 对于连续文件(固定长度)第i个记录的地址(addr0为首记录地址,L为记录长度):rptr:=addr0+i*L
  3. 对于索引文件先随机查找索引表再取地址

3、文件的存储设备

文件的存储设备主要有:有磁带,磁盘,光盘等,存储设备的特性可以决定文件的存取方法。

物理块(块):

  1. 文件的存储设备常常划分为若干大小相等的物理块
  2. 以块为单位进行信息的存储.传输

1、磁带

  • 永久保存大容量数据
  • 顺序存取设备:前面的物理块被存取访问之后,才能存取后续物理块的内容
  • 存取速度较慢:主要用于后备存储,或存储不经常用的信息或用于传递数据的介质

直接存取设备

  1. 可以顺序存取
  2. 也可以直接存取

4、文件物理结构-连续结构

1、文件结构

  • 用户按逻辑结构使用文件

文件的物理结构对用户来说是不必关心的,但对文件系统来说却是至关重要的,因为它直接影响存储空间的使用和检索文件信息的速度,

  • 文件系统按物理结构管理文件

当用户请求读写文件时,文件系统必须实现文件的逻辑结构与物理结构之间的转换。

2、文件的物理结构

文件在外存的存放组织形式称为文件的物理结构,文件的物理结构与存储设备的特性有很大关系。
文件的存储设备通常划分为大小相等的物理块,物理块是分配及传输信息的基本单位。
一个物理块中可以存放若干个逻辑记录,一个逻辑记录也可以存放在若干个物理块中。

文件的物理结构取决于外存的分配方式:

顺序结构:连续分配

链接结构:链接分配

索引结构:索引分配

最简单的物理文件结构,它将逻辑上连续的文件信息依次存放在外存连续的物理块中。

顺序分配:

  1. 每一个文件占用一个连续的磁盘块的集合
  2. 简单:只需要起始块号和长度
  3. 可以随机存取

浪费空间:动态存储分配问题,外碎片

文件不能增长:从逻辑地址映射到物理地址

文件的物理结构-顺序结构:

优点:

  1. 简单,支持随机存取和顺序存取
  2. 顺序存取速度快
  3. 所需的磁盘寻道次数和寻道时间最少

缺点:

  1. 要求连续的存储空间
  2. 产生外碎片
  3. 不利于文件的动态扩充

3、文件物理结构—链接结构

文件物理结构:按所需分配磁盘块,链接在一起。文件起始于第九块

  • 链接分配:

简单:只需要起始地址

自由空间管理系统:没有磁盘空间浪费,消除外碎片

无法随机存取

隐式链接:一个文件的信息存放在若干不连续的物理块中,各块之间通过指针连接,前一个物理块指向下一个物理块

优点:提高了磁盘空间利用率,不存在外部碎片问题;有利于文件插入和删除

缺点:

  1. 存取速度慢,不支持随机存取;
  2. 可靠性问题,如指针出错;
  3. 更多的寻道次数和寻道时间;
  4. 指针占用空间。

可将多个块组成簇,以簇为单位分配,指针占用百分比减少,但增加内碎片

链接结构的一个变形:

文件分配表(整个磁盘只有一张)

每个文件是一个磁盘块的链接列表:块可以分散在磁盘各处。

  • 索引结构

顺序结构支持随机存取,但有外碎片

>链接结构没有外碎片,但不能直接存取

> FAT可以随机存取,但需要占用较大的内存空间

事实上,打开某个文件时,只需知道该文件所在的盘块号
》一个文件的信息存放在若干不连续物理块中,系统为每个文件建立一个索引表,并将这些块的块号存放在索引表中
》一个索引表就是磁盘块地址数组,其中第:个条目指向文件的第i块

随机存取 :

可以动态存取而没有外部碎片;需要索引表

为了实现从逻辑到物理的映射,一个256K字的文件,块为512字,我们只需一个块作为索引表;

优点:

保持链接结构的优点,又克服了其缺点:·既能顺序存取又能随机存取满足了文件动态增长\插入删除要求·能充分利用外存空间

缺点:

较多的寻道次数和寻道时间
索引表本身带来了系统开销,如:内外存空间,存取时间

索引表组织:

  1. 链接模式:大的文件,索引表占了若干个盘块,一个盘块一个索引表,多个索引表链接起来
  2. 多级索引:将一个大文件的所有索引表(二级索引在另一个索引表(主索引,一级索引)中

  • 混合索引

UNIX文件系统采用的是多级混合索引结构(综合模式)。每个文件的索引表为13个索引项,每项2个字节。最前面10项直接登记存放文件信息的物理块号( 直接寻址 )

如果文件大于10块,则利用第11项指向一个物理块,该块中最多可放256个物理块的块号(一次间接寻址)。对于更大的文件还可利用第12和第13项作为二次和三次间接寻址

十三、目录

文件目录:

有些系统保存了成百万的文件;

为了管理这些数据,需要组织他们;

目录管理;

通常分为两部分:

磁盘可以分成一个或多个分区;

每个分区都包含了存储在分区中的文件的信息,这些信息保存在设备目录中。

设备目录(目录)记录分区上所有文件的各种信息。

目录结构:

一个包含着所有文件信息的节点的集合;

目录结构和文件都在磁盘上;

设备目录中的信息:

  1. ·Name(名称)
  2. ·Type(类型)
  3. ·Address(地址)
  4. ·Current length(当前长度)
  5. ·Maximum length(最大长度)
  6. ·Date last accessed(for archival)(最后访问时间)
  7. ·Date last updated(for dump)(数据最后更新时间)
  8. ·OwnerID(who pays)(所有者ID)·Protection information(discuss later)(保护信息)
  • 文件控制块FCB

用于描述和控制文件的数据结构,它至少要包括文件名和存放文件的盘物理地址
文件控制块的有序集合称为文件目录,即一个文件控制块FCB就是一个文件目录项。

  • A FCB contains

文件基本信息:文件名,用户名,文件地址,文件长度,文件逻辑结构物理结构
存取控制信息:文件存取权限
管理信息:共享计数,文件的建立日期,保存期限,最后修改日期,最后访问日期

文件目录:文件控制块的有序集合
文件目录是用于检索文件的,它是文件系统实现按名存取的重要手段
它的组织和 管理应便于检索和防止冲突

目录项:构成文件目录的项目(目录项就是FCB

目录文件:为了实现对文件目录的管理,将文件目录以文件的形式保存在外存,这个文件就叫目录文件
目录结构的组织关系到:文件的存取速度;文件共享性和安全性

1、操作系统的目录行为

寻找一个文件;建立一个文件 ;删除一个文件;列出目录的列表;重命名文件;遍历文件系统 

1、目录结构

组织目录的逻辑结构

效率:快速的定位一个文件

命名:方便用户

两个用户可以有相同名字的不同文件

相同的文件可以有不同的名字

  • 单级目录

  • 两级目录

为解决一级目录文件命名冲突,并提高对目录文件检索速度而改进
目录分为两级:
一级称为主文件目录(MFD),给出用户名,用户子目录所在的物理位置;

二级称为用户文件目录(UFD,又称用户子目录),给出该用户所有文件的FCB
优点:
解决了文件的重名问题:用户名|文件名
查找时间降低

优点:

层次结构清晰;便于管理和保护;;有利于文件分类;解决重名问题;提高文件检索速度

缺点:

查找一个文件按路径名逐层检查,由于每个文件都放在外存,多次访盘影响速度;不支持共享

别名:两个不同的名字

解决方案:

断点,我们可以删除所有的指针 ;

表项保留计数的解决;

普通图结构目录:

如何保证无环:

  1. 只允许链接到文件而不允许链接到子目录
  2. 垃圾收集
  3. 每次添加一个链接时都用一个检测算法判断是否正确 

十四、空闲空间管理

1、自由空间管理

磁盘空间有限,如何进行磁盘空间管理?

需要记录和维护磁盘的空闲空间

创建文件时,搜索空闲空间得到所需空间以分配

删除文件时,释放磁盘空间并将其记为空闲空间

位图法:

用一串二进制位反映磁盘空间中分配使用情况,每个物理块对应一位,分配物理块为0,否则为1。

空闲块表:将所有空闲块记录在一个表中,即空闲块表

空闲块链表:把所有空闲块链成一个链。

比较容易得到连续的文件;位图需要额外空间。

空闲块表:将所有空闲块记录在一个表中,即空闲块表,有两项:该空闲区的第-个盘块号、该区的空闲盘块总数。

空闲块链表:

把所有空闲块链成一个链
Limked list ( fiee list)(链接表一自由空间表 )

得到连续空间困难;没有浪费空间。扩展:成组链接法。

2、UNIX的成组链接法

文件区的所有空闲盘块被分成若干组(如100个空闲盘分成一组)

每一组的第一个盘块中记录有下一组的盘块总数和盘块号
第一组盘块总数和盘块号记入空闲盘块号栈中
空闲盘块号栈:存放当前可用的空闲盘块号及空闲盘块号数N(最多100个)。
能快速找到大量空闲块的地址

3、文件系统结构及实现

1、文件管理的目的

信息是计算机系统中的重要资源;

操作系统中的一个重要组成部分—文件系统,就负责信息的组织、存储和访问;

文件系统的功能就是提供高效、快速和方便的信息存储和访问功能。

2、什么是文件系统

文件系统是操作系统中以文件方式管理计算机软件资源的软件和被管理的文件和数据结构(如目录和索引表等)的集合。

从用户角度来看,文件系统主要是实现“按名存取”,文件系统的用户只要知道所需文件的文件名,就可存取文件中的信息,而无需知道这些文件究竟存放在什么地方。从系统角度来看,文件系统是对文件存储器的存储空间进行组织、分配和回收,负责文件的存储、检索、共享和保护。

3、文件系统的功能

  1. 统一管理文件的存储空间,实施存储空间的分配与回收;
  2. 实现逻辑文件与物理文件间的转换(文件组织)
  3. 目录管理,实现文件的按名存取:
  4. 名字空间 映射 存储空间
  5. 提供合适的存取方法(顺序\随机)
  6. 实现文件信息的共享,并提供文件的保护和保密措施
  7. 向用户提供一个方便使用的接口(提供对文件系统操作命令,以及提供对文件的操作命令)。

4、文件系统实现

磁盘的大小
物理块的大小
空闲块的个数及位置
目录
文件数据
操作系统的存储位置

  • 磁盘结构

引|导控制块;分区控制块;目录结构

5、内存结构

内存分区表;内存目录结构;系统范围打开文件表;单个进程的打开文件表

十五、磁盘结构

磁盘组:由若干磁盘组成,绕枢轴高速旋转,目前主流磁盘转速7200转/分

物理记录定位:

柱面号:各盘面所有的读写头同时移动,并定位在同样的垂直位置的磁道上,这些磁道形成了一个柱面。由外向内是:0.1.2,
磁头号:磁盘的全部有效盘面从上到下依次编号0,1,2,....H。磁头号与盘面号是相对应的。扇区号:将各盘面分割成若干大小相等的扇区,编号01.23..n

磁盘设备是以一种逻辑块的一维大数组的形式编址的,这里的逻辑块是传输的最小单位。

逻辑块的一维数组映射到磁盘上一些相连的扇区。

0扇区是最外边柱面的第一个磁道的第一个扇区。

数据首先都映射到一个磁道,其余的数据映射到同一柱面的其他磁道,然后按照从外向里的顺序映射到其余的柱面。

如何提高磁盘IO速度:

磁盘I/O速度的高低,将直接影响文件系统的性能。

  • 提高磁盘I/0速度的主要途径有:

选择性能好的磁盘;设置磁盘高速缓冲区;采用好的磁盘调度算法。

  • 磁盘访问时间:

寻道时间Ts;旋转延迟时间Tr;传输时间Tt

1、寻道时间Ts

  1. 把磁头从当前位置移动到指定磁道上所经历的时间,它与磁盘转速、移动的磁道数有关。
  2. 该时间是启动磁盘的时间s与磁头移动n条磁道所花费的时间之和,即Ts=mxn+S
  3. 式中,m是一常数,它与磁盘驱动器的速度有关。》对一般磁盘,m=0.2;>对高速磁盘,m≤0.1,磁臂启动时间约为2ms。
  4. 一般,寻道时间将随寻道距离的增大而增大。

2、旋转延迟时间Tr

Tr是指定扇区移动到磁头下面所经历的时间

与磁盘转速有关T=1/2rr为磁盘转速

如果磁盘旋转速度为5400r/min,则每转需时11.1ms,平均旋转延迟时间Tr=1/2r,Tr为5.55 ms。

3、传输时间Tt

Tt是指把数据从磁盘读出,或向磁盘写入数据所经历的时间。

b为所读/写的字节数:r为磁盘以秒计的旋转速度;N为一条磁道上的字节数。

4、磁盘访问时间

访问时间可表示为:

寻道时间和旋转延迟时间,基本都与所读/写数据的多少天关,而且它通常是占据了访问时间的大头。
随着磁盘传输速率的不断提高,数据传输时间所占的比例更低。可见,适当地集中数据(不要太零散)传输,将有利于提高传输效率。

  • 磁盘调度

最小寻道时间;  寻道时间≈寻道距离

有几种磁盘IO请求的服务调度算法;

我们假设一个请求序列。
98,183,37,122,14,124,65,67
磁头当前的位置在53.

5、先来先服务

如下图所示,磁头总共移动了640个柱面的距离。

6、最短寻道时间优先

选择从当前磁头位置所需寻道时间最短的请求。

SSTF是SJF调度的一种形式:有可能引起某些请求的饥饿。

1、进程“饥饿”现象

对于SSTF算法:只要不断有新进程到达,且新进程所要访问的磁道与磁头当前所在磁道的距离较近,则新进程一定优先满足,而某些老进程则会发生“饥饿”现象。

如何防止:如何防止“饥饿”现象

SCAN算法:不仅考虑到欲访问的磁道与磁头当前位置间的距离更优先考虑的是磁头当前的移动方向。算法所选择的访问对象应当是与磁头当前的移动方向一致且距离最近的。

2、扫描算法

磁头从磁盘的一端开始向另一端移动,沿途响应访问请求,直到到达了磁盘的另一端,此时磁头反向移动并继续响应服务请求。

有时也称为电梯算法。

C-SCAN

提供比扫描算法更均衡的等待时间。

磁头从磁盘的一段向另一端移动,沿途响应请求。当它到了另一trip.端,就立即回到磁盘的开始处,在返回的途中不响应任何请求。

把所有柱面看成一个循环的序列,最后一个柱面接续第一个柱面。

LOOK

SCAN算法的一种形式。

磁臂在每个方向上仅仅移动到最远的请求位置,然end of the disk.后立即反向移动,而不需要移动到磁盘的一端

C-LOOK

C-SCAN算法的一种形式

磁臂在每个方向上仅仅移动到最远的请求位置,然后立即反向移动,而不需要移动到磁盘的一端。

十六、IO控制方式

Controller

》设备并不是直接与CPU进行通信,而是与设备控制器通信,
》每个 I0 设备通过设备控制器与计算机的数据总线和地址总线相连接
》某些设备(如磁盘设备)有内置的控制器

I/0控制方式:

  1. 随着计算机技术的发展,I/O控制方式也在不断地发展
  2. 发展宗旨:尽量减少主机对I/0控制的干预,把主机从I0控制事务中解脱出来
  3. 主要有以下三种I/0控制方式·程序I/0方式(轮询Polling)·中断驱动I/ODMA控制方式

程序I/0方式:

早期的计算机系统中,无中断机构,处理机对IO设备的控制采取程序I/0方式(Programmed I0方式 )
该方式也叫轮询方式(Polling)

在进行数据I0之前先查询设备的状态:已准备好:传送数据;未准备好:继续查询

是否准备好的依据:设备控制器的状态位:Busy=1:未准备好;Busy=0:已准备好

  • 特点:
  1. CPU与设备串行工作
  2. CPU循环测试一浪费大量CPU时间
  • 中断驱动IO控制方式
  1. 在现代计算机系统中,对IO设备的控制,广泛采用中断驱动(Interrupt---Driven)方式。
  2. 在I/0设备输入/输出每个数据的过程中,无须CPU干预。
  3. 仅当输完一个数据时,才需CPU花费极短的时间去做些中断处理。

·CPU向设备控制器发出一条I0命令后,立即返回继续执行原来的任务。
设备控制器便控制I/0设备进行I/0。
当设备完成了一个字节数据的I0时,设备控制器产生一个中断信号。
·CPU检测到中断信号后,进行相应的处理工作。

特点:

  1. CPU与I/0设备并行工作
  2. 仅当输完一个数据时,才需CPU花费极短的时间去做些中断处理。
  3. 提高了系统的资源利用率及吞吐量

中断驱动I/0是以字(节)为单位进行I0的,若将这种方式用于块设备的I0,显然将会是极其低效的。
为了进一步减少CPU对IO的干预,而引入了直接存储器访问( Direct Memory Access )方式。

DMA方式的特点是:

数据传输的基本单位是数据块

所传输的数据是从设备直接送入内存的,或者相反;

整块数据的传送是由DMA控制器完成的

DMA方式较之中断驱动方式,成百倍地减少了CPU对I0的干预,进一步提高了CPU与I/0设备的并行操作程度。

DMA控制器的组成
·主机与DMA控制器的接口:·DMA控制器与块设备的接口
·I/O控制逻辑
>DMA控制器中设四类寄存器
命令/状态寄存器CR
内存地址寄存器MAR
数据寄存器DR
数据计数器DC;

1、I/0缓冲

缓冲技术:为提高I/0速度和设备的利用率,几乎所有的I0设备在与处理机(内存)交换数据时,都使用了缓冲区。

引入缓冲的主要原因有以下三点

缓和CPU与I/O设备间速度不匹配的矛盾

减少对CPU的中断频率,放宽对中断响应时间的限制

提高CPU和I/0设备之间的并行性

例如一个程序,"它时而进行长时间的计算而没有输出,时而又阵发性把输出送到打印机。由于打印机的速度跟不上CPU,而使得CPU长时间的等待
如果设置了缓冲区,程序输出的数据先送到缓冲区暂存,然后由打印机慢慢地输出。则CPU不必等待,可以继续执行程序。实现了CPU与IO设备之间的并行工作。

OS提供以下几种缓冲形式:

单缓冲;双缓冲;循环缓冲;缓冲池

  • 缓冲池的使用

两个过程:Getbuf;Putbuf

为使诸进程能互斥地和同步地访问缓冲池队列,可分别为每一队列设置一个互斥信号量MS(type)和资源信号量RS(type)

缓冲区的工作方式:

收容输入:输入进程需输入数据时,调用Getbuf(emq),从emq队首摘下一空缓冲区,作为收容输入缓冲区hin,把数据装入其中再调用Putbuf(inq,hin),把hin挂在inq队列上。

提取输入:当计算进程需输入数据时,调用Getbufing),从ing队首摘下一缓冲区,作为提取输入缓冲区sin,从中提取数据,然后调用Putbuf(emq,sin),将该缓冲区挂在空缓冲队列emq上。

2、I0子系统

I/O系统的目标

提高设备的利用率:

尽量提高CPU与I/0设备之间的并行工作程度
主要技术:中断技术、DMA技术、缓冲技术

为用户提供方便、统一的界面:

》方便,是指用户能独立于具体设备的复杂物理特性之外而方便地使用设备

》统一,是指对不同的设备尽量使用统一的操作方式,例如各种字符设备用一种I/O操作方式。

I/O 系统管理

I/O软件功能

提供使用I/O设备的用户接口命令接口和编程接口。

设备分配和释放:使用设备前,需要分配设备和相应控制器。

设备的访问和控制:包括并发访问和差错处理。

IO缓冲和调度:目标是提高I0访问效率

  • I/0软件组织成以下4个层次

(1)用户空间的I0软件
(2)与设备无关的IO软件(设备独立软件)
(3)设备驱动程序
(4)中断处理程序

用户空间的IO软件:

>大部分I/0软件都包含在OS内核之中,但有一小部分I0软件是由与用户程序连接在一起的库过程构成,它们运行在OS内核之外
>I/O系统调用,通常由库过程实现
》例如,下列一个C程序调用了write库过程,并包含在运行时的二进制程序代码中
count=write(fd, buffer, nbytes);
显然,write库过程是I/O系统的组成部分

  •  I/0系统调用把设备行为封装在通用类中
  • 操作系统对不同的设备提供不同的接口:块设备;字符设备

完成与设备无关的I/O操作,具体包括

设备命名;设备的分配;实现设备独立性等

3、设备独立软件

1.设备命名

设备命名后,所有设备的名字集合称做设备的名字空间。
把设备的符号名映射到相应的设备驱动程序。

UNIX系统:
UNIX把设备当作文件来管理,提供统一的操作命令。UNIX的字符设备开关表、块设备开关表实现把设备的符号名映射到相应的设备驱动程序。

2.设备分配

在多道程序环境下,系统中的设备不允许用户自行使用,必须由系统分配,

为了实现设备分配,必须在系统中设置相应的数据结构。

控制器控制表COCT

COCT包含如下信息:

控制器标识符:controllerid
控制器状态:忙/闲
控制器队列的队首指针
控制器队列的队尾指针

共享设备

提出IO请求的不同进程以排队方式分时地占用设备进行IO由于有多个进程同时访问,且访问频繁,就会影响整个设备使用效率,影响系统效率。因此要考虑多个访问请求到达时服务的顺序使平均等待时间越短越好

(2)设备分配算法:

与进程的调度算法有些相似,但相对要简单些:

先来先服务;优先级高者优先

3.设备独立性

目的:为了提高OS的可适应性和可扩展性。

基本含义:应用程序独立于具体使用的物理设备。

为了实现设备独立性而引入了逻辑设备和物理设备这两个概念

应用程序使用逻辑设备名称来请求使用设备

LUT:逻辑设备表LUT(LogicalUnit Table):将应用程序中所使用的逻辑设备名映射为物理设备名。

十七、设备驱动

I/O设备有很大的差异

操作系统怎样才能以一种标准的、统一的方式对待 I/O设备呢)?
操作系统怎样设计才能做到向计算机添加新设备(例如,添加新磁盘)而不需要重写操作系统代码呢?
操作系统怎样才能对应用程序给出方便、统一的接口呢

设备驱动程序隐藏了I/O控制器的差别

设备驱动程序:

操作系统能够以统一的方式对待不同的I/O设备,因为具体的差别被称为设备驱动程序 的内核模块所封装。

与设备相关的代码放在设备驱动程序中。

应为每一类设备配置一种驱动程序。

设备驱动程序层的作用是为内核 IO子系统隐藏设备控制器之间的差异。>

一个特定的设备可能带有多种设备驱动程序

》是I/O进程与设备控制器之间的通信程序,因为它常以进程的形式存在,故也可以称为设备驱动进程。
》设备驱动程序实际是处理或操作设备控制器的软件。
》它们是内核中具有高特权的、驻留内存的底层硬件处理例程。

设备驱动程序的处理过程

》将接收到的抽象要求转换为具体要求。
》检查用户I0请求的合法性,了解IO设备的状态,传递有关参数,设置设备
的工作方式。
》发出I/O命令,启动分配到的I0设备,完成指定的I/0操作
》及时响应由控制器发来的中断请求,并根据其中断类型调用相应的中断处理程序进行处理。

中断处理程序

  1. 在I/0时,设备控制器如果准备好服务会向CPU发出一中断请求。
  2. 这些中断表示输入数据已有,或输出已完成,或已检测到错误
  3. CPU响应后便转向中断处理程序。

无论是哪种I/O设备,其中断处理程序的处理过程都包含了以下几个步骤:

唤醒被阻塞的驱动程序进程

保护被中断进程的CPU环境

分析中断原因、转入相应的设备中断处理程序

进行中断处理

恢复被中断进程的现场

I/O请求到硬件操作:

考虑一个进程从磁盘中读取一个文件)

  1. 确定保存文件的设备 
  2. 转换名字到设备表示
  3. 把数据从磁盘读到缓冲区中
  4. 通知进程数据现在是有效的
  5. 把控制权返回给进程

1、Spooling

以SPOOLing方式使用外设

>SPOOLing技术是用于将一台独占设备改造成共享设备的一种行之有效的技术。

>SPOOLing技术是低速输入输出设备和主机交换的一种技术,通常称为假脱机输
入/输出技术。

1、SPOOLing技术

利用多道程序中的一道程序来模拟脱机输入时的外围控制机的功能,把低速I/O设备上的数据传送到高速磁盘上
用另一道程序来模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上:
这样,便在主机的直接控制下,实现脱机输入、:输出功能。
此时的外围操作与CPU对数据的处理同时进行,这种在联机情况下实现的同时外围操作称为SPOOLing(SimultaneousPeripheralOperations On-Line),或称假脱机操作。

2、SPOOLing的组成

SPOOLing系统是对脱机输入、持,这通常是采用磁盘。
SPOOLing系统组成如下图:

输入井和输出井;
输入缓冲和输出缓冲;
输入进程和输出进程

3、共享打印机的实现:

SPOOLing技术可将一台打印机改造成一台可供多个用户共享的设备
当用户进程请求打印输出时,SPOOLing做以下事情:

由输出进程在输出井中为之申请一空闲盘块区,并将要打印的数据送入其中
输出进程为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到请求打印队列上。
输出进程从请求打印队列中依次取出请求打印表根据表中的要求将要打印的数据从输出并传送到内存缓冲区,再由打印机打印。

4、SPOOLing系统的特点

提高了I/0速度

将独占设备改造为共享设

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梖梖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值