1.1 下列选项中,降低进程优先级的合理时机是( A )。
A. 进程的时间片用完
B. 进程刚完成I/O,进入就绪列队
C. 进程长期处于就绪列队中
D. 进程从就绪状态转为运行状态
解释
进程时间片用完,可降低其优先级以让别的进程被调度进入执行状态。B选项中进程刚完成I/O,进入就绪队列等待被处理机调度,为了让其尽快处理I/O结果,故应提高优先权。C选项中进程长期处于就绪队列,为不至于产生饥饿现象,也应适当提高优先级。D选项中进程的优先级不应该在此时降低,而应在时间片用完后再降低。
1.2 执行系统调用的过程包括如下主要操作:①返回用户态 ;②执行陷入(trap)指令 ;③传递系统调用参数 ④执行相应的服务程序 正确的执行顺序是 C
A. ②->③->①->④
B. ②->④->③->①
C. ③->②->④>①
D. ③->④->②->①
解释:
执行系统调用的过程是这样的:正在运行的进程先传递系统调用参数,然后由陷入(trap)指令负责将用户态转化为内核态,并将返回地址压入堆栈以备后用,接下来CPU执行相应的内核态服务程序,最后返回用户态。所以C正确。
1.3 在UNIX系统中,磁盘空闲空间管理所采用的方法是( C )
A. 位图法
B. 空闲块表法
C. 成组链接法
D. 单块链接法
解释:
空闲块成组链接,建立空闲块专用栈,空闲块分配时按组进行,一组的空闲块分配完了,再使用下一组;回收时次序相反,入栈一组空闲块后,够成一组。这种方法兼备了空闲空间表法和空闲块链接法的优点,UNIX系统使用这种空闲块管理策略。
1.4 在指令格式中采用扩展操作码的设计方案是为了( C )
A. 减少指令字长度
B. 增加指令字长度
C. 保持指令字长度不变
D. 保持指令字长度不变,而增加寻址空间
解释:
扩展操作码的重要规则是赋予使用频率高的指令短的操作码,目的是为了保持指令字长度不变而增加指令操作的数量,从而降低指令的平均长度,提高编码效率。
1.5 某页式存储管理系统中,地址寄存器长度为24位,其中页号占14位,则主存的分块大小是( B )位。
A. 10
B. 2^10
C. 2^14
D. 2^24
解释:
地址寄存器长度为24位,其中页号占14位,则页内地址占10位,分页大小与主存块大小相同,因此, 主存的分块大小是210字节。
1.6 SPOOLing 技术是指利用磁盘作为后援存储器,在联机情况下实现的同时外围操作,系统中采用该技术的主要目的是( A )
A. 提高独占设备的利用率
B. 提高主机效率
C. 减轻用户编程负担
D. 提高程序的运行速度
解释:
SPOOLing 技术: 它在输入和输出之间增加了“输入井”和“输出井”的排队转储环节,以消除用户的“联机”等待时间。在系统输入模块收到作业输入请求信号后,输入管理模块中的读过程负责将信息从输入装置中读入输入井缓冲区。当缓冲区满时,由写过程将信息从缓冲区写到外存的输入井中,读过程和写过程反复循环,直到一个作业输入完毕。当读过程读到一个硬件结束标志之后,系统再次驱动写过程把最后一批信息写入外存输入井并调用中断处理程序结束该次输入。然后,系统为该作业建立作业控制块,从而使输入井中的作业进入作业等待队列,等待作业调度程序选中后进入内存运行。系统在管理输入井过程中可以“不断”读入输入的作业,直到输入结束或输入井满而暂停。
1.7 下列方法中,解决碎片问题最好的存储管理方法是 。 A
A. 基本页式存储管理
B. 基本分段存储管理
C. 固定大小分区管理
D. 不同大小分区管理
1.8 Linux进程中,应用可见的内存空间是一样的,是如何做到的?( B )
A. 编译时区分
B. 使用虚拟内存转换
C. 运行时分配不一样的实际地址
D. 都不是
解释:
linux的虚拟内存模型,使得每个进程都以为自己拥有整个内存空间(内核使用的空间除外)
1.9 下列说法中,错误的是 D
A. 指令就是命令,它用来规定CPU执行什么操作
B. 指令是构成程序的基本单位,程序是由一连串指令组成的
C. 指令采用二进位表示
D. 指令一般由4个部分组成
解释:
指令一般由两部分组成:
操作码:该指令完成操作的类型或性质
地址码:操作对象的地址
1.10 下面有关 Java ThreadLocal 说法正确的有?A B C D
A. ThreadLocal存放的值是线程封闭,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递
B. 线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收
C. 在Thread类中有一个Map,用于存储每一个线程的变量的副本。
D. 对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式
解释:
ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程的上下文。 可以总结为一句话:ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。 举个例子,我出门需要先坐公交再做地铁,这里的坐公交和坐地铁就好比是同一个线程内的两个函数,我就是一个线程,我要完成这两个函数都需要同一个东西:公交卡(北京公交和地铁都使用公交卡),那么我为了不向这两个函数都传递公交卡这个变量(相当于不是一直带着公交卡上路),我可以这么做:将公交卡事先交给一个机构,当我需要刷卡的时候再向这个机构要公交卡(当然每次拿的都是同一张公交卡)。这样就能达到只要是我(同一个线程)需要公交卡,何时何地都能向这个机构要的目的。 有人要说了:你可以将公交卡设置为全局变量啊,这样不是也能何时何地都能取公交卡吗?但是如果有很多个人(很多个线程)呢?大家可不能都使用同一张公交卡吧(我们假设公交卡是实名认证的),这样不就乱套了嘛。现在明白了吧?这就是ThreadLocal设计的初衷:提供线程内部的局部变量,在本线程内随时随地可取,隔离其他线程。
1.11 下面关于进程间交互的论述哪个是不正确的? C
A. 进程之间可以通过传递消息进行交互
B. 进程可以采用信号量进行交互
C. 进程之间不能通过共享存储系统进行交互
D. 进程之间可以使用管程进行交互
1.12 用可变分区法可以比较有效的消除外部碎片,但不能消除内部碎片。 A
A. 错
B. 对
解释:
内部碎片指的是在存储管理时,给程序配了一定的内存,但是没有全部使用,有一部分空闲而浪费。
而外部碎片指的是可用内存无法满足用户要求而导致的浪费问题,比如用户要求2MB的内存,但是可用内存中有1MB,无法满足用户需求。
可变分区就是用户申请分区时系统根据用户的情况给用户分配大小的内存空间,而不是分配大小固定的内存。克服了固定分区方式中内存浪费的问题,解决的是内部碎片,而不是外部碎片,因为有时候可能用户申请的内存大于系统闲置的内存。
1.13 在( C )中,每次分配时把既能满足要求,又是最小的空闲区分配给进程。
A. 首次适应算法
B. 最坏适应算法
C. 最佳适应算法
D. 伙伴系统
解释:
首次适应算法
按照地址顺序在链表中存放进程和空闲区。每次进程申请内存空间时,从链表的头部查找一个能够满足要求的空闲区,分配给该进程。然后修改调整空闲链表,形成新的空闲链表。
改进的首次适应算法(下次适应算法)
该算法是对首次适应算法的改进。对于首次适应算法,每次进程分配空间完毕后,记录当前当前的位置。下次再分配空闲分区时,从该位置往后搜索,而不用从头搜索。从而减少检索次数。
最佳适配算法
最佳适配算法搜索整个链表,找出恰好够用的最小空闲区。
最坏适应算法
最坏适应算法总是非配最大可用的的空闲空间,是剩余的空间比较大从而可以继续使用。
1.14 以下关于通道的说法错误的是( D )
A. 通道是用来控制外部设备与主存之间进行成批数据传输的部件
B. 通道是一种特殊的处理机
C. 通道有自己的指令集,但指令类型单一,主要局限于与I/O操作有关的指令
D. 通道有自己的内存,用以存放通道要执行的程序
解释:
1、通道是一种通过执行通道程序管理I/O操作的控制器,它使主机(CPU和内存)与I/O操作之间达到更高的并行程度。由于它的任务是管理实现输入/输出操作,提供一种传送通道,所以将这种部件称作“通道”。
2、CPU把数据传输功能下放给通道,通道与CPU分时使用内存,就可以实现CPU与外设的并行工作。
3、在采用通道方式的指令系统中,除了供CPU编程使用的机器指令系统外,还设置另外供通道专用的一组通道指令,用通道指令编制通道程序,存入存储器。
4、当需要进行I/O操作时,CPU只需启动通道,然后可以继续执行自身程序,通道则执行通道程序,管理与实现I/O操作。
5、整个系统分为二级管理,一级是CPU对通道的管理,二级是通道对设备控制的管理。
1.15 In OS, short term schedule (调度) means . B
A. Job scheduling
B. Process scheduling
C. Thread scheduling
D. CPU scheduling
解释:
调度的分类及其定义
- 短程调度:又称进程调度,从进程的就绪队列选择一个进程运行。
- 中程调度:又称为对换。和内存管理相关,主要是为了提高内存的利用率引入的。
- 长程调度:又称作业调度。从磁盘上的后备作业队列中选取对应的作业调入内存。
1.16 10GB 的硬盘表示其存储容量为( D )。
A. 一万个字节
B. 一千万个字节
C. 一亿个字节
D. 一百亿个字节
解释:
根据换算公式 1GB=1000MB=1000 × 1000KB=1000 × 1000 × 1000B , 10GB=10^10B ,即为 100 亿个字节。 注:硬盘厂商通常以 1000 进行计位 : 1KB=1000Byte 、 1MB=1000KB 、 1GB=1000MB 、 1TB=1000GB , 操作系统中: 1KB=1024Byte 、 1MB=1024KB 、 1GB=1024MB 、 1TB=1024GB 。因此 A 、 B 、 C 选项错误。
1.17 通过fork和exec系统调用可以产生新进程,下列有关fork和exec系统调用正确的是A B
A. fork生成的进程是当前进程的一个相同副本
B. fork系统调用与clone系统调用的工作原理基本相同
C. exec生成的进程是当前进程的一个相同副本
D. exec系统调用与clone系统调用的工作原理基本相同
解释:
1、fork
一个程序一调用fork函数,系统就为一个新的进程准备了前述三个段,首先,系统让新的进程与旧的进程使用同一个代码段,因为它们的程序还是相同的,对于数据段和堆栈段,系统则复制一份给新的进程,这样,父进程的所有数据都可以留给子进程,但是,子进程一旦开始运行,虽然它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再有影响了,也就是说,它们之间不再共享任何数据了。而如果两个进程要共享什么数据的话,就要使用另一套函数(shmget,shmat,shmdt等)来操作。现在,已经是两个进程了,对于父进程,fork函数返回了子程序的进程号,而对于子程序,fork函数则返回零,这样,对于程序,只要判断fork函数的返回值,就知道自己是处于父进程还是子进程中。事实上,目前大多数的unix系统在实现上并没有作真正的copy。一般的,CPU都是以“页”为单位分配空间的,象INTEL的CPU,其一页在通常情况下是4K字节大小,而无论是数据段还是堆栈段都是由许多“页”构成的,fork函数复制这两个段,只是“逻辑”上的,并非“物理”上的,也就是说,实际执行fork时,物理空间上两个进程的数据段和堆栈段都还是共享着的,当有一个进程写了某个数据时,这时两个进程之间的数据才有了区别,系统就将有区别的“页”从物理上也分开。系统在空间上的开销就可以达到最小。
2、exec
一个进程一旦调用exec类函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。不过exec类函数中有的还允许继承环境变量之类的信息,这个通过exec系列函数中的一部分函数的参数可以得到。