今天考了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 mode
cli # Disable interrupts
cld # String operations increment
# Set up the important data segment registers (DS, ES, SS).
xorw %ax, %ax # Segment number zero
movw %ax, %ds # -> Data Segment
movw %ax, %es # -> Extra Segment
movw %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, %al
jnz seta20.1
movb $0xd1, %al # 0xd1 -> port 0x64
outb %al, $0x64 # 0xd1 means: write data to 8042's P2 port
seta20.2:
inb $0x64, %al # Wait for not busy(8042 input buffer empty).
testb $0x2, %al
jnz seta20.2
movb $0xdf, %al # 0xdf -> port 0x60
outb %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 gdtdesc
movl %cr0, %eax
orl $CR0_PE_ON, %eax
movl %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 registers
movw $PROT_MODE_DSEG, %ax # Our data segment selector
movw %ax, %ds # -> DS: Data Segment
movw %ax, %es # -> ES: Extra Segment
movw %ax, %fs # -> FS
movw %ax, %gs # -> GS
movw %ax, %ss # -> SS: Stack Segment