软件评测师笔记_程序语言和操作系统基础20170324
一、结构化数据类型
一个数据结构是一个包含其他数据对象作为其元素或成员的数据对象。比较重要的结构化数据类型有数组和记录。
其他结构化数据类型如下。
(1)列表:列表是由一连串有序的数据结构构成的数据结构,通常是不定长和异构的。在JL、LISP和Prolog等语言中,列表是基本数据对象。列表的典型变形有堆栈(stack)、队列(queue)、树(tree)、有向图和属性列表。
(2)集合:集合是一种包含无序的不同值的数据对象,集合中的值是不能重复的。
1.过程:
在程序设计中,习惯把程序看做层次结构,程序从主程序开始执行,然后进入各层次的过程执行,到最后返回主程序结束。过程为程序员提供了一种抽象手段,实际上是一组输入到一组输出的映射。
过程通常有4个要素:过程名、过程体、形式参数列表和返回值类型。例如C语言中的函数(即C语言中的过程)如下:
int Function1 (int x, int y);
其中Function1为函数名,(int x, int y)为形式参数列表,int是返回值类型。
2.参数传递方式
当用户调用一个过程时,就会发生通过参数传递信息的过程之间的通信。形式参数就是过程定义中用于命名所传递的数据或其他信息的标识符,而实际参数是在调用点表示向被调用过程传递的数据或其他信息的表达式。在大多数的语言中,形式参数和实际参数之间的对应关系通常按位置确定。程序语言传递参数的方式通常有传值调用、引用调用和传值—结果调用。
1)传值调用
在按值调用时,过程的形式参数取得的是实际参数的值。在这种情况下,形式参数实际上是过程中的局部量,其值的改变不会导致调用点所传送的实际参数的值发生改变,也就是数据的传送是单向的。在C语言中只有按值调用的过程参数传递方式。
2)引用调用
在按引用调用时,过程的形式参数取得的是实际参数所在单元的地址。在过程中,对该形式参数的引用相当于对实际参数所在的存储单元的地址引用。任何改变形式参数值的操作会反映在该存储单元中,也就是反映在实际参数中,因此数据的传送是双向的。C++语言既支持按值调用,也支持按引用调用。
3)传值-结果调用
传值—结果调用也称为拷入/拷出,因为初始时实际参数被拷贝到形式参数,而在过程调用结束时再把形式参数拷贝回实际参数。
二、操作系统基础
1、在计算机系统中引入操作系统的目的可以从4个方面来理解。
(1)用户观点。操作系统是用户与计算机之间的接口。一方面,用户可以透明地使用计算机软/硬件资源;另一方面,操作系统提供了一些功能强大的系统调用,用户软件可以使用这些系统调用请求操作系统服务。
(2)资源管理观点。操作系统是计算机资源的管理者,它管理和分配计算机系统硬件和软件资源,合理地组织计算机的工作流程,使资源能为多个用户共享,当用户程序和其他程序争用这些资源时,提供有序和可控的分配。
(3)进程观点。操作系统由一个系统核心和若干并发运行的程序组成。这些运行的程序称为“进程”,进程可以分为用户进程和系统进程两大类。每个进程完成特定的任务,系统核心则控制和协调这些进程的运行。
(4)分层观点。操作系统通常采用分层结构实现,各层次的程序按照一定的结构组织并协调工作。
2、操作系统的基本类型批处理操作系统、分时操作系统、实时操作系统、网络操作系统和分布式操作系统。
从资源管理的观点看,操作系统的功能分成5大部分,即处理机管理、存储管理、文件管理、设备管理和作业管理。
3、操作系统的结构设计模式主要包括以下几种。
(1)模块化结构。操作系统由许多标准的、可兼容的基本单位构成(称为模块),各模块相对独立,模块之间通过规定的接口相互调用。模块化设计方法的优点是缩短了系统的开发周期,缺点是模块之间调用关系复杂、相互依赖,从而使分析、移植和维护系统容易出错。
(2)层次化结构。层次化结构是指操作系统由若干模块按照某种逻辑关系进行分层组合而成,各层之间只能单向依赖。优点是大大地简化了接口的设计,整个系统的正确性由各层次的正确性来保证,易于保证可靠性,也便于维护和移植。
(3)客户/服务器结构。操作系统中只包括一个最小的核心,操作系统的其他功能(如文件服务、进程服务等)由用户进程来实现。优点是服务器以用户进程的形式运行而不是运行于核心态,它们不直接访问硬件,单个服务器的崩溃不会导致整个系统的崩溃,它适用于分布式系统。
(4)对象模式。面向对象的操作系统是按照面向对象思想设计的,具有数据隐藏及消息激活对象等特征。其中对象是对操作系统管理的信息和资源的抽象,可以被视为受保护的信息或资源的总称。优点是适用于网络操作系统和分布式操作系统中,Windows NT就被称为对象操作系统。
(5)对称多处理模式。如果一个操作系统在系统中的所有处理机运行且共享同一内存,这样的系统就是一个对称多处理系统。优点是适合共享存储器结构的多处理机系统,即紧耦合的多处理机系统。
4、进程的概念
进程是可以与其他程序并发执行的段程序的一次执行过程,是系统进行资源分配和调度的基本单位。进程是一个程序关于某个数据集的一次运行。也就是说,进程是运行中的程序,是程序的一次运行活动。相对于程序而言,进程是一个动态的概念,而程序是静态的概念,是指令的集合。因此,进程具有动态性和并发性。
从静态的角度看,进程实体由程序块、进程控制块(Process Control Block,PCB)和数据块3部分组成。程序块描述该进程所要完成的任务;数据块包括程序在执行时所需要的数据和工作区。进程控制块包括进程的描述信息、控制信息、资源管理信息和CPU现场保护信息等,反映了进程的动态特性。
PCB是进程存在的唯一标志,描述了进程的基本情况。在创建一个进程时,首先创建其PCB,然后才能根据PCB中的信息对进程实施有效的管理和控制。当一个进程完成其功能后,系统则释放PCB,进程也随之消亡。一般情况下,进程的PCB结构都是全部或部分常驻内存的。
进程是程序的一次运行,是一个动态的概念。进程是有状态的,其状态有,就绪,执行,阻塞。
进程控制是通过进程控制原语实现的。用于进程控制的原语主要包括:创建原语、阻塞原语、撤销原语、唤醒原语、优先级原语、调度原语。在操作系统中,原语是一个不可分割的基本单位。它们可以被系统本身调用,有的也以软中断形式供用户进程调用。
通常操作系统中设置3种队列:执行队列、就绪队列和阻塞队列。在单处理器系统中执行队列只有一个成员。一般阻塞队列的个数取决于等待事件(原因)的个数。新创建的进程处于就绪队列。
5、进程互斥与同步
进程互斥定义为:一组并发进程中一个或多个程序段,因共享某一公有资源而导致它们必须以一个不允许交叉执行的单位执行。也就是说,互斥是要保证临界资源在某一时刻只被一个进程访问。
进程同步定义为:异步环境下的一组并发进程因直接制约而互相发送消息,进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程同步。也就是说,进程之间是异步执行的,同步即是使各进程按一定的制约顺序和速度执行。
(1).信号量与P-V操作
信号量(Semaphore)可以有效地实现进程的同步和互斥。在操作系统中,信号量是一个整数。当信号量大于等于0时,代表可供并发进程使用的资源实体数;当信号量小于0时,则表示正在等待使用临界区的进程数。建立一个信号量必须说明所建信号量所代表的意义和设置初值,以及建立相应的数据结构,以便指向那些等待使用该临界区的进程。
对信号量只能施加特殊的操作:P操作和V操作,P操作和V操作都是不可分割的原子操作,也称为原语,因此,P-V原语执行期间不允许中断发生。
P(sem)操作的作用是将信号量sem值减l,若sem的值变成负数,则调用P操作的进程暂停执行,直到另一个进程对同一信号量做V操作。(Vsem) 操作的作用是将信号量sem值加1,若sem的值小于等于0,从相应队列(与sem有关的队列)中选择一个进程,唤醒它。
一般P操作与V操作的定义如下所述。
P操作:
P(sem){
sem = sem–1;
if(sem<0) 进程进入等待状态;
else 继续进行;}
V操作:
V(sem){
sem = sem+1;
if(sem≤0) 唤醒队列中的一个等待进程;
else 继续进行;}
(2).用P-V操作实现进程互斥
为了保护共享资源(如公共变量等),使它们不被多个进程同时访问,就要阻止这些进程同时执行访问这些资源的代码段,这些代码段称为临界区,这些资源称为临界资源。进程互斥不允许两个以上共享临界资源的并发进程同时进入临界区。利用P-V原语和信号量可以方便地解决并发进程对临界区的进程互斥问题。
设信号量mutex是用于互斥的信号量,初值为1,表示没有并发进程使用该临界区。于是各并发进程的临界区可改写成下列形式的代码段:
P(mutex);
临界区
V(mutex);
(3).用P-V操作实现进程同步
要用P-V操作实现进程同步,需要引进私用信号量,私用信号量只与制约进程和被制约进程有关,而不是与整组并发进程相关。与此相对,进程互斥使用的信号量为公用信号量。首先为各并发进程设置私用信号量,然后为私用信号量赋初值,最后利用P-V原语和私用信号量规定各进程的执行顺序。
经典同步问题的例子是生产者–消费者问题。这要求存后再取,取后再存,即有两个制约关系。为此,需要两个信号量,记为Bufempty和Buffull,它们的初值分别是1和0,相应的程序段形式如下。
生产者:
loop
生产一产品next;
P(Bufempty);
next产品存缓冲区;
V(Buffull);
endloop
消费者:
loop
P(Buffulll);
V(Bufempty);
从缓冲区中取产品;
使用产品
endloop
6、进程通信与管程
通信(Communication)就是在进程间传送数据。一般来说,进程间的通信根据通信内容可以划分为两种:控制信息的传送和大批量数据的传送。把控制信息的传送称为低级通信,把大批量数据的传送称为高级通信。进程的同步和互斥是通过信号量进行通信来实现的,属于低级通信。高级通信原语则提供两种通信方式:有缓冲区的通信和无缓冲区的通信。
汉森(Brinch Hansen)和霍尔(Hoare)提出了一个新的同步机制——管程。管程是—个由过程、变量及数据结构等组成的集合,即把系统中的资源用数据抽象地表示出来。这样,对资源的管理就可以用数据及在其上实施操作的若干过程来表示,而代表共享资源的数据及在其上操作的一组过程就构成了管程。进程可以在任何需要资源的时候调用管程,且在任一时刻最多只有一个进程能够真正地进入管程,而其他调用进程则只能等待。由此看来,管程实现了进程之间的互斥,使临界区互斥实现了自动化,它比信号量更容易保证并发进程的正确性。
7、进程调度与死锁
进程调度即处理器调度(又称为上下文转换),由调度原语实现。进程调度的方式有两类:剥夺方式与非剥夺方式。所谓非剥夺方式是指一旦某个作业或进程占有了处理器,别的进程就不能把处理器从这个进程手中夺走,直到该进程自己因调用原语操作而进入阻塞状态,或时间片用完而让出处理机。剥夺方式是指就绪队列中一旦有进程优先级高于当前执行进程优先级时,便立即发生进程调度,转让处理机。
进程调度的算法是服务于系统目标的策略,对于不同的系统与系统目标,常采用不同的调度算法,如:
(1)先来先服务(FCFS)调度算法,又称为先进先出(FIFO)。就绪队列按先来后到原则排队。
(2)优先数调度。优先数反映了进程优先级,就绪队列按优先数排队,有两种确定优先级的方法,即静态优先级和动态优先级。静态优先级是指进程的优先级在进程开始执行前确定,执行过程中不变;而动态优先级则可以在进程执行过程中改变。
(3)轮转法(Round Robin)。就绪队列按FCFS方式排队。每个进程执行一次占有处理器时间都不超过规定的时间单位(时间片)。若超过,则自行释放自己所占有的CPU而排到就绪队列的末尾,等待下一次调度。同时,进程调度程序又去调度当前就绪队列中的第一个进程。
当若干个进程互相竞争对方已占有的资源,无限期地等待,不能向前推进时,会造成“死锁”。死锁是系统的一种出错状态,应该尽量预防和避免。产生死锁的主要原因是供共享的系统资源不足、资源分配策略和进程的推进顺序不当。
产生死锁的必要条件是互斥条件、保持和等待条件、不剥夺条件、环路等待条件。
解决死锁有两种策略:一种是在死锁发生前采用的预防和避免策略;另一种是在死锁发生后采用的检测与恢复策略。
死锁的预防主要是通过打破死锁产生的四个必要条件之一来保证不会产生死锁。死锁避免策略,则是在系统进行资源分配时,先执行一个死锁避免算法(典型的如银行家算法),来保证本次分配不会导致死锁的发生。实际上系统出现死锁的概率很小,故从系统所花的代价上看,采用死锁发生后的检测与恢复策略要比采用死锁发生前的预防与避免策略代价小一些。
8、线程
在支持线程的操作系统中,线程是进程中的一个实体,是系统实施调度的独立单位。线程只拥有—些在运行中必不可少的资源,它与属于同一个进程的其他线程共享该进程所拥有的资源。各线程可以并发地运行。线程切换时只需保存和设置少量寄存器的内容,而并不涉及存储器管理方面的操作,所以线程切换的开销远远小于进程的切换(原运行进程状态的切换还要引起资源转移及现场保护等问题)。同一个进程中的多个线程共享同一个地址空间,这使得线程之间同步和通信的实现也比较容易
9、存储管理
主要对象是内存,是除处理器外操作系统管理的最重要的资源。存储管理部分偏重于虚拟存储、分区存储、地址转换及交换技术等知识。
存储管理主要是指对内存储器的管理,负责对内存的分配和回收、内存的保护和扩充。存储管理的目的是尽量提高内存的使用效率。
(1.单一连续区管理
在单道程序系统中,内存区域的用户空间全部为一个作业或进程占用。单一连续分配方法主要用于早期单道批处理系统。单一连续分配方法主要采用静态分配方法,为降低成本和减小复杂度,通常不对内存进行保护,因而会引起冲突使系统瘫痪。
(2.分区存储管理
分区存储管理包括固定分区和可变分区,其基本思想是把内存划分成若干个连续区域,每个分区装入一个作业运行。要求作业一次性装入内存,且分区内部地址必须连续。
1)固定分区存储管理
固定分区分配方法是把内存空间固定地划分为若干个大小不等的区域,划分的原则由系统决定。系统使用分区表描述分区情况。分区一旦划分结束,在整个执行过程中每个分区的长度和内存的总分区个数保持不变。
2)可变分区存储管理
可变分区分配方法是把内存空间按用户要求动态地划分成若干个分区。随着进程的执行,剩余的自由区域会变得更小,这时需要合并自由区和存储拼接技术。合并自由区是将相邻自由存储区合并为单一自由区的方法;存储拼接技术也称为碎片收集,包括移动存储器的所有被占用区域到主存的某一端。可变分区克服了固定分区分配方法中的小作业占据大分区后产生碎片的浪费问题。
3)存储分配算法
常使用的4种存储分配算法介绍如下。
(1)首次适应算法:把内存中的可用分区单独组成可用分区表或可用分区自由链,按起始地址递增的次序排列。每次按递增次序向后找,一旦找到大于或等于所要求内存长度的分区,则结束探索。从找到的分区中找出所要求的内存长度分配给用户,并把剩余的部分进行合并。
(2)循环适应算法:上述首次适应算法经常利用的是低地址空间,后面经常是较大的空白区,为使内存所有线性地址空间尽可能轮流使用到,每重新分配一次,都在当前之后寻找。
(3)最佳适应算法:最佳适应算法是将输入作业放入主存中与它所需大小最接近的空白区中,使剩下的未用空间最小,该法要求空白区大小按从小到大次序组成空白区可用表或自由链。在进行分配时总是从最小的一个开始查询,因而找到的一个能满足要求的空白区便是最佳的一个。
(4)最差适应算法:分配时把一个作业程序放入主存中最不适合它的空白区,即最大的空白区(空闲区)。
4)交换与覆盖技术
覆盖与交换技术是在多道程序环境下用来扩充内存的两种方法。覆盖技术主要用在早期的操作系统中,而交换技术则在现代操作系统中得到了进一步发展。
覆盖技术是一种解决小内存运行大作业的方法。—个作业中若干程序段和数据段可以不同时使用,这样它们就可以共享内存的某个区域,再根据需要分别调入该区域,这个区域就称为覆盖区。将程序执行时并不要求同时装入主存的覆盖组成一组,并将其称为覆盖段,这个覆盖段分配到同一个覆盖区。
交换技术可以将暂不需要的作业移到外存,让出内存空间以调入其他作业,交换到外存的作业也可以被再次调入。交换技术与覆盖技术相比不要求给出程序段之间的覆盖结构。交换主要是在作业之间进行的,而覆盖则主要是在同一个作业内进行的。
(3.页式存储管理
分页的基本思想是把程序的逻辑空间和内存的物理空间按照同样的大小划分成若干页面,以页面为单位进行分配。在页式存储管理中,系统中虚地址是一个有序对(页号,位移)。系统为每一个进程建立一个页表,其内容包括进程的逻辑页号与物理页号的对应关系、状态等。
(4.段式存储管理
段式存储管理与页式存储管理相似。分段的基本思想是把用户作业按逻辑意义上有完整意义的段来划分,以段为单位作为内、外存交换的空间尺度。一个作业是由若干个具有逻辑意义的段(如主程序、子程序、数据段等)组成的。在分段系统中,容许程序(作业)占据内存中许多分离的分区。每个分区存储一个程序分段。这样,每个作业需要几对界限地址寄存器,判定访问地址是否越界也困难了。在分段存储系统中常常利用存储保护键实现存储保护。分段系统中虚地址是一个有序对(段号,位移)。系统为每个作业建立一个段表,其内容包括段号、段长、内存起始地址和状态等。状态也指出这个段是否已调入内存,即内存起始地址指出这个段,状态指出这个段的访问权限。
(5.段页式存储管理
段页式管理是段式和页式两种管理方法结合的产物,综合了段式组织与页式组织的特点,根据程序模块分段,段内再分页,内存被划分成定长的页。段页式系统中虚地址形式是段号、页号、位移。系统为每个进程建立一个段,为每个段建立一个页表。段页式管理采用段式分配、页式使用的方法,便于动态连接和存储的动态分配。这种存储管理能提高内存空间的利用率。段页式虚拟存储管理结合了段式和页式的优点,但增加了设置表格(段表、页表)和查表等开销,段页式虚拟存储器一般只在大型计算机系统中使用。
(6.页面调度
如果选择的页面被频繁地装入和调出,这种现象称为“抖动”,应减少和避免抖动现象。常用的页面调度算法有以下几种。
(1)最优(OPT)算法。选择不再使用或最远的将来才被使用的页,难以实现,常用于淘汰算法的比较。
(2)随机(RAND)算法。随机地选择被淘汰的页,开销小,但是可以选中立即就要访问的页。
(3)先进先出(First in First out,FIFO)算法,又称为轮转法(RR)。选择在内存驻留时间最长的页,似乎合理,但可能淘汰掉频繁使用的页。另外,使用FIFO算法时,在未给予进程分配足够的页面数时,有时会出现给予进程的页面数增多,缺页次数反而增加的异常现象。FIFO算法简单,可采用队列实现。
(4)最近最少使用(Least Recently Used,LRU)算法。选择离当前时间最近的一段时间内使用得最少的页。这个算法的主要出发点是,如果某个页被访问了,则它可能马上就要被访问;反之,如果某个页长时间未被访问,则它在最近一段时间也不会被访问。
另外,还有最不经常使用的页面先淘汰(Least Frequent Used,LFU)、最近没有使用的页面先淘汰、最优淘汰算法(Optimal Replacement Algorithm,OPT)等。
(7.存储管理方式比较
存储管理方式的比较如表3-1所示。
表3-1 存储管理方式比较表

10、设备管理
在计算机系统中,除了处理器和内存之外,其他的大部分硬件设备称为外部设备。它包括输入/输出设备、辅存设备及终端设备等。为了完成上述主要任务,设备管理程序一般要提供下述功能。
(1)提供和进程管理系统的接口。当进程要求设备资源时,该接口将进程要求转达给设备管理程序。
(2)进行设备分配。按照设备类型和相应的分配算法把设备和其他有关的硬件分配给请求该设备的进程,并把未分配到所请求设备或其他有关硬件的进程放入等待队列。
(3)实现设备和设备、设备和CPU等之间的并行操作。
(4)进行缓冲区管理。主要减少外部设备和内存与CPU之间的数据速度不匹配的问题,系统中一般设有缓冲区(器)来暂放数据。设备管理程序负责进行缓冲区分配、释放及有关的管理工作。
外围设备和内存之间的常用数据传送控制方式介绍如下。
(1)程序控制方式。
(2)中断方式。
(3)直接存储访问(DMA)方式。指外部设备和内存之间开辟直接的数据交换通路。
(4)通道方式。通道又称为输入/输出处理器(IOP),主要有3类通道:字节多路通道、选择通道和成组多路通道。
设备分配方式有两种:一种是静态分配,另一种是动态分配。静态分配方式是在用户作业开始执行之前,由系统一次分配该作业所要求的全部设备、控制器和通道。一旦分配之后,这些设备、控制器和通道就一直为该作业所占用,直到该作业被撤销。静态分配方式不会出现死锁,但是设备的使用效率低。
动态分配在进程执行过程中根据执行需要进行。当进程需要设备时,通过系统调用命令向系统提出设备请求,由系统按照事先规定的策略给进程分配所需要的设备、I/O控制器和通道,一旦用完之后,便立即释放。动态分配方式有利于提高设备的利用率,但如果分配算法使用不当,则有可能造成进程死锁。
常用的分配策略有先请求先分配、优先级高者先分配策略等。
(1)先请求先分配。即按照进程请求设备的先后顺序进行分配。
(2)优先级高者先分配。这种策略和进程调度的优先级算法是一致的,即进程的优先级高,那么它的I/O请求也优先满足。对于相同优先级的进程来说,则按照先请求先分配策略分配。
磁盘调度方法
访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。因此,磁盘调度算法主要有以下几种。
(1)先来先服务(FCFS)调度。按先来后到次序服务,未做优化。
(2)最短查找时间优先(SSTF)调度。SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(又称为饥饿)。
(3)SCAN调度,又称为电梯算法。SCAN算法是磁头前进方向L的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。
Spooling(simultaneous peripheral operation on line)的意思是外部设备同时联机操作,又称为假脱机输入/输出操作,采用一组程序或进程模拟一台输入/输出处理器。
采用假脱机技术,可以将低速的独占设备改造成一种可共享的设备,而且一台物理设备可以对应若干台虚拟的同类设备。Spooling系统必须有高速、大容量并且可随机存取的外存(如磁盘或磁鼓)支持。

Spooling系统示意图
11、文件管理
文件和文件系统
文件是信息的一种组织形式,是存储在辅助存储器上的具有标识名的一组信息集合。它可以是有结构的,也可以是无结构的。操作系统中由文件系统来管理文件的存储、检索、更新、共享和保护。文件系统包括两个方面:一方面包括负责管理文件的一组系统软件;另一方面包括被管理的对象——文件。
文件类型
根据不同的方面,文件有多种分类方法。
(1)按文件的用途可以分为系统文件、库文件和用户文件等。
(2)按文件的安全属性可分为只读文件、读写文件、可执行文件和不保护文件等。
(3)按文件的信息流向可以分为输入文件、输出文件和输入/输出文件等。
(4)按文件的组织形式可以分为普通文件、目录文件和特殊文件等。特殊文件是UNIX系统采用的技术,把所有的输入/输出设备都视为文件(特殊文件)。特殊文件的使用形式与普通文件相同。
文件存储设备管理,就是操作系统要有效地进行存储空间的管理。由于文件存储设备分成许多大小相同的物理块,并以块为单位交换信息,因此,文件存储设备的管理实质是对空闲块的组织和管理问题,它包括空闲块的组织、空闲块的分配与空闲块的回收等问题。有3种不同的空闲块管理方法,它们是索引法、链接法和位图法。

浙公网安备 33010602011771号