文章目录
第1章 计算机系统概述
源程序和编译器一样,都是一段程序指令,保存在文件中。操作系统也有文件管理,但是操作系统不关心文件的具体内容,而关心文件的逻辑结构、物理结构、文件的内部结构以及多文件如何组织。
系统调用只能通过用户程序间接使用。系统调用和命令都可用于执行某些操作,但它们的作用范围、调用方式以及执行上下文都是不同的。系统调用是操作系统提供给程序的一个接口,而命令是操作系统提供给用户的交互方式之一(来自通义)。
并行,是指同一时刻一起在工作。处理机与设备可以,处理机与通道可以,不同的设备与设备也可以,而进程与进程在单处理机上只能并发执行。
单机资源,最重要的就是处理器,因此多道程序设计技术才是提高资源利用率的关键。
此题很拉。多任务操作系统可以理解为具有交互性的多道批处理系统,以多道程序技术为基础的。毫无疑问并发是可以的,但此题中的并行却没有指明主语,很狗,处理机是可以和设备并行的,但是进程和进程不能并行。
屏蔽中断通常是操作系统内核在处理系统调用时采取的一种措施,以确保系统调用期间的完整性。系统调用不会直接生成屏蔽中断指令,程序设计无法编译形成屏蔽中断指令。
中断是操作系统必须提供的功能。引入中断后才出现了多任务操作系统,现代操作系统就是靠中断驱动的软件。
用户态到核心态的转换是由硬件实现的。中断处理程序一般在核心态运行,是转换完成后的操作,而不是进行转换。
操作系统的内核主要包括四个内容,分别是时钟管理、中断机制、原语、系统控制的数据结构及处理。接下来分析选项,A读时钟指令,虽然涉及系统时间,但一般不需要特别的权限,用户态程序也可能需要获取时间来进行日期时间处理。B置时钟指令,可以修改系统的时钟,显然这需要非常高的权限来防止被滥用,因此只能在核心态下执行。C取数指令:这是基本的数据加载指令,任何程序都可以使用。D寄存器清零,清零寄存器的操作取决于具体寄存器的功能。如果是普通寄存器,那么用户态程序也可以访问。
命令解释程序,属于命令接口,面对用户,解释用户输入的命令,在用户态执行。
上面已经具体分析过了。需要注意的系统调用的调用可能发生在用户态,但是系统调用的执行必然在核心态。
特权指令是指仅能由操作系统使用的指令。
系统调用需要保存PSW和PC,但是一般过程调用只需要保存PC的值。一般过程调用的被调程序与调用程序处于同一个状态,可以是用户态也可以是核心态。
上面也分析过了,子过程调用就是一般过程调用,中断处理是系统调用。
中断处理,先是中断隐指令执行,全硬件完成,保存断点,主要是保存了PC和PSW的内容,后面引出中断处理程序,这就是系统调用,也就是操作系统干的事,过程中保存通用寄存器和状态寄存器的内容。Cache和TLB都是硬件实现,相应的内容也都由硬件保存。
时钟中断的主要工作是处理和时间有关的信息以及决定是否执行调度程序,包括系统时间、进程的时间片、延时、使用CPU的时间、各种定时器。
注意理解题目,通过系统调用。系统调用是操作系统提供给用户程序的一组接口,通过系统调用的意思也就是说,由用户程序向操作系统请求功能执行。对于页面置换和进程调度,用户程序完全不知道这些事情,就不会去请求操作系统,也不是通过系统调用实现,而是操作系统自动完成。
对于前三个前面基本都有过解释,看第四个描述,可以这样来思考,中断处理都是在内核态进行的,那么将CPU改为内核态应该是在一开始就执行了,中断一开始是中断隐指令,说明此行为由硬件完成。
分层法每层只能调用相邻层,便于系统的调试,如果哪里出了问题,那就是当前层有问题。
B项或许是不足,调用需要层层穿越各层,增大了开销,但是如果设计的好,就可以提高效率和可靠性。最显著的不足还是设计困难,很难去完美划分层次。
模块化操作系统各功能模块都在内核中,各个模块都相互调用、相互依赖,一旦一个出错,可能都无法使用,崩溃了。微内核可以解决这个问题,微内核外的功能模块出错,系统不会崩溃。
功能分层设计一看就是层次结构操作系统的特点。策略与机制分离是操作系统设计中的原则,指的是将底层的机制与上层的策略分开。机制是提供功能的实现,而策略是决定如何使用这些功能的方法。这样的分离使软件开发更灵活,适应不同需求更容易。
微内核需要频繁切换状态,需要很大的开销。对于稳定性,内核服务越少越稳定。
前两个一眼错,windows是融合了宏内核和微内核的操作系统。添加系统服务时,微内核确实不必修改内核,但是没有让系统更高效。
操作系统的引导程序,是用来启动操作系统的,主板BIOS里的引导程序,即自举程序,是用来找操作系统的引导程序的,去硬盘里找。
先加电,没电啥都干不了。再通过PC指向的地址跳到BIOS,BIOS先找中断地址,因为自检要用到中断,再进行硬件自检,没问题就去硬盘里找操作系统引导程序。
都到确定分区了,肯定是主引导分区记录在干活。
中断向量表,前面说过了,自举程序创建,用来通电自检。分区表是逻辑格式化之前,物理格式化干的。根目录是逻辑格式化干的。
性能是没有的。安全和可靠是由于微内核不容易崩溃。
第2章 进程与线程
通过多次执行,一个程序对应多个进程;通过调用关系,一个进程可包括多个程序。但不可以同时执行多个程序。
在操作系统中,用户登录系统、作业调度、系统提供服务、用户程序的应用请求都会引起进程的创建。高级调度就是作业调度。
对于就绪队列里的进程,如果处理机没有进程运行,肯定会上一个去处理机运行,那么最多就会有9个在队列等待。如果问的是阻塞队列,那么最多十个都会被阻塞。
进程不是程序,程序是静态的,而进程是动态的。
进程的内存映像,最上面是内核区,PCB在这里(大概吧)。然后向下为栈区,是函数调用地方,里面会有局部变量的传递和使用,向下生长。再向下就是堆区,是malloc
函数调用生成的东西,动态分配,向上生长。再下面就是题中的共享正文段,分为两部分,一部分是全局变量和静态变量,再向下是程序的指令代码。
PCB主要包括四种信息,进程标志信息、进程控制信息、进程资源信息、CPU现场信息。而全局变量只与用户代码有关,和PCB无关。
解释同上。互斥信号量是用于实现同步和互斥的,不是进程本身的属性,一般存储在内核或共享内存中。
运行态到就绪态,只是缺失了处理机资源,肯定是处理机把进程下了。就绪态到运行态就是处理机选上了进程运行。阻塞态到就绪态,进程获得了等待的资源,是由协作进程决定的。只有运行态到阻塞态,是进程自己需要等待资源,自己下了自己。
当进程只有一个线程时,进程和线程一样大。
系统只有一个键盘,键盘输入也较慢,完全一个线程就够了,不用多线程。
内核线程的切换需要切换到核心态完成,而用户级线程不需要,显然内核级线程在这方面开销大。
用户级线程的切换不由操作系统内核管理,而是由用户空间的库软件来管理。因此,导致用户级线程切换的原因与那些会触发内核态操作的因素不同。而ABC都需要操作系统进入内核态完成,肯定不会涉及用户级线程的切换,系统都看不见用户级线程。
时间片轮转算法没有偏好,保证每个进程都能周期性地获得CPU时间,使得各个用户的进程都能得到及时执行,从而支持多用户的交互。该算法没有使得系统高效,由于有大量的进程切换操作,反而系统开销较大。
进程在操作系统内核的临界区中确实是不可以进行调度和切换的,但是在普通临界区,可以被调度。
CPU繁忙型就是所说的长作业,I/O繁忙型就是短作业,长作业有利的调度是先来先服务算法。
没啥好说的,就是算错了。
多级反馈队列有多个队列,需要在多个队列中来回切换,反而增大了系统开销。这个并行度,不知道怎么理解。
进程在临界区的问题,上面解释过了。
算错了,没有加上切换时间。
不难算。就是平均等待时间,需要除以2。
等待I/O处于阻塞态,其他进程可以抢占处理器,但是不能进入该进程的临界区,因为临界区正在被访问。
访问临界资源的那段代码称为临界区。
由初值1变为了0,只减少了1,说明有一个进程访问了临界区,如果还有其他进程等待进入,那么信号量值会变成负数。
临界区是访问临界资源的代码段,每个进程都涉及临界资源的访问,每个进程都会有这个代码段。
管程,是资源管理程序,由代表共享资源的数据结构和对这个数据结构操作的过程组成。具体来说,管程有,名称、管程内部共享数据结构的说明、一组过程、对内部共享数据设置初值的语句。由此可见,管程不涉及管程外部的东西。
死锁有四个条件,互斥、保持和请求、不剥夺、循环等待。A项破坏了保持和请求,B项破坏了互斥,D项破坏了循环等待。对于C项,没有破坏任何死锁的必要条件,有可能会发生死锁,优先级没啥用。
产生死锁的原因主要是两类,一是进程推进顺序不当,二是独占资源分配不当。需要注意的是,系统资源不足,会导致饥饿。(没懂)
每个进程需要一个资源,拿到了就执行,执行就释放,不会死锁。
解除死锁有三种。资源剥夺法,是剥夺某些死锁进程的资源,分配给其他死锁进程。撤销进程法,撤销部分或者全部死锁进程。进程回退法,让一个或多个进程回退到不会死锁的程度。
这个策略是把等待进程的有的资源给新等待的进程,导致原来等待的进程又更小的可能退出等待,这样下去会导致饥饿。
这是独木桥问题,具体分析不好写,dddd。
题目中结果不止u,z
,而是包括x,y,z,t,y
的结果,u,z
结果是确定的,x,y,z,t,y
的结果是不一样的。
银行家算法作用是找到一个安全序列,按照这个序列执行不会发生死锁,也就是说,按照这个序列执行,任何时刻都能至少有一个进程可以得到所需资源正常结束。
计算错误。再算算吧。
死锁避免就是采用银行家算法,找到安全序列。死锁检测是,利用资源分配图检测死锁,采取解除措施。分析选项,银行家算法找到安全序列,但是安全序列不是唯一的,也不是固定的,算法也没有给出固定的申请资源的顺序(有一说一,不能说服我)。银行家算法需要资源总量去判断是否存在安全序列,而死锁检测是检测当前状态是否发生死锁,只需要当前资源的请求情况,不需要总量。银行家算法不会给导致死锁的进程分配资源,它要找安全序列,而死锁检测不管分配,检测到了死锁直接上解除死锁的办法。