提交所有LaTeX文件。

This commit is contained in:
2024-09-02 17:47:53 +08:00
parent 10e6004666
commit b2fb901612
131 changed files with 17921 additions and 0 deletions

View 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}}

View 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

View File

@@ -0,0 +1,10 @@
\documentclass[a4paper]{ctexbook}
\input{mypreamble}
\begin{document}
\maketitle
\tableofcontents
\subfile{第二章作业}
\subfile{第三章作业}
\subfile{第四章作业}
\subfile{第五六章作业}
\end{document}

View 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}
可供选择的答案:
ABC1缺页 21E5DH 32A5CH 4115CH 5125CH6165CH 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 块主存块,作业执行时访问页面顺序为 70120304230321201701假如最初四个页面通过缺页中断装入请问用最佳置换算法、先入先出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}

View 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[]{
ab两点之间是一段东西向的单行车道现要设计一个自动管理系统管理的
规则如下当ab之间有车辆在行驶时同方向的车可以同时驶入ab段但另一个
方向的车必须在ab段以外等待当ab之间无车辆在行驶时到达a点或b点
的车辆可以进入ab段但不能同时驶入当某方向在ab段行驶的车辆驶出了a
b 段且暂无车辆进入ab段时应让另一方向等待的车辆进入ab段行驶。请用PV
操作作为工具对ab段实现正确管理以确保行驶安全。
}{}
{\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共享一个缓冲区BB中每次只能存放一个整数。
进程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}

View 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 号柱面的请求者服务,同时有若干个请求者在等待服务,它们依次要访问的柱面号为:
187641694817111812084
\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个资源这时如果分配给P2P2就达到了最大需求量那么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 个进程P0P1P2P3P4和4 种类型资源ABCDT0 时刻系统的资源分配情况如下所示:
\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(12 00),能否将资源分配给它?
}{
Re2 < Av进行试探性分配尝试寻找安全序列如下图所示
\includexopp[1.3]{6.4.2.1}
与T0 时刻相比有不同的地方已用红色标出所以成功找到安全序列P0、P3、P4、P1、P2所以\boldkai{}将资源分配给它。
}
\questionandanswer[]{
T2 时刻进程 P3 提出资源请求 Re3(0 022),能否将资源分配给它?
}{
Re3 < Av进行试探性分配尝试寻找安全序列如下图所示
\includexopp[1.2]{6.4.3.1}
发现找不到安全序列,所以\boldkai{不能}将资源分配给它。
}
\end{enumerate}
\end{enumerate}
\end{document}

View 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不受限制 21KB 3256KB 464MB
516GB 61KB+256KB+64MB+16GB
710KB+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}