提交所有LaTeX文件。
This commit is contained in:
25
操作系统/作业/mypreamble.tex
Normal file
25
操作系统/作业/mypreamble.tex
Normal file
@@ -0,0 +1,25 @@
|
||||
\usepackage{amssymb, amsfonts, amstext, amsmath, amsopn, amsthm}
|
||||
\usepackage{booktabs}
|
||||
\usepackage{multicol}
|
||||
\usepackage{multirow}
|
||||
\usepackage{bm}
|
||||
\usepackage{hyperref}
|
||||
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{enumitem}
|
||||
\usepackage{totpages}
|
||||
\usepackage{mylatex}
|
||||
\usepackage{subfiles}
|
||||
|
||||
\title{《操作系统》作业}
|
||||
\author{岳锦鹏}
|
||||
\newcommand{\mysignature}{10213903403 岳锦鹏}
|
||||
\date{2024年3月29日——2024年6月18日}
|
||||
\setlist[1]{listparindent=\parindent}
|
||||
\setlist[2]{label=(\arabic{enumii}),listparindent=\parindent}
|
||||
\definecolor{shadecolor}{RGB}{204,232,207}
|
||||
\setminted{fontsize=\zihao{6}, baselinestretch=1}
|
||||
|
||||
\let\kaishu\relax % 清除旧定义
|
||||
\newCJKfontfamily\kaishu{KaiTi}[AutoFakeBold] % 重定义 \kaishu
|
||||
\newcommand{\boldkai}[1]{{\bfseries\kaishu #1}}
|
||||
10
操作系统/作业/mysubpreamble.tex
Normal file
10
操作系统/作业/mysubpreamble.tex
Normal file
@@ -0,0 +1,10 @@
|
||||
\pagestyle{fancyplain}
|
||||
\fancyhead{}
|
||||
\fancyhead[C]{\mysignature}
|
||||
\fancyfoot[C]{第 \thepage 页\quad 共 \ref{TotPages} 页}
|
||||
% \definecolor{shadecolor}{named}{white}
|
||||
\makeatletter
|
||||
\ctexset{
|
||||
chapter/break = \addpenalty{\@secpenalty}
|
||||
}
|
||||
\makeatother
|
||||
10
操作系统/作业/全部作业.tex
Normal file
10
操作系统/作业/全部作业.tex
Normal file
@@ -0,0 +1,10 @@
|
||||
\documentclass[a4paper]{ctexbook}
|
||||
\input{mypreamble}
|
||||
\begin{document}
|
||||
\maketitle
|
||||
\tableofcontents
|
||||
\subfile{第二章作业}
|
||||
\subfile{第三章作业}
|
||||
\subfile{第四章作业}
|
||||
\subfile{第五六章作业}
|
||||
\end{document}
|
||||
204
操作系统/作业/第三章作业.tex
Normal file
204
操作系统/作业/第三章作业.tex
Normal file
@@ -0,0 +1,204 @@
|
||||
\documentclass[全部作业]{subfiles}
|
||||
\input{mysubpreamble}
|
||||
\begin{document}
|
||||
\setcounter{chapter}{2}
|
||||
\chapter{存储管理}
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
一个 32 位的系统支持的逻辑空间最大为$2^{32}$字节,假如一个分页系统的页面大小为 4KB(即 $2^{12}$),一个页表项 4 个字节。请问:一个进程页表最多可有多少个表项?此时该进程的页表需要占多大的内存?
|
||||
}{
|
||||
按照题意来看,页表需要放到内存中,因此$2^{32}$字节的逻辑空间不能全部用来放分页页面。那么一个页面对应一个页表项,它们需要$2^{12}+4$字节,所以一个进程页表最多可有$$\dfrac{2^{32}}{2^{12}+4} = \dfrac{1073741824}{1025} \approx 1047552.99902439 \xrightarrow{\text{向下取整}} 1047552$$个表项。此时该进程的页表需要占$1047552\times 4 = 4190208$个字节的内存。
|
||||
}
|
||||
\questionandanswer[]{
|
||||
在分页式系统中,其页表存放在内存中
|
||||
}{}
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
如果对内存的一次存取需要 $100 \mathrm{\mu s}$,试问实现一次页面访问至少需要存取时间是多少?
|
||||
}{
|
||||
先访问一次页表,得到页面的地址以及是否缺页,此时如果没有缺页异常,直接从内存中就能访问到页面,所以实现一次页面访问至少需要存取时间为$100+100=200 \mathrm{\mu s}$。
|
||||
}
|
||||
\questionandanswer[]{
|
||||
如果系统有快表,快表的命中率为 80\%,当页表项在快表中时,其查询快表的时间可忽略不计,试问此时平均存取时间为多少?
|
||||
}{
|
||||
当页表项在快表中时(并且没有缺页),此时可以认为一次页面访问只需要一次内存访问的时间,即$100 \mathrm{\mu s}$;所以此时平均存取时间(不考虑缺页)为
|
||||
$$
|
||||
\begin{aligned}
|
||||
EX &= 100 \mu \mathrm{s}\times P(快表命中) + 200 \mu \mathrm{s} \times P(快表未命中) \\
|
||||
&=100 \mu \mathrm{s} \times 0.8 + 200 \mu \mathrm{s} \times 0.2 = 120 \mu\mathrm{s} \\
|
||||
\end{aligned}
|
||||
$$
|
||||
}
|
||||
\questionandanswer[]{
|
||||
采用快表后的平均存取时间比没有采用快表时下降了百分之几?
|
||||
}{
|
||||
$$
|
||||
1 - \frac{120}{200} = \frac{2}{5} = 0.4 = 40 \%
|
||||
$$
|
||||
下降了$40 \%$。
|
||||
}
|
||||
\end{enumerate}
|
||||
\questionandanswer[]{
|
||||
某虚拟存储器的用户编程空间共 32 个页面,每页1KB,主存为16KB。假定某时刻用户表中已调入主存的页面的虚拟页号和物理块号对照表为表一,则与逻辑地址相对应的物理地址为表二。\\
|
||||
\begin{minipage}{0.5\linewidth}
|
||||
\begin{center}
|
||||
\begin{tabular}{cc}
|
||||
\toprule
|
||||
虚拟页号 & 物理块号 \\
|
||||
\midrule
|
||||
0 & 5 \\
|
||||
1 & 10 \\
|
||||
2 & 4 \\
|
||||
8 & 7 \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
|
||||
表一
|
||||
\end{center}
|
||||
\end{minipage}
|
||||
\begin{minipage}{0.5\linewidth}
|
||||
\begin{center}
|
||||
\begin{tabular}{cc}
|
||||
\toprule
|
||||
逻辑地址 & 物理地址 \\
|
||||
\midrule
|
||||
0A5CH & A(\quad) \\
|
||||
1A5CH & B(\quad) \\
|
||||
925DH & C(\quad) \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
|
||||
表二
|
||||
\end{center}
|
||||
\end{minipage}
|
||||
|
||||
可供选择的答案:
|
||||
A,B,C:(1)缺页 (2)1E5DH (3)2A5CH (4)115CH (5)125CH(6)165CH (7)越界 (8)以上答案都不对
|
||||
}{
|
||||
|
||||
页面大小1KB,也就是$2^{10}$字节(其实准确说1KiB才是$2^{10}$字节,1KB是$10^{3}$字节),也就是逻辑地址的后10位代表页内偏移。
|
||||
|
||||
由于一共$32=2^{5}$个页面,所以(序号从右数0开始)第10到14位是页号,题目中的逻辑地址是4位十六进制数(最后的H表示这是十六进制数),也就是16位二进制数,因此第15位(最高位)必定为0,否则就是虚拟页号越界。以0A5CH为例:
|
||||
$$
|
||||
0|\underbrace{000\ 10}_{\text{虚拟页号}}|\underbrace{10\ 0101\ 1100}_{页内偏移}
|
||||
$$
|
||||
从逻辑地址转换到物理地址,只需要把虚拟页号换成对应的物理块号即可,这里虚拟页号为二进制的 00010 也就是十进制的2,对应的物理块号为4,也就是二进制的00100,转换后为
|
||||
$$
|
||||
0|\underbrace{001\ 00}_{\text{物理块号}}|\underbrace{10\ 0101\ 1100}_{页内偏移}
|
||||
$$
|
||||
转换成十六进制也就是125CH,所以A(5)。
|
||||
|
||||
同理,对于1A5CH,
|
||||
$$
|
||||
0|\underbrace{001\ 10}_{\text{虚拟页号}}|\underbrace{10\ 0101\ 1100}_{页内偏移}
|
||||
$$
|
||||
虚拟页号00110,即十进制的6,在表一中没有,所以是缺页,从而B(1)。
|
||||
|
||||
对于925DH
|
||||
$$
|
||||
1|\underbrace{001\ 00}_{\text{虚拟页号}}|\underbrace{10\ 0101\ 1101}_{页内偏移}
|
||||
$$
|
||||
最高位为1,根据前面的分析,虚拟页号越界,所以C(7)。
|
||||
|
||||
综上所述,A(5), B(1), C(7)。
|
||||
}
|
||||
\questionandanswer[]{
|
||||
分页存储管理系统中,逻辑地址长度为 16,页面大小为4K。一个进程有 6 个页面,且页号为 1、2、3 的页面依次存放在物理块5、10、11 中,试问:
|
||||
}{
|
||||
|
||||
4K看作是$2^{12}$,也就是12位逻辑地址,也就是右起3位十六进制。逻辑地址长度为16,$16-12=4$位表示页号,所以左起1位十六进制表示页号。有6个页面,所以页号从0到5有效,否则越界。
|
||||
}
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
逻辑地址 4010、8500 和 25000 所对应的物理地址分别为多少?
|
||||
}{
|
||||
这里的数字没有字母后缀,应该是十进制,需要先转化成十六进制。\\
|
||||
\begin{center}
|
||||
\begin{tabular}{ccc}
|
||||
\toprule
|
||||
十进制逻辑地址 & 十六进制逻辑地址 & 物理地址 \\
|
||||
\midrule
|
||||
4010 & 0|FAA & 缺页 \\
|
||||
8500 & 2|134 & A134 \\
|
||||
25000 & 6|1A8 & 越界 \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
}
|
||||
\questionandanswer[]{
|
||||
逻辑地址 2F6AH、0578H 和 6ACDH 所对应的物理地址分别为多少?
|
||||
}{
|
||||
\begin{center}
|
||||
\begin{tabular}{cc}
|
||||
\toprule
|
||||
逻辑地址 & 物理地址 \\
|
||||
\midrule
|
||||
2|F6A\ H & AF6A\ H \\
|
||||
0|578\ H & 缺页 \\
|
||||
6|ACD\ H & 越界 \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
}
|
||||
\end{enumerate}
|
||||
\questionandanswer[]{
|
||||
假定某采用页式存储管理的系统中,主存容量为1M,被分成256 块,块号为 0、1、2、…、255。现有一个共 4 页(页号为0、1、2、3)的作业被依次装入到主存的块 2、4、1、5 中。请回答:
|
||||
}{}
|
||||
|
||||
% 啊?为什么这里如果不加空行,后面就没有parindent了?加了一个空行就重新出现parindent了?
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
主存地址应该用多少位来表示?
|
||||
}{
|
||||
1M省略了单位,应该是指1MB,看作是$2^{20}$字节,由于寻址的单位为字节,所以主存地址应该用20位来表示。
|
||||
}
|
||||
\questionandanswer[]{
|
||||
作业每一页的长度为多少字节?逻辑地址中的页内地址部分应占用多少位?
|
||||
}{
|
||||
1MB $=2^{20}$字节,分成$256=2^{8}$块,所以每块的大小为$\frac{2^{20}}{2^{8}}=2^{12}$字节,块大小和页大小一样,因此作业每一页的长度为$2^{12}$字节,逻辑地址中的页内地址部分应占用12位。
|
||||
}
|
||||
\questionandanswer[]{
|
||||
把作业中每一页占用的主存块起始地址填入下表。
|
||||
}{
|
||||
\begin{center}
|
||||
\begin{tabular}{cc}
|
||||
\toprule
|
||||
页号 & 起始地址 \\
|
||||
\midrule
|
||||
0 & 02\ 000\ H \\
|
||||
1 & 04\ 000\ H \\
|
||||
2 & 01\ 000\ H \\
|
||||
3 & 05\ 000\ H \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
}
|
||||
\questionandanswer[]{
|
||||
若作业执行中要从第 0 页的第 75 单元和第 3 页的第 548 单元读信息,那么,实际应从主存的哪两个单元读信息?请把应访问的主存绝对地址用二进制编码的十六进制数表示。
|
||||
}{
|
||||
|
||||
这里“二进制编码的十六进制数”表述不清,直接描述成“十六进制”或许更好。
|
||||
第 0 页的第 75 单元为 0x02\,048,第 3 页的第 548 单元为 0x05\,224。
|
||||
}
|
||||
\end{enumerate}
|
||||
\questionandanswer[]{
|
||||
在请求式分页系统中,运行一个共有 8 页的作业,且作业在主存中分配到 4 块主存块,作业执行时访问页面顺序为 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1,假如最初四个页面通过缺页中断装入,请问用最佳置换算法、先入先出(FIFO)算法和最近最久未使用(LRU)算法时,它们的页面缺页和置换次数分别为多少?(要求画出页面置换图)
|
||||
}{
|
||||
\begin{center}
|
||||
\includexopp{3.6.1}
|
||||
(图中标了$\times $的是发生置换的)
|
||||
\vspace{1em}
|
||||
|
||||
\begin{tabular}{ccc}
|
||||
\toprule
|
||||
页面置换算法 & 页面缺页次数 & 置换次数 \\
|
||||
\midrule
|
||||
最佳置换(Opt) & 8 & 4 \\
|
||||
先入先出(FIFO) & 10 & 6 \\
|
||||
最近最久未使用(LRU) & 8 & 4 \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
283
操作系统/作业/第二章作业.tex
Normal file
283
操作系统/作业/第二章作业.tex
Normal file
@@ -0,0 +1,283 @@
|
||||
\documentclass[全部作业]{subfiles}
|
||||
\input{mysubpreamble}
|
||||
\begin{document}
|
||||
\setcounter{chapter}{1}
|
||||
\chapter{进程与线程}
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
设有一台计算机,有两条 I/O 通道,分别挂一台输入机和一台打印机。若要把输入机上的数据逐一地输入到缓冲区 B1 中,然后处理,并把结果搬到缓冲区B2中,最后在打印机上输出。请问:
|
||||
}{}
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
系统可设置哪些进程完成这一任务?这些进程间有什么具体制约关系?
|
||||
}{
|
||||
\noindent
|
||||
进程一:把输入机上的数据逐一地输入到缓冲区 B1 中;\\
|
||||
进程二:从缓冲区 B1 中取数据,处理后把结果放到缓冲区B2中;\\
|
||||
进程三:从缓冲区 B2 中取数据,在打印机上输出。
|
||||
|
||||
这里的“逐一地”“缓冲区”等关键词表明是单个缓冲区而不是缓冲队列。那么进程一和进程二之间关于缓冲区B1存在同步的制约关系,进程二和进程三之间关于缓冲区B2存在同步的制约关系。(这里不需要互斥)
|
||||
}
|
||||
\questionandanswer[]{
|
||||
用 P-V 操作写出这些进程的同步算法。
|
||||
}{}
|
||||
{\kaishu\noindent
|
||||
\begin{minipage}{0.4\linewidth}
|
||||
\begin{minted}{C}
|
||||
struct semaphore B1_empty = 1, B1_full = 0, B2_empty = 1, B2_full = 0;
|
||||
number temp1, temp2, temp3;
|
||||
buffer B1, B2;
|
||||
cobegin
|
||||
void process1() {
|
||||
while(1) {
|
||||
temp1 = input();
|
||||
P(B1_empty);
|
||||
B1 = temp1;
|
||||
V(B1_full);
|
||||
}
|
||||
}
|
||||
void process2() {
|
||||
while(1) {
|
||||
P(B1_full);
|
||||
temp2 = B1_full;
|
||||
V(B1_empty);
|
||||
temp2 = processing(temp2);
|
||||
P(B2_empty);
|
||||
B2_full = temp2;
|
||||
V(B2_full);
|
||||
}
|
||||
}
|
||||
void process3() {
|
||||
while(1) {
|
||||
P(B2_full);
|
||||
temp3 = B2_full;
|
||||
V(B2_empty);
|
||||
output(temp3);
|
||||
}
|
||||
}
|
||||
coend
|
||||
\end{minted}
|
||||
\end{minipage}
|
||||
% \columnbreak
|
||||
\begin{minipage}{0.6\linewidth}
|
||||
\includexopp{2.1.2.1}
|
||||
\end{minipage}
|
||||
}
|
||||
\questionandanswer[]{
|
||||
用Send和Receive原语写出这些进程的同步算法。
|
||||
}{}
|
||||
{\kaishu\noindent
|
||||
\begin{minipage}{0.4\linewidth}
|
||||
\begin{minted}{C}
|
||||
cobegin
|
||||
void process1() {
|
||||
number item;
|
||||
message m;
|
||||
while (1) {
|
||||
item = input();
|
||||
m = build_message(item);
|
||||
Send(process2, &m);
|
||||
}
|
||||
}
|
||||
void process2() {
|
||||
number item;
|
||||
message m;
|
||||
while (1) {
|
||||
Receive(process1, &m);
|
||||
item = extract_item(&m);
|
||||
item = processing(item);
|
||||
m = build_message(item);
|
||||
Send(process3, &m);
|
||||
}
|
||||
}
|
||||
void process3() {
|
||||
number item;
|
||||
message m;
|
||||
while (1) {
|
||||
Receive(process2, &m);
|
||||
item = extract_item(&m);
|
||||
output(item);
|
||||
}
|
||||
}
|
||||
coend
|
||||
\end{minted}
|
||||
\end{minipage}
|
||||
% \columnbreak
|
||||
\begin{minipage}{0.6\linewidth}
|
||||
\includexopp{2.1.3.1}
|
||||
\end{minipage}
|
||||
}
|
||||
\end{enumerate}
|
||||
|
||||
\questionandanswer[]{
|
||||
“哲学家就餐问题”除课堂上介绍的方案外,有没有其他解决方案?有的话,请
|
||||
写出相应的解决方案。
|
||||
}{}
|
||||
{\kaishu
|
||||
有,比较容易想到的一种最简单的方案是,每次只允许一个哲学家就餐,也就是将所有的叉子视为一个整体的临界资源,但是缺点也很明显,会导致性能低下,因为五个叉子可以满足两个哲学家同时就餐。因此下面使用另一种方案。
|
||||
|
||||
大致方案是偶数序号的哲学家先拿左边的叉子,奇数序号哲学家先拿右边的叉子(释放的时候就不需要讲究先放左边还是先放后边了)。
|
||||
% \begin{multicols}{2}
|
||||
\begin{minted}{C}
|
||||
struct semaphore forks[5] = {1, 1, 1, 1, 1};
|
||||
void philosopher(i) {
|
||||
while (1) {
|
||||
think;
|
||||
if (i % 2) {
|
||||
P(forks[(i + 1) % 5]);
|
||||
P(forks[i])
|
||||
} else {
|
||||
P(forks[i]);
|
||||
P(forks[(i + 1) % 5]);
|
||||
}
|
||||
eat;
|
||||
V(forks[i]);
|
||||
V(forks[(i + 1) % 5]);
|
||||
}
|
||||
}
|
||||
\end{minted}
|
||||
% \end{multicols}
|
||||
}
|
||||
\questionandanswer[]{
|
||||
a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理的
|
||||
规则如下:当a,b之间有车辆在行驶时同方向的车可以同时驶入a,b段,但另一个
|
||||
方向的车必须在a,b段以外等待;当a,b之间无车辆在行驶时,到达a点(或b点)
|
||||
的车辆可以进入a,b段,但不能同时驶入;当某方向在a,b段行驶的车辆驶出了a,
|
||||
b 段且暂无车辆进入a,b段时,应让另一方向等待的车辆进入a,b段行驶。请用PV
|
||||
操作作为工具,对a,b段实现正确管理以确保行驶安全。
|
||||
}{}
|
||||
{\kaishu
|
||||
可能会存在一个问题,就是一个方向一直有车辆,导致另一个方向无法进入车道,从而产生很长的排队。
|
||||
|
||||
还有个问题,是否要考虑车辆排队的过程,即先入先出,或先排队先进入。
|
||||
|
||||
这里先不考虑这两个问题。
|
||||
|
||||
这种问题大多数做法都是使用两个互斥量和两个计数值,这里尝试使用一个互斥量和一个计数值,计数值为正表示从a到b有车辆,计数值为负表示从b到a有车辆。但是缺点是发生任何一个事件(a或b方向进入或离开车辆)都需要访问临界资源(使用同一个 \mintinline{C}{mutex} 信号量),可能会导致性能较低。
|
||||
|
||||
\begin{multicols}{2}
|
||||
\begin{minted}{C}
|
||||
struct semaphore mutex = 1, s = 1;
|
||||
// 车道内的车辆数
|
||||
int count = 0; // 正数为从a到b,负数为从b到a
|
||||
cobegin
|
||||
void a_to_b() {
|
||||
P(mutex);
|
||||
if (count <= 0) {
|
||||
P(s);
|
||||
}
|
||||
count++;
|
||||
V(mutex);
|
||||
通过 a -> b;
|
||||
P(mutex);
|
||||
count--;
|
||||
assert(count >= 0);
|
||||
if (count == 0) {
|
||||
V(s);
|
||||
}
|
||||
V(mutex);
|
||||
}
|
||||
|
||||
|
||||
void b_to_a() {
|
||||
P(mutex);
|
||||
if (count >= 0) {
|
||||
P(s);
|
||||
}
|
||||
count--;
|
||||
V(mutex);
|
||||
通过 b -> a;
|
||||
P(mutex);
|
||||
count++;
|
||||
assert(count <= 0);
|
||||
if (count == 0) {
|
||||
V(s);
|
||||
}
|
||||
V(mutex);
|
||||
}
|
||||
coend
|
||||
\end{minted}
|
||||
\end{multicols}
|
||||
}
|
||||
\questionandanswer[]{
|
||||
假定有三个进程R、W1、W2共享一个缓冲区B,B中每次只能存放一个整数。
|
||||
进程R每次启动输入设备读一个整数且把它存放在缓冲区B中,若存放到缓冲区B中
|
||||
的是奇数,则由进程W1将其取出打印,否则由进程W2将其取出打印。要求用PV操
|
||||
作管理这3个并发进程,使它们能够正确同步工作。
|
||||
}{}
|
||||
{\kaishu
|
||||
这里使用了三个信号量实现R与W1的同步、R与W2的同步,一个信号量实现了打印的互斥。
|
||||
|
||||
\begin{minipage}{0.4\linewidth}
|
||||
\begin{minted}{C}
|
||||
struct semaphore odd = 0, even = 0, empty = 1;
|
||||
struct semaphore output_mutex;
|
||||
buffer B;
|
||||
cobegin
|
||||
void R() {
|
||||
int temp;
|
||||
while (1) {
|
||||
temp = input();
|
||||
P(empty);
|
||||
B = temp;
|
||||
if (temp % 2) {
|
||||
V(odd);
|
||||
} else {
|
||||
V(even);
|
||||
}
|
||||
}
|
||||
}
|
||||
void W1() {
|
||||
int temp;
|
||||
while (1) {
|
||||
P(odd);
|
||||
temp = B;
|
||||
V(empty);
|
||||
P(output_mutex);
|
||||
output(temp);
|
||||
V(output_mutex);
|
||||
}
|
||||
}
|
||||
void W2() {
|
||||
int temp;
|
||||
while (1) {
|
||||
P(even);
|
||||
temp = B;
|
||||
V(empty);
|
||||
P(output_mutex);
|
||||
output(temp);
|
||||
V(output_mutex);
|
||||
}
|
||||
}
|
||||
coend
|
||||
\end{minted}
|
||||
\end{minipage}
|
||||
\begin{minipage}{0.6\linewidth}
|
||||
\includexopp{2.4.1}
|
||||
\end{minipage}
|
||||
}
|
||||
\questionandanswer[]{
|
||||
假定在一个CPU上执行以下5个作业:(优先数小者优先级高)
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{|c|c|c|c|c|c|}
|
||||
\hline
|
||||
作业号 & 1 & 2 & 3 & 4 & 5 \\
|
||||
\hline
|
||||
到达时间 & 0 & 2 & 4 & 6 & 8 \\
|
||||
\hline
|
||||
优先数 & 4 & 3 & 5 & 2 & 1 \\
|
||||
\hline
|
||||
运行时间 & 3 & 6 & 4 & 5 & 2 \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
当分别采用FCFS、RR(时间片为1)、非抢占式SJF、抢占式SJF、优先级调度5
|
||||
种调度算法时,试(1)画出调度图(2)计算每个作业的周转时间(3)计算平均周转
|
||||
时间。
|
||||
}{
|
||||
\includexopp{2.5.1}
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
106
操作系统/作业/第五六章作业.tex
Normal file
106
操作系统/作业/第五六章作业.tex
Normal file
@@ -0,0 +1,106 @@
|
||||
\documentclass[全部作业]{subfiles}
|
||||
\input{mysubpreamble}
|
||||
\begin{document}
|
||||
\setcounter{chapter}{4}
|
||||
\chapter{I/O设备管理}
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
假定某磁盘共有 200 个柱面(编号为 0$\sim $199),如果在为访问80 号柱面的请求者服务后,当前正在为访问 108 号柱面的请求者服务,同时有若干个请求者在等待服务,它们依次要访问的柱面号为:
|
||||
|
||||
187,64,169,48,171,118,120,84
|
||||
\begin{enumerate}
|
||||
\item 分别用先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)和循环扫描(CSCAN)算法进行磁盘调度时,试确定实际的服务次序。
|
||||
\item 按实际服务次序计算(1)中四种算法下磁臂移动的距离。
|
||||
\end{enumerate}
|
||||
}{
|
||||
\includexopp{5.1.1}
|
||||
|
||||
每次磁臂移动的距离已经用蓝色字标在两次访问的柱面号之间,要注意循环扫描的返回是瞬间完成,不应算到磁臂移动的距离中。
|
||||
}
|
||||
\end{enumerate}
|
||||
\chapter{死锁}
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
在某系统中,有 N 个进程共享 R 台同类设备资源,每个进程最多需要M台设备资源,试问:N 最多为几时才能保证系统不会发生死锁?请简略说明原因。
|
||||
}{
|
||||
% N最多为 $\bm{\left\lfloor R / M \right\rfloor}$ 时才能保证系统不会发生死锁。因为当N达到这个值时,如果此时所有进程都按照最大资源数量申请,那么总申请的资源数量为$\left\lfloor R / M \right\rfloor \times M \leqslant R$,所以不会发生死锁,但如果N多一个,那么总申请的资源数量为$\left( \left\lfloor R / M \right\rfloor+1 \right) \times M$这就可能大于R,那么就可能发生死锁。
|
||||
|
||||
(这里的N、R、M应该均为正整数)
|
||||
|
||||
当N固定时,根据抽屉原理,每个进程都恰好分到最大资源数量少一个资源,并且都申请一个资源,这时如果没有资源可以分配,那么就死锁了;如果有至少一个资源可以分配,那么就不会死锁。所以R最少应取$N\times (M-1) + 1$才能保证不会发生死锁,那么
|
||||
$$
|
||||
R\geqslant N\times (M-1)+1 \implies N \leqslant \frac{R-1}{M-1}
|
||||
$$
|
||||
因为N为整数,所以N最多为$\displaystyle \left\lfloor \frac{R-1}{M-1} \right\rfloor$。
|
||||
}
|
||||
\questionandanswer[]{
|
||||
考虑有 3 个进程共享 9 个资源,当前资源分配情况如下:
|
||||
\begin{center}
|
||||
\begin{tabular}{ccc}
|
||||
\toprule
|
||||
进程 & 已占资源数 & 最大需求量 \\
|
||||
\midrule
|
||||
P1 & 2 & 6 \\
|
||||
P2 & 3 & 6 \\
|
||||
P3 & 1 & 5 \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
请回答以下问题:
|
||||
}{}
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
目前系统是否处于安全状态?为什么?
|
||||
}{
|
||||
目前已占资源总数为6,那么还有3个资源,这时如果分配给P2,P2就达到了最大需求量,那么P2运行结束后就有6个空闲资源,这时可以分配给P1 4个资源,P1就达到了最大需求量,P1运行结束后分配给P3 4个资源,P3就达到了最大需求量,P3运行完后就结束了。\boldkai{所以可以找到资源分配安全序列 P2、P1、P3,所以目前系统处于安全状态。}示意图如下:
|
||||
\bigskip
|
||||
\includexopp[1.2]{6.2.1.1}
|
||||
}
|
||||
\questionandanswer[]{
|
||||
如果接着 3 个进程均再申请 2 个资源,可以先分配资源给哪个进程?
|
||||
}{
|
||||
在未实际分配资源时,安全序列不变,仍然为P2、P1、P3,所以可以先分配资源给\boldkai{P2}。
|
||||
}
|
||||
\end{enumerate}
|
||||
\questionandanswer[]{
|
||||
假如系统中有 5 个进程{P0,P1,P2,P3,P4}和4 种类型资源{A,B,C,D},T0 时刻系统的资源分配情况如下所示:
|
||||
\begin{center}
|
||||
\begin{tabular}{c|cccc|cccc|cccc}
|
||||
\toprule
|
||||
进程 & \multicolumn{4}{c}{Al} \vline& \multicolumn{4}{c}{Need} \vline & \multicolumn{4}{c}{Av} \\
|
||||
\midrule
|
||||
P0 & 0 & 2 & 3 & 2 & 0 & 0 & 1 & 2 & 1 & 6 & 2 & 2 \\
|
||||
P1 & 1 & 0 & 0 & 0 & 1 & 7 & 5 & 0 & & & & \\
|
||||
P2 & 1 & 3 & 5 & 4 & 2 & 3 & 5 & 6 & & & & \\
|
||||
P3 & 0 & 3 & 3 & 2 & 0 & 6 & 5 & 2 & & & & \\
|
||||
P4 & 1 & 0 & 1 & 4 & 0 & 6 & 5 & 6 & & & & \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
试问:
|
||||
}{}
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
T0 时刻该系统是否安全?
|
||||
}{
|
||||
尝试寻找安全序列如下图所示:
|
||||
\includexopp[1.3]{6.4.1.1}
|
||||
成功找到安全序列P0、P1、P3、P2、P4,所以T0 时刻系统\boldkai{安全}。
|
||||
}
|
||||
\questionandanswer[]{
|
||||
T1 时刻进程 P2 提出资源请求 Re2(1,2, 0,0),能否将资源分配给它?
|
||||
}{
|
||||
Re2 < Av,进行试探性分配,尝试寻找安全序列如下图所示:
|
||||
\includexopp[1.3]{6.4.2.1}
|
||||
与T0 时刻相比有不同的地方已用红色标出,所以成功找到安全序列P0、P3、P4、P1、P2,所以\boldkai{能}将资源分配给它。
|
||||
}
|
||||
\questionandanswer[]{
|
||||
T2 时刻进程 P3 提出资源请求 Re3(0, 0,2,2),能否将资源分配给它?
|
||||
}{
|
||||
Re3 < Av,进行试探性分配,尝试寻找安全序列如下图所示:
|
||||
\includexopp[1.2]{6.4.3.1}
|
||||
发现找不到安全序列,所以\boldkai{不能}将资源分配给它。
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
83
操作系统/作业/第四章作业.tex
Normal file
83
操作系统/作业/第四章作业.tex
Normal file
@@ -0,0 +1,83 @@
|
||||
\documentclass[全部作业]{subfiles}
|
||||
\input{mysubpreamble}
|
||||
\begin{document}
|
||||
\setcounter{chapter}{3}
|
||||
\chapter{文件系统}
|
||||
\begin{enumerate}
|
||||
\questionandanswer[]{
|
||||
一个文件系统的盘块大小为1KB,每块地址用4B表示,当分别采用连
|
||||
续、链接、二级索引和UNIX S V 分配方案时,试确定各方案能管理的最大文件,
|
||||
管理一个10MB的大文件和一个10KB的小文件时所需的管理专用块数,以及要
|
||||
访问大文件的第9M+3.5KB单元时需要的磁盘I/O操作次数。
|
||||
|
||||
A$\sim $D:(1)不受限制 (2)1KB (3)256KB (4)64MB
|
||||
(5)16GB (6)1KB+256KB+64MB+16GB
|
||||
(7)10KB+256KB+64MB+16GB
|
||||
}{
|
||||
二级索引管理的最大文件:
|
||||
$$
|
||||
256\times 256\times 1 \mathrm{KB} = 2^{8}\times 2^{8}\times 1 \mathrm{KB} = 2^{16}\mathrm{KB} = 2^{6} \mathrm{MB} = 64 \mathrm{MB}
|
||||
$$
|
||||
二级索引专用块数:
|
||||
$$
|
||||
10\text{KB}/1\text{KB} =10 \text{个存储块}
|
||||
$$
|
||||
$$
|
||||
\left\lceil 10/256 \right\rceil = 1 \text{个二级索引块}, \quad \left\lceil 1/256 \right\rceil =1 \text{个一级索引块}
|
||||
$$
|
||||
$$
|
||||
10\text{MB}/1\text{KB}=10\times 2^{10}\text{个存储块}
|
||||
$$
|
||||
$$
|
||||
10\times 2^{10}/256 = 10\times 2^{2} = 40 \text{个二级索引块}, \quad \left\lceil 1/256 \right\rceil =1 \text{个一级索引块}
|
||||
$$
|
||||
UNIX专用块数:
|
||||
$$
|
||||
10\text{MB}-10\text{KB}-256\text{KB} = (10\times 2^{20} - 10\times 2^{10} - 256\times 2^{10}) = 10213376\text{B} = 9974\text{KB}
|
||||
$$
|
||||
$$
|
||||
\left\lceil 9974/256 \right\rceil = 39 \text{个二级索引块}, \quad \left\lceil 39/256 \right\rceil =1 \text{个一级索引块}
|
||||
$$
|
||||
$$
|
||||
1+39+1=41 \text{个管理专用块}
|
||||
$$
|
||||
大文件的某处信息需要的IO次数:
|
||||
$$
|
||||
\left\lceil 9\times 2^{10} +3.5 \right\rceil + 1 = 9221
|
||||
$$
|
||||
\begin{center}
|
||||
\begin{tabular}{cccccc}
|
||||
\toprule
|
||||
& & 连续分配 & 链接分配 & 二级索引 & UNIX \\
|
||||
\midrule
|
||||
\multicolumn{2}{c}{管理的最大文件} & A(1) & B(1) & C(4) & D(7) \\
|
||||
\hline
|
||||
\multirow{2}{*}{管理用的专用块数} & 10KB 文件 & 0 & 0 & 2 & 0 \\
|
||||
& 10MB 文件 & 0 & 0 & 41 & 41 \\
|
||||
\hline
|
||||
大文件的某处信息 & 9M+3.5KB & 1 & 9221 & 3 & 3 \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
}
|
||||
\questionandanswer[]{
|
||||
在 Unix 文件系统中,文件的物理组织为 Unix 直接间接混合寻址方式,假设一个进程要在第 4200 字节、第 210000 字节和第800000 字节三个偏移处读文件,请问分别要访问多少次磁盘?并以必要的图示说明访问之过程。假设该文件的 FCB(即文件说明或文件控制块)已读入内存,每个磁盘块大小为1K,块号用 32 位的指针表示。
|
||||
}{
|
||||
32位即4B,所以一个索引块能存储 $1\text{KB}/4\text{B}=256\text{个块指针}$。
|
||||
|
||||
\includexopp[1.1]{4.2.1}
|
||||
|
||||
图中用不同颜色写出了不同偏移处的计算步骤以及访问过程。访问磁盘次数即不同颜色的箭头数量,在第 4200 字节、第 210000 字节和第800000 字节三个偏移处读文件,分别要访问1、2、3次磁盘。
|
||||
}
|
||||
\questionandanswer[]{
|
||||
假设文件系统的盘块大小为 4KB, 某文件的物理结构采用连续文件方式,假设该文件的首个盘块的盘块号为 85,那么该文件的第8292 字节单元在第几个盘块上?其盘块号为多少?该字节单元是盘块内的第几字节?
|
||||
}{
|
||||
$$
|
||||
8292\text{B}/4\text{KB} = 8292 \div (4\times 2^{10}) = 2 \cdots\cdots 100
|
||||
$$
|
||||
\includexopp[1]{4.3.1}
|
||||
|
||||
所以该文件的第8292字节单元在第3个盘块上,其盘块号为87,该字节单元是盘块内的第101字节。
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
Reference in New Issue
Block a user