目前公认的第一台电子数字计算机是ENIAC(Electronic Numerical Integrator And Computer),它于1946年在美国宾夕法尼亚大学研制成功。ENIAC的计算速度是每秒5000次加法或400次乘法。它的诞生标志着计算机时代的到来,从此以后,计算机以极高的速度发展。
根据计算机本身采用的物理部件不同,将其发展分为4个阶段。
第1阶段是电子管计算机时代,时间为1946年到20世纪50年代后期。
第2阶段是晶体管计算机时代,时间为20世纪50年代后期到20世纪60年代中期。
第3阶段是中小规模集成电路计算机时代,时间为20世纪60年代中期到20世纪70年代初期。
第4阶段是大规模和超大规模集成电路计算机时代,时间为20世纪70年代初期至今。
虽然ENIAC可以大大提高计算速度,但它本身存在两大缺点:一是没有存储器;二是用布线接板进行控制,电路连接烦琐、耗时,在很大程度上抵消了ENIAC计算速度高带来的便利。因此,以美籍匈牙利数学家冯·诺依曼(John von Neumann)为首的研制小组于1946年提出了“存储程序控制”的思想,并开始研制存储程序控制的计算机EDVAC(Electronic Discrete Variable Automatic Computer)。1951年,EDVAC问世。
EDVAC的主要特点如下。
(1)在计算机内部,程序和数据采用二进制数表示。
(2)程序和数据存放在存储器中,即采用程序存储的概念。计算机执行程序时,无须人工干预,能自动、连续地执行程序,并得到预期的结果。
(3)计算机硬件由运算器、控制器、存储器、输入设备及输出设备5大基本部件组成。
直到今天,计算机基本结构的设计仍采用冯·诺依曼提出的思想和原理,人们把符合这种设计的计算机称为冯·诺依曼机。冯·诺依曼也被誉为“现代电子计算机之父”。
计算机系统由硬件系统和软件系统两大部分组成,如图2.1所示。
图2.1 计算机系统的组成
硬件系统是借助电、磁、光、机械等原理构成的各种物理部件的有机组合,是计算机系统赖以工作的实体。硬件系统也被称为裸机,裸机只能识别由0和1组成的机器代码。
软件系统是为运行、管理及维护计算机而编制的各种程序、数据及文档的总称。软件是计算机的核心,没有软件的计算机毫无实用意义。软件是用户与硬件之间的接口,用户可以通过软件使用计算机硬件上的数据信息资源。
计算机软件按照面向应用对象的不同主要分为系统软件和应用软件。系统软件是控制和协调计算机外部设备、支持应用软件开发和运行的软件,主要负责管理计算机系统中各种独立的硬件,使之可以协调工作。它主要包括操作系统、语言处理系统、数据库管理系统及系统辅助处理程序等。其中最主要的是操作系统,它提供了软件运行的环境。应用软件是指为满足用户不同的应用需求而提供的软件,它可以拓宽计算机系统的应用领域,放大硬件的功能。常用的应用软件有信息管理软件、辅助设计软件、文字处理软件、图形图像软件、各种程序包等。
计算机硬件系统主要包含中央处理器、存储器(包括主存储器、高速缓冲存储器及辅助存储器)及其他外部设备,它们之间通过总线连接在一起。
中央处理器(Central Processing Unit,CPU)是计算机的运算和控制核心,是计算机的“大脑”,其功能主要是解释计算机指令和处理软件中的数据。CPU主要包括运算器和控制器两个部件,它们都包含寄存器,并通过总线连接起来。
(1)运算器负责对数据进行加工处理(对数据进行算术运算和逻辑运算)。
(2)控制器负责对程序所规定的指令进行分析,控制并协调输入、输出操作或对主存储器的访问。
(3)寄存器是高速存储区域,用来暂时存放参与运算的数据和运算结果。寄存器的类型较多,包括指令寄存器、地址寄存器、存储寄存器及累加寄存器。根据CPU中寄存器的数量和每个寄存器的大小(多少位)可以确定CPU的性能和速度。例如,64位的CPU是指CPU中的寄存器是64位的。所以,每个CPU指令可以处理64位的数据。
(4)CPU的主要技术性能指标有字长、主频、运算速度等。
● 字长是指CPU一次能处理的二进制数据的位数。在工作频率不变和CPU体系结构相似的前提下,字长越长,CPU的数据处理速度越快。
● 主频是指CPU的时钟频率,计算机的操作在时钟信号的控制下分步执行,每个时钟信号周期完成一步操作。主频越高,CPU的运算速度就越高。
● 运算速度通常是指CPU每秒所能执行的加法指令数目,常用百万次/秒(Million Instructions Per Second,MIPS)来表示。这个指标能更直观地反映计算机的运算速度。
存储器是存储程序和数据的部件,它可以自动完成程序或数据的存取。
(1)存储器的分类。
● 按存储介质分类:半导体存储器、磁表面存储器、磁芯存储器、光盘存储器等。
● 按存取方式分类:随机存储器(Random Access Memory,RAM)、只读存储器 (Read⁃only Memory,ROM)、串行访问存储器、直接存取存储器等。
● 按在计算机中的作用分类:主存储器(又称内存)、高速缓冲存储器(cache)、辅助存储器(又称外存储器,简称外存)等。
(2)主存储器。
存储器中最重要的是主存储器,它一般采用半导体存储器,包括RAM和ROM两种。
① RAM。
RAM具有可读写性,即信息可读、可写,当写入时,原来存储的数据被擦除;具有易失性,即断电后数据会消失,且无法恢复。RAM又分为静态RAM和动态RAM。
● 静态RAM(Static RAM,SRAM)的特点是集成度低,价格高,存储速度快,不需要刷新。
● 动态RAM(Dynamic RAM,DRAM)的特点是集成度高,价格低,存储速度慢,需要刷新。
DRAM目前被各类计算机广泛使用,内存条采用的就是DRAM。
② ROM。
ROM中信息只能读出不能写入,ROM具有内容永久性,断电后信息不会丢失。根据半导体制造工艺的不同,可将其分为可编程只读存储器(Programmable ROM,PROM)、可擦可编程只读存储器(Erasable PROM,EPROM)、电可擦编程只读存储器(Electrically EPROM,EEPROM)、掩模型只读存储器(Mask ROM,MROM)等。
(3)高速缓冲存储器。
高速缓冲存储器是介于CPU和内存之间的一种小容量、可高速存取信息的芯片,可用于解决它们之间速度不匹配的问题。高速缓冲存储器一般用速度高的SRAM元件组成,其速度与CPU相当,但价格较高。
(4)辅助存储器。
辅助存储器的容量一般都比较大,而且大部分可以移动,便于不同计算机之间进行信息交流。辅助存储器中的数据被读入内存后,才能被CPU读取,CPU不能直接访问辅助存储器。
存储器主要有3个性能指标:速度、容量和每位(bit)价格。一般来说,速度越快,价格越高;容量越大,位价格越低;容量越大,速度越慢。
(1)外部设备的分类。
计算机中,CPU和内存构成主机。除主机以外,围绕着主机设置的各种硬件装置称为外部设备(外设)。外设的种类很多,应用比较广泛的有输入/输出(Input/Output,I/O)设备、辅助存储器及终端设备。
① 输入/输出设备。
● 输入设备。输入设备是指向计算机输入数据和信息的设备,用于向计算机输入原始数据和处理数据的程序。常用的输入设备有键盘、鼠标、摄像头、扫描仪、语音输入设备、传感器等。
● 输出设备。输出设备的功能是将各种计算结果数据或信息以数字、字符、图像、声音等形式表示出来。常见的输出设备有显示器、打印机、绘图仪、投影仪、音箱等。
● 有一些设备同时集成了输入和输出两种功能,如光盘刻录机。
② 辅助存储器。
辅助存储器可存放大量的程序和数据,且断电后程序和数据不会丢失。目前,常见的辅助存储器有硬盘、闪存(U盘、SM卡、SD卡、记忆棒、TF卡等)及光盘等。
③ 终端设备。
终端设备是指经由通信设施向计算机输入程序和数据或接收计算机的输出处理结果的设备。终端设备分为通用终端设备和专用终端设备两类。通用终端设备泛指具有通信处理控制功能的通用计算机输入/输出设备。专用终端设备是指具有特殊性能、适用于特定业务范围的终端设备。
(2)硬盘。
硬盘是计算机主要的外部存储设备,具有容量大、存取速度快等优点。
① 硬盘的分类。
根据磁头是否可移动,硬盘可以分为固定磁头硬盘和活动磁头硬盘两类。磁头和磁臂是硬盘的重要组成部分,磁头安装在磁臂上,负责读/写各磁道上的数据。
● 固定磁头硬盘中,每个磁道对应一个磁头。工作时,磁头无径向移动,其特点是存取速度快,省去了磁头寻找磁道的时间,但造价比较高。
● 活动磁头硬盘中,每个盘面只有一个磁头,在存取数据时,磁头在盘面上做径向移动。由于增加了“寻道”时间,其存取速度比固定磁头硬盘要慢。目前常用的硬盘都是活动磁头的。
② 硬盘的信息分布。
● 记录面。硬盘通常由重叠的一组盘片构成,每个盘片的两面都可用作记录面,每个记录面对应一个磁头,所以记录面号就是磁头号。
● 磁道。当盘片旋转时,磁头若保持在一个位置上,则每个磁头都会在记录面上划出一个圆形轨迹,这个圆形轨迹就是磁道。一条条磁道形成一组同心圆,最外圈的磁道为0号,往内则磁道号逐步增加。
● 圆柱面。在一个硬盘中,各记录面上相同编号的磁道构成一个圆柱面。例如,某硬盘有8片(16面),则16个0号磁道构成0号圆柱面,16个1号磁道构成1号圆柱面……硬盘的圆柱面数就等于一个记录面上的磁道数,圆柱面号就对应磁道号。
● 扇区。通常将一个磁道划分为若干弧段,每个弧段称为一个扇区或扇段,扇区从1开始编号。
因此,硬盘寻址的磁盘地址应该由硬盘号(一台计算机可能有多个硬盘)、记录面(磁头)号、圆柱面(磁道)号、扇区号等字段组成。
磁盘存储器的主要性能指标包括存储密度、存储容量、平均存取时间及数据传输率等。
(3)I/O接口。
I/O接口(I/O控制器)用于主机和外设之间的通信,通过接口可实现主机和外设之间的信息交换。
① I/O接口的功能。
● 实现主机和外设的通信联络控制。
● 进行地址译码和设备选择。
● 实现数据缓冲以匹配速度。
● 信号格式的转换(如电平转换、并/串或串/并转换、模/数或数/模转换等)。
● 传输控制命令和状态信息。
② I/O方式。
I/O方式包括程序查询方式、程序中断方式、直接存储器存取(Direct Memory Access,DMA)方式及I/O通道控制方式等。
● 程序查询方式:一旦某一外设被选中并启动,主机将查询这个外设的某些状态位,判断其是否准备就绪,若未准备就绪,主机将再次查询;若外设已准备就绪,则执行一次I/O操作。这种方式控制简单,但系统效率低。
● 程序中断方式:在主机启动外设后,无须等待查询,继续执行原来的程序。外设在做好输入/输出准备时,向主机发送中断请求,主机接到请求后就暂时中止原来执行的程序,转去执行中断服务程序对外部请求进行处理,在中断处理完毕后返回原来的程序继续执行。
● DMA方式:在内存和外设之间开辟直接的数据通道,可以在不需要CPU介入的情况下在内存和外设之间进行信息传输。这样不仅保证了CPU的高效率,也能满足高速外设的需要。
● I/O通道控制方式:是DMA方式的进一步发展,在系统中设有通道控制部件,每个通道有若干外设。主机执行I/O指令来启动有关通道,通道执行通道程序,完成输入/输出操作。通道是一种独立于CPU的专门管理I/O的处理机制,它控制设备与内存直接进行数据交换。通道有自己的通道指令,通道指令由CPU启动,并在操作结束时向CPU发出中断信号。
总线是一组能被多个部件分时共享的公共信息传输线路。分时是指同一时刻总线上只能传输一个部件发送的信息;共享是指总线上可以挂接多个部件,各个部件之间相互交换的信息都可以通过这组公共线路传输。
(1)总线的分类。
总线按功能层次可以分为3类。
● 片内总线:指芯片内部的总线,如在CPU芯片内部寄存器与寄存器之间、寄存器与算术逻辑部件(Arithmetic and Logic Unit,ALU)之间都由片内总线连接。
● 系统总线:指计算机硬件系统内各功能部件(CPU、内存、I/O接口)之间相互连接的总线。系统总线按传输的信息不同,又分为数据总线(双向传输)、地址总线(单向传输)及控制总线(部分“出”、部分“入”)。
● 通信总线:用于计算机之间或计算机与其他设备(远程通信设备、测试设备)之间信息传输的总线,也称外部总线。依据不同的传输方式,通信总线又分为串行通信总线和并行通信总线。
(2)总线的基本结构。
从系统总线的角度出发,总线的基本结构如下。
● 单总线结构:只有一条系统总线,CPU、内存、I/O设备都挂在该总线上,允许I/O设备之间、I/O设备与CPU之间或I/O设备与内存之间直接交换信息。
● 双总线结构:将低速I/O设备从单总线上分离出来,实现了内存总线与I/O总线的分离。
● 三总线结构:各部件之间采用3条各自独立的总线来构成信息通道。内存总线用于在CPU和内存之间传输地址、数据及控制信息;I/O总线用于CPU和外设之间的通信;直接内存访问总线用于在内存和高速外设之间直接传输数据。
(3)总线的性能指标。
● 总线周期:一次总线操作(包括申请阶段、寻址阶段、传输阶段及结束阶段)所需的时间简称总线周期。总线周期通常由若干总线时钟周期构成。
● 总线时钟周期:即计算机的时钟周期。
● 总线的工作频率:总线上各种操作的频率,为总线周期的倒数。若总线周期= N ×时钟周期,则总线的工作频率=时钟频率/ N 。
● 总线宽度:通常指数据总线的根数,用位表示,如32根称为32位总线。
● 总线带宽:可理解为总线的数据传输率,即单位时间内总线上传输数据的位数,通常用每秒传输信息的字节数来衡量,单位可用兆字节每秒(MB/s)表示。例如,总线工作频率为33MHz,总线宽度为32位(4B),则总线带宽为33×(32÷8)=132MB/s。
● 时钟同步/异步:数据与时钟同步工作的总线称为同步总线,数据与时钟不同步工作的总线称为异步总线。
● 总线复用:总线在不同的时间传输不同的信息。
● 信号线数:地址总线、数据总线及控制总线3种总线数的总和。
(4)总线仲裁。
为了保证同一时刻只有一个申请者使用总线,总线控制机构中有总线判优和仲裁控制逻辑,即按照一定的优先次序来决定哪个部件首先使用总线,只有获得总线使用权的部件才能开始数据传输。总线判优控制按照仲裁控制机构的设置可分为两种。
● 集中式控制:仲裁控制逻辑基本上集中于一个设备(如CPU)中。将所有的总线请求集中起来,利用一个特定的裁决算法进行裁决。
● 分布式控制:不需要中央仲裁器,即仲裁控制逻辑分散在连接于总线上的各个部件或设备中。
(5)总线操作。
在总线上的操作主要有读和写、块传输、写后读或读后写、广播和广集等。
(6)总线标准。
总线标准是国际上公布或推荐的连接各个模块的标准,是把各种不同的模块组成计算机系统时必须遵守的规范。
常见的系统总线标准有工业标准结构(Industry Standard Architecture,ISA)、扩展的ISA(Extended Industry Standard Architecture,EISA)、视频电子标准协会(Video Electronics Standards Association,VESA)、外设部件互连(Peripheral Component Interconnect,PCI)及加速图形接口(Accelerated Graphics Port,AGP)等。
常见的外部总线标准有集成设备电路(Integrated Drive Electronics,IDE)、小型计算机系统接口(Small Computer System Interface,SCSI)、美国电子工业协会推行的串行通信总线标准(Recommended Standard-232C,RS-232C)及通用串行总线(Universal Serial Bus,USB)等。
计算机在执行程序前须将要执行的相关程序和数据先放入内存中,在执行时CPU根据当前程序指针寄存器的内容取出指令并执行,然后取出下一条指令并执行,如此循环直到程序结束时才停止执行。其工作过程就是不断地取指令和执行指令,最后将计算的结果放入指令指定的存储器地址中。
(1)计算机指令格式。
指令是指计算机完成某个基本操作的命令。指令能被计算机硬件理解并执行。一条计算机指令是用一串二进制代码表示的,它通常包括两方面的信息:操作码和操作数(地址码),如图2.2所示。
图2.2 计算机指令
操作码指明指令所要完成操作的性质和功能,即指出进行什么操作。操作码也是二进制代码。对于一种类型的计算机来说,各种指令的操作码互不相同,分别表示不同的操作。因此,指令中操作码的二进制位数决定了该类型计算机最多能具有的指令条数。
操作数指明操作码执行的操作对象。操作数可以是数据本身,也可以是存放数据的内存单元地址或寄存器名称。根据指令中操作数的性质,操作数又可以分为源操作数和目的操作数两类。例如,减法指令中减数和被减数为源操作数,它们的差为目的操作数。
如果指令中的操作码和操作数共占 n 字节,则称该指令为 n 字节指令。
(2)计算机指令的寻址方式。
寻址方式是指找到当前正在执行指令的数据地址和下一条将要执行指令的地址的方法。
寻址方式被分为两大类:找到下一条将要执行指令的地址,称为指令寻址;找到当前正在执行指令的数据地址,称为数据寻址。
指令寻址分为顺序寻址和跳跃寻址两种。常见的数据寻址有立即寻址、直接寻址、隐含寻址、间接寻址、寄存器寻址、寄存器间接寻址、基址寻址、变址寻址、相对寻址及堆栈寻址等。
(3)计算机指令系统。
一台计算机所能执行的全部指令的集合,称为该计算机的指令系统。不同类型的计算机的指令系统的指令数目与格式也不同。但无论哪种类型的计算机,指令系统都应该具有以下功能指令。
● 数据传输类指令:用来实现数据在内存和CPU之间的传输。
● 运算类指令:用来进行数据的运算。
● 程序控制类指令:用来控制程序中指令的执行顺序。
● 输入/输出指令:用来实现外设与主机之间的数据传输。
● 处理器控制和调试指令:用来实现计算机的硬件管理等。
(4)指令的执行过程。
指令的执行过程可分为取指令、分析指令和执行指令3个步骤。
● 取指令:按照程序规定的次序,从内存取出当前执行的指令,并送到控制器的指令寄存器中。
● 分析指令:对所取的指令进行分析,即根据指令中的操作码确定计算机应进行什么操作。由指令中的地址码确定操作码存放的地址。
● 执行指令:根据指令分析结果,由控制器发出完成操作所需的一系列控制电位,以便指挥计算机有关部件完成这一操作,同时为取下一条指令做好准备。
一般把计算机完成一条指令所花费的时间称为一个指令周期。指令周期越短,指令执行就越快。
(1)计算机中的数据。
计算机内部均使用二进制数表示各种信息,但计算机在与外部沟通中会采用人们比较熟悉和方便阅读的形式,如十进制数。其中的转换主要由计算机系统的硬件和软件来实现。
二进制只有“0”和“1”两个数。相对十进制数而言,二进制数表示不但运算简单、易于物理实现、通用性强,而且所占的空间和所消耗的资源也少得多,可靠性较高。
(2)计算机中数据的存储单位。
位(bit)是计算机中数据的最小存储单位,二进制的数码只有0和1,计算机中采用多个数码表示一个数,每一个数码称为1位。
字节(Byte,B)是存储容量的基本单位,一个字节由8位二进制数组成。在计算机内部一个字节可以表示一个数字,也可以表示一个英文的字母或其他特殊字符,两个字节可以表示一个汉字。为了便于衡量存储器的大小,统一以字节为单位。表2.1所示为常用的存储单位。
表2.1 常用的存储单位
随着电子技术的发展,计算机的并行处理能力越来越强,人们通常将计算机一次能够并行处理的二进制位的个数称为字长,也称为计算机的一个“字”。字长是计算机的一个重要指标,直接反映一台计算机的计算能力和精度。字长越长,表示计算机的数据处理速度越快。计算机的字长通常是字节的整数倍,如8位、16位、32位。发展到今天,微型机的字长已达到64位,大型机的字长已达到128位。
(1)进位记数制。
数的表示规则称为数制。如果 R 表示任意整数,进位记数制为“逢 R 进一”。处于不同位置的数码代表的值不同,与它所在位置的权值有关。任意一个 R 进制数 D 均可展开为
此时, R 为记数的基数,数制中固定的基本符号称为“数码”。 i 称为位数, k i 是第 i 位的数码,为0~ R -1中的任一个, R i 称为第i位的权,m、n为最低位和最高位的位序号。例如,十进制数“5820”,基数 R 为10,数码“8”的位数 i =2(位数从0开始计),权值为 R i =10 2 ,此时“8”的值代表: k i × R i =8×10 2 =800。
常用数制包括二进制、八进制、十进制、十六进制,其中的各个要素如表2.2所示。
表2.2 常用数制的各个要素
通常用圆括号标注进制数、以数制基数作为下标的方式来表示不同的进制数,如二进制数(1100) B 、八进制数(3567) O 、十进制数(5820) D ,也可直接表示为(1100) 2 、(3567) 8 、(5820) 10 。
十六进制除了数码0~9之外,还使用了6个英文字母A、B、C、D、E、F,相当于十进制的10、11、12、13、14、15。十进制数、二进制数、八进制数、十六进制数的对照如表2.3所示。
表2.3 不同进制数的对照
(2) R 进制数转换为十进制数。
R 进制数转换为十进制数的方法是“按权展开”,如下。
二进制数转换为十进制数:(11010) 2 =1×2 4 +1×2 3 +0×2 2 +1×2 1 +0×2 0 =(26) 10
八进制数转换为十进制数:(140) 8 =1×8 2 +4×8 1 +0×8 0 =(96) 10
十六进制数转换为十进制数:(A2B) 16 =10×16 2 +2×16 1 +11×16 0 =(2603) 10
(3)十进制数转换为 R 进制数。
将十进制数转换为 R 进制数时,可将此数分成整数与小数两部分分别转换,然后拼接起来。下面以十进制数转换为二进制数为例进行介绍。
十进制整数转换为二进制整数的方法是“除以2取余法”,具体步骤如下。
步骤1:把十进制数除以2得到商和余数,商再除以2又得到商和余数……依次除下去直到商是0为止。
步骤2:以最先除得的余数为最低位,最后除得的余数为最高位,从最高位到最低位依次排列。
将十进制整数13转换为二进制整数的步骤如表2.4所示。
表2.4 将十进制整数转换为二进制整数步骤
十进制小数转换为二进制小数采用“乘2取整法”,具体步骤如下。
步骤1:把小数部分乘以2得到一个新数,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分再乘以2,一直取到小数部分为0为止。
步骤2:以最先乘得的乘积整数部分为最高位,最后乘得的乘积整数部分为最低位,从高位向低位依次排列。
将十进制小数0.125转换为二进制小数的步骤如表2.5所示。
表2.5 将十进制小数转换为二进制小数步骤
将十进制数转换为八进制数、十六进制数,均可以采用类似的“除以8取余”“除以16取余”“乘8取整”“乘16取整”的方法来实现转换。
(4)二进制数、十六进制数、八进制数之间的转换。
① 二进制数转换为十六进制数。
将二进制数转换为十六进制数的步骤如下。
步骤1:二进制数从小数点开始,整数部分向左、小数部分向右,每4位分成1节。
步骤2:整数部分最高位不足4位或小数部分最低位不足4位时补“0”。
步骤3:将每节4位二进制数依次转换成1位十六进制数,再把这些十六进制数连接起来即可。
将二进制数(10111100101.00011001101) 2 转换为十六进制数的步骤如表2.6所示。
表2.6 将二进制数转换为十六进制数
同理,将二进制数转换为八进制数,只要将二进制数按每3位为1节划分,并分别转换为1位八进制数即可。
② 十六进制数转换为二进制数。
将十六进制数转换为二进制数,就是对每1位十六进制数,用与其等值的4位二进制数代替。将十六进制数(1AC0.6D) 16 转换为二进制数的步骤如表2.7所示。
表2.7 将十六进制数转换为二进制数
同理,将八进制数转换为二进制数,只需分别将每1位八进制数转换为3位二进制数即可。
在计算机中,采用数字化方式来表示数据,数据有无符号数和带符号数之分。
(1)无符号数。
无符号数是指整个机器字长的全部二进制位均表示数值位(没有符号位),相当于数的绝对值。字长为 n 的无符号数的表示范围为0~2 n -1。若机器字长为8位,则数的表示范围为0~2 8 -1,即0~255。
(2)带符号数。
日常生活中,把带有“+”或“-”符号的数称为真值。在机器中,数的“+”“-”是无法识别的,因此需要把符号数字化。通常,约定二进制数的最高位为符号位,0表示正号,1表示负号。这种把符号数字化的数称为机器数。常见的机器数有原码、反码、补码及移码等不同的表示形式。
● 原码。原码是机器数中最简单的一种表示形式,符号位为0表示正数,符号位为1表示负数,数值位即真值的绝对值。用原码实现乘除运算的规则很简单,但实现加减运算的规则很复杂。
● 反码。正数的反码与原码相同;负数的反码是对该数的原码除符号位外的各位取反(将0变为1,将1变为0)。
● 补码。正数的补码与原码相同;负数的补码是在该数的反码的最低位(最右边一位)加1。
● 移码。一个真值的移码和补码只差一个符号位,若将补码的符号位由0改为1,或由1改为0,即可得该真值的移码。
根据小数点的位置是否固定,在计算机中有两种方法表示小数点,即定点表示和浮点表示。定点表示的机器数称为定点数,浮点表示的机器数称为浮点数。
(1)定点表示。
定点表示,即约定机器数中的小数点位置是固定不变的,小数点不再使用“.”表示,而是约定它的位置。在计算机中通常采用两种简单的约定:将小数点的位置固定在最高位之前、符号位之后,或固定在最低位之后。一般常称前者为定点小数(纯小数),后者为定点整数(纯整数)。
除了加、减、乘、除外,定点数的运算还有移位运算。根据操作对象的不同,移位运算分为算术移位(带符号数的移位)和逻辑移位(无符号数的移位)。
(2)浮点表示。
计算机中处理的数不一定是纯小数或纯整数(如圆周率约为3.1416),而且在运算中常常会遇到非常大(如太阳的质量约2×10 33 g)或非常小(如电子的质量约9×10 -28 g)的数值,它们用定点表示非常不方便,但可以用浮点表示。
浮点数是指小数点位置可浮动的数据。例如,679.32=6.7932×10 2 =6793.2×10 -1 =0.67932×10 3 。
通常,浮点数被表示成
其中, N 为浮点数, S 为其尾数, j 为其阶码, R 是浮点数阶码的底(隐含,在机器数中不出现)。通常 R =2, j 和 S 都是带符号的定点数。可见,浮点数由阶码和尾数两部分组成,如图2.3所示。
图2.3 浮点数的表示形式
阶码是整数,阶符 j f 和阶码的位数 m 共同反映浮点数的表示范围和小数点的实际位置;数符 S f 反映浮点数的正/负;尾数的位数 n 反映浮点数的精度。
为了提高运算的精度,浮点数的尾数必须为规格化数(即尾数的最高位必须是一个有效值)。如果不是规格化数,需要修改阶码并左/右移尾数,使其变成规格化数。将非规格化数转换为规格化数的过程称为规格化操作。例如,二进制数0.0001101可以表示为0.001101×2 -01 、0.01101×2 -10 、0.1101×2 -11 ……而其中只有0.1101×2 -11 是规格化数。
现代计算机中,浮点数一般采用IEEE 754标准。IEEE 754标准浮点数的格式如图2.4所示。
图2.4 IEEE 754标准浮点数的格式
这种标准规定常用的浮点数格式有短浮点数(单精度,即float型)、长浮点数(双精度,即double型)、临时浮点数,如表2.8所示。除临时浮点数外,短浮点数和长浮点数的尾数用隐藏位的原码表示,阶码用移码表示。
表2.8 IEEE 754标准规定常用的浮点数格式
以短浮点数为例,最高位为数符位;其后是8位阶码,以2为底,用移码表示,阶码的偏置值为2 8-1 -1=127;其后23位是原码表示的尾数数值位。对于规格化的二进制浮点数,数值的最高位总是“1”,为了能使尾数多表示一位有效位,将这个“1”隐藏,因此尾数数值实际是24位。隐藏的“1”是一位整数。在浮点数格式中表示的23位尾数是纯小数。例如,(12) 10 =(1100) 2 ,将它规格化后结果为1.1×2 3 ,其中整数部分的1将不存储在23位尾数内。
(1)操作系统的功能与任务。
操作系统是现代计算机中最基本和最核心的系统软件之一,所有其他的软件都依赖于操作系统的支持。
操作系统是配置在计算机硬件上的第1层软件,是对硬件系统的首次扩充。其主要作用是管理硬件设备,提高它们的利用率和系统的吞吐量,并为用户和软件提供一个简单的接口,便于用户使用。
如果把操作系统看成计算机系统资源的管理者,则操作系统的任务及其功能主要有以下5个方面。
● 处理器(CPU)管理:对进程进行管理。其主要功能有创建和撤销进程,对多个进程的运行进行协调,实现进程之间的信息交换,以及按照一定的算法把处理器分配给进程等。
● 存储器管理:为多道程序的运行提供良好的环境,提高存储器的利用率,方便用户使用,并能从逻辑上扩充内存。因此,存储器管理应具有内存分配和回收、内存保护、地址映射及内存扩充等功能。
● 设备管理:完成用户进程提出的I/O请求,为用户进程分配所需的I/O设备,并完成指定的I/O操作;提高CPU和I/O设备的利用率,提高I/O速度,方便用户使用I/O设备。因此,设备管理应具有缓冲管理、设备分配、设备处理以及虚拟设备等功能。
● 文件管理:对用户文件和系统文件进行管理以方便用户使用,并保证文件的安全性。因此,文件管理应具有文件存储空间管理、目录管理、文件的读/写管理以及文件的共享与保护等功能。
● 提供用户接口:为了方便用户使用计算机和操作系统,操作系统向用户提供了“用户和操作系统的接口”。
(2)操作系统的发展。
操作系统经历了如下的发展过程:手工操作(无操作系统)、批处理系统、多道程序系统、分时操作系统、实时操作系统、个人计算机操作系统。
(3)操作系统的分类。
根据使用环境和对作业处理方式的不同,操作系统分为多道批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统、嵌入式操作系统等。
(1)程序的并发执行。
程序只有经过执行才能得到结果。程序的执行又分为顺序执行和并发执行。
一个具有独立功能的程序独占处理器直至执行结束的过程称为程序的顺序执行。顺序执行具有顺序性、封闭性及可再现性等特点。
程序顺序执行时,虽然可以给程序员带来方便,但系统资源的利用率很低。为此,在系统中引入了多道程序技术,使程序或程序段间能并发执行。程序的并发执行是指一组在逻辑上互相独立的程序或程序段在执行过程中,其执行时间在客观上互相重叠,即一个程序段的执行尚未结束,另一个程序段的执行已经开始的执行方式。
并发程序在执行过程中有以下几个特点。
● 失去了封闭性。
● 不可再现性。
● 间断性,即程序之间可以互相制约。
并发程序具有并行性和共享性,而顺序程序则以顺序性和封闭性为基本特征。
(2)进程的基本概念。
进程是指一个具有一定独立功能的程序关于某个数据集合的一次运行活动。简单地说,进程是指可以并发执行的程序的执行过程。
进程与程序有关,但它与程序又有本质的区别,主要反映在以下几个方面。
● 进程是程序在处理器上的一次执行过程,它是动态的概念。程序只是一组指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。
● 进程具有一定的生命周期,它能够动态地产生和消亡。程序可以作为一种软件资源长期保存,它的存在是“永久”的。
● 进程包括程序和数据,还包括记录进程相关信息的“进程控制块”。
● 一个程序可能对应多个进程。
● 一个进程可以包含多个程序。
(3)进程的状态及其转换。
进程从创建、产生、撤销至消亡的整个生命周期,有时占有处理器并运行,有时虽可运行但不占有处理器,有时虽有空闲处理器但因等待某个事件发生而无法运行,这说明进程是活动的且有状态变化。一般来说,一个进程的活动情况至少可以划分为以下5种基本状态。
● 创建状态:进程正在创建过程中,尚不能运行的状态。
● 就绪状态:进程具备运行条件,等待系统分配处理器以便运行的状态。
● 运行状态:进程占有处理器,正在运行的状态。
● 等待状态:又称阻塞状态或睡眠状态,指进程不具备运行条件,正在等待某个事件完成的状态。
● 终止状态:进程运行结束的状态。
处于运行状态的进程个数不能大于处理器个数,处于就绪和等待状态的进程可以有多个。进程的几种基本状态之间在一定的条件下是可以互相转换的。图2.5表示了进程的5种基本状态之间在一定条件下的转换。
图2.5 进程的5种基本状态的转换
(4)进程控制块。
每个进程有且仅有一个进程控制块(Process Control Block,PCB)。它是进程存在的唯一标识,是操作系统用来记录和刻画进程状态及环境信息的数据结构,是进程动态特征的汇集,也是操作系统掌握进程的唯一资料结构和管理进程的主要依据。PCB包括进程运行时的状态,以及进程让出处理器之后所处的状态、断点等信息。
PCB中通常应包括以下基本内容。
● 进程名:唯一标识,对应进程的一个标识符或数字,系统根据该标识符来识别一个进程。
● 特征信息:反映该进程是不是系统进程等信息。
● 执行状态信息:反映对应进程当前的状态。
● 通信信息:反映该进程与其他进程之间的通信关系。
● 调度优先数:用于分配处理器时参考的一种信息,它决定在所有就绪的进程中,究竟哪一个进程先得到处理器。
● 现场信息:在对应进程放弃处理器时,将处理器的一些现场信息(如指令计数器值、各寄存器值等)保留在该进程的PCB中,当下次恢复运行时,只要按保存值重新装配即可继续运行。
● 系统栈:主要反映对应进程在执行时的一条嵌套调用路径上的历史。
● 进程映像信息:用以说明该进程的程序和数据存储情况。
● 资源占有信息:指明对应进程所占有的外设种类、设备号等。
● 族关系:反映该进程与其他进程间的隶属关系。
除此之外,PCB中还包含文件信息、工作单元等内容。
(5)进程的组织。
进程的物理组织方式通常有线性方式、链接方式及索引方式。
● 线性方式:先将系统中所有的PCB都组织在一个线性表中,再将该表的首地址存放在内存的一个专用区域中。该方式实现简单、开销小,但每次查找时都需要扫描整个表,因此适合进程数目不多的系统。
● 链接方式:把具有相同状态进程的PCB通过PCB中的链接字链接成一个队列,这样可以形成一个就绪队列、若干个阻塞队列及空白队列等。在就绪队列中,往往按进程的优先级将PCB从高到低进行排列,将优先级高的进程的PCB排在队列的前面。
● 索引方式:系统根据所有进程不同的状态,建立几个索引表,如就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在表中的地址。
(6)进程调度。
进程调度是指按一定策略动态地把CPU分配给处于就绪队列中的某一进程并使之运行的过程。进程调度亦可称为处理器调度或低级调度,相应的进程调度程序可称为分配程序或低级调度程序。进程调度仅负责对CPU进行分配。
进程调度方式有抢占方式和非抢占方式。抢占方式指就绪队列中一旦有优先级高于当前正在运行的进程出现时,系统便立即把CPU分配给高优先级的进程,并保存被抢占了CPU的进程的有关状态信息,以便以后恢复。而对于非抢占方式,一旦CPU分给了某进程,即使就绪队列中出现了优先级比它高的进程,高优先级进程也不能抢占当前正在运行进程的CPU。
基本的进程调度算法有先来先服务调度算法、时间片轮转调度算法、优先级调度算法等。
(7)其他概念。
● 线程。线程是比进程更小的能独立运行的基本单位,用它来提高程序的并行程度,减少系统开销,可进一步提高系统的吞吐量。
● 死锁。各进程互相独立地动态获得,并不断申请和释放系统中的软硬件资源,这就有可能使系统中若干个进程均因互相“无知地”等待对方所占有的资源而无限地等待,这种状态称为死锁。
存储管理是操作系统的重要组成部分,管理的主要对象是内存。操作系统的主要任务之一是尽可能方便用户使用和提高内存利用率。此外,有效的存储管理也是多道程序设计技术的关键支撑。
(1)存储管理的功能。
● 地址变换。
● 内存分配。
● 存储共享与保护。
● 存储器扩充。
(2)地址重定位。
地址变换:当用户程序进入内存执行时,必须把用户程序中的所有相对地址(逻辑地址)转换成内存中的实际地址(物理地址)。
地址重定位:在进行地址转换时,必须修改程序中所有与地址有关的项,也就是要对程序中的指令地址以及指令中有关地址的部分(有效地址)进行调整。
地址重定位建立用户程序的逻辑地址与物理地址之间的对应关系,实现方式包括静态地址重定位和动态地址重定位。
● 静态地址重定位是在程序执行之前将操作系统的重定位装入程序,程序必须占用连续的内存空间,且一旦装入内存后,程序便不再移动。
● 动态地址重定位则在程序执行期间进行,由专门的硬件机构来完成,通常采用一个重定位寄存器,在每次进行存储访问时,将取出的逻辑地址加上重定位寄存器的内容形成物理地址。
动态地址重定位的优点是不要求程序装入固定的内存空间,在内存中允许程序再次移动位置,而且可以部分地装入程序运行,同时也便于多个作业共享同一程序的副本。动态地址重定位技术被广泛采用。
(3)存储管理技术。
① 连续存储管理。
基本特点:内存空间被划分成一个个分区,一个作业占一个分区,即系统和用户作业都以分区为单位享用内存。
在连续存储管理中,地址重定位采用静态地址重定位,分区的存储保护可采用上、下界寄存器保护方式。
分区分配方式分为固定分区和可变分区。固定分区存储管理的优点是简单,要求的硬件支持少;缺点是容易产生内部碎片。可变分区避免了固定分区中每个分区都可能有剩余空间的情况,但由于它的空闲区域仍是离散的,因此会出现外部碎片。
② 分页式存储管理。
在分页式存储管理中,当作业提出存储分配请求时,系统首先根据存储块大小把作业分成若干页,每一页可存储在内存的任意一个空白块内。这样,只要建立起程序的逻辑页和内存的存储块之间的对应关系,借助动态地址重定位技术,分散在不连续物理存储块中的用户作业就能够正常运行。
分页式存储管理的优点是能有效解决碎片问题,内存利用率高,内存分配与回收算法也比较简单;缺点是采用动态地址变换机构增加了硬件成本,也降低了处理器的运行速度。
③ 分段式存储管理。
在分段式存储管理中,作业的逻辑地址空间由若干个逻辑段组成,每一段是一组逻辑意义完整的信息集合,并有自己的名字(段名)。每一段都是以0开始的、连续的一维地址空间,整个作业则构成了二维地址空间。
分段式存储管理是以段为基本单位来分配内存的,且每一段必须分配连续的内存空间,但各段之间不要求连续。由于各段的长度不一样,因此分配的内存空间大小也不一样。
分段式存储管理较好地解决了程序和数据的共享以及程序动态链接等问题。与分页式存储管理一样,分段式存储管理采用动态地址重定位技术来进行地址转换。分页式存储管理的优点体现在内存空间的管理上,而分段式存储管理的优点体现在地址空间的管理上。
④ 段页式存储管理。
段页式存储管理是分页和分段两种存储管理方式的结合,它同时具备两者的优点。
段页式存储管理是目前使用较多的一种存储管理方式,它有如下特点。
● 将作业的逻辑地址空间分成若干个逻辑段,每段都有自己的段名。
● 每段再分成若干大小固定的页,每段都从0开始为自己的各页依次编写连续的页号。
● 对内存空间的管理仍然和分页式存储管理一样,将其分成若干个与页面大小相同的物理块,对内存空间的分配是以物理块为单位的。
● 作业的逻辑地址包括3个部分:段号、段内页号及页内位移。
⑤ 虚拟存储器管理。
连续存储管理和分页分段式存储管理技术必须为作业分配足够的内存空间,可装入其全部信息,否则作业将无法运行。把作业的全部信息装入内存后,实际上并非同时使用这些信息,有些部分运行一次,有些部分暂时不用或在某种条件下才使用。让作业全部信息驻留于内存是对内存资源的极大浪费,会降低内存利用率。
虚拟存储器管理技术的基本思路是把内存扩大到大容量外存上,把外存空间当作内存的一部分,作业运行过程中可以只让当前用到的信息进入内存,其他当前未用的信息留在外存;而当作业进一步运行,需要用到外存中的信息时,再把已经用过但暂时还不会用到的信息换到外存,把当前要用的信息换到已空出的内存中,从而给用户提供一个比实际内存空间大得多的地址空间。这种大容量的地址空间并不是真实的存储空间,而是虚拟的,因此,这样的存储器称为虚拟存储器。
虚拟存储器管理主要采用请求分页式存储管理、请求段式存储管理及请求段页式存储管理技术实现。
在操作系统中,无论是用户数据,还是计算机系统程序和应用程序,甚至各种外设,都是以文件形式提供给用户的。文件管理就是对用户文件和系统文件进行管理,以方便用户使用,并保证文件的安全性,提高外存空间的利用率。
(1)文件与文件系统的概念。
文件是指一组带标识(文件名)的、具有完整逻辑意义的相关信息的集合。用户作业、源程序、目标程序、初始数据、输出结果、汇编程序、编译程序、连接装配程序、编辑程序、调试程序及诊断程序等,都是以文件的形式存在的。
各个操作系统的文件命名规则略有不同,文件名的格式和长度也因系统而异。一般来说,文件名由文件名和扩展名两部分组成,前者用于识别文件,后者用于区分文件类型,中间用“.”分隔开。
操作系统中与管理文件有关的软件和数据称为文件系统。它负责为用户建立、撤销、读/写、修改及复制文件,还负责对文件的按名称存取和存取控制。常用的、具有代表性的文件系统有EXT2/4、NFS、HPFS、FAT、NTFS等。
(2)文件类型。
文件依据不同标准可以有多种类型,如表2.9所示。
表2.9 文件类型
(3)文件系统模型。
文件系统的传统模型为层次模型,该模型由许多不同的层组成。每一层都会使用下一层的功能来创建新的功能,为上一层服务。层次模型比较适合支持单个文件系统。
(4)文件的组织结构。
① 文件的逻辑结构。
文件的逻辑结构是用户可见结构。根据有无逻辑结构,文件可分为记录式文件和流式文件。
在记录式文件中,每个记录都用于描述实体集中的一个实体。各个记录有着相同或不同数目的数据项,记录的长度可分为定长和不定长两类。
流式文件内的数据不再组成记录,只是一串有顺序的信息集合(有序字符流)。这种文件的长度以字节为单位。可以把流式文件看作记录式文件的一个特例:一个记录仅有一个字节。
② 文件的物理结构。
文件按不同的组织方式在外存上存放,就会得到不同的物理结构。文件的物理结构有时也称为文件的“存储结构”。
文件在外存上有连续存放、链接块存放及索引表存放这3种不同的存放方式,其对应的存储结构分别为顺序结构、链接结构及索引结构。
(5)文件目录管理。
① 文件目录的概念。
为了能对一个文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称为文件控制块(File Control Block,FCB)。FCB一般应包括以下内容。
● 有关文件存取控制的信息:文件名、用户名、文件主存取权限、授权者存取权限、文件类型及文件属性等。
● 有关文件结构的信息:记录类型、记录个数、记录长度、文件所在设备名及文件的物理结构类型等。
● 有关文件使用的信息:已打开文件的进程数、文件被修改的情况、文件最大长度及文件当前大小等。
● 有关文件管理的信息:文件建立日期、最近修改日期及最后访问日期等。
文件与FCB一一对应,而人们把多个FCB的有序集合称为文件目录,即一个FCB就是一个文件目录项。通常,一个文件目录也被看作一个文件,可称为目录文件。
对文件目录的管理就是对FCB的管理。对文件目录的管理除了要解决存储空间的有效利用问题外,还要解决快速搜索、文件命名冲突以及文件共享等问题。
② 文件目录的结构。
文件目录根据不同结构可分为单级目录、二级目录、多层级目录、无环图结构目录及图状结构目录等。
● 单级目录的优点是简单,缺点是查找速度慢,不允许重名,不便于实现文件共享。
● 二级目录提高了检索目录的速度;在不同的用户目录中,可以使用相同的文件名;不同用户还可以使用不同的文件名访问系统中的同一个共享文件。但对同一用户目录,也不能有两个同名的文件存在。
● 多层级目录也叫树结构目录,既可以方便用户查找文件,又可以把不同类型和不同用途的文件分类;允许文件重名,不但不同用户目录可以使用相同名称的文件,同一用户目录也可以使用相同名称的文件;利用多级层次结构关系,可以更方便地设置文件的存取权限,有利于文件的保护。其缺点为不能直接支持文件或目录的共享等。
● 为了使文件或目录可以被不同的目录所共享,出现了结构更复杂的无环图结构目录和图状结构目录等。
③ 存取权限。
存取权限可以通过建立访问控制表和存取权限表来实现。
大型文件系统主要采用两个措施来进行安全性保护:一是对文件和目录进行权限设置,二是对文件和目录进行加密。
(6)文件存储空间管理。
文件存储空间管理是文件系统的重要任务之一。文件存储空间管理实质上是空闲块管理问题,它包括空闲块的组织、空闲块的分配及空闲块的回收等问题。
空闲块管理方法主要有空闲文件项、空闲区表、空闲块链、位示图、空闲块成组链接法(UNIX操作系统中)等。
I/O设备类型繁多,差异又非常大,因此I/O设备管理是操作系统中最庞杂和琐碎的部分之一。
(1)I/O软件的层次结构。
I/O软件的设计目标是将I/O软件组织成一种层次结构,每一次都是利用其下层提供的服务,完成I/O功能中的某些子功能,并屏蔽这些功能实现的细节,向上层提供服务。
通常把I/O软件组织成4个层次,如图2.6所示,图中的箭头表示I/O的控制流。各层次功能如下。
● 用户层软件:用于实现与用户交互的接口,用户可直接调用该层所提供的、与I/O操作有关的库函数对设备进行操作。
● 设备独立性软件:用于实现用户程序与设备驱动器的统一接口、设备命名、设备的保护以及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
● 设备驱动程序:与硬件直接相关,用于具体实现系统对设备发出的操作指令,驱动I/O设备工作。
● 中断处理程序。用于保持被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完毕再恢复被中断进程的现场,并返回到被中断进程。
图2.6 I/O软件的层次结构
(2)中断处理程序。
当一个进程请求I/O操作时,该进程将被“挂起”,直到I/O设备完成I/O操作后,设备控制器向CPU发送一个中断请求,CPU响应后便转向中断处理程序。中断处理过程如下。
● CPU检查响应中断的条件是否满足。
● 如果条件满足,CPU响应中断,则CPU关中断,使其进入不可再次响应中断的状态。
● 保存被中断进程的CPU环境。
● 分析中断原因,调用中断处理子程序。
● 执行中断处理子程序。
● 退出中断,恢复被中断进程的CPU现场或调度新进程占用CPU。
● 开中断,CPU继续执行。
I/O操作完成后,驱动程序必须检查本次I/O操作中是否发生了错误,并向上层软件报告,最终向调用者报告本次I/O的执行情况。
(3)设备驱动程序。
设备驱动程序是驱动物理设备和DMA控制器或I/O控制器等直接进行I/O操作的子程序的集合。它负责启动I/O设备进行I/O操作,指定操作的类型和数据流向等。设备驱动程序有如下功能。
● 接收由设备独立性软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层次操作序列。
● 检查用户I/O请求的合法性,了解I/O设备的工作状态,传递与I/O设备操作有关的参数,设置设备的工作方式。
● 发出I/O命令,如果设备空闲,便立即启动I/O设备,完成指定的I/O操作;如果设备忙碌,则将请求者的请求块挂在设备队列上等待。
● 及时响应由设备控制器发来的中断请求,并根据其中断类型,调用相应的中断处理程序进行处理。
(4)设备独立性软件。
为了实现设备独立性,必须在设备驱动程序之上设置一层软件,该软件称为与设备无关的I/O软件,或设备独立性软件。其主要功能:①向用户层软件提供统一接口;②设备命名;③设备保护;④提供一个独立于设备的块;⑤缓冲技术;⑥设备分配和状态跟踪;⑦错误处理和报告等。
(5)用户层软件。
用户层软件在层次结构的最上层,它面向用户,负责与用户和设备无关的I/O软件通信。当接收到用户的I/O指令后,该层会把具体的请求发送到与设备无关的I/O软件进一步处理。它主要包含用于I/O操作的库函数和SPOOLing系统。此外,用户层软件还会用到缓冲技术。
(6)设备的分配与回收。
由于设备、控制器及通道资源的有限性,因此不是每一个进程随时随地都能得到这些资源。进程必须首先向设备管理程序提出资源申请,然后由设备分配程序根据相应的分配算法为进程分配资源。如果申请进程得不到它所申请的资源,将被放入资源等待队列中等待,直到所需要的资源被释放。如果进程得到了它所需要的资源,就可以使用该资源完成相关的操作,使用完之后通知系统,系统将及时回收这些资源,以便其他进程使用。