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