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