HNU-操作系统OS-2023期中考试
今天考了OS期中考试,特别傻地最后改错了一道10分的题目,很难受。应该是考差了。
回忆一下今天考试的题目,为可能需要的后继者提供帮助(往年期中考题极难获得)
我这里先给出题目,有时间我再补充答案,太忙了,实验和小班,喘不过气来。
欢迎物理催更
试卷总共6道题目
第一题:基础题(20分)
1.1(4分)
进程状态一共有多少个,是哪些?哪些状态只出现一次,哪些出现多次?
答:
初始,运行,就绪,阻塞,结束
只出现一次:初始,结束
出现多次:运行,就绪,阻塞
1.2(4分)
请结合进程状态转移图来说明,哪些是抢占式的,哪些是非抢占式的。
这道题不太确定,
放张状态图在这里,等确定了再更新,或者就一直不知道了
1.3(4分)
fork()与exec()调用的区别
答到:一个创建新的进程,一个不创建新的进程,即可,我觉的啊。
1.4(8分)
基于抢占式的调度,优先权值越小表示越优先,运行调度程序和进程切换用时1μs。
到达时间 | CPU耗时 | 优先权值 | |
P1 | 2μs | 12μs | 10 |
P2 | 1μs | 24μs | 30 |
P3 | 0μs | 36μs | 20 |
从0开始调度程序,问平均周转时间为多少。
第二题:MLFQ多级反馈队列(10分)
问五条规则及其相应作用
五条规则:
1.如果A的优先级 > B的优先级,运行A(不运行B)
2.如果A的优先级 = B的优先级,轮转运行A和B
3.工作进入系统时,放在最高优先级(最上层队列)
4.一旦工作用完了其在某一层中的时间配额(无论中间主动放弃了多少次CPU),就降低其优先级(移入低一级队列)
5.经过一段时间S,就将系统中所有工作重新加入最高优先级队列
具体作用(书上有,自己稍作摘录即可)
第三题:彩票调度与步长调度(20分)
(1)写出彩票的意义,问彩票数与步长的关系
(2)若ABC彩票数分别是200,300,500。给定整数60000,求出各自的票数。
(3)模拟一遍,直至各自里程再次相同。
(4)求出各自的CPU占比。
第四题:僵尸进程(20分)
(1)运行以下代码,写出输出结果
(2)结合僵尸进程与孤儿进程的概念。这段代码会产生僵尸进程还是孤儿进程?
如果是孤儿进程,请修改代码使其产生僵尸进程;
如果是僵尸进程,请修改代码使其产生孤儿进程。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>int main()
{printf("%d\\n", (int)getpid());pid_t pid;int count = 0;pid = fork();if (pid < 0){}else if (pid == 0){printf("%d father %d\\n", getppid(), getpid());count++;exit(0);}else{sleep(1);wait(NULL);printf("%d father %d\\n", getppid(), getpid());count++;}printf("count = %d\\n",count);
}
第五题:作业题(10分)
题目提供了./process -l 4:100 -S 3 -c和./process -l 4:0 -S 3 -c的运行截图
要求我们写出./process -l 4:50 -S 3 -c的运行截图
第六题:实验题【与Lab1实验紧密相关】(20分)
给了bootmain.S的一段代码,围绕这个展开问题。
.globl start
start:
.code16 # Assemble for 16-bit modecli # Disable interruptscld # String operations increment# Set up the important data segment registers (DS, ES, SS).xorw %ax, %ax # Segment number zeromovw %ax, %ds # -> Data Segmentmovw %ax, %es # -> Extra Segmentmovw %ax, %ss # -> Stack Segment# Enable A20:# For backwards compatibility with the earliest PCs, physical# address line 20 is tied low, so that addresses higher than# 1MB wrap around to zero by default. This code undoes this.
seta20.1:inb $0x64, %al # Wait for not busy(8042 input buffer empty).testb $0x2, %aljnz seta20.1movb $0xd1, %al # 0xd1 -> port 0x64outb %al, $0x64 # 0xd1 means: write data to 8042's P2 portseta20.2:inb $0x64, %al # Wait for not busy(8042 input buffer empty).testb $0x2, %aljnz seta20.2movb $0xdf, %al # 0xdf -> port 0x60outb %al, $0x60 # 0xdf = 11011111, means set P2's A20 bit(the 1 bit) to 1# Switch from real to protected mode, using a bootstrap GDT# and segment translation that makes virtual addresses# identical to physical addresses, so that the# effective memory map does not change during the switch.lgdt gdtdescmovl %cr0, %eaxorl $CR0_PE_ON, %eaxmovl %eax, %cr0# Jump to next instruction, but in 32-bit code segment.# Switches processor into 32-bit mode.ljmp $PROT_MODE_CSEG, $protcseg.code32 # Assemble for 32-bit mode
protcseg:# Set up the protected-mode data segment registersmovw $PROT_MODE_DSEG, %ax # Our data segment selectormovw %ax, %ds # -> DS: Data Segmentmovw %ax, %es # -> ES: Extra Segmentmovw %ax, %fs # -> FSmovw %ax, %gs # -> GSmovw %ax, %ss # -> SS: Stack Segment