答:
为计算机用户提供一个方便、有效地在计算机上执行程序的环境。
根据需要分配计算机的不同资源来解决给定的问题。分配过程应尽可能公平和有效。
作为一个控制程序,它有两个主要功能:(1)监督用户程序的执行,以防止错误和不适当的使用计算机(2)管理操作和控制的I/O设备。
答:主要的困难是保持操作系统在实时系统的固定时间限制内。如果系统没有在一定时间内完成某个任务,可能会导致正在运行的整个系统崩溃。因此,在为实时系统编写操作系统时,编写者必须确保他的调度方案不允许响应时间超过时间限制。
答:支持操作系统包括流行的应用程序:如果应用程序嵌入到操作系统,它可能更好地利用在内核中的特性,比在内核以外的应用程序具有更好的性能优势。反对在操作系统中嵌入应用程序的争论通常占主导地位:(1)应用程序是应用程序——而不是操作系统的一部分,(2)在内核中运行的任何性能好处都会被安全漏洞抵消,(3)它会导致操作系统膨胀。
a. Set value of timer.
b. Read the clock.
c. Clear memory.
d. Issue a trap instruction.
e. Turn off interrupts.
f. Modify entries in device-status table.
g. Switch from user to kernel mode.
h. Access I/O device.
答:Set value of timer, clear memory, turn off interrupts, modify entries in device-status table, access I/O device.其他指令可以在用户模块中执行
答:一个程序可以使用下面的方法来计算使用定时器中断的当前时间。该程序可以为未来的某个时间设置一个计时器,然后进入睡眠状态。当它被中断唤醒时,它可以更新它的本地状态,用来跟踪到目前为止它收到的中断的数量。然后,它可以重复这个过程,不断设置计时器中断,并在中断实际引发时更新其本地状态。
a:这两个问题是什么?
b:我们能否确保分时机器和专用机器一样的安全性?解释你的答案。
答:a.窃取或复制自己的程序或数据;在没有合理核算的情况下使用系统资源(CPU、内存、磁盘空间、外设)。
b.可能不会,因为人类设计的任何保护方案都不可避免地会被人打破,而且方案越复杂,就越难以对其正确实施有信心。
答:当其他用户很少,任务很大,而且硬件速度很快时,分时是合理的。系统的全部功能可以用来解决用户的问题。这个问题可以比在个人电脑上更快地解决。另一种情况是,许多其他用户同时需要资源。当工作足够小,可以合理地在上面执行,并且性能足够执行程序,使用户满意时,个人计算机是最好的。
答:中断是系统中由硬件生成的流变更。一个中断处理器被调用来处理中断的原因;然后将控制返回给中断的上下文和指令。陷阱是一种软件生成的中断。中断可以用来发出I/O完成的信号,以避免设备轮询的需要。陷阱可以用来调用操作系统例程或捕获算术错误。
答:这类机器的操作系统需要始终处于控制状态(或监控模式)。这可以通过两种方法来实现:
a:所有用户程序的软件解释(例如一些BASIC、Java和LISP系统)。软件解释器可以在软件中提供硬件不能提供的东西。
b:所有的程序都要用高级语言编写,这样所有的目标代码都是由编译器生成的。编译器将生成(内联或通过函数调用)保护检查,以确定硬件是否缺失。
答:系统调用允许用户级进程请求操作系统的服务
答:它从用户输入或命令文件中读取命令并执行它们,通常是将它们转换为一个或多个系统调用。
命令解释程序通常不是内核的一部分,因为命令解释程序有很多变化,有的系统甚至有多个命令解释程序。
答:分层法作为系统模块化的一种方法,其主要优点在于简化了构造和调试。
其主要难点在于合理定义各层,由于每层只能利用更底层的功能,有必要仔细规划。并且分层法与其他方法相比效率更差。
答:操作系统提供的一类服务是在系统中同时运行的不同进程之间实施保护。 进程只允许访问与其地址空间相关联的那些内存位置。 此外,不允许进程损坏与其他用户关联的文件。 进程也不允许在没有操作系统干预的情况下直接访问设备。 操作系统提供的第二类服务是提供底层硬件不直接支持的新功能。 虚拟内存和文件系统就是操作系统提供的两个这样的新服务示例。
答:可以像访问文件系统中的文件一样访问每个设备。 由于大多数内核通过这个文件接口处理设备,通过实现特定于硬件的代码来支持这个抽象文件接口来添加新的设备驱动程序相对容易。 因此,这有利于开发用户程序代码(可以编写为以相同方式访问设备和文件)和设备驱动程序代码(可以编写为支持定义良好的 API)。 使用相同接口的缺点是可能难以在文件访问 API 的上下文中捕获某些设备的功能,从而导致功能损失或性能损失。 其中一些问题可以通过使用 ioctl 操作来克服,该操作为进程调用设备上的操作提供了一个通用接口。
答:用户应该能够使用操作系统提供的系统调用接口开发新的命令解释程序。 命令解释程序允许用户创建和管理进程并确定它们通信的方式(例如通过管道和文件)。 由于所有这些功能都可以由用户级程序使用系统调用来访问,因此用户应该可以开发一个新的命令行解释程序。
答:好处通常包括以下(a)添加新服务不需要修改内核,(b)它更安全,因为在用户模式下比在内核模式下完成更多操作,(c)更简单的内核设计和功能通常 导致更可靠的操作系统。
用户程序和系统服务通过使用进程间通信机制(例如消息传递)在微内核体系结构中进行交互。 这些消息由操作系统传送。
微内核架构的主要缺点是与进程间通信相关的开销以及频繁使用操作系统的消息传递功能以使用户进程和系统服务能够相互交互。
答:使用fork()创建子进程后,子进程拥有自己的内存地址,在子进程中返回值为0,即pid=0,修改value为15,因为子进程中value和父进程的value内存地址不一样,所以父进程的value任为5;而在父进程中,fork()返回的是子进程的进程id>0,直接打印PARENT: value = 5
答:总共创建了8个进程。
答:只有共享内存段在父进程和新分叉的子进程之间共享。为新创建的进程复制堆栈。
答:短期调度程序(CPU调度程序)——从准备执行的进程中选择进程,并分配CPU。
中期调度程序,将进程从内存(或从CPU竞争)中移出,从而降低多道程序程度。之后进程看重新被调入内存,并从中断出继续执行。实现一种交换方案。
长期调度程序(作业调度程序)——从进程缓冲池中选择进程加到内存中,以便执行。
他们主要的区别在于执行的频率。短期调度程序必须经常为CPU选择新的进程。长期调度程序并不频繁,因为长期调度程序控制多道程序进程,必须保证多道程序进程的稳定,为此创建创建程序的平均速度必须等于进程离系统的平均速度。所以只有在进程离开系统时才会需要长期调用程序的调度。
答:内核会将旧进程状态保存在其PCB中,然后加载经调度后的要执行的新进程的上下文。上下文切换的工作量与硬件支持密切相关,例如有的处理器提供了多个寄存器组,上下文切换只需简单改变寄存器组的指针,但如果活动进程数超过寄存器组数,系统就需要在寄存器和内存之间进行数据复制。
答:共创建16个进程。
答:当子进程创建成功后,调用execlp()加载/bin/ls程序的代码和静态数据,若调用成功,则永远不会执行printf(“line J”);若调用失败(如不存在/bin/ls这样的可执行程序),才会执行printf(“line J”)
答:
A: pid=0
B: pid1 = 2603
C: pid = 2603
D: pid = 2600
答:1、一个Web服务器,需要接受有关网页、图像、声音的请求,同时处理上千个用户的访问请求。
2、一个并行的应用程序,如矩阵乘法,其中矩阵的不同部分可以并行处理。
3、一种交互式的字处理器,一个线程用于显示图形,一个线程用于响应用户键盘输入,还有一个线程用于在后台进行拼写和语法检查。
答:1、用户线程位于内核之上,他的管理无需内核支持,而内核线程由操作系统来直接支持与管理。
2、在使用一对一模型或多对多模型的系统上,用户线程由线程库调度,而内核调度内核线程。
内核线程不需要与一个进程相关联,而每个用户线程都属于一个进程。内核线程通常比用户线程的维护成本更高,因为它们必须用内核数据结构表示。
答:内核线程之间的上下文切换通常需要保存被切换出去的线程的CPU寄存器的值,并恢复被调度的新线程的CPU寄存器。
答:因为线程比进程小,所以创建线程通常比创建进程使用更少的资源。创建一个进程需要分配一个进程控制块(PCB),这是一个相当大的数据结构。PCB包括内存映射、打开的文件列表和环境变量。分配和管理内存映射通常是最耗时的活动。创建用户或内核线程都需要分配一个小数据结构来保存寄存器集、堆栈和优先级。
答:顺序程序不适合多线程编程。例子:
1、一个计算个人纳税申报单的程序。
2、“shell”程序,如C-shell或Korn shell。这样的程序必须密切监视自己的工作空间,如打开的文件、环境变量和当前工作目录。
答:当内核线程发生页面错误时,可以切换到另一个内核线程,以一种有用的方式使用交错时间。另一方面,当发生页面错误时,单线程进程将无法执行有用的工作。因此,在程序可能出现频繁的页面错误或必须等待其他系统事件的情况下,多线程解决方案甚至在单处理器系统上也能执行得更好。
答:多线程进程的线程共享堆内存和全局变量。每个线程都有其独立的寄存器值集和独立的栈。
答:由多个用户级线程组成的多线程系统不能在多处理器系统中同时使用不同的处理器。操作系统只看到一个进程,不会将该进程的不同线程调度到不同的处理器上。因此,在多处理器系统上执行多个用户级线程不会带来性能上的好处。
答:可以,系统的并行性(parallelism)是指在同一时间执行多个任务,并发性(concurrency)是指系统能够支持多个任务,允许所有任务都能取得进展。因此没有并行,通过系统的调度也可以实现并发。
答:(1)6个进程
(2)8个线程
答:忙等待(也叫自旋锁)意味着一个进程为了等待某个条件得到满足,连续循环的调用acquire(),不放弃处理器。忙等待是可以避免的,进程可以通过放弃处理器进入沉睡状态(阻塞)来等待,等待在未来的某个适当时间被唤醒。但将进程置于睡眠状态并且在达到适当的程序状态时将其唤醒,会导致额外的开销。
答:wait()操作以原子的方式递减与信号量相关的值。如果一个信号量的值为1时,在该信号量上执行了两个等待操作,如果这两个操作不是原子执行的,那么这两个操作可能会继续减小信号量的值,从而违反互斥。
答:n个进程共享一个初始化为1的信号量mutex。每个过程Pi组织如下:
答:如果用户级程序具有禁用中断的能力,那么它可以禁用计时器中断并防止发生上下文切换,从而不让其他进程执行,达到独占处理器的目的。
答:如果多个进程运行在不同的CPU上,每个进程都试图进入一个临界区,即使禁止中断,其他进程依旧能够在其他处理器上进入临界区。
答:伪代码如下:
答:可以使用下面的监视代码实现信号量:
监视器可以通过以下方式使用信号量来实现。每个条件变量都由一个等待条件的线程队列表示。每个线程都有一个与其队列条目相关联的信号量。当线程执行等待操作时,它会创建一个新的信号量(初始化为0),将该信号量添加到与条件变量相关的队列中,并对新创建的信号量执行阻塞信号量递减操作。当一个线程在一个条件变量上执行一个信号时,队列中的第一个进程将通过对相应的信号量执行递增操作而被唤醒。
答:
答:n!种调度
答:抢占式调度允许进程在执行过程中被中断,将CPU取走并分配给另一个进程。非抢占式调度,一旦CPU分配给一个进程,那么这个进程会一直使用CPU知道进程终止,或切换到等待状态。
a.使用FCFS调度算法,这些流程的平均周转时间是多少?
b.使用SJF调度算法,这些进程的平均周转时间是多少?
c. SJF算法应该是为了提高性能,但是请注意,我们选择在时间0运行进程P1,因为我们不知道两个更短的进程将很快到达。如果第一个单元的CPU处于空闲状态,计算平均周转时间,然后使用SJF调度。请记住,进程P1和P2在这段空闲时间内正在等待,因此它们的等待时间可能会增加。这种算法可以称为未来知识调度。
答:
a. 10.53
b. 9.53
c. 6.86
记住,周转时间是完成时间减去到达时间,所以您必须减去到达时间来计算周转时间。
如果你忘记减去到达时间的话,FCFS是11
答:需要更频繁服务的进程(例如,编辑器等交互进程)可以在一个时间量较小的队列中。不需要频繁服务的进程可以在一个具有更大时间片的队列中,需要更少的上下文切换来完成处理,从而更有效地利用计算机。
答:它将有利于I/ o限制程序,因为它们的CPU突发请求相对较短;但是,CPU绑定的程序不会饿死,因为I/O绑定的程序会相对频繁地放弃CPU来执行它们的I/O操作。
答:I/O密集型程序具有在执行IO之前只执行少量计算的特性。这类程序通常不会使用它们的全部CPU量。另一方面,CPU密集型程序使用它们的整个CPU,而不执行任何IO阻塞操作。因此,通过赋予I/O密集型程序更高的优先级,并允许它们在CPU密集型程序之前执行,可以更好地利用计算机资源。
a. CPU利用率和响应时间
b.平均周转时间和最小等待时间
c. I/O设备利用率和CPU利用率
答:CPU利用率和响应时间:如果最小化与上下文切换相关的开销,CPU利用率就会增加。通过不频繁地执行上下文切换,可以降低上下文切换的开销。然而,这可能会增加流程的响应时间。
平均周转时间和最小等待时间:通过先执行最短的任务来最小化平均周转时间。然而,这样的调度策略可能会耗尽长时间运行的任务,从而增加它们的等待时间。
I/O设备利用率和CPU利用率:在不进行上下文切换的情况下,运行长时间与CPU绑定的任务,可以最大化CPU利用率。在I/O密集型程序准备好运行时立即进行调度,可以最大化I/O设备利用率,但会因此增加上下文切换造成的开销。
答:
a、α为0,则最近信息对预测没有影响,公式总是预测为100ms。
b、α为0.99,则赋予最近信息很大的权重,几乎无需考虑过去历史,只用前一个CPU执行长度简单的预测下一个CPU执行。
答:偏爱I/O密集型程序,因为它总是能在时间片结束之前发生I/O阻塞,优先级不变,那么他就可以长期处于CPU的高优先级队列中,长期霸占CPU
假设进程以P1、P2、P3、P4、P5的顺序到达,都是在时刻0到达。
a、画出4个Gantt图,分别演示采用每种调度算法(FCFS、SJF、非抢占优先级(一个较大优先级意味着更高优先级)和RR(时间片=2))的进程执行。
b、每个进程在a里的每种调度算法下的周转时间是多少?
c、每个进程在a里的每种调度算法下的等待时间是多少?
d、哪一种调度算法的平均等待时间(对所有进程)最小?
答:
a、
b、
c、
d、SJF的平均等待时间最小
a、采用Gantt图,演示进程的调度顺序
b、每个进程的周转时间是多少?
c、每个进程的等待时间是多少?
d、CPU使用率是多少?
答:a、
b、
c、
d、105/120 = 87.5%
答:b、SJF d、priority
答:a、FCFS不偏好短进程,位于长进程之后的短进程将会等待很长时间
b、RR对长短进程一视同仁都执行相同的时间片,短周期能够最早的完成执行
c、多级反馈队列类似于RR,赋予短进程较高的优先级,而长进程优先级会逐渐降低,最先完成短进程
答:四辆车同时穿过一个十字路口;
哲学家就餐问题;
一条轨道上两辆相向行驶的火车。
答:a、Need = Max - Allocation
b、是安全状态,首先p0和p3可直接在一开始运行,结束后释放资源,Available变为(1,11,6,4),满足其他所有进程的需求
c、在银行家算法中,若给p1立即分配资源,则Available变为(1,1,0,0),系统依旧处于安全状态
问:a、安装死锁避免算法的理由是什么?
b、反对安装死锁避免算法的理由是什么
答:a、安装死锁避免算法能有效避免死锁的发生,减少因死锁带来损失,并且虽然安装了死锁避免算法后,系统依旧可以每月运行5000个job,不影响任务的完成。
b、由于死锁发生的概率很小,造成的损失只有20/5000可以忽略不计,不必要安装死锁避免算法
答:饥饿是一个很难定义的主题,因为它对不同的系统可能意味着不同的东西。出于这个问题的目的,我们将饥饿定义为这样一种情况:在接收到请求的资源之前,进程必须等待超过一段合理的时间(可能是无限期的)。检测饥饿的一种方法是首先确定一段时间T,它被认为是不合理的。当进程请求资源时,将启动计时器。如果运行时间超过T,则认为进程处于饥饿状态。解决饥饿问题的一种策略是采用一种策略,将资源只分配给等待时间最长的进程。例如,如果进程Pa等待资源X的时间比进程Pb更长,那么来自进程Pb的请求将被延迟,直到进程Pa的请求得到满足。另一种策略可能没有刚才提到的那么严格。在这种情况下,可以将资源授予等待时间少于另一个进程的进程,前提是另一个进程没有饿死。但是,如果另一个进程被认为处于饥饿状态,那么它的请求将首先得到满足。
答:系统要想成为死锁,则必须每个进程占有并请求资源,假设三个进程都占有一个资源,每个进程恰好都请求一个资源,而系统刚好能为其中一个进程提供一个资源,当该进程完成后释放全部资源,并不会造成死锁的情况。
答:只有当所有哲学家都没有两支筷子且只剩一直筷子时,若哲学家请求的是他第一支筷子,该请求会被拒绝。
答:a、安全序列可以是:p0、p3、p1、p2、p4处于安全状态
b、可以立即批准,当批准p1的请求后,依旧存在安全序列p0、p3、p1、p2、p4处于安全状态
c、不可以,若批准p4(0,0,2,0)的请求,则Available变为(3,3,0,1)其中c资源不满足任意进程的需求量,系统不安全
答:
semaphore bridge = 1;
void cross(){
while(true){
wait(bridge);
//过桥并离开后
signal(bridge);
}
}
答:优点:1、它是一种有效的代码和数据共享机制。
2、防止代码被错误修改。
缺点:代码和数据必须分离。
答:分页是将二进制地址分为x位表示页,y位表示偏移量,因此每一页的大小都为2^y,即大小为2的幂。
答:(a)逻辑地址16位(b)物理地址15位
答:允许页表中的两个条目指向内存中的相同页帧,使得可实现代码和数据的共享。如果代码是可重入的,那么可以通过共享使用大型程序(如文本编辑器、编译器和数据库系统)来节省大量内存空间,无需将他们反复进行复制。但是,共享不可重入的代码或数据意味着任何访问代码的进程都可以修改它,并且这些修改将反映在其他用户的副本中。
答:这两个问题都归结为程序能够引用自己的代码和数据,而不知道与地址相关联的段或页码。MULTICS通过将四个寄存器与每个进程关联来解决这个问题。一个寄存器有当前程序段的地址,另一个寄存器有堆栈的基址,另一个寄存器有全局数据的基址,等等。其思想是,所有的引用都必须通过一个映射到当前段或页码的寄存器间接地进行。通过改变这些寄存器,可以在没有相同页号或段号的情况下,为不同的进程执行相同的代码。
答:
连续内存分配:可能需要重新定位整个程序,因为没有足够的空间让程序增长其分配的内存空间。
纯分段:也可能需要重新定位需要扩展的段,因为没有足够的空间让段增长其分配的内存空间。
纯分页:在这种方案中,新页面的增量分配是可能的,而不需要重新定位程序的地址空间。
答:
由于地址空间是连续分配的,并且随着旧进程的死亡和新进程的启动,洞就会出现,因此相邻的内存分配方案存在外部碎片问题。它也不允许进程共享代码,因为进程的虚拟内存段没有分解成非连续的细粒度段。
纯分段会受到外部碎片的影响,因为进程的一个段是连续地放置在物理内存中,当死进程的段被新进程的段取代时,就会出现碎片。然而,分段使进程能够共享代码;例如,两个不同的进程可以共享一个代码段,但有不同的数据段。
纯分页不会受到外部碎片的影响,而是会受到内部碎片的影响。进程是按页粒度分配的,如果没有完全利用页,就会导致内部碎片化和相应的空间浪费。分页还允许进程以页面的粒度共享代码。
答:分页系统中的地址是一个逻辑页码和一个偏移量。通过根据逻辑页码搜索表来生成物理页码,从而找到物理页。因为操作系统控制该表的内容,所以它可以限制一个进程只能访问那些分配给该进程的物理页。进程无法引用它不拥有的页,因为该页不在页表中。为了允许这样的访问,操作系统只需要允许将非进程内存的条目添加到进程的页表中。当两个或多个进程需要交换它们刚刚读和写到相同物理地址(可能位于不同的逻辑地址)的数据时,这很有用。这使得进程间通信非常高效。
答:分页需要更多的内存开销来维护转换结构。每个段只需要两个寄存器:一个维护段的基址,另一个维护段的范围。另一方面,分页要求每页有一个条目,这个条目提供了页面所在的物理地址。
答:
1)连续内存分配要求操作系统在程序开始执行时将整个虚拟地址空间分配给程序。这可能比进程的实际内存需求高得多。
2)纯分段给操作系统灵活性,在每个程序启动时分配一个小范围的段,如果需要则扩展段。
3)纯分页不需要操作系统在启动时为进程分配最大范围的虚拟地址空间,但它仍然需要操作系统分配一个大的页表,跨越程序的所有虚拟地址空间。当一个程序需要扩展栈或堆时,它需要分配一个新页,但相应的页表条目是预先分配的。
答:
地址 | 页码 | 平偏移量 |
---|---|---|
a | 3 | 13 |
b | 41 | 111 |
c | 210 | 161 |
d | 634 | 784 |
e | 1953 | 129 |
答:若地址空间为x位,则物理内存最大容量为2^x byte
答:2^20个
答:
a、100ns,其中50ns用于引用页表,50ns用引用物理内存
b、0.75*(50ns + 2ns) + 0.25*100ns = 64ns
答:由于分段是基于内存的逻辑划分而不是物理划分,因此每个用户的段表中只能有一个条目共享任何大小的段。对于分页,对于每个共享的页,页表中必须有一个公共条目。
a. 0,430
b. 1,10
c. 2,500
d. 3,400
e. 4,112
答:
a. 219 + 430 = 649
b. 2300 + 10 = 2310
c. illegal reference, trap to operating system
d. 1327 + 400 = 1727
e. illegal reference, trap to operating system
答:在某些情况下分页的页表可以变得足够大的页表,可以简化内存分配问题(通过确保所有分配固定大小的页而不是可变大小的块),也可以交换目前不使用的页表部分。
答:当一个程序只占用其大虚拟地址空间的一小部分时,可能会首选散列页表,因为它的大小更小。然而,散列页表的缺点是,将多个页映射到相同的散列页表条目时会产生冲突。如果许多页映射到相同的表项,那么遍历对应于该哈希表项的列表可能会引起很大的开销;在分段分页方案中,这种开销是最小的,因为每个页表条目只维护关于一个页的信息。
答:当进程视图访问尚未调入主存中的页面时,就会发生缺页错误。此时进程会被陷阱中断,操作系统检查进程的内部表,确认该引用是否为有效引用,若为无效引用,则终止该进程,若为有效引用,则将该页从磁盘读取到主存中。
答:a、因为每种页码都必须被读入内存一次,所以缺页错误至少有n次;b、当每次要引用的页面都不在内存中时,缺页错误数最大为p次。
• 9EF
• 111
• 700
• 0FF
答:0EF 211 D00 EFF
答:对于每个内存访问操作,都需要咨询页表,以检查相应的页是否常驻,以及程序是否具有访问该页的读写权限。这些检查必须在硬件中执行。TLB可以用作缓存并提高查找操作的性能。
答:
先计算磁盘传送1个页面的时间: 平均寻道时间+旋转延迟时间+传送时间 =19ms+10ms+lK/(1M/s) =19ms+10ms+1ms =30ms 所有指令都需要一个执行指令时间,即处理机周期1μs。1%的指令还需要访问另一个页面,需要另外耗时1μs。 其中有(1-80%)的指令不在内存中,需要从外存换入,需要另外耗时30ms。 其中有50%的情况下,被换出的页面已被修改过,需要另外耗时30ms换出,就得到下列表达式: 有效指令时间 =1μs+1%(1μs+(1-80%)(30ms+50%×30ms)) =91.01μs
答:a:5000 b:50(数组的两行为一个页面)
1, 2, 3, 4, 2, 1, 5, 6, 2, 1, 2, 3, 7, 6, 3, 2, 1, 2, 3, 6
在假设1、2、3、4、5、6和7帧的情况下,以下替换算法会出现多少个页面错误?请记住,所有帧最初都是空的
• LRU replacement
• FIFO replacement
• Optimal replacement
答:
Number | of | frames | LRU | FIFO | Optimal
1 | 20 | 20 | 20
2 | 18 | 18 | 15
3 | 15 | 16 | 11
4 | 10 | 14 | 8
5 | 8 |10 |7
6 | 7 |10 |7
7 | 7 | 7 | 7
a.如果发生缺页错误,线程会改变状态吗?如果是,它会变成什么状态?
会改变状态,首先进程被陷阱中断,检查进程内部表后若为无效引用,则进程直接进入终止状态,若为有效引用,则系统请求调页后进程进入就绪态等待被处理器重启。
b.如果在页表中解决了一个TLB miss,线程会改变状态吗?如果是,它会变成什么状态?
不会改变状态,继续在访问页表
c.如果在页表中解决了队列地址引用,线程会改变状态吗?如果是这样,它会变成什么状态
答:当两个进程要访问相同的页面时,如父进程与其创建的子进程,一般的方式是直接复制该页面,而采用写时复制的方式时,在一开始两进程共享该页面,并将页面标记为写时复制,则无需在起初就复制全部页面,只有当进程向共享页面写入时,才创建该页面飞副本供进程写入,未被修改的页面依旧共享。
硬件支持:对标记为写时复制的页面进行写入保护,一旦进程对该页面发起写入,操作系统需要查看页表确认该页面是否写入保护,若是,则发起对该进程的陷阱中断,操作系统再进行对该页面的复制,让进程向页面副本写入。
答:该虚拟地址的二进制共有32位,则其中高20位为虚拟地址在页表中的偏移量,低12位为虚拟地址在页面中的偏移量
答:LRU 18
FIFO 17
Optimal 13
a.将以下虚拟地址(十六进制)转换为等效的物理地址。您可以提供十六进制或十进制的答案。还要为页表中条目设置正确引用位。
• 0xE12C
• 0x3A9D
• 0xA9D9
• 0x7001
• 0xACA1
b.以上述地址为指导,提供一个导致缺页错误的逻辑地址(十六进制)示例。
c.在解决缺页错误时,LRU的页面替换算法会选择哪一组页面帧
答:将15、3、10、7条目引用为设置为1
• 0xE12C ->312C
• 0x3A9D->AA9D
• 0xA9D9->59D9
• 0x7001->E001
• 0xACA1->5CA1
b、4A9D
c、会选择替换掉最近最少使用的页面帧
a.安装速度较快的CPU。–no
b.安装更大的分页磁盘。 --no
c.增加多道编程的度。–no
d.降低多道编程的度。–yes 减少不断调用不同分页的操作
e.增加主存。–yes,更多的也能够驻留在主存中,减少请求调页操作
f.安装较快硬盘或多控制器多硬盘。 --yes,更快的磁盘响应能够减少请求调页操作的时间
g.在取页算法中增加预处理。–yes,CPU将更快地获得更多数据,所以它将被更多地使用。只有在分页操作可以预取的情况下才会出现这种情况(即,一些访问是顺序的)。
h.增大页面大小 --不一定,因为当页面增加后,若程序是按顺序读取磁盘,那么就会减少页面调用的操作,若程序随机读取,则因为页面变大,所以和在内存驻留的页面减少,需要缺页错误也就越多。
a.使用这个基本思想定义一个页面替换算法。具体解决这些问题:
1.计数器的初始值是多少? 初始值为0
2什么时候增加计数器? 当一个新页面与该页帧相关联时。
3什么时候减少计数器? 当该页帧其中一个关联页面未来不再被需要时
4要替换的页面是如何选择的? 选择计数器最小的页帧,当计数器相同时,使用FIFO
b.对于以下4个页面帧的引用字符串,在你的算法中发生了多少个页面错误? 12
1, 2, 3, 4, 5, 3, 4, 1, 6, 7, 8, 7, 8, 9, 7, 8, 9, 5, 4, 5, 4, 2
c.对于b部分中包含4个页面帧的参考字符串,最佳页面替换策略的最小页面错误数是多少? 11
答:抖动是由进程所需的最小页面数分配不足引起的,这会导致进程出现连续的缺页错误。系统可以通过评估CPU利用率水平与多道编程水平的比较来检测抖动。它可以通过降低多道程序的程度来消除。
答:是的,事实上许多处理器都为此提供了两个TLB。例如,进程访问的代码可能在很长一段时间内保持相同的工作集。然而,代码访问的数据可能会改变,因此反映了数据访问工作集中的变化。
答.在单用户环境中,I/O队列通常是空的。对于一个块或一系列连续的块,请求通常来自单个进程。在这种情况下,FCFS是一种经济的磁盘调度方法。但是,当多个进程同时执行I/O时,例如当一个web浏览器在后台检索数据,而操作系统正在分页,而另一个应用程序在前台处于活动状态时,LOOK几乎同样容易编程,并且可以提供更好的性能。
答.磁盘中心位置的磁道距离其他磁道的平均距离最小,从而使磁头移动到其他位置的时间最短
答.
操作系统向控制器发送的请求是以逻辑块的形式,而在现代磁盘中没有透露逻辑块的物理位置,因而操作系统无法通过判断旋转的具体位置。如果将磁盘调度算法在磁盘驱动器的控制器上用硬件实现,使控制器能够对操作系统的调度请求进行排队和调度,那么就可以优化旋转延迟
答.系统只能以最慢瓶颈的速度运行。磁盘或磁盘控制器常常是现代系统中的瓶颈,因为它们各自的性能无法跟上CPU和系统总线的速度。通过均衡磁盘和控制器的IO,单个磁盘和控制器都不会过载,从而避免了瓶颈的产生。
a.除了FCFS其他调度算法都是抢占式的调度算法,当不断有新的靠近磁头的调度请求出现时,远离磁头的调度请求就会饥饿。b.设置一个定时器,所有超过固定时长的调度请求被安排到等待队列队首。c.分时系统要求计算机能够快速响应所有用户的请求,所以要避免某些用户的进程因为不公布导致长时间等待。d.内核的IO请求优先于用户的IO请求;高优先级进程的IO请求优先于低优先级的进程IO请求;分页和交换优先于用户IO请求
a. FCFS
b. SSTF
c. SCAN
d. LOOK
e. C-SCAN
f. C-LOOK
答.分别是13011 、7586、7492、9205、7424、9137
答:跟踪文件类型的系统,会基于文件的不同类型会其进行文件操作,而不跟踪文件类型的系统,将对文件数据进行解释的操作留给进程,两种系统都能适应于不同的需求,比如在处理多种数据类型时,最好让不同的进程来解释数据,而在单一数据处理时,如在大型数据库系统,只需让操作系统实现对数据库文件的数据解释即可,无需在每个进程重复代码。
答:当任意长的字符作为文件名来模拟多层目录结构是可行的,只需要用特殊字符表示不同的层级关系,如A/b/1.png表示1.png位于b目录中,b又位于A根目录中,当限定了字符串长度时,则不可直接用文件名称来模拟,而需要专门对层级关系进行记录,在访问文件时查找记录来得到层级关系。
答:open()操作通知系统指定的文件即将被激活。close()操作通知系统指定的文件不再被发出close操作的用户活跃使用
a.描述可能出现的保护问题。
b.提出解决这些保护问题的方案。
答:a.保存在目录条目中的一条信息是文件位置。如果用户可以修改这个位置,那么他就可以访问其他文件,从而破解访问保护方案。b.禁止用户直接写入子目录,由系统操作来写入。
答:只维护一个包含所有用户访问文件的表。当首次访问某文件时,将其添加在打开文件表中,后面的进程在访问该文件时通过表中条目指定文件。同样只有在所有进程都不在使用改文件时才将其从系统文件表中删除。另一方面,如果两个进程正在访问该文件,则需要维护单独的状态,以跟踪两个进程正在访问文件的哪些部分的当前位置。这需要操作系统为两个进程维护单独的条目
答:操作系统强制阻止其他进程访问已加锁的文件,能够最大限度的保证互斥,而在许多情况下,不需要如此严格的方法保证互斥,降低了系统的并行性。可以通过其他程序结构来保证互斥,比如内存锁。而且强制锁将限制访问文件的灵活性,还可能导致死锁,并可能增加与访问文件相关的开销。
•顺序访问
•随机访问
答:顺序访问:编辑器和编译器; 随机访问:大型数据库计算
答:维护条目数据库的应用程序可以从这种支持中受益。例如,如果一个程序正在维护一个学生数据库,那么对数据库的访问就不能用任何预先确定的访问模式来建模。对记录的访问是随机的,如果操作系统提供某种形式的基于树的索引,那么定位记录将更加有效。
答:对于单个副本,对一个文件的多个并发更新可能会导致用户获取不正确的信息,并使文件处于不正确的状态。如果有多个副本,就会产生存储浪费,而且多个副本之间可能不一致。
答:导致相同的文件会有不同的文件路径,会导致一致性问题
答:当位图存储在主存中,如系统崩溃,则位图会丢失,而存储在大容量存储设备上时,位图不会丢失
答:当文件较小且常被顺序访问时,可采用连续分配策略,当文件较大且常被连续访问时,可采用索引分配的策略,当文件较大且常被随机访问时可采用索引分配策略
答:缓存可以进行高速数据交换,由局部性原理实现将经常使用的数据读取到缓存中,提高将数据从低速存储设备传输到高速计算设备的效率,然而缓存的成本十分昂贵。
答:动态分配内部表使得用户不会使用超过内部表的大小,提高了灵活性。然而动态改变内部表会增加内核结构的复杂性,使操作系统变得更复杂,增大开销。
a.所有区段的大小是相同的,大小是预先确定的。
b.区段可以是任意大小的,并且是动态分配的。
c.区段可以有几个固定的大小,这些大小是预先确定的。
答:对于区段大小相同的方案,则其为简化后的连续分配,使用较小的空闲空间列表,结构简单,灵活性低。对于区段大小自由的方案,可根据文件大小调整区段大小,同时存在外部碎片的可能,需要更复杂的结构来实现动态的区段,但是可以提高分配的灵活性,复杂度较大。对于最后一种,不同大小的区段需要不同的空闲空间列表,复杂度和灵活性介于ab之间。
答:连续分配对于两种访问方式都只需访问一次即可获得磁盘块;链接分配可以在内存中保留下一块的地址,实现顺序访问,而在随机访问时,若要访问第i块,则需访问i次磁盘访问性能较差。而在索引分配时,若索引块在内存中,则可直接访问,若由多级索引结构,则在访问文件末尾的块时,需要读取所有的索引块,其性能取决于索引的结构。
a.假设指向空闲列表的指针丢失。系统能否重建空闲空间列表?解释你的答案。
b.考虑一个类似于UNIX使用索引分配的文件系统。在/a/b/c读取一个小的本地文件的内容可能需要多少磁盘I/O操作?假设当前没有磁盘块被缓存。
c.提出一个方案,确保指针不会因为内存故障而丢失。
答:a要重建空闲空间列表,需要遍历目录结构,确定磁盘空间中未被文件或目录使用的空间,将其链接在空闲空间列表中。b c
为了重建空闲列表,需要执行“垃圾收集”。这将需要搜索整个目录结构,以确定哪些页面已经分配给了作业。那些剩余未分配的页可以作为空闲空间列表重新链接。
答:当采用延迟更新来优化系统性能,如果系统在没有提交延迟更新的情况下崩溃,那么文件系统的一致性就会被破坏。
答:优点:1.设备出现问题不会导致系统崩溃 2.使用专用的硬件和硬编码算法可以提高性能 3.将控制设备的算法移出内核,简化内核大小 缺点: 1.新的固件版本更难修复bug,需要新的硬件 2.改进算法同样需要更新硬件,使得迭代更加繁琐 3.嵌入的算法可能与应用程序使用的设备冲突,导致性能下降。
答:对于I/O操作频繁且实践短的情况,采用轮询机制比中断更高效和简单,适合于处理集中串口;而中断机制适合于操作不频繁且时间长的I/O请求,这种情况使用轮询机制会降低处理器的效率,因此单个串口采用中断机制。
答:1.设备中断的优先级要大于用户程序的陷阱中断 2.设备中断优先级应大于简单任务的中断优先级,将不急迫的中断放在之后执行 3.对数据处理时间有实时限制的设备应该比其他设备拥有更高的优先级 4.也要避免部分设备中断被饿死的情况
答:优点:通过标准数据传输指令读写映射到物理内存的设备控制器,消除了对特殊I/O指令的需要。缺点是其产生的灵活性会带来潜在的危险,内存转换单元需要确保与设备控制寄存器相关联的内存地址不能被用户程序访问。
答:用户程序通常指定一个缓冲区,用于向设备进行数据传输。这个缓冲区存在于用户空间中,由一个虚拟地址指定。内核需要发出I/O操作,需要在I/O操作之前或之后在用户缓冲区和自己的内核缓冲区之间复制数据。为了访问用户缓冲区,内核需要在用户程序的虚拟地址空间上下文中将用户程序提供的虚拟地址转换为相应的物理地址。这种转换通常在软件中执行,因此会产生开销。此外,如果用户缓冲区当前不在物理内存中,则需要从交换空间中获取相应的页。此操作可能需要谨慎处理,并可能延迟数据复制操作。
答:当中断发生时,当前正在执行的进程被中断,它的状态被存储在适当的进程控制块中。为了处理中断,中断服务程序随后被调度。在中断处理完成后,进程的状态被恢复。因此,性能开销包括保存和恢复进程状态的成本,以及在进程重新启动时刷新指令管道并将指令恢复到管道中的成本。
在CentOS 7系统中配置非root用户的jmeter环境变量,通过编辑.bash_profile文件并添加export JMET命令来配置。确保配置生效后,可通过java -version命令查看java版本信息。参考链接:知乎和程序员宅基地。
文章浏览阅读7.6k次。L2-039 清点代码库 (25 分)Java (javac)时间限制1500 ms内存限制128 MBPython (python3)时间限制1500 ms内存限制64 MB其他编译器时间限制500 ms内存限制64 MB上图转自新浪微博:“阿里代码库有几亿行代码,但其中有很多功能重复的代码,比如单单快排就被重写了几百遍。请设计一个程序,能够将代码库中所有功能重复的代码找出。各位大佬有啥想法,我当时就懵了,然后就挂了。。。”这里我们把问题简化一下:首先假设两个功能模_l2-039 清点代码库 java
文章浏览阅读922次,点赞2次,收藏6次。题目详情:一个无重复的非负整数序列,必定对应唯一的一棵形状为完全二叉树的二叉搜索树。本题就要求你输出这棵树的层序遍历序列。输入格式:首先第一行给出一个正整数N(≤1000),随后第二行给出N个不重复的非负整数。数字间以空格分隔,所有数字不超过 2000。输出格式:在一行中输出这棵树的层序遍历序列。数字间以 1 个空格分隔,行首尾不得有多余空格。输入样例:101 2 3 4 5 6 7 8 9 0结尾无空行输出样例:6 3 8 1 5 7 9 0 2 4..._完全二叉搜索树 分数 10 作者 陈越 单位 浙江大学 一个无重复的非负整数序列,必定
文章浏览阅读72次。教程本刷机包比一般的大,是因为同时适配recovery卡刷和酷卓一键刷机。但是刷进系统后和普通刷机包都是一样的。注意事项(务必细读) 联想 ZUK Z1 免解锁BL(bootloader),一键ROOT是保资料的,刷机是会清空数据的(无论如何都请备份重要数据)卡刷方法卡刷需要已经安装了twrp recovery,直接传入手机后用twrp recovery刷机,和普通刷机包使用无区别..._zukz1被root了怎么办
文章浏览阅读590次。一、题目 编写支持双端队列的例程,插入与弹出操作均花费 O(1)时间二、解答 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的数据结构。 双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行。 基本操作:在双端队列两端插入与删除。 ADT术语: ..._编写算法实现双端队列。数据结构分析
文章浏览阅读4.2k次。centos7安装clion下载clion的linux包。上传到linux服务器下。scp -P 20211 E:\迅雷下载\cmake-3.14.3.tar.gz 用户名@服务器地址:/home/bob/解压并到解压的文件夹bin目录下。运行命令“./clion.sh”。(需在centos7图形界面模式下才能启动clion)启动之后还不能运行c语言程序,我们还需要安装gcc、..._clion centos
文章浏览阅读382次。Multi-head attention 是一种在深度学习中的注意力机制。它在处理序列数据时,通过对不同位置的特征进行加权,来决定该位置特征的重要性。Multi-head attention 允许模型分别对不同的部分进行注意力,从而获得更多的表示能力。这在自然语言处理中,特别是在处理长文本时,可以显著提高模型性能。..._multi-head attention是什么
文章浏览阅读2.1k次。因初次编译安装php时没有开启openssl, 导致请求https网站报错, 为此需要手动编译openssl扩展然后添加到php.ini中. 问题就在自己明明已经编译安装生成openssl.so的步骤都没有错, 也已经将extension=openssl.so加入php.ini中,服务器也重启了, 但是无论是访问phpinfo()打印的出内容还是直接命令行php -m打印加载的模块都没有显示有加载..._php.ini加入了extension 不生效
文章浏览阅读8.1k次。这是linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间..._linux建立文件链接
文章浏览阅读5.2w次,点赞27次,收藏102次。摘要:本文主要说明了如何在Windows安装运行Kafka_kafak windows版
文章浏览阅读4.3k次,点赞2次,收藏11次。element里面表格的一个属性 formatter 叫格式化内容的_formatter
文章浏览阅读897次。(MIT6.828) 1.实验环境搭建参考官网:https://pdos.csail.mit.edu/6.828/2018/tools.html在ubuntu14中安装x86模拟器QEMU.1. 检查工具链objdump -i会看到elf32-i386等信息gcc -m32 -print-libgcc-file-name会看到/usr/lib/gcc/i486-linux-gnu..._mit6.828实验是否能在虚拟机上完成