diff --git a/.gitignore b/.gitignore
index 5cc8fe3..a631e5a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,5 +20,6 @@ yarn-debug.log*
yarn-error.log*
pnpm-lock.yaml
+AGENTS.md
.claude/
-scripts/__pycache__/check_urls.cpython-313.pyc
+__pycache__
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index e02948f..2622784 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -47,6 +47,16 @@ course_code: 课程代码
```
+课程页面整理规则:
+
+- 课程页面按学期组织。每个学期使用 `## 20xx-20xx学年x学期` 作为二级标题。
+- 每个学期下优先放 `### 试卷`,试卷链接原则上指向本仓库中的 Markdown 试卷文件,不直接链接 PDF、图片或其他原始文件。
+- 试卷原始 PDF、图片可以作为校对来源保存在资源仓库中,但展示入口应为 Markdown 试卷。
+- 教师评价和属于某位教师的教学资源放在对应 `### 教师名` 下;该教师暂无评价时可以留空。
+- 属于某位教师的课件、作业、补充资料等放在该教师标题下的 `#### 教学资源` 中。
+- 无法确认教师归属的教学资源、教材、参考资料等,统一放在最后的 `## 推荐教材与参考资料` 中。
+- `## 推荐教材与参考资料` 用于课程通用资料,不再按教师拆分。
+
## 试卷
样式比较复杂, 具体参照 [网络安全数学基础(一)/2023-2024学年下学期期末.md](https://raw.githubusercontent.com/BetterECNU/SharedCourses/refs/heads/main/docs/courses/软件工程学院/网络安全数学基础(一)/2023-2024学年下学期期末.md)
@@ -74,7 +84,7 @@ title: 2023-2024学年下学期期末
***
-## 2023-2024学年下学期期末试卷(A)——张佳秋(含答案)
+## 2023-2024学年下学期期末试卷(A)——张xx(含答案)
...
```
@@ -93,6 +103,7 @@ title: 2023-2024学年下学期期末
- 原卷中有大题标题时, 使用 `### 一、选择题`、`### 二、填空题` 等格式。
- 原卷中只有题号时, 直接使用 `1.`、`2.` 等编号即可。
- 卷别、教师、是否含答案或版本差异写在 Markdown 正文标题中, 例如 `## 2023-2024学年下学期期末试卷(A)`、`## 2023-2024学年下学期期末试卷(A)——张xx(含答案)`。
+- 原题中标注的总分、大题分值、小题分值必须保留; 参考答案或评分标准中标注的步骤分值、扣分规则也必须写入对应答案中, 不要省略。
- 同一大题内的题目之间使用缩进 4 个空格的分隔线 ` ***`;大题之间使用顶格分隔线 `***`。例如:
``` markdown
@@ -119,8 +130,76 @@ title: 2023-2024学年下学期期末
```
- 若答案折叠块位于编号题目内, ``、``、答案正文和 `
` 整体缩进 4 个空格, 与题内分隔线保持一致。
-- 选择题选项建议使用 A/B/C/D 分行书写; 数学公式使用 LaTeX。
+- 选择题选项建议使用 A/B/C/D 分行书写, 并在选项之间空一行; 数学公式使用 LaTeX。
+- 试卷正文中不要滥用反引号。普通英文单词、英文缩写、IP 地址、子网掩码、CIDR 表项、比特串、协议名、设备名等, 若原卷就是普通正文, 一般也按普通正文书写; 分式、上下标、带单位的计算式、不等式、函数表达式等数学内容优先使用 LaTeX。
+- 独立出现的数量与英文单位优先使用 LaTeX, 例如 `$100\ \text{Mbps}$`、`$125\ \text{B}$`、`$100\ \text{m}$`、`$5\ \text{ms}$`; 中文单位通常保持普通正文, 例如 `1 微秒`、`15000 字节`、`32 位`, 不必为了统一而写成 LaTeX。但像 `100BASE-TX`、`IPv4`、`CSMA/CD` 这类协议名、标准名或固定术语通常保持普通正文即可。
+- 填空横线优先使用 LaTeX: `$\underline{\qquad}$`。
+- 横线上带编号的填空优先将编号写入下划线中, 例如 `$\underline{\qquad(1)\qquad}$`、`$\underline{\qquad(2)\qquad}$`。
- 不确定或来自回忆的题目, 应在正文中用 `### 说明` 标明来源不确定性。
+- 原卷或参考答案疑似有误时, 可在对应题目或答案下使用 Docusaurus 提示块说明, 但不要替代原卷原文或原参考答案。例如:
+
+``` markdown
+ :::tip
+ 原参考答案此处疑似有误: 题目条件为 ..., 因此应为 ...。
+ :::
+```
+
+若原卷的大题标题本身就是题目, `###` 后只写题号和分值, 题面放在标题下方。例如:
+
+``` markdown
+### 一、(10 分)
+
+设 $A$ 为矩阵, 求 $\det(A)$。
+
+1. 小问题面
+
+
+ 答案:
+
+ 答案内容
+
+
+
+ ***
+```
+
+选择题推荐排版:
+
+``` markdown
+1. 题面( )。
+
+ A. 选项 A
+
+ B. 选项 B
+
+ C. 选项 C
+
+ D. 选项 D
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+```
+
+编号题目内的答案与题间分隔线推荐排版:
+
+``` markdown
+1. 题面
+
+
+ 答案:
+
+ 报文交换网、分组交换网
+
+
+
+ ***
+```
### 图片处理
@@ -132,6 +211,22 @@ images/2023-2024学年下学期期末_A_第4题.png
images/2023-2024学年下学期期末_B_第6题.png
```
+- 若试卷没有 A/B 卷等卷别信息, 文件名中省略卷别; 若同一试卷中不同大题存在相同题号, 可在题号前加入题型以避免歧义, 例如:
+
+``` text
+images/2024-2025学年上学期期中_选择题_第4题.png
+images/2024-2025学年上学期期中_分析与设计题_第2题.png
+```
+
+- 同一题有多张必要图片时, 在题号后加 `_1`、`_2` 等序号; 答案或解析中的必要图片可在题号后加 `_答案`, 例如:
+
+``` text
+images/2023-2024学年下学期期末_B_第6题_1.png
+images/2023-2024学年下学期期末_B_第6题_2.png
+images/2024-2025学年上学期期中_分析与设计题_第2题_答案_1.png
+images/2024-2025学年上学期期中_分析与设计题_第2题_答案_2.png
+```
+
- Markdown 中使用相对路径引用图片:
``` markdown
@@ -139,5 +234,6 @@ images/2023-2024学年下学期期末_B_第6题.png
```
- 页眉、学校 logo、空白答题框、装饰线等非题目必要内容通常不需要保留。
+- 协议伪代码、短程序、ASCII 图、可读性好的波形图优先使用代码块, 不必截图; 复杂拓扑图、坐标图、手写图、表格截图等无法稳定转写的内容再放入 `images/`。
有搞不懂样式怎么写的可以询问开发团队
diff --git "a/docs/undergraduate/\345\244\226\350\257\255\345\255\246\351\231\242/\351\253\230\347\272\247\346\227\245\350\257\2551/README.md" "b/docs/undergraduate/\345\244\226\350\257\255\345\255\246\351\231\242/\351\253\230\347\272\247\346\227\245\350\257\2551/README.md"
index e22ba89..d96c4f5 100644
--- "a/docs/undergraduate/\345\244\226\350\257\255\345\255\246\351\231\242/\351\253\230\347\272\247\346\227\245\350\257\2551/README.md"
+++ "b/docs/undergraduate/\345\244\226\350\257\255\345\255\246\351\231\242/\351\253\230\347\272\247\346\227\245\350\257\2551/README.md"
@@ -3,6 +3,6 @@ title: 高级日语1
course_code: SFLK3117
---
-## 2024-2025学年上学期
+## 推荐教材与参考资料
-[日语综合教程+第五册+(陆静华+谭晶华)+(9787544649636)](https://drive.vanillaaaa.org/SharedCourses/外语学院/日语综合教程+第五册+(陆静华+谭晶华)+(9787544649636).pdf)
+- [日语综合教程第五册(陆静华、谭晶华,ISBN 9787544649636)](https://github.com/BetterECNU/SharedResources/blob/main/SFLK/SFLK3117/推荐教材与参考资料/日语综合教程+第五册+%28陆静华+谭晶华%29+%289787544649636%29.pdf)
diff --git "a/docs/undergraduate/\345\244\226\350\257\255\345\255\246\351\231\242/\351\253\230\347\272\247\346\227\245\350\257\2552/README.md" "b/docs/undergraduate/\345\244\226\350\257\255\345\255\246\351\231\242/\351\253\230\347\272\247\346\227\245\350\257\2552/README.md"
index 0586a07..07754f8 100644
--- "a/docs/undergraduate/\345\244\226\350\257\255\345\255\246\351\231\242/\351\253\230\347\272\247\346\227\245\350\257\2552/README.md"
+++ "b/docs/undergraduate/\345\244\226\350\257\255\345\255\246\351\231\242/\351\253\230\347\272\247\346\227\245\350\257\2552/README.md"
@@ -3,6 +3,6 @@ title: 高级日语2
course_code: SFLK3119
---
-## 2024-2025学年下学期
+## 推荐教材与参考资料
-[日语综合教程第六册](https://drive.vanillaaaa.org/SharedCourses/外语学院/日语综合教程第六册.pdf)
+- [日语综合教程第六册](https://github.com/BetterECNU/SharedResources/blob/main/SFLK/SFLK3119/推荐教材与参考资料/日语综合教程第六册.pdf)
diff --git "a/docs/undergraduate/\345\244\247\345\255\246\350\213\261\350\257\255\346\225\231\345\255\246\351\203\250/\350\213\261\350\257\255\347\225\205\350\260\210\344\270\255\345\233\275\346\226\207\345\214\226/README.md" "b/docs/undergraduate/\345\244\247\345\255\246\350\213\261\350\257\255\346\225\231\345\255\246\351\203\250/\350\213\261\350\257\255\347\225\205\350\260\210\344\270\255\345\233\275\346\226\207\345\214\226/README.md"
index 9de3fd8..15fb0bd 100644
--- "a/docs/undergraduate/\345\244\247\345\255\246\350\213\261\350\257\255\346\225\231\345\255\246\351\203\250/\350\213\261\350\257\255\347\225\205\350\260\210\344\270\255\345\233\275\346\226\207\345\214\226/README.md"
+++ "b/docs/undergraduate/\345\244\247\345\255\246\350\213\261\350\257\255\346\225\231\345\255\246\351\203\250/\350\213\261\350\257\255\347\225\205\350\260\210\344\270\255\345\233\275\346\226\207\345\214\226/README.md"
@@ -19,4 +19,4 @@ course_code: SFLE0030
#### 教学资源
-- [判断题全解+复习](https://drive.vanillaaaa.org/SharedCourses/大学英语教学部/英语畅谈中国文化/2024-2025学年下学期/胡婧/判断+复习.pdf)
+- [判断题全解+复习](https://github.com/BetterECNU/SharedResources/blob/main/SFLE/SFLE0030/2024-2025学年下学期/胡婧/判断题全解+复习.pdf)
diff --git "a/docs/undergraduate/\345\244\247\345\255\246\350\213\261\350\257\255\346\225\231\345\255\246\351\203\250/\350\213\261\350\257\255\347\237\255\347\257\207\345\260\217\350\257\264\350\265\217\346\236\220/2023-2024\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\345\244\247\345\255\246\350\213\261\350\257\255\346\225\231\345\255\246\351\203\250/\350\213\261\350\257\255\347\237\255\347\257\207\345\260\217\350\257\264\350\265\217\346\236\220/2023-2024\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
index 154b4f5..7bd91c0 100644
--- "a/docs/undergraduate/\345\244\247\345\255\246\350\213\261\350\257\255\346\225\231\345\255\246\351\203\250/\350\213\261\350\257\255\347\237\255\347\257\207\345\260\217\350\257\264\350\265\217\346\236\220/2023-2024\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
+++ "b/docs/undergraduate/\345\244\247\345\255\246\350\213\261\350\257\255\346\225\231\345\255\246\351\203\250/\350\213\261\350\257\255\347\237\255\347\257\207\345\260\217\350\257\264\350\265\217\346\236\220/2023-2024\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -4,10 +4,12 @@ title: 2023-2024学年下学期期末
## 2023-2024学年下学期期末试卷(A)——张佳秋
-考试科目:英语短篇小说赏析
-任课教师:张佳秋
-考试形式:闭卷
-考试时间:90 分钟
+### 说明
+
+- 考试科目:英语短篇小说赏析
+- 任课教师:张佳秋
+- 考试形式:闭卷
+- 考试时间:90 分钟
### I. Translation(20%)
diff --git "a/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..35b61df
--- /dev/null
+++ "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,695 @@
+---
+title: 2021-2022学年下学期期末
+---
+
+## 2021-2022学年下学期期末试卷(A)(含答案)
+
+### 一、选择题
+
+1. 中断处理和子程序调用都需要压栈以保护现场。中断处理一定会保存而子程序调用不需要保存其内容的是( )。
+
+ A. 程序计数器
+
+ B. 程序状态字寄存器
+
+ C. 通用数据寄存器
+
+ D. 通用地址寄存器
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 列选项中,不可能在用户态发生的事件是( )。
+
+ A. 系统调用
+
+ B. 外部中断
+
+ C. 进程切换
+
+ D. 缺页
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+3. 一次性分配所有资源的方法可以预防死锁的发生,这种方法破坏的是产生死锁的 4 个必要条件中的( )。
+
+ A. 互斥条件
+
+ B. 占有并请求
+
+ C. 不剥夺条件
+
+ D. 循环等待
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. ( )有利于 CPU 繁忙型的作业,而不利于 I/O 繁忙型的作业(进程)。
+
+ A. 时间片轮转调度算法
+
+ B. 先来先服务调度算法
+
+ C. 短作业(进程)优先调度算法
+
+ D. 优先权调度算法
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 下列选项中,导致创建新进程的操作是( )。
+
+ I. 用户登录成功 II. 设备分配 III. 启动程序执行
+
+ A. 仅 I 和 II
+
+ B. 仅 II 和 III
+
+ C. 仅 I 和 III
+
+ D. I,II,III
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+6. 若 I/O 所花费的时间比 CPU 的处理时间短很多,则缓冲区( )。
+
+ A. 最有效
+
+ B. 几乎无效
+
+ C. 均衡
+
+ D. 以上都不是
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+7. 采用 SPOOLing 技术将磁盘的一部分作为公共缓冲区以代替打印机,用户对打印机的操作实际上是对磁盘的存储操作,用以代替打印机的部分是( )。
+
+ A. 独占设备
+
+ B. 共享设备
+
+ C. 虚拟设备
+
+ D. 一般物理设备
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+8. 设某文件为索引顺序文件,由 5 个逻辑记录组成,每个逻辑记录的大小与磁盘块的大小相等,均为 $512\ \text{B}$,并依次存放在 50,121,75,80,63 号磁盘块上。若要存取文件的第 1569 逻辑字节处的信息,则要访问( )号磁盘块。
+
+ A. 3
+
+ B. 75
+
+ C. 80
+
+ D. 63
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+9. 现有一个容量为 $10\ \text{GB}$ 的磁盘分区,磁盘空间以簇(Cluster)为单位进行分配,簇的大小为 $4\ \text{KB}$,若采用位图法管理该分区的空闲空间,即用位(bit)标识一个簇是否被分配,则存放该位图所需簇的个数为( )。
+
+ A. 80
+
+ B. 320
+
+ C. 80K
+
+ D. 320K
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+10. 假设一个“按需调页”虚拟存储空间,页表由寄存器保存。在存在空闲页帧的条件下,处理一次缺页的时间是 $8\ \text{ms}$。如果没有空闲页面,但待换出页面并未更改,处理一次缺页的时间也是 $8\ \text{ms}$。若待换出页面已被更改,则需要 $20\ \text{ms}$。访问一次内存的时间是 $100\ \text{ns}$。假设 70% 的待换出页面已被更改,请问缺页率不超过( )才能保证有效访问时间小于或等于 $200\ \text{ns}$?
+
+ A. $0.6\times 10^{-4}$
+
+ B. $1.2\times 10^{-4}$
+
+ C. $0.6\times 10^{-5}$
+
+ D. $1.2\times 10^{-5}$
+
+
+ 答案:
+
+ C。题目并没有明确当缺页中断时内存中是否有空闲页帧,所以假设内存总是忙的。设缺页率为 $P$。
+
+
+
+ ***
+
+11. 设有 8 页的逻辑空间,每页有 $1024\ \text{B}$,它们被映射到 32 块的物理存储区中。那么,逻辑地址的有效位是( )位,物理地址至少是( )位。
+
+ A. 10,11
+
+ B. 12,14
+
+ C. 13,15
+
+ D. 14,16
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+12. 下列存储管理方式中,会产生内部碎片的是( )。
+
+ I. 请求分段存储管理
+
+ II. 请求分页存储管理
+
+ III. 段页式分区管理
+
+ IV. 固定式分区管理
+
+ A. I、II、III
+
+ B. III,IV
+
+ C. 只有 II
+
+ D. II、III、IV
+
+
+ 答案:
+
+ D
+
+
+
+***
+
+### 二、填空题
+
+13. MS-DOS 启动的方式有两种:$\underline{\qquad}$ 和 $\underline{\qquad}$。
+
+
+ 答案:
+
+ 冷启动、热启动
+
+
+
+ ***
+
+14. 为了防止各种系统故障破坏文件,文件系统可以采用 $\underline{\qquad}$ 和 $\underline{\qquad}$ 两种方法在保护文件。
+
+
+ 答案:
+
+ 建立副本、定时转储
+
+
+
+ ***
+
+15. UNIX 系统规定用户使用文件的权限是读、$\underline{\qquad}$ 和 $\underline{\qquad}$ 三种。
+
+
+ 答案:
+
+ 写、执行
+
+
+
+ ***
+
+16. 操作系统中,进程调度通常有先来先服务、$\underline{\qquad}$、$\underline{\qquad}$ 和分级调度算法等调度算法。
+
+
+ 答案:
+
+ 优先数调度算法、时间片轮转调度算法
+
+
+
+ ***
+
+17. 不可中断的过程称为 $\underline{\qquad}$。
+
+
+ 答案:
+
+ 原语
+
+
+
+ ***
+
+18. 网络操作系统把计算机网络中的各台计算机有机地联结起来,实现各台计算机之间的 $\underline{\qquad}$ 及网络中各种资源的 $\underline{\qquad}$。
+
+
+ 答案:
+
+ 通信、共享
+
+
+
+ ***
+
+19. 能使计算机系统接收到 $\underline{\qquad}$ 后及时进行处理,并在严格的规定时间内处理结束,再给出 $\underline{\qquad}$ 的操作系统称为“实时操作系统”。
+
+
+ 答案:
+
+ 外部信号、反馈信号
+
+
+
+ ***
+
+20. 在批处理兼分时的系统中,往往由分时系统控制的作业称为 $\underline{\qquad}$ 前台作业,而由批处理系统控制的作业称为 $\underline{\qquad}$。
+
+
+ 答案:
+
+ 前台作业、后台作业
+
+
+
+***
+
+### 三、判断题
+
+21. 大多数虚拟系统采用 OPT。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+22. 在页式虚拟存储系统中,页面长度是根据程序长度动态地分配的。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+23. 由于 P、V 操作描述同步、互斥等问题的能力不足,所以有必要引入其它的通讯原语或机制,如 send,receive 或 Monitor 等。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+24. 设置中断屏蔽指令可以在目态下执行。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+25. 文件系统的主要目的是存储系统文档。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+26. 参与死锁的所有进程都占有资源。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+27. 进程在运行中,可以自行修改自己的进程控制块。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+28. 清内存指令只能在管态下执行。( )
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+29. 如果输入输出所用的时间比处理时间短得多,则缓冲区最有效。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+30. 由于现代操作系统提供了程序共享的功能,所以要求被共享的程序必须是可再入程序。( )
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+31. 进程控制块中的所有信息必须常驻内存。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+32. 一旦出现死锁,所有进程都不能运行。( )
+
+
+ 答案:
+
+ 错
+
+
+
+***
+
+### 四、名词解释题
+
+33. 并发:
+
+
+ 答案:
+
+ 是指两个或多个活动在同一给定的时间间隔中进行。
+
+
+
+ ***
+
+34. 存储设备:
+
+
+ 答案:
+
+ 它们是指计算机用来存储信息的设备,如磁盘(硬盘和软盘)、磁带等。
+
+
+
+ ***
+
+35. 通道:
+
+
+ 答案:
+
+ 是独立于 CPU 的、专门负责数据输入输出的处理单元。
+
+
+
+ ***
+
+36. 可重定位地址:
+
+
+ 答案:
+
+ 当含有它的程序被重定位时,将随之被调整的一种地址。
+
+
+
+ ***
+
+37. 外部碎片:
+
+
+ 答案:
+
+ 在所有分区之外新产生的碎片称作外部碎片,如在动态分区法实施过程中出现的越来越多的小空闲块,由于它们太小,无法装入一个小进程,因而被浪费掉。
+
+
+
+ ***
+
+38. 交换调度:
+
+
+ 答案:
+
+ 是基于系统确定的某个策略,将主存中处于等待状态或就绪状态的某个或某些进程交换到外存交换区中,以便将外存交换区上具备运行条件的进程换入主存,准备执行。引入交换调度的目的是为了解决主存紧张和提高主存的利用效率。
+
+
+
+***
+
+### 五、简答题
+
+39. 虚拟存储器的基本特征是什么?虚拟存储器的容量主要受到哪两方面的限制?
+
+
+ 答案:
+
+ 虚拟存储器的基本特征是:① 虚拟扩充,即不是物理上而是逻辑上扩充了内存容量;② 部分装入,即每个作业不是全部一次性地装入内存,而是只装入一部分;③ 离散分配,即不必占用连续的内存空间,而是“见缝插针”;④ 多次对换,即所需的全部程序和数据要分成多次调入内存。虚拟存储器的容量主要受到指令中表示地址的字长和外存的容量的限制。
+
+
+
+ ***
+
+40. 一个具有分时兼批处理功能的操作系统应怎样调度和管理作业?
+
+
+ 答案:
+
+ 1)优先接纳终端作业,仅当终端作业数小于系统可以允许同时工作的作业数时,可以调度批处理作业;
+
+ 2)允许终端作业和批处理作业混合同时执行;
+
+ 3)把终端作业的就绪进程排成一个就绪队列,把批处理作业的就绪进程排入另外的就绪队列中;
+
+ 4)有终端作业进程就绪时,优先让其按“时间片轮转”法先运行。没有终端作业时再按确定算法选批处理作业就绪进程运行。
+
+
+
+ ***
+
+41. 什么是快表?它在地址转换中起什么作用?
+
+
+ 答案:
+
+ 快表是一个高速、具有并行查询能力的联想存储器,用于存放正运行的进程的当前页号和块号,或者段号和段起始地址。加入快表后,在地址转换时,首先在快表中查找,若找到就直接进行地址转换;未找到,则在主存页表继续查找,并把查到的页号和块号放入联想存储器中。快表的命中率很高,有效地提高了地址转换的速度。
+
+
+
+ ***
+
+42. 处理机调度分为哪三级?各自的主要任务是什么?
+
+
+ 答案:
+
+ 作业调度:从一批后备作业中选择一个或几个作业,给它们分配资源,建立进程,挂入就绪队列。执行完后,回收资源。
+
+ 进程调度:从就绪进程队列中根据某个策略选取一个进程,使之占用 CPU。
+
+ 交换调度:按照给定的原则和策略,将外存交换区中的进程调入内存,把内存中的非执行进程交换到外存交换区。
+
+
+
+ ***
+
+43. 为什么说批处理多道系统能极大地提高计算机系统的工作效率?
+
+
+ 答案:
+
+ ① 多道作业并行工作,减少了处理器的空闲时间;
+
+ ② 作业调度可以合理选择装入主存储器中的作业,充分利用计算机系统的资源;
+
+ ③ 作业执行过程中不再访问低速设备,而直接访问高速的磁盘设备,缩短执行时间;
+
+ ④ 作业成批输入,减少了从操作到作业的交接时间。
+
+
+
+ ***
+
+44. 从资源管理的角度说明操作系统的主要功能?
+
+
+ 答案:
+
+ 处理器管理,存储管理,文件管理,作业管理和设备管理。
+
+
+
+***
+
+### 六、综合题
+
+45. 设有一个发送者进程和接收者进程,其流程图如图所示。s 是用于实现进程同步的信号量,mutex 是用于实现进程互斥的信号量。试问流程图中的 A、B、C、D 矩形框中应填写什么?假定缓冲区有无限多个,s 和 mutex 的初值应为多少?
+
+ 
+
+
+ 答案:
+
+ A、B、C、D 矩形框中分别应该填写 P(mutex)、V(mutex),P(s),P(mutex)。s 是一资源信号量,用来表示信息链中信息的个数,故其初值应设置为 0;mutex 是用来实现对信息链互斥访问的互斥信号量,故其初值应设置为 1。
+
+
+
+ ***
+
+46. 有一个烟草供应商和 3 个抽烟者。抽烟者若要抽烟,必须具有烟叶、烟纸和火柴。3 个抽烟者中,一个有烟叶、一个有烟纸、一个有火柴。烟草供应商会源源不断地分别供应烟叶、烟纸和火柴,并将它们放在桌上。若他放的是烟纸和火柴,则有烟叶的抽烟者会拾起烟纸和火柴制作香烟,然后抽烟;其他类推。试用信号量同步烟草供应商和 3 个抽烟者。
+
+
+ 答案:
+
+ ```text
+ Semaphore smoker[3]=(0,0,0);
+ Semaphore material[3]=(0,0,0);
+ Semaphore agent=1;
+ Int turn=0;
+
+ Agent()
+ {
+ While(true)
+ {
+ P(agent);
+ V(smoker[turn]);
+ V(material[(turn+1)%3]);
+ V(material[(turn+2)%3]);
+ turn=(turn+1)%3;
+ }
+ }
+
+ Smoker i()
+ {
+ While(true)
+ {
+ P(smoker[i]);
+ P(material[(i+1)%3]);
+ P(material[(i+2)%3]);
+ V(agent);
+ Smoke;
+ }
+ }
+ ```
+
+
+
+ ***
+
+47. 假设一台计算机有 $32\ \text{MB}$ 内存,操作系统占用 $2\ \text{MB}$,每个用户进程占用 $10\ \text{MB}$。用户进程等待 I/O 的时间为 80%,问 CPU 的利用率为多少?若再增加 $32\ \text{MB}$ 内存,则 CPU 的利用率又为多少?
+
+
+ 答案:
+
+ 只有当所有进程都在等待 I/O 时,CPU 才会空闲下来。因此需要算出所有进程都在等待 I/O 这种情况发生的概率。本题给出的条件为“用户进程等待 I/O 的时间为 80%”,也就是说进程等待 I/O 的概率为 80%,那么 $n$ 个进程都同时等待 I/O 的概率就为 $(80\%)^n$,则 CPU 的利用率 $u$ 可表示为:
+
+ $u=1-(80\%)^n=1-(0.8)^n$
+
+ 在内存为 $32\ \text{MB}$ 时,可容纳 $(32-2)/10=3$ 个用户进程,CPU 利用率为:
+
+ $u=1-(0.8)^3=48.8\%$
+
+ 在内存再增加 $32\ \text{MB}$ 时,可容纳 $(32+32-2)/10=6$ 个用户进程,CPU 利用率为:
+
+ $u=1-(0.8)^6=73.8\%$
+
+
diff --git "a/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/README.md" "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/README.md"
new file mode 100644
index 0000000..9d8e445
--- /dev/null
+++ "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/README.md"
@@ -0,0 +1,10 @@
+---
+title: 操作系统
+course_code: DATA3106
+---
+
+## 2021-2022学年下学期
+
+### 试卷
+
+- [2021-2022学年下学期期末试卷](./2021-2022学年下学期期末)
diff --git "a/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\254\25445\351\242\230.png" "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\254\25445\351\242\230.png"
new file mode 100644
index 0000000..4efe008
Binary files /dev/null and "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\254\25445\351\242\230.png" differ
diff --git "a/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\347\272\277\346\200\247\344\273\243\346\225\260\357\274\210\350\256\241\347\256\227\346\234\272\346\213\224\345\260\226\345\237\272\345\234\260\357\274\211.md" "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\347\272\277\346\200\247\344\273\243\346\225\260\357\274\210\350\256\241\347\256\227\346\234\272\346\213\224\345\260\226\345\237\272\345\234\260\357\274\211.md"
deleted file mode 100644
index c85c503..0000000
--- "a/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\347\272\277\346\200\247\344\273\243\346\225\260\357\274\210\350\256\241\347\256\227\346\234\272\346\213\224\345\260\226\345\237\272\345\234\260\357\274\211.md"
+++ /dev/null
@@ -1,13 +0,0 @@
----
-title: 线性代数(计算机拔尖基地)
----
-
-> 2023Fall 与 2024Fall 的《线性代数(计算机拔尖基地)》由btm老师授课.
->
-> 而众所周知btm老师也在软件工程学院教授《线性代数》.
->
-> 因此可以同时参考[软件工程学院-线性代数](../软件工程学院/线性代数/)的真题卷.
-
-## 真题卷
-
-[2023-2024学年上学期_期中_A_部分](https://drive.vanillaaaa.org/SharedCourses/数据科学与工程学院/线性代数(计算机拔尖基地)/2023-2024学年上学期_期中_A_部分.jpg)
diff --git "a/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\347\272\277\346\200\247\344\273\243\346\225\260\357\274\210\350\256\241\347\256\227\346\234\272\346\213\224\345\260\226\345\237\272\345\234\260\357\274\211/2023-2024\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\347\272\277\346\200\247\344\273\243\346\225\260\357\274\210\350\256\241\347\256\227\346\234\272\346\213\224\345\260\226\345\237\272\345\234\260\357\274\211/2023-2024\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..983e29e
--- /dev/null
+++ "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\347\272\277\346\200\247\344\273\243\346\225\260\357\274\210\350\256\241\347\256\227\346\234\272\346\213\224\345\260\226\345\237\272\345\234\260\357\274\211/2023-2024\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,150 @@
+## 2023-2024学年上学期期中试卷(A)
+
+### 一、(15 分)
+
+计算行列式
+
+a)
+
+$$
+D=
+\begin{vmatrix}
+a & b & c & d \\
+a & a+b & a+b+c & a+b+c+d \\
+a & 2a+b & 3a+2b+c & 4a+3b+2c+d \\
+a & 3a+b & 6a+3b+c & 10a+6b+3c+d
+\end{vmatrix}
+$$
+
+b)
+
+$$
+\begin{vmatrix}
+x_1-a_1 & x_2 & x_3 & \cdots & x_n \\
+x_1 & x_2-a_2 & x_3 & \cdots & x_n \\
+x_1 & x_2 & x_3-a_3 & \cdots & x_n \\
+\cdots & \cdots & \cdots & \cdots & \cdots \\
+x_1 & x_2 & x_3 & \cdots & x_n-a_n
+\end{vmatrix}
+$$
+
+***
+
+### 二、(15 分)
+
+已知
+
+$$
+A=
+\begin{pmatrix}
+1 & 2 & \cdots & n \\
+2 & 3 & \cdots & n+1
+\end{pmatrix},\quad n\ge 2,
+$$
+
+求 $\det(AA^T)$ 与 $\det(A^TA)$。
+
+***
+
+### 三、(10 分)
+
+已知 $a^2\ne b^2$,证明方程组
+
+$$
+\left\{
+\begin{aligned}
+ax_1 + bx_{2n} &= 1,\\
+ax_2 + bx_{2n-1} &= 1,\\
+&\cdots\\
+ax_n + bx_{n+1} &= 1,\\
+bx_n + ax_{n+1} &= 1,\\
+&\cdots\\
+bx_2 + ax_{2n-1} &= 1,\\
+bx_1 + ax_{2n} &= 1
+\end{aligned}
+\right.
+$$
+
+有唯一解,并求解。
+
+***
+
+### 四、(10 分)
+
+问 $\lambda,\mu$ 取何值时,齐次线性方程组
+
+$$
+\begin{cases}
+\lambda x_1+x_2+x_3=0,\\
+x_1+\mu x_2+x_3=0,\\
+x_1+2\mu x_2+x_3=0
+\end{cases}
+$$
+
+有非零解?
+
+***
+
+### 五、(15 分)
+
+设 $n$ 阶方阵
+
+$$
+A=
+\begin{pmatrix}
+2a & 1 & 0 & \cdots & 0 \\
+a^2 & 2a & 1 & \cdots & 0 \\
+0 & a^2 & 2a & \cdots & 0 \\
+\vdots & \vdots & \vdots & \ddots & 1 \\
+0 & 0 & 0 & a^2 & 2a
+\end{pmatrix}.
+$$
+
+a) 求 $\det(A)$;
+
+b) 若方程组 $Ax=b$ 有唯一解,$a$ 应该如何取值,其中
+
+$$
+b=(1,0,\cdots,0)^T;
+$$
+
+c) 求方程组的解。
+
+***
+
+### 六、(10 分)
+
+设 $\alpha=(-1,0,1)^T$,矩阵 $A=3I-\alpha\alpha^T$。
+
+a) 求矩阵 $A$;
+
+b) $A$ 是否可逆?若可逆,求 $A^{-1}$。
+
+***
+
+### 七、(15 分)
+
+设 $n$ 阶方阵 $A,B$ 满足 $A+B=AB$。
+
+a) 证明:$A-I$ 可逆。
+
+b) 证明:$AB=BA$。
+
+c) 若
+
+$$
+B=
+\begin{pmatrix}
+1 & 2 & 0 \\
+3 & 4 & 0 \\
+0 & 0 & 5
+\end{pmatrix},
+$$
+
+求 $A$。
+
+***
+
+### 八、(10 分)
+
+设 $n$ 阶方阵 $A,B$ 和 $A+B$ 均可逆,证明:$A^{-1}+B^{-1}$ 也可逆,并求并求其逆矩阵。
diff --git "a/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\347\272\277\346\200\247\344\273\243\346\225\260\357\274\210\350\256\241\347\256\227\346\234\272\346\213\224\345\260\226\345\237\272\345\234\260\357\274\211/README.md" "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\347\272\277\346\200\247\344\273\243\346\225\260\357\274\210\350\256\241\347\256\227\346\234\272\346\213\224\345\260\226\345\237\272\345\234\260\357\274\211/README.md"
new file mode 100644
index 0000000..7747f9f
--- /dev/null
+++ "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\347\272\277\346\200\247\344\273\243\346\225\260\357\274\210\350\256\241\347\256\227\346\234\272\346\213\224\345\260\226\345\237\272\345\234\260\357\274\211/README.md"
@@ -0,0 +1,16 @@
+---
+title: 线性代数(计算机拔尖基地)
+course_code: DATA1602
+---
+
+> 2023Fall 与 2024Fall 的《线性代数(计算机拔尖基地)》由btm老师授课.
+>
+> 而众所周知btm老师也在软件工程学院教授《线性代数》.
+>
+> 因此可以同时参考[软件工程学院-线性代数](../../软件工程学院/线性代数/)的真题卷.
+
+## 2023-2024学年上学期
+
+### 试卷
+
+- [2023-2024学年上学期期中试卷](./2023-2024学年上学期期中)
diff --git "a/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/2025-2026\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\345\211\215\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\346\213\224\345\260\226\345\237\272\345\234\260\351\201\264\351\200\211\347\254\224\350\257\225.md" "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\346\213\224\345\260\226\345\237\272\345\234\260\351\201\264\351\200\211/2025-2026\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237.md"
similarity index 98%
rename from "docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/2025-2026\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\345\211\215\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\346\213\224\345\260\226\345\237\272\345\234\260\351\201\264\351\200\211\347\254\224\350\257\225.md"
rename to "docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\346\213\224\345\260\226\345\237\272\345\234\260\351\201\264\351\200\211/2025-2026\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237.md"
index 719caeb..1b47730 100644
--- "a/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/2025-2026\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\345\211\215\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\346\213\224\345\260\226\345\237\272\345\234\260\351\201\264\351\200\211\347\254\224\350\257\225.md"
+++ "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\346\213\224\345\260\226\345\237\272\345\234\260\351\201\264\351\200\211/2025-2026\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237.md"
@@ -1,8 +1,10 @@
---
-title: 2025-2026学年上学期前计算机科学拔尖基地遴选笔试
+title: 2025-2026学年上学期
---
-## 一、选择题
+## 2025-2026学年上学期笔试
+
+### 一、选择题
:::info
选择题共10道 未展示部分是高考数学排列组合的内容,并且难度低于全国卷高考
@@ -95,7 +97,7 @@ title: 2025-2026学年上学期前计算机科学拔尖基地遴选笔试
-## 二、填空题
+### 二、填空题
1. 一个小猴子边上有100根香蕉,它要走过50米才能到家,每次最多搬50根香蕉(多了就被压死),每走1米就要吃掉一根。
问:它最多能把多少根香蕉搬到家里?
@@ -185,7 +187,7 @@ title: 2025-2026学年上学期前计算机科学拔尖基地遴选笔试
-## 三、简答题
+### 三、简答题
1. 有一枚不均匀的硬币,掷出正面朝上的概率为 70%,反面为 30%。如何高效地构造一个概率为 50% 的公平事件?
diff --git "a/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\346\213\224\345\260\226\345\237\272\345\234\260\351\201\264\351\200\211/README.md" "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\346\213\224\345\260\226\345\237\272\345\234\260\351\201\264\351\200\211/README.md"
new file mode 100644
index 0000000..bb74a74
--- /dev/null
+++ "b/docs/undergraduate/\346\225\260\346\215\256\347\247\221\345\255\246\344\270\216\345\267\245\347\250\213\345\255\246\351\231\242/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\346\213\224\345\260\226\345\237\272\345\234\260\351\201\264\351\200\211/README.md"
@@ -0,0 +1,9 @@
+---
+title: 计算机科学拔尖基地遴选
+---
+
+## 2025-2026学年上学期
+
+### 试卷
+
+[2025-2026学年上学期笔试](./2025-2026学年上学期)
\ No newline at end of file
diff --git "a/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\345\244\247\345\255\246\347\211\251\347\220\206C/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\345\244\247\345\255\246\347\211\251\347\220\206C/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
index 2d64e3a..10d6c38 100644
--- "a/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\345\244\247\345\255\246\347\211\251\347\220\206C/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
+++ "b/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\345\244\247\345\255\246\347\211\251\347\220\206C/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -8,6 +8,7 @@ title: 2024-2025学年下学期期末
- 此卷也用于大物C免听考试,详见[物理与电子科学学院物理学系免听不免考试行方案](https://phy.ecnu.edu.cn/_upload/article/files/87/8e/6616f5924ffa8b4ae426d4858a5d/d5a0a0c4-65d9-4e8c-aa46-5b993b13fc32.pdf)。
- 通常来说,期末考试A卷不会有简答题,但是B卷出现了简答题...
+- 试卷内容几乎不全并且大部分没有数据,仅供参考。
### 一、选择题(每小题 3 分,共 24 分)
diff --git "a/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\347\203\255\345\255\246/README.md" "b/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\347\203\255\345\255\246/README.md"
index 9817470..35bcebd 100644
--- "a/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\347\203\255\345\255\246/README.md"
+++ "b/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\347\203\255\345\255\246/README.md"
@@ -3,4 +3,6 @@ title: 热学
course_code: PHYS1503
---
-- [部分 ppt](https://github.com/BetterECNU/SharedResources/tree/main/PHYS/PHYS1503/Slides)
+## 推荐教材与参考资料
+
+- [Slides](https://github.com/BetterECNU/SharedResources/tree/main/PHYS/PHYS1503/推荐教材与参考资料/Slides)
diff --git "a/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\347\224\265\347\243\201\345\255\246/README.md" "b/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\347\224\265\347\243\201\345\255\246/README.md"
index c1e314e..75a38d3 100644
--- "a/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\347\224\265\347\243\201\345\255\246/README.md"
+++ "b/docs/undergraduate/\347\211\251\347\220\206\345\255\246\347\263\273/\347\224\265\347\243\201\345\255\246/README.md"
@@ -3,4 +3,6 @@ title: 电磁学
course_code: PHYS1502
---
-- [部分 ppt](https://github.com/BetterECNU/SharedResources/tree/main/PHYS/PHYS1502/Slides)
+## 推荐教材与参考资料
+
+- [Slides](https://github.com/BetterECNU/SharedResources/tree/main/PHYS/PHYS1502/推荐教材与参考资料/Slides)
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\344\272\272\345\267\245\346\231\272\350\203\275\347\232\204\346\225\260\345\255\246\346\200\235\347\273\264/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\344\272\272\345\267\245\346\231\272\350\203\275\347\232\204\346\225\260\345\255\246\346\200\235\347\273\264/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
index 639834b..ff133e9 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\344\272\272\345\267\245\346\231\272\350\203\275\347\232\204\346\225\260\345\255\246\346\200\235\347\273\264/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\344\272\272\345\267\245\346\231\272\350\203\275\347\232\204\346\225\260\345\255\246\346\200\235\347\273\264/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -2,12 +2,14 @@
title: 2024-2025学年下学期期末
---
-:::tip
-1956年达特茅斯会议之前的数学史没有考察。概念知识是考试的核心,需要重点掌握。发展史的内容仅在简答题中涉及,相对次要。
-:::
-
## 2024-2025学年下学期期末试卷(A)
+### 说明
+
+- 1956年达特茅斯会议之前的数学史没有考察。
+- 概念知识是考试的核心,需要重点掌握。
+- 发展史的内容仅在简答题中涉及,相对次要。
+
### 一、单选题(共 10 小题,每小题 2 分,共 20 分)
:::tip
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\344\272\272\345\267\245\346\231\272\350\203\275\347\232\204\346\225\260\345\255\246\346\200\235\347\273\264/README.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\344\272\272\345\267\245\346\231\272\350\203\275\347\232\204\346\225\260\345\255\246\346\200\235\347\273\264/README.md"
index 451d05c..e9ede0e 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\344\272\272\345\267\245\346\231\272\350\203\275\347\232\204\346\225\260\345\255\246\346\200\235\347\273\264/README.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\344\272\272\345\267\245\346\231\272\350\203\275\347\232\204\346\225\260\345\255\246\346\200\235\347\273\264/README.md"
@@ -4,19 +4,24 @@ course_code: SE1212
---
## 2022-2023学年下学期
-考核方式为期末调研小论文, 我组内容是奇异值分解
+- 考核方式为期末调研小论文, 我组内容是奇异值分解
## 2024-2025学年下学期
-### 成绩构成
+### 吴敏
-- **平时成绩**: 40%
-- **期末成绩**: 60%
+#### 教学资源
-### 试卷
+- [Slides](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE1212/2024-2025学年下学期/吴敏/Slides)
-- [2024-2025学年下学期期末试卷](./2024-2025学年下学期期末)
+### 吴连涛
+
+- 推荐!不点名,几次小作业(可惜貌似只有这个学期开课一次)
#### 教学资源
-- [2024-2025学年下学期PPT](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/人工智能的数学思维/PPT)
+- [Slides](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE1212/2024-2025学年下学期/吴连涛/Slides)
+
+### 试卷
+
+- [2024-2025学年下学期期末试卷](./2024-2025学年下学期期末)
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\214\272\345\235\227\351\223\276\345\237\272\347\241\200/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\214\272\345\235\227\351\223\276\345\237\272\347\241\200/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
index e0d4d48..8daf5cf 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\214\272\345\235\227\351\223\276\345\237\272\347\241\200/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\214\272\345\235\227\351\223\276\345\237\272\347\241\200/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -1,23 +1,24 @@
---
title: 2024-2025学年下学期期末
---
-## 2025春季学期区块链基础期末考试试卷(回忆版)
+## 2024-2025学年下学期期末试卷
### 选择题
-选择题大多较简单, 只有一个比较神秘:
-
-智能合约的提出者是谁:
+:::tip
+选择题大多较简单, 只有一个比较神秘
+我只记得B选项是中本聪, ACD是什么没有印象
+:::
-A.
+1. 智能合约的提出者是谁:
-B.Nakamoto Satoshi
+ A.
-C.
+ B.Nakamoto Satoshi
-D.
+ C.
-我只记得B选项是中本聪, ACD是什么没有印象
+ D.
### 填空题
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\214\272\345\235\227\351\223\276\345\237\272\347\241\200/README.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\214\272\345\235\227\351\223\276\345\237\272\347\241\200/README.md"
index aa6554f..cdbfb88 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\214\272\345\235\227\351\223\276\345\237\272\347\241\200/README.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\214\272\345\235\227\351\223\276\345\237\272\347\241\200/README.md"
@@ -5,11 +5,13 @@ course_code: SE3324
## 2024-2025学年下学期
+### 试卷
+
+- [2024-2025学年下学期期末试卷](./2024-2025学年下学期期末)
+
### 鲍海勇
-#### 教学资料
+#### 教学资源
-- [南京大学慕课](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/区块链基础/2024-2025学年下学期/课件/南京大学慕课)
-- [蚂蚁区块链](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/区块链基础/2024-2025学年下学期/课件/蚂蚁区块链)
-- [作业](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/区块链基础/2024-2025学年下学期/作业)
-- [2024-2025学年下学期期末](./2024-2025学年下学期期末)
+- [Slides](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE3324/2024-2025学年下学期/鲍海勇/Slides)
+- [Homework](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE3324/2024-2025学年下学期/鲍海勇/Homework)
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/2019-2020\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/2019-2020\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..0f83ce6
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/2019-2020\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,103 @@
+---
+title: 2019-2020学年下学期期末
+---
+
+## 2019-2020学年下学期期末试卷(A)
+
+### 一、不定项选择题(选择一个或多个正确选项,20 分,每题 4 分)
+
+1. 对并行程序描述正确的是( )。
+
+ A. 减少所有系统开销
+
+ B. 要求资源共享
+
+ C. 提高系统运行速度和处理能力
+
+ D. 电源管理能力更强
+
+ ***
+
+2. 以下属于读后写的数据依赖关系的是( )。
+
+ A. $a=2$;$b=20$
+
+ B. $a=b+1$;$a=4$
+
+ C. $b=a$;$b=2$
+
+ D. $a=b+1$;$b=4$
+
+ ***
+
+3. 对于共享内存系统描述不正确的是( )。
+
+ A. 处理器拥有自己独特的地址空间
+
+ B. 处理器间以隐式的通信完成数据共享
+
+ C. 线程间的协调通过共享变量的锁和屏障实现
+
+ D. 每个处理器可以访问每个内存空间
+
+ ***
+
+4. 在 OpenMP 中,下列哪些是共享的( )。
+
+ A. shared variables
+
+ B. loop index
+
+ C. static variables
+
+ D. private variables
+
+ ***
+
+5. 以下关于消息传递的描述中,正确的是( )。
+
+ A. 消息传递是共享内存并行编程的主要替代方案
+
+ B. 消息传递没有数据竞争
+
+ C. 消息传递是不可移植的
+
+ D. 对消息传递库的调用在单处理器上运行
+
+***
+
+### 二、简答题(30 分,每小题 10 分)
+
+1. 请简述什么是死锁?
+
+ ***
+
+2. 请简述 cache 映射的三种方式的原理。
+
+ ***
+
+3. 请简述指令级并行的流水线和多发射机制,及其两种多发射方法。
+
+***
+
+### 三、分析题(30 分,每小题 15 分)
+
+1. 某个程序需要运行 $10^{12}$ 条指令来解决一个特定问题,一个单处理器系统可以在 $10^6$ 秒(大约 11.6 天)内完成。所以,一个单处理器系统平均每秒运行 $10^6$ 条指令。现在假设程序已经实现并行化,可以在分布式内存系统上运行。该并行程序使用 $p$ 个处理器。每个处理器执行 $10^{12}/p$ 条指令并必须发送 $10^9(p-1)$ 条消息。执行该程序时,不会有额外的开销,即每个处理器执行完所有的指令并发送完所有的消息之后,程序就完成了,而不会有由诸如等待消息等事件所产生的延迟。那么,
+
+ 1. 假设发送一条消息需要耗费 $10^{-9}$ 秒。如果程序使用 1000 个处理器,每个处理器的速度和单个处理器运行串行程序的速度一样,那么该程序的运行需要多少时间?
+
+ 2. 假设发送一条消息需要耗费 $10^{-3}$ 秒。如果程序使用 1000 个处理器,那么该程序的运行需要多少时间?
+
+ ***
+
+2. 假定 `comm_sz=8`,`n=16`。
+
+ 1. 画一张图来说明进程 0 要分发 $n$ 个元素的数组,怎样使用拥有 `comm_sz` 个进程的树形结构的通信来实现 MPI_Scatter。
+
+ 2. 画一张图来说明原先分布在 `comm_sz` 个进程间的 $n$ 个数组元素由进程 0 保存,怎样使用树形结构的通信来实现 MPI_Gather。
+
+***
+
+### 四、程序题(20 分)
+
+1. 使用 OpenMP 实现生产者-消费者程序,其中一些线程是生产者,另外一些线程是消费者。它们将读出的文本行插入到一个共享的队列中。消费者从队列中取出文本行,并对文本行进行分词。符号是被空白符分开的单词,当消费者发现一个单词后,它将该单词输出到 stdout。(要求:输出的单词需要给出是哪个线程输出的)
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
index 7f321b2..cd5e3a4 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -2,11 +2,11 @@
title: 2024-2025学年下学期期末
---
-## 2025春季学期并行程序设计期末考试试卷(回忆版)
+## 2024-2025学年下学期期末试卷
-### 选择题
+### 说明
-选择题都较简单, 不做记录.
+- 选择题都较简单, 不做记录。
### 填空题
@@ -40,4 +40,6 @@ title: 2024-2025学年下学期期末
(其中loc_arr[]为每个进程拥有的局部数组, loc_n 为局部数组的大小, comm 为通讯器, global_avg 储存最终结果)
- (注:本题下方提供了会用到的 MPI 函数定义以供查阅, 不需要特意背诵接口. 不过奇怪的是考试中唯独没有提供 MPI_Allreduce 的定义, 比较诡异)
+ :::tip
+ 本题下方提供了会用到的 MPI 函数定义以供查阅, 不需要特意背诵接口. 不过奇怪的是考试中唯独没有提供 MPI_Allreduce 的定义, 比较诡异
+ :::
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/README.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/README.md"
index 3f0e814..6fd35cd 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/README.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/README.md"
@@ -3,6 +3,12 @@ title: 并行程序设计
course_code: SE2425
---
+## 2019-2020学年下学期
+
+### 试卷
+
+- [2019-2020学年下学期期末试卷](./2019-2020学年下学期期末)
+
## 2024-2025学年下学期
### 试卷
@@ -13,17 +19,10 @@ course_code: SE2425
#### 教学资源
-- [2024-2025学年下学期课件](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/并行程序设计/2024-2025学年下学期/课件)
-- [2024-2025学年下学期作业](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/并行程序设计/2024-2025学年下学期/作业)
+- [Slides](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE2425/2024-2025学年下学期/谷守珍/Slides)
+- [Homework](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE2425/2024-2025学年下学期/谷守珍/Homework)
## 推荐教材与参考资料
-- [并行程序设计导论](https://drive.vanillaaaa.org/d/SharedCourses/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%AD%A6%E9%99%A2/%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E5%AF%BC%E8%AE%BA.pdf?sign=v1EtFro7aKJbuG-4kyKAiV3dQf6kRNag6o1QPUNm2to=:0)
-
-## 古早资料(不建议使用)
-
-- [2008并行程序设计期末考试卷(missing-answer)](https://drive.vanillaaaa.org/d/SharedCourses/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%AD%A6%E9%99%A2/%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/%E5%8F%A4%E6%97%A9%E8%B5%84%E6%96%99/2008%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E8%80%83%E8%AF%95%E5%8D%B7(missing-answer).pdf?sign=atGUDTJcLpJUcYobwRLrjWYCbgFwcGjcYAukksi6l5w=:0)
-- [2011并行程序设计期末考试卷 - 参考答案](https://drive.vanillaaaa.org/d/SharedCourses/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%AD%A6%E9%99%A2/%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/%E5%8F%A4%E6%97%A9%E8%B5%84%E6%96%99/2011%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E8%80%83%E8%AF%95%E5%8D%B7%20-%20%E5%8F%82%E8%80%83%E7%AD%94%E6%A1%88.pdf?sign=hgEFhYizXwUmhGWORgCfgGOIVV4MNUL8S3unBwIPt-Q=:0)
-- [参考解答-2009-2010第一学期并行程序设计期末考试卷](https://drive.vanillaaaa.org/d/SharedCourses/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%AD%A6%E9%99%A2/%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/%E5%8F%A4%E6%97%A9%E8%B5%84%E6%96%99/%E5%8F%82%E8%80%83%E8%A7%A3%E7%AD%94%EF%BC%8D2009%EF%BC%8D2010%E7%AC%AC%E4%B8%80%E5%AD%A6%E6%9C%9F%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E8%80%83%E8%AF%95%E5%8D%B7.pdf?sign=ijnoA1gusQshYklKwB-dP2EnkW1VKyK59rfeykbSuLw=:0)
-- [参考解答-2010并行程序设计期末考试卷](https://drive.vanillaaaa.org/d/SharedCourses/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%AD%A6%E9%99%A2/%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/%E5%8F%A4%E6%97%A9%E8%B5%84%E6%96%99/%E5%8F%82%E8%80%83%E8%A7%A3%E7%AD%94%EF%BC%8D2010%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E6%9C%9F%E6%9C%AB%E8%80%83%E8%AF%95%E5%8D%B7.pdf?sign=JGuoMMfPVqe6PMA4wACP4gJMJmWuF2jRXHv_PYo7evY=:0)
-- [并行计算往年试题和划重点](https://drive.vanillaaaa.org/d/SharedCourses/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%AD%A6%E9%99%A2/%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/%E5%8F%A4%E6%97%A9%E8%B5%84%E6%96%99/%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97%E5%BE%80%E5%B9%B4%E8%AF%95%E9%A2%98%E5%92%8C%E5%88%92%E9%87%8D%E7%82%B9.pdf?sign=eXhs12EbTxfjEHhV9gWZl3mWU7U51ltvtg3jh-9gVhk=:0)
+- [并行程序设计导论](https://github.com/BetterECNU/SharedResources/blob/main/SE/SE2425/推荐教材与参考资料/并行程序设计导论.pdf)
+- [古早资料(不建议使用)](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE2425/推荐教材与参考资料/古早资料(不建议使用))
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/\346\234\237\346\234\253\350\257\225\345\215\267/2019-2020\345\255\246\345\271\264\347\254\254\344\272\214\345\255\246\346\234\237\346\234\237\346\234\253\350\257\225\345\215\267.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/\346\234\237\346\234\253\350\257\225\345\215\267/2019-2020\345\255\246\345\271\264\347\254\254\344\272\214\345\255\246\346\234\237\346\234\237\346\234\253\350\257\225\345\215\267.jpg"
deleted file mode 100644
index ea0ab4b..0000000
Binary files "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\271\266\350\241\214\347\250\213\345\272\217\350\256\276\350\256\241/\346\234\237\346\234\253\350\257\225\345\215\267/2019-2020\345\255\246\345\271\264\347\254\254\344\272\214\345\255\246\346\234\237\346\234\237\346\234\253\350\257\225\345\215\267.jpg" and /dev/null differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\275\242\345\274\217\345\214\226\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272\347\220\206\350\256\272/2023-2024\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\275\242\345\274\217\345\214\226\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272\347\220\206\350\256\272/2023-2024\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
index 67c1efa..95fa390 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\275\242\345\274\217\345\214\226\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272\347\220\206\350\256\272/2023-2024\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\275\242\345\274\217\345\214\226\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272\347\220\206\350\256\272/2023-2024\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -1,7 +1,9 @@
---
-title: 2023-2024学年下学期期末试卷
+title: 2023-2024学年下学期期末
---
+## 2023-2024学年下学期期末试卷
+
### 一、问答题
1. 有限状态自动机有哪些分类?它们之间有什么联系与区别?
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\275\242\345\274\217\345\214\226\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272\347\220\206\350\256\272/README.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\275\242\345\274\217\345\214\226\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272\347\220\206\350\256\272/README.md"
index 21b4630..fbbdcbd 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\275\242\345\274\217\345\214\226\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272\347\220\206\350\256\272/README.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\345\275\242\345\274\217\345\214\226\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272\347\220\206\350\256\272/README.md"
@@ -5,9 +5,13 @@ course_code: SE2424
## 2023-2024学年下学期
-- [期末试题](./2023-2024学年下学期期末)
+### 试卷
+
+- [2023-2024学年下学期期末试卷](./2023-2024学年下学期期末)
### 李钦
-- [作业](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/形式语言与自动机理论/2023-2024学年下学期/作业)
-- [课件](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/形式语言与自动机理论/2023-2024学年下学期/课件)
+#### 教学资源
+
+- [Homework](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE2424/2023-2024学年下学期/李钦/Homework)
+- [Slides](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE2424/2023-2024学年下学期/李钦/Slides)
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..bbd6a4c
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,397 @@
+---
+title: 2007-2008学年下学期期中
+---
+
+## 2007-2008学年下学期期中试卷(含答案)
+
+### 说明
+
+- 原卷标题:2008年度操作系统期中考试试题
+
+### 一、(20分)
+
+在按需调页(demand paging)中,给定页面引用串(reference string):3, 2, 1, 0, 3, 2, 4, 3, 2, 1, 0, 4, 2, 3, 2, 1, 0, 4。
+
+a)给定2个页框(frame),采用FIFO页面替换策略,请写出页框内页面变化过程,并计算缺页率(page fault)。(4分)
+
+
+答案:
+
+| 页面引用 | 3 | 2 | 1 | 0 | 3 | 2 | 4 | 3 | 2 | 1 | 0 | 4 | 2 | 3 | 2 | 1 | 0 | 4 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| 页框1 | 3 | 2 | 1 | 0 | 3 | 2 | 4 | 3 | 2 | 1 | 0 | 4 | 2 | 3 | 3 | 1 | 0 | 4 |
+| 页框2 | NULL | 3 | 2 | 1 | 0 | 3 | 2 | 4 | 3 | 2 | 1 | 0 | 4 | 2 | 2 | 3 | 1 | 0 |
+| 结果 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 命中 | 错误 | 错误 | 错误 |
+| 调入 | 3 | 2 | 1 | 0 | 3 | 2 | 4 | 3 | 2 | 1 | 0 | 4 | 2 | 3 | | 1 | 0 | 4 |
+| 调出 | | | 3 | 2 | 1 | 0 | 3 | 2 | 4 | 3 | 2 | 1 | 0 | 4 | | 2 | 3 | 1 |
+
+缺页错误有17个。
+
+命中有1个。
+
+缺页率为17/18。
+
+
+
+***
+
+b)给定3个页框(frame),采用FIFO页面替换策略,请写出页框内页面变化过程,并计算缺页率(page fault)。(4分)
+
+
+答案:
+
+| 页面引用 | 3 | 2 | 1 | 0 | 3 | 2 | 4 | 3 | 2 | 1 | 0 | 4 | 2 | 3 | 2 | 1 | 0 | 4 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| 页框1 | 3 | 2 | 1 | 0 | 3 | 2 | 4 | 4 | 4 | 1 | 0 | 0 | 2 | 3 | 3 | 1 | 0 | 4 |
+| 页框2 | NULL | 3 | 2 | 1 | 0 | 3 | 2 | 2 | 2 | 4 | 1 | 1 | 0 | 2 | 2 | 3 | 1 | 0 |
+| 页框3 | NULL | NULL | 3 | 2 | 1 | 0 | 3 | 3 | 3 | 2 | 4 | 4 | 1 | 0 | 0 | 2 | 3 | 1 |
+| 结果 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 | 命中 | 命中 | 错误 | 错误 | 命中 | 错误 | 错误 | 命中 | 错误 | 错误 | 错误 |
+| 调入 | 3 | 2 | 1 | 0 | 3 | 2 | 4 | | | 1 | 0 | | 2 | 3 | | 1 | 0 | 4 |
+| 调出 | | | | 3 | 2 | 1 | 0 | | | 3 | 2 | | 4 | 1 | | 0 | 2 | 3 |
+
+缺页错误有14个。
+
+命中有4个。
+
+缺页率为14/18=7/9。
+
+
+
+***
+
+c)简述什么是Belady异常(Belady's Anomaly)。(3分)
+
+
+答案:
+
+belady异常指的是随着可分配的页数的增加,页错误率反而增加的现象
+
+
+
+***
+
+d)简述什么是最近最少使用策略(LRU)。(3分)
+
+
+答案:
+
+least recently used 指的是在帧满时,将最近最久未使用的的页替换掉
+
+
+
+***
+
+e)试证明,采用LRU策略时,在相同的时刻,页框数目多时,页框内页面集合一定包含了页框数目少时的所有页面,故而不会出现Belady异常(提示:可对时间运用数学归纳法)。(6分)
+
+
+答案:
+
+假设该LRU算法由CPU的计数器来实现,即每次内存引用,cpu计数器加1,并将该值赋给该页。
+
+1)显然当页框数为n时,若页数小于n,则页框内包含所有页,此时当页框数为n+1时,同理也框内也包含所有页。
+
+2)若页数大于n时,n个页框内包含的页为最近刚使用过的n个页,即与页相关联的计数器最大的n个,当页框数为n+1,n+1个页框内包含的是最近刚使用过的n+1个页,即与页相关联的计数器最大的n+1个,因为无论页框数是n还是n+1,cpu引用页的顺序是不变的,所以同一时刻最大的n+1个页必包含最大的n个页。因此n个页框数可以命中的,n+1个页框数也一定命中,n个页框数不能命中的,n+1个页框数也有可能命中,所以不会出现belady异常。
+
+
+
+***
+
+### 二、(20分)
+
+给定如下的资源请求、分配图(包含5个进程P1-P5,3类资源R1-R3),假定五个进程已提出对所有资源的请求:
+
+
+
+a)请写出可用资源向量(available vector)、资源分配矩阵(allocation matrix)、最大资源需求矩阵(max matrix)。(3分)
+
+
+答案:
+
+available vector:available[1]=1, available[2]=0, available[3]=1
+
+:::tip
+此处原答案文字写为 `available[3]=1`,但同一答案表格中的 AVAILABLE 为 `1 0 0`,两处不一致;此处均按原答案保留。
+:::
+
+| | ALLOCATION R1 | ALLOCATION R2 | ALLOCATION R3 | MAX R1 | MAX R2 | MAX R3 | AVAILABLE R1 | AVAILABLE R2 | AVAILABLE R3 |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| P1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
+| P2 | 0 | 0 | 0 | 0 | 1 | 0 | | | |
+| P3 | 0 | 0 | 1 | 0 | 2 | 1 | | | |
+| P4 | 1 | 0 | 0 | 1 | 1 | 0 | | | |
+| P5 | 0 | 1 | 0 | 0 | 1 | 1 | | | |
+
+
+
+***
+
+b)请判断当前是否处于安全状态(safe state),请写出判断的依据(过程)?(6分)
+
+
+答案:
+
+| | NEED R1 | NEED R2 | NEED R3 | AVAILABLE R1 | AVAILABLE R2 | AVAILABLE R3 |
+| --- | --- | --- | --- | --- | --- | --- |
+| P1 | 1 | 0 | 0 | 1 | 0 | 0 |
+| P2 | 0 | 1 | 0 | | | |
+| P3 | 0 | 2 | 0 | | | |
+| P4 | 0 | 1 | 0 | | | |
+| P5 | 0 | 0 | 1 | | | |
+
+处于不安全状态,因为假设存在顺序因为AVAILABLE为1 0 0,所以PI1只能等度P1,P1执行后AVAILABLE= (2 0 0) 此时不能再进行,不安全。
+
+
+
+***
+
+c)试论述说明,判断安全状态时,尝试资源分配的次序不影响最终结果。(5分)
+
+
+答案:
+
+判断安全状态时,系统遍历所有可能的次序,PI1,PI2,PI3,…PIN,当找到一个顺序满足安全状态时,则说明现状满足安全状态而我们的目的只是判断现状是否满足安全状态,只有当遍历完所有的顺序后仍不满足,才能说明该现状不是安全状态,因此尝试资源分配的次序不影响最终的结果。
+
+若现状不是安全状态,则无论哪种顺序都要遍历完所有的顺序。
+
+若现状是安全状态,则无论哪种次序都将在遍历所有中最后一个之前(包括最后一个)判断出该状态时安全状态
+
+
+
+***
+
+d)如果进程P1-P5按优先级从高到低排序,且高优先级进程能够剥夺(preempt)低优先级已分配到的资源,当前是否存在死锁?(2分)
+
+
+答案:
+
+不存在死锁。
+
+因为存在优先级,而每个进程所需要的每个资源的实例小于该资源拥有的实例,所以不会出现死锁
+
+
+
+***
+
+e)处于不安全状态是否一定出现死锁?如果一定出现死锁请证明之,否则请描述两种不安全但不出现死锁的情况。(4分)
+
+
+答案:
+
+处于不安全状态不一定出现死锁,但处于安全状态一定不会出现死锁。
+
+1. 对系统进行安全性检测的时候是根据进程的最大资源需求进程的,而时间运行过程中进程可能不需要那么多的资源,所以哪怕系统进入了不安全状态也不一定会导致死锁。
+
+2. 系统中的各个进程并不一定都要执行完毕的,有些会在执行到一半的时候被注销掉,收回其占有的所有资源。(原因有很多,可能是父进程销毁它,也可能是它执行的时候发生异常、错误等,如除0操作)。所有也可能导致本处于不安全状态的几个进程最终没有死锁地执行完毕。
+
+
+
+***
+
+### 三、(20分)
+
+给定双向单车道桥要求(同时满足):
+
+任意时刻只有一个方向的车辆能够在桥上通行,另一个方向的车辆必须在桥下等待;
+
+任意时刻桥上只能有2辆车在桥上通行,其它车辆必须在桥下等待;
+
+等待另一方向车辆下桥的车辆不能无限制等待。
+
+请使用信号量(semaphore)实现该问题:
+
+a)请说明使用几个信号量,其初始值,以及其含义。(4分)
+
+
+答案:
+
+分为2组,L(车从左到右),R(车从右到左),互斥,用信号量mutex表示,初始值为1
+
+在L的情况下,用信号量mutexL表示一次最多2辆车,初始值为2
+
+在R的情况下,用信号量mutexR表示一次最多2辆车,初始值为2
+
+在L的情况下,用 2-MutexLL表示在获取桥后已经通过的车的数量, 初始值为2
+
+在R的情况下,用 2-MutexRR表示在获取桥后已经通过的车的数量, 初始值为2
+
+
+
+***
+
+b)请写出控制左向右车辆的程序代码和控制右向左车辆的程序代码。(12分)
+
+
+答案:
+
+左向右:
+
+```c
+If(mutex<=0&&mutexL<2)
+{
+ Wait(mutexL)
+ PASS
+ Wait(mutexLL)
+ Signal(mutexL)
+ If(mutexL==2)
+ Signal(mutex)
+ If(mutexLL==0)
+ {
+ Signal(mutexLL)
+ Signal(mutexLL)
+ Signal(mutex)
+ }
+}
+Else
+{
+ wait(mutex)
+ wait(mutexL)
+ pass
+ wait(mutexLL)
+ if(mutexL==2)
+ signal(mutex)
+ if(mutexLL==0)
+ {
+ Signal(mutexLL)
+ Signal(mutexLL)
+ Signal(mutex)
+ }
+}
+```
+
+右向左:
+
+```c
+if(mutex<=0&&mutexL<2)//已有同向车在桥上,可行
+{
+ wait(mutexR)
+ Passs
+ Wait(mutexRR)
+ Signal(mutexR)
+ If (mutexR==2)
+ Signal(mutex)
+ If(mutexRR==0)
+ {
+ Signal(mutexRR)
+ Signal(mutexRR)
+ Signal(mutex)
+ }
+}
+Else
+{
+ wait(mutex)
+ Wait(mutexR)
+ PASS
+ Wait(mutexRR)
+ Signal(mutexR)
+ If(mutexR==2)
+ Signal(mutex)
+ If(mutexRR==0)
+ {
+ Signal(mutexRR)
+ Signal(mutexRR)
+ Signal(mutex)
+ }
+}
+```
+
+
+
+***
+
+c)请说明你的代码不会出现死锁,且满足以上列出的三个条件。(4分)
+
+
+答案:
+
+死锁:因为两边对称,故仅以从左到右的代码来分析不会出现死锁。
+
+设车A将从左往右行驶
+
+若mutex==0,则说明当前桥上有车,若mutexL<2则说明该桥上的车为从左到右行驶的,故车A可以向前行驶,wait(mutexL),当mutexL>0时,通过,signal(mutexL) 结束后若mutexL==2,说明桥上已经没有车了,故执行signal(mutex),使左右的车再一次同时开始竞争桥
+
+若mutex=0,mutelR==2,则说明桥上的车为从右向左行驶,此时mutexR必然小于2,步骤类比同上,当mutex=1时,左右开始竞争该桥
+
+若mutex=1,说明桥上没车,于是wait(mutex)争得该桥,pass,signal(mutexR),若mutexR==2时,说明桥上没从左向右的车了,于是signal(mutex),左右再次开始竞争
+
+而mutexRR和mutexLL的作用为,使一方等待的车最多等待2辆相反方向的车,即若某次竞争被左到右的车竞争到,若做到右的车有100万辆,则经过2个pass,mutexLL变为0,2次signal(mutexRR),一次signal(mutex),使两方又开始竞争了,
+
+满足三个条件:
+
+1. Mutex的特性使它满足1,具体见阐释死锁部分
+
+2. MutexR,mutexL的特性使它满足2,具体见阐释死锁部分
+
+3. MutexRR,mutexLL的性质使它满足3,具体见阐述死锁部分
+
+
+
+***
+
+### 四、(20分)
+
+请说明以下进程状态转换图中状态转换的箭头方向(每个1分),并例举中每一种状态转换的一个例子(每个1.5分)。
+
+
+
+
+答案:
+
+1. New->ready 新进程创建后处于ready状态
+
+2. running->ready 正在运行的进程收到I/O中断,回到就绪队列
+
+3. ready->running 进程调度算法将就绪队列中的一个进程交给cpu执行
+
+4. running->terminated 结束进程
+
+5. runnint->waiting 等待I/0,进程进入waiting
+
+6. waiting->ready I/O完成,进程再次进入就绪队列
+
+7. waiting->suspended 内存将满,操作系统内存管理将不常用的进程调入虚拟内存
+
+8. suspended->ready 需要执行,但该页不在内存中,从虚拟内存中取出该页,并加入就绪队列
+
+
+
+***
+
+### 五、(10分)
+
+请给出进程与线程的定义(4分),并简述在一个多进程、多线程,且支持内核线程(kernel thread)的系统中,进程与线程在地址空间、CPU调度上的的主要联系与区别(6分)。
+
+
+答案:
+
+进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
+
+线程:程(thread),有时被称为轻量级进程 (Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆堆栈组成。
+
+联系与区别:线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU
+
+通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
+
+
+
+***
+
+### 六、(10分)
+
+采用如下图的机制实现采用旁路转换缓存(或称为快表,TLB)的逻辑地址到物理地址的翻译。已知TLB的命中率为60%,TLB的平均访问时间为10ns,内存的访问时间为200ns,页表存储在内存中。请计算CPU对内存的有效访问时间(effective access time)(5分)。若要将有效访问时间减少到120ns以下,需要将TLB的命中率提高到多少?(5分)
+
+
+
+
+答案:
+
+根据题意内存访问时间为200ns包括访问页表和方位内容,所以单独访问内存时间为100ns
+
+有效访问时间:$(100+10)\times0.6+200\times0.4=66+80=146\text{ns}$
+
+$110\times x+200\times(1-x)=120$
+
+$80=90x$
+
+$x=8/9=88.9\%$
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..b531b91
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,334 @@
+---
+title: 2007-2008学年下学期期末
+---
+
+## 2007-2008学年下学期期末试卷(A)
+
+### 一、(15分)判断题(判断(T表示正确,F表示错误)并说明原因)(3分x5)
+
+1. 在通写(write-through)策略下,关闭以只读方式打开的文件也需要对磁盘进行写操作。
+
+ ***
+
+2. 间谍软件(spyware)必然是病毒。
+
+ ***
+
+3. 在 Linux 系统中,对于目录具有 x 权限意味着可以在目录中创建或删除文件。
+
+ ***
+
+4. 块设备一定是快速设备,且一定既能支持顺序访问又能支持随机访问。
+
+ ***
+
+5. 采用了具有完备的安全机制的操作系统则必然能够保护系统免受攻击的侵害。
+
+***
+
+### 二、(15分)单项选择题(3分x5)
+
+1. TCP/IP 分别对应了 ISO OSI 七层模型的哪两层:
+
+ A. 传输层/网络层
+
+ B. 会话层/网络层
+
+ C. 数据链路层/物理层
+
+ D. 会话层/传输层
+
+ ***
+
+2. 以下哪种设备常用假脱机方式(spooling)进行 I/O 操作:
+
+ A. 磁带
+
+ B. 磁盘
+
+ C. 网络
+
+ D. 打印机
+
+ ***
+
+3. 以下哪一项对于 u 盘的文件系统和 I/O 操作不适用:
+
+ A. 块分配
+
+ B. 空闲块管理
+
+ C. 磁盘调度
+
+ D. 缓存管理
+
+ ***
+
+4. 以下哪个操作属于磁盘物理格式化的工作:
+
+ A. 删除所有文件
+
+ B. 初始化文件系统结构
+
+ C. 创建一个空的根目录
+
+ D. 在扇区中填入校验码等信息
+
+ ***
+
+5. 以下对于文件控制块,描述错误的是:
+
+ A. 文件控制块一般包含文件的访问控制信息和指向数据块的指针信息
+
+ B. 一个进程在用户态可对其打开的文件的文件控制块信息进行直接修改,修改后的信息在关闭文件时回写到磁盘上
+
+ C. 文件名可以不存储在文件控制块内
+
+ D. inode 是一种文件控制块
+
+***
+
+### 三、(20分)名词辨析(写出名词的含义,并说明区别)(4分x5)
+
+1. 进程和线程
+
+ ***
+
+2. 段式内存管理和页式内存管理
+
+ ***
+
+3. 死锁和饥饿(starvation)
+
+ ***
+
+4. 网络操作系统和分布式操作系统
+
+ ***
+
+5. 微内核和模块化内核
+
+***
+
+### 四、(20分)问答题
+
+1. (9分)请问文件组织和块分配技术中,连续分配、链接分配、索引分配三种方法,哪种最适合随机访问?哪种最不适合随机访问?哪种最适合顺序访问?哪种最不适合顺序访问?对于频繁创建、删除文件的情况,且需要支持随机访问,哪种方法最合适?哪种最不合适?请说明理由。(1.5分x6)
+
+ ***
+
+2. (6分)请列举分布式系统中,进程协同所碰到的三个困难,并说明这些困难是如何造成集中式进程协同技术无法直接被应用于分布式环境的。(2分x3)
+
+ ***
+
+3. (5分)请简要说明采用 DMA 进行数据传输的过程。
+
+***
+
+### 五、(10分)计算题
+
+假设磁盘磁头当前在磁道 100,磁道请求队列为:`<55,58,39,18,90,160,150,38,184>`:
+
+1. 请计算 FIFO(先进先出)策略下的寻道总长度(包括过程)。(4分)
+
+ ***
+
+2. 请计算 SSTF(最近寻道时间优先)策略下的寻道总长度(包括过程)。(4分)
+
+ ***
+
+3. 请问:SSTF 是否一定是总寻道长度最短的,为什么?(2分)
+
+***
+
+### 六、(10分)
+
+假设文件系统只能提供 read 和 write 两个对文件的读写操作:
+
+```c
+int read(FILE* fd, long pos, char* buf, long len);
+int write(FILE* fd, long pos, char* buf, long len);
+```
+
+其中,fd 为文件描述符;pos 为文件指针位置;buf 为读取后数据存放地址;或要写入的数据所在地址;len 为要读或写的数据长度。pos 使用绝对地址(即文件头位置为 0,其它位置的值为其偏移量)。read 的返回值为其读到的实际数据长度,如果 `pos+len+1` 超出了文件的长度(设为 x),则返回值为 `(x-pos)`,且 pos 永远小于等于 `x-1`;write 的返回值为其实际写入数据的长度;pos 和 len 都以 char 为单位。文件指针指向下一个要读或写的位置,指针随着读和写顺序移动。
+
+请使用 read 和 write 函数,实现插入函数 insert:
+
+```c
+int insert(FILE* fd, long pos, char* buf, long len);
+```
+
+其参数含义同上,返回直为实际插入的数据量。insert 的含义是:如果 pos 不是文件末尾,则将 pos 以后所有数据(从 pos+1 开始,到文件尾为止)往后移 len 的长度,并将 buf 的内容填入文件位置 pos+1 到 pos+len 中。
+
+例如:fd 对应的原始文件为:``,文件长度为 7,buf 内容为:`<***>`,len 为 3,则 `insert(fd, 3, buf, 3)` 后文件的内容为:``,返回值为 3。
+
+1. 请用写出实现 insert 的主要伪代码和注释(假设 fd 已知,read 和 write 不需要进行出错处理)。(7分)
+
+ ***
+
+2. 请简单描述一下实现的思路。(3分)
+
+***
+
+### 七、(10分)
+
+1. 请简要描述你在课程 project 2 中对文件控制块的实现方式(包括基本数据结构、目录的实现方式,文件控制块缓存的实现方式)。(7分)
+
+ ***
+
+2. 请简要描述在课程 project 2 中你在你们小组中承担的任务。(3分)
+
+***
+
+## 2007-2008学年下学期期末试卷(B)
+
+### 一、(15分)判断题(判断(T表示正确,F表示错误)并说明原因)(3分x5)
+
+1. 关闭以只读方式打开的文件不需要对数据块进行写操作。
+
+ ***
+
+2. 病毒必然是间谍软件(spyware)。
+
+ ***
+
+3. 在Linux系统中,对于目录具有x权限意味着可以删除该目录。
+
+ ***
+
+4. 磁带是一种字符设备。
+
+ ***
+
+5. 确定文件的访问权限是制定安全策略的一部分。
+
+***
+
+### 二、(15分)单项选择题(3分x5)
+
+1. HTTP对应了ISO OSI七层模型的哪一层:
+
+ A. 网络层
+
+ B. 会话层
+
+ C. 应用层
+
+ D. 传输层
+
+ ***
+
+2. 以下哪种设备常用顺序访问方式进行访问:
+
+ A. 磁带
+
+ B. 磁盘
+
+ C. u盘
+
+ D. 光盘
+
+ ***
+
+3. 以下哪一项对于只读光盘的文件系统和I/O操作不适用:
+
+ A. 预读
+
+ B. 空闲块管理
+
+ C. 磁(光)盘调度
+
+ D. 缓存管理
+
+ ***
+
+4. 文件系统结构初始化是在哪个操作时进行的:
+
+ A. 删除所有文件
+
+ B. 物理格式化
+
+ C. 逻辑格式化
+
+ D. 磁盘分区
+
+ ***
+
+5. 以下对于文件控制块,描述正确的是:
+
+ A. 文件控制块和进程控制块一样,只存在于内存中,在文件关闭时释放
+
+ B. 文件控制块存放于目录项中
+
+ C. 文件控制块中不需要存放文件名
+
+ D. 文件控制块一般不包括文件访问权限信息
+
+***
+
+### 三、(20分)名词辨析(写出名词的含义,并说明区别)(4分x5)
+
+1. 死锁检测和死锁避免
+
+ ***
+
+2. 最短作业优先调度和最短剩余时间优先调度
+
+ ***
+
+3. 动态联编和静态联编
+
+ ***
+
+4. 内部碎片和外部碎片
+
+ ***
+
+5. 核心态和用户态
+
+***
+
+### 四、(20分)问答题
+
+1. (8分)请简述磁盘空闲块管理的位图和链表技术,并比较它们在空间利用率与空闲块分配时的效率。
+
+ ***
+
+2. (6分)请简要论述分布式文件系统和集中式文件系统在命名(名称解析,naming)和数据访问方式及其实现上的异同。
+
+ ***
+
+3. (6分)请简要说明I/O方式中何为程序控制输入输出(programmed I/O)和直接内存访问(direct memory access, DMA)。并说明为何DMA比前一方式进行快速大规模I/O数据交换时效率要高。
+
+***
+
+### 五、(10分)计算题
+
+假设磁盘磁头当前在磁道98,磁道请求队列为:`<55,58,39,18,90,160,150,38,184>`:
+
+1. 请计算FIFO(先进先出)策略下的寻道总长度(包括过程)(5分)
+
+ ***
+
+2. 请计算SSTF(最近寻道时间优先)策略下的寻道总长度(包括过程)(5分)
+
+***
+
+### 六、(10分)
+
+假定有一个一层文件系统(即所有文件只能存储于根目录):文件名长度最多为1024个字符;文件名允许使用包括“a-z”、“A-Z”、“0-9”、“.”在内的26 + 26 + 10 + 1 = 63个字符。请设计一种方法,在该一层文件系统上模拟多层文件系统:
+
+1. 请详细描述你的方法(6分);
+
+ ***
+
+2. 请分析你的方法对于文件个数的限制和对于目录层数的限制(4分)。
+
+***
+
+### 七、(10分)
+
+1. 请简要描述你在课程project 2中对文件读写(权限检查、缓存管理、块申请、文档控制块信息更新)的实现方式(7分);
+
+ ***
+
+2. 请简要描述在课程project 2中你在文件读写部分中承担的任务(3分)。
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..dc635c2
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,487 @@
+---
+title: 2008-2009学年下学期期中
+---
+
+## 2008-2009学年下学期期中试卷(含答案)
+
+### 一、多项选择题(5‘x6=30',每题有一个或多个答案,答错不给分,少答按比例给分)
+
+1. 以下对于虚存调页(page replacement)策略,错误的是:
+
+ A. LRU不会发生Belady异常
+
+ B. 最优策略不会发生Belady异常
+
+ C. Belady异常就是随着页框(frame)个数增多,缺页率(page fault rate)必然增加
+
+ D. 调页必须在内核态(kernel mode)下进行
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+2. 当系统中的进程增多时,以下哪些(个)情况不可能出现(不考虑死锁):
+
+ A. CPU利用率增高
+
+ B. CPU利用率降低
+
+ C. 磁盘I/O增多
+
+ D. 磁盘I/O减少
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+3. 以下那些(个)操作会使得一个进程从运行(running)状态转换为就绪(ready)状态:
+
+ A. 在可占先(preemptive)系统中,高优先级进程被创建
+
+ B. 分时系统中,时间片到
+
+ C. 当前运行进程发生缺页中断
+
+ D. 当前运行进程调用yield(),主动放弃使用CPU
+
+
+ 答案:
+
+ A, B, D
+
+
+
+ ***
+
+4. 对于死锁,以下哪些(个)描述是正确的:
+
+ A. 死锁避免(deadlock avoidance)中,不安全的状态必然发生死锁
+
+ B. 死锁避免(deadlock avoidance)中,发生死锁必然处于不安全状态
+
+ C. 资源分配图中有环(以资源类型和进程为节点),必然发生死锁
+
+ D. 如果要求每个进程必须一次申请所有需要的资源,如果不能满足其要求,则不分配任何资源,那么死锁不可能发生
+
+
+ 答案:
+
+ A, C, D
+
+
+
+ ***
+
+5. 以下描述正确的是:
+
+ A. 中断处理程序(interrupt handler)是进程的一部分,在进程的地址空间运行
+
+ B. 中断处理程序(interrupt handler)必须运行在内核态
+
+ C. 微内核体系结构下,进程间通讯(inter-processing communication)必须在微内核内
+
+ D. 分时(time sharing)的目的是提高CPU和I/O的并行度
+
+
+ 答案:
+
+ B, C
+
+
+
+ ***
+
+6. 关于线程,以下说法正确的是:
+
+ A. 用户态线程(无核心态线程或LWP)阻塞,可能会阻塞线程
+
+ B. 多处理器环境下,线程间同步不能使用关中断实现
+
+ C. 线程控制块中包含CPU寄存器状态
+
+ D. 在支持核心态线程的系统中,CPU调度的单位仍然是进程
+
+
+ 答案:
+
+ A, B, C
+
+
+
+***
+
+### 二、(10')
+
+请说明:
+
+1. 进程创建时(如在类UNIX操作系统中,连续执行fork()和exec()系统调用),操作系统所需要进行那些工作,它们的代价如何(大,中,小)。(6')
+
+
+ 答案:
+
+ a. 构造PCB,代价小
+
+ b. 设置地址空间映射,代价中
+
+ c. 复制父进程地址空间内容,代价大
+
+ d. 复制I/O状态,代价中
+
+
+
+ ***
+
+2. 为什么线程创建比进程快,它主要节省了以上哪个步骤的代价?(4')
+
+
+ 答案:
+
+ 同一进程的不同线程共享资源,因此以上b, c, d三项代价几乎都可节省
+
+
+
+***
+
+### 三、(10')
+
+现有四个进程P0, P1, P2, P3,三类资源A, B, C,各有7、5、5个。资源分配矩阵如下:
+
+| | A | B | C |
+| --- | --- | --- | --- |
+| P0 | 0 | 1 | 0 |
+| P1 | 2 | 0 | 0 |
+| P2 | 3 | 0 | 3 |
+| P3 | 2 | 2 | 2 |
+
+资源请求矩阵如下:
+
+| | A | B | C |
+| --- | --- | --- | --- |
+| P0 | 0 | 0 | 0 |
+| P1 | 2 | 0 | 2 |
+| P2 | 0 | 0 | 0 |
+| P3 | 1 | 0 | 0 |
+
+可用资源向量为:
+
+| A | B | C |
+| --- | --- | --- |
+| 0 | 2 | 0 |
+
+1. 请问:目前是否存在死锁?如果不存在死锁,请给出一个能够让所有进程执行完的序列。(4')
+
+
+ 答案:
+
+ 不存在死锁
+
+ | 进程 | A | B | C |
+ | --- | --- | --- | --- |
+ | P0 | 0 | 3 | 0 |
+ | P2 | 3 | 3 | 3 |
+ | P1 | 5 | 3 | 3 |
+ | P3 | 7 | 5 | 5 |
+
+
+
+ ***
+
+2. 假设此时又来一个进程P4,申请资源(2, 2, 0),请问如果把2个资源B的实例分配给P4,假设除已经获得和正在请求的资源外,所有进程不再请求其它资源,是否处于安全状态(为什么)?(6')
+
+
+ 答案:
+
+ 安全
+
+ 此时可用资源向量为:0 0 0
+
+ | 进程 | A | B | C |
+ | --- | --- | --- | --- |
+ | P2 | 3 | 0 | 3 |
+ | P1 | 5 | 0 | 3 |
+ | P4 | 5 | 2 | 3 |
+ | P0 | 5 | 3 | 3 |
+ | P3 | 7 | 5 | 5 |
+
+ 仍然都能执行完
+
+
+
+***
+
+### 四、(15')
+
+使用段页式内存管理,段表和页表都存放在主存中,所有要访问的页面都在主存中。页表项可以缓存在快表(或称旁路转换缓存,TLB)中。一次内存访问的代价为 $200\ \text{ns}$,一次TLB访问代价为 $10\ \text{ns}$。
+
+1. 请写出以上段页式内存访问的处理流程(也可以用图示表示)。(5')
+
+
+ 答案:
+
+ a. 访问段表,检查是否违法,获取页表地址
+
+ b. 访问快表,如果miss goto c,否则goto d
+
+ c. 访问内存页表
+
+ d. 访问内存
+
+
+
+ ***
+
+2. 假设TLB的命中率为50%,请计算进程对内存的有效访问时间(effective access time)。(5')
+
+
+ 答案:
+
+ $200 + 50\% \times 10 + (1-50\%) \times 210 + 200$
+
+ $= 510\text{ns}$
+
+
+
+ ***
+
+3. 如果要求进程对内存的有效访问时间不大于500ns,请问TLB的命中率必须提高到多少?(5')
+
+
+ 答案:
+
+ $200 + x \times 10 + (1-x) \times 210 + 200$
+
+ $=610-200x\le 500$
+
+ $x\ge 110/200=55\%$
+
+
+
+***
+
+### 五、(20')
+
+假设有三个进程A,B和C,A和B只使用CPU,各需要1000毫秒,进程C使用10毫秒CPU然后进行90毫秒I/O,然后再使用100毫秒CPU接着100毫秒I/O,总共也是1000毫秒。假设三个进程的到达次序是ABC。
+
+1. 请计算使用FIFO调度,三个进程的平均等待时间和平均完成时间。(4')
+
+
+ 答案:
+
+ A,B,C
+
+ 平均等待时间:(0+1000+2000)/3=1000
+
+ 平均完成时间:(1000+2000+3000)/3=2000
+
+
+
+ ***
+
+2. 请计算使用100毫秒为时间片长度,使用轮询(round-robin)调度时,三个进程的平均等待时间和平均完成时间。(4')
+
+
+ 答案:
+
+ A100, B100, C10, A100C90, B100, C10, A100C90, … B100, C10, C90
+
+ 平均等待时间:(990+1090+1190)/3=1090
+
+ A: 110*9=990
+
+ B: 100+110*9=1090
+
+ C: 200+110*9=1190
+
+ 平均完成时间:(1990+2090+2190)/3=1790
+
+ A: 210*9+100=1990
+
+ B: 210*9+200=2090
+
+ C: 210*10+90=2190
+
+
+
+ ***
+
+3. 请计算使用10毫秒为时间片长度,使用轮询(round-robin)调度时,三个进程的平均等待时间和平均完成时间。(4')
+
+
+ 答案:
+
+ A10, B10, C10, A10C10, B10C10, A10C10, B10C10...
+
+ 平均等待时间:(1080+1090+1190)/3=1120
+
+ A: 20*99-10*90=1980-900=1080
+
+ B: 10+20*99-10*90=1990-900=1090
+
+ C: 1190
+
+ 平均完成时间:1790
+
+ A: 1990
+
+ B: 2090
+
+ C: 2190
+
+
+
+ ***
+
+4. 请计算使用最短剩余时间优先(shortest remaining time first)调度时,三个进程的平均等待时间和平均完成时间。(4')
+
+
+ 答案:
+
+ C10, A90C90, C10, A90C90, …, A, …, B, …
+
+ 平均等待时间:(100+1100+0)/3=400
+
+ A: 10*10=100
+
+ B: 10*10+1000=1100
+
+ C: 0
+
+ 平均完成时间:(1100+2100+1000)/3=1400
+
+ A: 1000+100=1100
+
+ B: 1100+1000=2100
+
+ C: 1000
+
+
+
+ ***
+
+5. 假设每次上下文切换需要1毫秒,请从CPU利用率、I/O利用率、进程响应时间三个角度分析以上四种调度策略哪种最适合A、B、C三个进程。(4')
+
+
+ 答案:
+
+ CPU利用率:SRTF最高,其次是RR的两种
+
+ I/O利用率:SRTF最高,其次是RR的两种
+
+ 进程响应时间:RR最高,其次是SRTF
+
+
+
+***
+
+### 六、(15')
+
+假设有一个科学计算进程scicomp,它每次从任务队列中获得一个计算任务,然后进行计算:
+
+```c
+void scicomp ()
+{
+ while (true)
+ {
+ get_task ();
+ comp ();
+ }
+}
+```
+
+任务队列中的任务数存放在全局变量m中:
+
+```c
+int m;
+```
+
+当任务队列为空时,它唤醒另一个进程taskassign,分配一些计算任务,放在队列中:
+
+```c
+void taskassign ()
+{
+ while (true)
+ {
+ m = put_task ();
+ }
+}
+```
+
+其中,put_task ()返回的是放入队列的任务个数。
+
+假设scicomp在队列为空时不能执行get_task(),而taskassign只能在队列为空时执行,队列的大小没有限制。要求:
+
+1. 使用信号量,并修改以上scicomp和taskassign代码,使得程序能够满足以上条件(10');
+
+2. 说明为什么你的程序是对的(5')
+
+
+答案:
+
+信号量:
+
+```c
+semaphore free=0;
+semaphore busy=0;
+semaphore mutex=1;
+int servings=0;
+
+int m;
+```
+
+程序:
+
+```c
+void scicomp ()
+{
+ while (true)
+ {
+ mutex.wait();
+ if(servings==0)
+ {
+ free.signal();
+ busy.wait();
+ servings=m;
+ }
+ servings -= 1;
+ get_task ();
+ mutex.signal();
+ comp ();
+ }
+}
+
+void taskassign ()
+{
+ while (true)
+ {
+ free.wait();
+ m = put_task ();
+ busy.signal();
+ }
+}
+```
+
+说明:
+
+1. 对队列、servings的访问不会冲突
+
+2. 逻辑正确
+
+3. 不会死锁或饥饿
+
+
+
+***
+
+### 附加题(实验班做)
+
+请使用二元信号量(binary semaphore,即值只能为0或1的信号量)实现计数信号量(counting semaphore,取值可为任意整数)。
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..8d71c6a
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,476 @@
+---
+title: 2008-2009学年下学期期末
+---
+
+## 2008-2009学年下学期期末试卷(A)(含答案)
+
+### 一、(15')是非题(以下结论正确的请标T,错误的请标F并改正)(3'x5)
+
+1. 线程都保存有各自的栈信息和CPU状态(寄存器、指令计数器等)。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+2. 页表由各个进程自己管理,进程可在用户态对页表进行更新。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+3. 单CPU环境下由于任何时刻只有一个进程(线程)能够运行,因此操作系统不需要实现同步与互斥支持。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+4. 在微内核结构的操作系统中,CPU调度必然在微内核内。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+5. 在抢占式(preemptive)操作系统中,进程不会因为申请、使用资源发生死锁。
+
+
+ 答案:
+
+ T
+
+
+
+***
+
+### 二、(18')单项选择题(3'x6)
+
+1. 以下哪一种程序(或程序片段)会自我复制、传播,进而威胁系统的安全?
+
+ A. 计算机病毒
+
+ B. 特洛伊木马
+
+ C. 逻辑炸弹
+
+ D. 操作系统自举(bootstrap)文件
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+2. 以下哪一种机制能够帮助系统管理员抵御拒绝攻击(Denial of Service)?
+
+ A. 加密
+
+ B. 认证
+
+ C. 访问控制矩阵
+
+ D. 防火墙
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+3. 以下哪种机制提供了最佳的位置透明(transparency)性?
+
+ A. 通过 http://www.sei.ecnu.edu.cn/ 访问学院主页
+
+ B. 通过 telnet 166.111.8.238 访问清华大学水木清华 BBS
+
+ C. 通过 msn messenger 和好友聊天
+
+ D. 在 windows 下通过 \\server 访问服务器共享目录和设备
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+4. 以下对于目录及其实现的描述,错误的是:
+
+ A. 目录是文件的集合,是一种逻辑概念,通常用文件实现
+
+ B. 目录文件中存放的就是目录中文件的文件控制块(file control block)
+
+ C. 目录中可以有子目录,形成嵌套结构
+
+ D. 目录中的“.”和“..”通常分别代表该目录本身和其父目录
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 以下哪种存储设备通常只支持顺序访问?
+
+ A. 光盘
+
+ B. 磁盘
+
+ C. 磁带
+
+ D. U盘
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+6. 以下哪个功能不是由设备驱动程序提供的?
+
+ A. 提供标准的设备访问系统调用(如 open(), read() 等)
+
+ B. 提供中断处理程序
+
+ C. 提供 DMA 控制功能
+
+ D. 提供内核直接访问设备的接口
+
+
+ 答案:
+
+ C
+
+
+
+***
+
+### 三、(20')简答题
+
+1. 请简单比较程序控制输入输出(programmed I/O)和直接内存访问(DMA)的区别,并解释为什么DMA对于高速I/O访问效率较高。(5')
+
+
+ 答案:
+
+ PIO时,CPU需要介入每一次数据交换;DMA方式时,CPU只在数据交换开始/结束时介入,其它时候,由DMA控制器协调I/O设备和内存利用总线进行数据交换。由于此时CPU和I/O设备几乎并行,因此与PIO方式相比,节省了大量中断、CPU介入时间。
+
+
+
+ ***
+
+2. 请简述在一个支持有向无环图目录结构的文件系统中,删除一个普通文件(非目录文件)时操作系统需要执行哪些操作。(5')
+
+
+ 答案:
+
+ 查看/更新引用计数,如果为零,更新目录文件,释放FCB,释放磁盘数据块
+
+
+
+ ***
+
+3. 请简述磁盘访问效率由哪些部分决定,并分析如何提高文件系统中顺序访问文件的效率。(5')
+
+
+ 答案:
+
+ 定位时间+传输速度。前者又包括:旋转速度和寻道事件
+
+
+
+ ***
+
+4. 请简述分布式操作系统和网络操作系统的区别,并列举至少三个分布式操作系统难于实现的原因。(5')
+
+
+ 答案:
+
+ DOS是网络连接的计算机上的一个操作系统,NOS是支持网络的操作系统。难点:1) 网络传输代价/延迟大;2) 网络/远程节点错误,且常常不可知;3) 集中控制难/代价大;4) 无全局时钟
+
+
+
+***
+
+### 四、(25')计算题
+
+1. (15')假设有文件系统使用i-node如图所示。其中一个磁盘块大小为4KB,一个磁盘块指针大小为32位(4B),直接块(direct block)大小为2KB,其它索引块大小和一个磁盘块一样大小。假设有一个4MB大小的文件,其i-node已在内存中(direct block也在内存中),文件的其它部分都在磁盘上,不考虑缓存。请问:
+
+ a) 访问其第一个字节,第1K个字节,第1M个字节,第2M个字节,第3M个字节,和最后一个字节分别需要访问几个磁盘块(2'x5=10)?
+
+ b) 该文件系统最大能支持多大的文件(5')?
+
+ 
+
+
+ 答案:
+
+ a) 1K: 1, 1M: 1, 2M: 1, 3M: 2, 最后:2
+
+ b) 2K/4*4K+4K/4*4K+4K/4*4K/4*4K
+
+
+
+ ***
+
+2. (10')设现有磁头访问请求队列98,83,137,122,14,124,67,65,当前磁头位置为50。请:
+
+ a) 分别计算最短寻道时间优先(SSTF)算法和SCAN算法所需的磁头移动距离(3'x2)
+
+ b) 请比较以上两种方法的优缺点(4')。
+
+
+ 答案:
+
+ a) SSTF: |50-65|+|65-67|+|67-83|+|83-98|+|98-122|+|122-124|+|124-137|+|137-14|=15+2+16+15+24+2+13+123=210
+
+ SCAN: |50-14|+|14-65|+|65-67|+|67-83|+|83-98|+|98-122|+|122-124|+|124-137|=36+51+2+16+15+24+2+13=159
+
+ b) SSTF未必最优,反而可能引起饥饿和不必要的抖动。SCAN和方向有关。
+
+
+
+***
+
+### 五、(22')计算、设计题
+
+设有一个文件系统,文件数据块(磁盘块)大小为4KB,每个文件数据块指针大小为4B(32位)。该文件系统需要支持以下操作:
+
+```c
+int read (int fd, int pos, int len, int *buf);
+int write (int fd, int pos, int len, int *buf);
+int insert (int fd, int pos, int len, int *buf);
+```
+
+其中,fd为文件句柄(handle),pos为读/写/插入位置,以上三个函数会按照 pos x 4KB 为实际位置读/写/插入 buf 中 len x 4KB 的数据,即每次数据操作必然读/写/插入一个磁盘块大小的数据,且插入位置的偏移量正好是4KB的整数倍。
+
+1. 请分别详细描述如何在连续磁盘块分配、链接分配、索引分配情况下实现插入操作(3'x3);
+
+
+ 答案:
+
+ 连续:是否能扩展?如果能:移动插入点以后部分,插入;否则,寻找连续空间,移动插入点前和后部分,然后插入。
+
+ 链接:重新计算插入点位置,插入点开始,重新分配;删除原来的数据块。(还有很多其它实现方法)
+
+ 索引:分配块,复制数据,移动索引指针。
+
+
+
+ ***
+
+2. 不考虑缓存,不考虑连续分配时空间不够的情况,请详细分析以上三种实现每次读/写/插入操作需要访问多少次磁盘(2x3');
+
+
+ 答案:
+
+ 连续:读:1,写:1,插入:插入点后块个数*2+1
+
+ 链接:读:1到2次,写:1到2次,插入:插入点后块个数*2+1或2
+
+ 索引:1+插入索引项后的索引块个数+1
+
+
+
+ ***
+
+3. 请问以上哪种方式最不适合这一场景?哪种方式最适合这一场景?为什么?(2x2')
+
+
+ 答案:
+
+ 链接最不适合:非对齐
+
+ 索引最适合:移动代价小
+
+
+
+ ***
+
+4. 假设在FCB中,还剩余256B的空间,请参考UNIX文件系统的i-node结构,设计一个多级的包含直接块和间接索引的块管理方式,并分析该方式与以上三种方式相比的优缺点。(3')
+
+
+ 答案:
+
+ 小文件读写速度快,能容纳大文件
+
+
+
+***
+
+## 2008-2009学年下学期期末试卷(B)
+
+### 一、(15')是非题(以下结论正确的请标T,错误的请标F并改正)(3'x5)
+
+1. 线程都保存有各自的栈信息、CPU状态(寄存器、指令计数器等)、堆信息,以及打开文件列表等。
+
+ ***
+
+2. 段表由各个进程自己管理,进程可在用户态对段表进行更新。
+
+ ***
+
+3. 分时(time-sharing)是为了在操作系统中支持同时运行多个程序,从而提高CPU的利用率而提出的。
+
+ ***
+
+4. Windows的实现将图形界面功能在核心态,有利于图形界面功能的效率。
+
+ ***
+
+5. 进程不会因为申请、使用共享资源发生死锁。
+
+***
+
+### 二、(18')单项选择题(3'x6)
+
+1. 以下哪一种程序(或程序片段)常通过伪装成其它程序,引诱用户运行,从而威胁系统的安全?
+
+ A. 计算机病毒
+
+ B. 特洛伊木马
+
+ C. 逻辑炸弹
+
+ D. 操作系统自举(bootstrap)文件
+
+ ***
+
+2. 以下哪一种机制能够帮助系统管理员防止攻击者窃听在公共网络上传输的数据?
+
+ A. 加密
+
+ B. 认证
+
+ C. 访问控制矩阵
+
+ D. 防火墙
+
+ ***
+
+3. 以下哪种网络拓扑结构对单点故障的容错性最好?
+
+ A. 星型网络
+
+ B. 树型网络
+
+ C. 环型网络
+
+ D. 全联通网络
+
+ ***
+
+4. 以下对于目录及其实现的描述,正确的是:
+
+ A. 目录就是文件控制块(file control block)
+
+ B. 目录是文件控制块的集合,它通常使用一种特殊的文件控制块实现
+
+ C. 通过链接,文件在不同目录下可以有不同的文件名;目录虽然也可以链接,但是不能有不同目录名
+
+ D. 根目录的父目录是其本身
+
+ ***
+
+5. 以下哪种存储设备不需要进行空闲块管理?
+
+ A. 只读光盘
+
+ B. 磁盘
+
+ C. 磁带
+
+ D. U盘
+
+ ***
+
+6. 以下哪个操作不是磁盘格式化进行的?
+
+ A. 划分扇区和磁道
+
+ B. 建立空闲FCB列表
+
+ C. 建立空闲块列表
+
+ D. 设定根目录文件
+
+***
+
+### 三、(20')简答题
+
+1. 程序控制输入输出(programmed I/O)和直接内存访问(DMA)哪种对于高速I/O访问效率较高,为什么?。(5')
+
+ ***
+
+2. 请简述在一个支持有向无环图目录结构的文件系统中,链接一个普通文件(非目录文件)时操作系统需要执行哪些操作。(5')
+
+ ***
+
+3. 请问哪种文件块分配方式有利于顺序访问文件的效率,为什么?。(5')
+
+ ***
+
+4. 请简述实现分布式互斥的三个难点。(5')
+
+***
+
+### 四、(25')计算题
+
+1. (15')假设有文件系统使用i-node如图所示。其中一个磁盘块大小为4KB,一个磁盘块指针大小为32位(4B),直接块(direct block)大小为2KB,其它索引块大小和一个磁盘块一样大小。假设有一个3MB大小的文件,其i-node已在内存中(direct block也在内存中),文件的其它部分都在磁盘上,不考虑缓存。请问:
+
+ a) 顺序访问其第1到第1K个字节,第1到第2M个字节,和整个文件分别需要访问几个磁盘块(2'x5=10)?
+
+ b) 该文件系统最大能支持多大的文件(5')?
+
+ 
+
+ ***
+
+2. (10')设现有磁头访问请求队列98,83,137,122,14,124,67,65,当前磁头位置为23。请:
+
+ a) 分别计算最短寻道时间优先(SSTF)算法和SCAN算法所需的磁头移动距离(3'x2)
+
+ b) SSTF是否是最优的?为什么?(4')。
+
+***
+
+### 五、(22')计算、设计题
+
+在一个需要频繁读和追加数据(即写在文件末尾)的场合,有写操作,但没有插入操作。已知每次读或写操作都会读出或写入相当大规模的数据(但未必是磁盘块大小的整数倍),但是开始读或写的位置可能出现在文件的任何地方。
+
+1. 请问:连续磁盘块分配、链接分配、索引分配分别是否适合这一场景,请为每一种方法分析优缺点?(5'x3);
+
+ ***
+
+2. 假设在FCB中,还剩余256B的空间,请参考UNIX文件系统的i-node结构,设计一个多级的包含直接块和间接索引的块管理方式,并分析该方式与以上三种方式相比的优缺点。(7')
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2009-2010\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2009-2010\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..77b5f0b
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2009-2010\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,697 @@
+---
+title: 2009-2010学年下学期期末
+---
+
+## 2009-2010学年下学期期末试卷(A)(含答案)
+
+### 一、(15分)是非题(请判断以下论述正确与否(用T/F表示),并修正错误的论述)(每题3分)
+
+1. 在多进程多线程操作系统中,每个进程只需要维护一个栈(stack);
+
+
+ 答案:
+
+ F, 每个线程都需要栈
+
+
+
+ ***
+
+2. 微内核操作系统中,CPU调度和虚存管理功能必须在微内核中实现;
+
+
+ 答案:
+
+ F. 虚存管理可以不在微内核中
+
+
+
+ ***
+
+3. 在虚存管理时,采用先进先出(FIFO)页面替换策略,必然会发生Belady异常(即分配页框越多,缺页率反而越高);
+
+
+ 答案:
+
+ F. 可能发生,也可能不发生
+
+
+
+ ***
+
+4. 对于键盘这样的低速字符设备,采用DMA方式进行数据交换是不合适的;
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+5. 在目录文件中,必须保存文件名和文件控制块信息。
+
+
+ 答案:
+
+ F. 文件控制块通常不在目录文件中
+
+
+
+***
+
+### 二、(15分)单项选择题(每题3分)
+
+1. 当发生抖动(或称为颠簸,thrashing)时,以下哪种现象不会出现?
+
+ A. 处于等待(waiting)状态的进程数增多
+
+ B. CPU利用率增高
+
+ C. 磁盘I/O增多
+
+ D. 长程调度(long-term scheduling)允许更多的进程进入就绪(ready)状态
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 多CPU共享内存环境下,以下哪种实现临界区的方法无效?
+
+ A. 使用test_and_set机器指令实现“忙等”(busy waiting)
+
+ B. Peterson算法
+
+ C. 关中断
+
+ D. 使用swap机器指令实现“忙等”
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+3. 以下哪种情况仍然可能会发生死锁?
+
+ A. 资源都是可共享的;
+
+ B. 每一种资源的数量都超过单个进程所需这类资源的最大值;
+
+ C. 空闲资源能够满足任意一个进程还需要的资源需求;
+
+ D. 每个进程必须一次申请、获得所需的所有资源
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. 以下哪种数据结构必须存放在持久存储介质上?
+
+ A. 进程控制块
+
+ B. 页表
+
+ C. 文件控制块
+
+ D. 打开文件列表
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 以下哪种海量存储技术对于提升存储系统的容错性没有直接帮助?
+
+ A. 无冗余(non-redundant)的条带化(striping)
+
+ B. 映像(mirroring)
+
+ C. 按位奇偶校验(bit-interleaved parity)
+
+ D. 按块奇偶校验(block-interleaved parity)
+
+
+ 答案:
+
+ A
+
+
+
+***
+
+### 三、(25分)辨析题(请分别解释以下每组的两个名词,并列举他们的区别)(每题5分)
+
+1. 死锁(deadlock)与饥饿(starvation)
+
+
+ 答案:
+
+ 死锁:多个进程循环等待对方,都无法继续执行
+
+ 饥饿:某个或某些进程由于无法得到资源长时间无法执行
+
+ 死锁必然发生饥饿,但是饥饿不一定发生死锁
+
+
+
+ ***
+
+2. 程序控制输入输出(programmed I/O)与直接内存访问(DMA)
+
+
+ 答案:
+
+ PIO:CPU直接发出对于I/O的指令
+
+ DMA:CPU在交换开始、结束时介入,其他时候由DMA控制器协调I/O设备和内存间利用总线的数据交换。
+
+ DMA通常能够节省大量中断和CPU介入的时间,有利于大批量数据的交换
+
+
+
+ ***
+
+3. 分时(time-sharing)与多道程序(multi-programming)
+
+
+ 答案:
+
+ 分时:将时间划分成时间片,进程按时间片轮流执行
+
+ 多道:系统中存在多个程序同时执行
+
+ 分时主要针对提高系统的响应速度,改善用户体验;多道主要针对增加系统的利用率。
+
+
+
+ ***
+
+4. 长程调度(long-term scheduling)与中程调度(mid-term scheduling)
+
+
+ 答案:
+
+ 长程调度:操作系统决定到底有多少进程能够从“new”状态进入就绪状态的调度
+
+ 中程调度:操作系统决定哪些进程的地址空间能够保留在内存中,哪些进程的地址空间需要被交换到外存的调度
+
+ 长程调度被用于平衡系统资源利用率与并发进程个数;中程调度被用于控制运行与就绪进程有足够的内存、较低的缺页率能够运行。
+
+
+
+ ***
+
+5. 二级存储(secondary storage)与三级存储(tertiary storage)
+
+
+ 答案:
+
+ 二级存储:通常指磁盘,用于存储文件、交换空间、虚存
+
+ 三级存储:较慢、但具有较大容量的持久存储介质,包括光盘、磁带等,通常用于转储、备份
+
+ 和三级存储相比,二级存储通常访问速度较快、单位容量价格较高。三级存储通常具有存储介质与存储驱动器分离的特点,所以价格较低,也也导致随机访问速度较慢。
+
+
+
+***
+
+### 四、(30分)计算、问答题
+
+1. 采用按需调页(demand paging),现有3个页框,分别存储着页面号2,3,4三个页面。已知接下来的页面访问顺序为1,2,3,4,1,2,5,1,2,3,4,5。使用时钟算法(clock algorithm)作为页面替换算法。(10分)
+
+ a) 请计算会发生的缺页次数(假设初始时在页框内的页面的引用位(reference bit)都是1,2/3/4三个页面按序存放,初始时指针指向页面2)?(7分)
+
+
+ 答案:
+
+ ```text
+ 2(1*), 3(1), 4(1): 1x
+ 1(1), 3(0*), 4(0): 2x
+ 1(1), 2(1), 4(0*): 3x
+ 1(1*), 2(1), 3(1): 4x
+ 4(1), 2(0*), 3(0): 1x
+ 4(1), 1(1), 3(0*): 2x
+ 4(1*), 1(1), 2(1): 5x
+ 5(1), 1(0*), 2(0): 1
+ 5(1), 1(1*), 2(0): 2
+ 5(1), 1(1*), 2(1): 3x
+ 5(0), 3(1), 2(0*): 4x
+ 5(0*), 3(1), 4(1): 5
+ 5(1), 3(1), 4(1)
+ 9次缺页
+ ```
+
+
+
+ b) 请写出这一访问序列所对应的工作集。(3分)
+
+
+ 答案:
+
+ {1,2,3,4,5}
+
+
+
+ ***
+
+2. 已知磁盘访问队列98, 183, 37, 122, 14, 124, 65, 67(标号为柱面号),当前磁头位置为53。(10分)
+
+ a) 请写出一种最优的磁头移动序列,并计算磁头移动距离。(5分)
+
+
+ 答案:
+
+ ```text
+ 53, 37, 14, 65, 67, 98, 122, 124, 183
+ (53-14)+(183-14)=39+169=208
+ ```
+
+
+
+ b) 请问这一序列和哪种调度算法的结果是一致的?(2分)
+
+
+ 答案:
+
+ LOOK
+
+
+
+ c) 请问这种调度算法能否保证在任意情况下是最优的?为什么?(3分)
+
+
+ 答案:
+
+ 不能,与磁头移动的初始移动方向有关
+
+
+
+ ***
+
+3. (10分)现有以下实现有界缓存(bounded buffer)问题的伪代码
+
+ ```c
+ semaphore mutex = 1;
+ semaphore full = 0;
+ semaphore empty = 3; //buffer中允许3个item
+
+ producer() {
+ // produce an item
+ wait(empty);
+ wait(mutex);
+ // add it to the buffer
+ signal(mutex);
+ signal(full);
+ }
+
+ consumer() {
+ wait(mutex);
+ wait(full);
+ // remove one from buffer
+ signal(mutex);
+ signal(empty);
+ // consume the removed item
+ }
+ ```
+
+ a) 请问该代码是否会引起死锁?(3分)
+
+
+ 答案:
+
+ 会
+
+
+
+ b) 如果不会引起死锁,请证明死锁(证明死锁的四个必要条件中有一个不成立);如果可能引起死锁,请画出资源分配图(信号量作为资源),指出代码发生死锁的原因,并进行改正。(7分)
+
+
+ 答案:
+
+ 
+
+ 第13、14行交换次序
+
+
+
+***
+
+### 五、(15分)综合题
+
+现有如下代码
+
+```c
+int pos[10];
+... /* 和用户交互,为pos[i]赋值 */
+int fd = open("/home/us001/test.txt", O_WRONLY); /* 以只写方式打开文件 */
+for (int i = 0; i < 10; i ++) {
+ fseek(fd, pos[i], SEEK_CUR); /* 文件指针定位到当前位置+pos[i] */
+ fprint(fd, "pos %d\n", i); /* 写文件 */
+}
+close(fd); /* 关闭文件 */
+```
+
+a) 请解释第2、第4、第5、第6行代码执行时,操作系统分别需要进行哪些操作?(8分)
+
+
+答案:
+
+2:通过文件系统查找、定位文件;获取文件控制块;更新系统和进程的打开文件列表;
+
+4:更新文件位置指针
+
+5:写缓存
+
+6:将缓存写出到磁盘;更新文件控制块信息;更新打开文件列表(关闭文件)
+
+
+
+b) 请问第4、第5行代码的写操作属于顺序访问还是随机访问?(2分)
+
+
+答案:
+
+随机访问
+
+
+
+c) 请问对于这种访问方式,采用何种文件块组织方式较合适?为什么?(5分)
+
+
+答案:
+
+采用顺序分配或者索引分配较合适。因为这样能够较快的定位文件位置指针。
+
+
+
+***
+
+## 2009-2010学年下学期期末试卷(B)(含答案)
+
+### 说明
+
+- 原卷参考答案不全
+
+### 一、(15分)是非题(请判断以下论述正确与否(用T/F表示),并修正错误的论述)(每题3分)
+
+1. 在多进程多线程操作系统中,每个进程可以只维护一个堆(heap);
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+2. 在操作系统中,CPU调度和虚存管理功能必须在内核中实现;
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+3. 在虚存管理时,采用LRU页面替换策略,可能会发生Belady异常(即分配页框越多,缺页率反而越高);
+
+
+ 答案:
+
+ F. 不会发生
+
+
+
+ ***
+
+4. 对于光盘设备,采用DMA方式进行数据交换是不合适的;
+
+
+ 答案:
+
+ F. 光盘数据交换速度较快,传输数据量大,合适
+
+
+
+ ***
+
+5. 在目录文件中,必须保存文件名和文件数据存储位置信息。
+
+
+ 答案:
+
+ F. 数据存储位置通常在文件控制块中,不在目录文件中
+
+
+
+***
+
+### 二、(15分)单项选择题(每题3分)
+
+1. 当系统中的进程增多时,以下哪些(个)情况不可能出现(不考虑死锁):
+
+ A. CPU利用率增高
+
+ B. CPU利用率降低
+
+ C. 磁盘I/O增多
+
+ D. 磁盘I/O减少
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+2. 以下那个操作不会使得一个进程从运行(running)状态转换为就绪(ready)状态:
+
+ A. 在可占先(preemptive)系统中,高优先级进程被创建
+
+ B. 分时系统中,时间片到
+
+ C. 当前运行进程发生缺页中断
+
+ D. 当前运行进程调用yield(),主动放弃使用CPU
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+3. 对于死锁,以下哪个描述是错误的:
+
+ A. 死锁避免(deadlock avoidance)中,不安全的状态必然发生死锁
+
+ B. 死锁避免(deadlock avoidance)中,发生死锁必然处于不安全状态
+
+ C. 资源分配图中有环(以资源类型和进程为节点),必然发生死锁
+
+ D. 如果要求每个进程必须一次申请所有需要的资源,如果不能满足其要求,则不分配任何资源,那么死锁不可能发生
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+4. 关于线程,以下说法错误的是:
+
+ A. 用户态线程(无核心态线程或LWP)阻塞,可能会阻塞线程
+
+ B. 多处理器环境下,线程间同步不能使用关中断实现
+
+ C. 线程控制块中包含CPU寄存器状态
+
+ D. 在支持核心态线程的系统中,CPU调度的单位仍然是进程
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+5. 以下哪种海量存储技术不是实现RAID的基本技术?
+
+ A. 无冗余(non-redundant)的条带化(striping)
+
+ B. 位图(bitmap)空闲块索引
+
+ C. 按位奇偶校验(bit-interleaved parity)
+
+ D. 按块奇偶校验(block-interleaved parity)
+
+
+ 答案:
+
+ A
+
+
+
+***
+
+### 三、(25分)辨析题(请分别解释以下每组的两个名词,并列举他们的区别)(每题5分)
+
+1. 进程(process)与线程(thread)
+
+ ***
+
+2. 目录(directory)与文件控制块(FCB)
+
+ ***
+
+3. 分时(time-sharing)与批处理(batch processing)
+
+ ***
+
+4. 旁路查找表(或称为快表,TLB)与页表(page table)
+
+ ***
+
+5. 块设备与字符设备
+
+***
+
+### 四、(30分)计算、问答题
+
+1. 采用按需调页(demand paging),现有3个页框,分别存储着页面号2,3,4三个页面。已知接下来的页面访问顺序为1,2,3,4,1,2,5,1,2,3,4,5。使用LRU算法作为页面替换算法。(10分)
+
+ a) 请计算会发生的缺页次数(7分)
+
+ b) 请写出这一访问序列所对应的工作集。(3分)
+
+
+ 答案:
+
+ {1,2,3,4,5}
+
+
+
+ ***
+
+2. 已知磁盘访问队列98, 183, 37, 122, 14, 124, 65, 67(标号为柱面号),当前磁头位置为12。(10分)
+
+ a) 请写出一种最优的磁头移动序列,并计算磁头移动距离。(5分)
+
+ b) 请问这一序列和哪种调度算法的结果是一致的?(2分)
+
+
+ 答案:
+
+ LOOK
+
+
+
+ c) 请问这种调度算法能否保证在任意情况下是最优的?为什么?(3分)
+
+
+ 答案:
+
+ 不能,与磁头移动的初始移动方向有关
+
+
+
+ ***
+
+3. (10分)现有以下实现有界缓存(bounded buffer)问题的伪代码
+
+ ```c
+ semaphore mutex = 1;
+ semaphore full = 0;
+ semaphore empty = 3; //buffer中允许3个item
+
+ producer() {
+ // produce an item
+ wait(empty);
+ wait(mutex);
+ // add it to the buffer
+ signal(mutex);
+ signal(full);
+ }
+
+ consumer() {
+ wait(full);
+ wait(mutex);
+ // remove one from buffer
+ signal(empty);
+ signal(mutex);
+ // consume the removed item
+ }
+ ```
+
+ a) 请问该代码是否正确?(3分)
+
+ b) 请问该代码是否会引起死锁?(3分)
+
+
+ 答案:
+
+ 不会
+
+
+
+ c) 如果不会引起死锁,请证明死锁(证明死锁的四个必要条件中有一个不成立);如果可能引起死锁,请画出资源分配图(信号量作为资源),指出代码发生死锁的原因,并进行改正。(4分)
+
+***
+
+### 五、(15分)综合题
+
+请使用二元信号量(binary semaphore,即值只能为0或1的信号量)实现计数信号量(counting semaphore,取值可为任意整数)。
+
+***
+
+## 2009-2010学年下学期期末试卷(实验班附加题)
+
+### 一、辨析题(请判断以下论断是否正确,如正确请证明,否则请给出反例)(5分x3)
+
+1. 在不可占先(non-preemptive)的情况下,最短作业优先(shortest-job first)在平均响应时间上必然是最优的。
+
+ ***
+
+2. 采用反向页表(inverted page table)和采用普通的页表(forward page table)相比,能够减少页面的访问时间。
+
+ ***
+
+3. 处于不安全状态必然发生死锁。
+
+***
+
+### 二、简述题(5分)
+
+请从语义和使用方式两个方面比较管程(monitor)和信号量(semaphore)的区别。
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2010-2011\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2010-2011\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..e99ea6c
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2010-2011\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,108 @@
+---
+title: 2010-2011学年下学期期中
+---
+
+## 2010-2011学年下学期期中试卷
+
+### 说明
+
+- 原卷标题:操作系统 2011年3班期中小测验
+
+### 一、综合(25')
+
+请简述计算机系统启动,直到运行第一个用户应用程序,然后派生出第二个线程的整个过程中的可能的步骤,并分析每一个步骤的代价(大/中/小),说明理由。
+
+***
+
+### 二、进程与线程(25')
+
+假设线程有运行(running)、就绪(ready)、等待(waiting)和休眠(suspended)四种状态。请分别说明什么时候会发生以下状态转换:
+
+a) 运行 ==> 等待 (4')
+
+b) 就绪 ==> 运行 (4')
+
+c) 等待 ==> 就绪 (4')
+
+d) 等待 ==> 休眠 (4')
+
+e) 请证明SJF调度策略在非抢占(non-preemptive)情况下是最优的 (9')。
+
+***
+
+### 三、进程间同步与死锁(30')
+
+现有四个进程P0, P1, P2, P3,三类资源A, B, C,各有7、5、5个。资源分配矩阵如下:
+
+| | A | B | C |
+| --- | --- | --- | --- |
+| P0 | 0 | 1 | 0 |
+| P1 | 2 | 0 | 0 |
+| P2 | 3 | 0 | 3 |
+| P3 | 2 | 2 | 2 |
+
+资源请求矩阵如下:
+
+| | A | B | C |
+| --- | --- | --- | --- |
+| P0 | 0 | 0 | 0 |
+| P1 | 2 | 0 | 2 |
+| P2 | 0 | 0 | 0 |
+| P3 | 1 | 0 | 0 |
+
+可用资源向量为:
+
+| A | B | C |
+| --- | --- | --- |
+| 0 | 2 | 0 |
+
+a) 请问:目前是否存在死锁?如果不存在死锁,请给出一个能够让所有进程执行完的序列 (8')
+
+假设有一个科学计算进程scicomp,它每次从任务队列中获得一个计算任务,然后进行计算:
+
+```c
+void scicomp ()
+{
+ while (true)
+ {
+ get_task ();
+ comp ();
+ }
+}
+```
+
+任务队列中的任务数存放在全局变量m中:
+
+```c
+int m;
+```
+
+当任务队列为空时,它唤醒另一个进程taskassign,分配一些计算任务,放在队列中:
+
+```c
+void taskassign ()
+{
+ while (true)
+ {
+ m = put_task ();
+ }
+}
+```
+
+其中,put_task ()返回的是放入队列的任务个数。
+
+假设scicomp在队列为空时不能执行get_task(),而taskassign只能在队列为空时执行,队列的大小没有限制。要求:
+
+b) 使用信号量,并修改以上scicomp和taskassign代码,使得程序能够满足以上条件 (8');
+
+c) 说明为什么你的程序是对的 (4')
+
+d) 请使用二元信号量(binary semaphore,即值只能为0或1的信号量)实现计数信号量(counting semaphore,取值可为任意整数) (10')。
+
+***
+
+### 四、内存管理 (20')
+
+a) 请简述采用TLB和2级页表时,内存访问的步骤 (10');
+
+b) 请比较反向页表(inverted page table)和散列页表(hashed page table)的优缺点 (10')。
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..aba1124
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,195 @@
+---
+title: 2011-2012学年下学期期中
+---
+
+## 2011-2012学年下学期期中试卷(含答案)
+
+### 一、(5')
+
+请证明给定就绪(ready)队列,采用最短剩余时间优先(Shortest Remaining Time First,SRTF)的CPU调度能确保队列中所有进程的平均响应时间最小。(5‘)
+
+
+答案:
+
+采用反证法:SRTF调度情况下调换任意两个进程顺序,平均响应时间将会增加。
+
+
+
+***
+
+### 二、(16’)
+
+已知就绪队列中已有4个进程,所需要的CPU时间按到达次序分别为28,5,43,35个毫秒;在第10毫秒到达第五个进程,它所需要的CPU时间为8个毫秒。请写出在先来先服务(First-Come-First-Serve,FCFS)、以5毫秒和20毫秒为单位的轮询(Round-Robin)、最短作业优先(Shortest Job First)这四种不同的CPU调度下,这些进程的调度序列(可用甘特图(Gantt Chart)表示)(3' x 4),并分别计算四种不同情况下的平均响应时间(1' x 4)。
+
+
+答案:
+
+FCFS: 28, 5, 43, 35, 8. (28+33+76+(111-10))/5
+
+RR(5): p1(5,23),p2(5,0),p3(5,38),p4(5,30),p1(5,18),p5(5,3),p3(5,33),p4(5,25),p1(5,13),p5(3,0),p3(5,28),p4(5,20),p1(5,8),p3(5,23),p4(5,15),p1(5,3),p3(5,18),p4(5,10),p1(3,0),p3(5,13),p4(5,5),p3(5,8),p4(5,0),p3(5,3),p3(3,0)
+
+p1: 15+15+13+10+10=63
+
+p2: 5
+
+p3: 10+15+13+10+10+8+5+5=76
+
+p4: 15+15+13+10+10+8+5=76
+
+p5: 15+15=30
+
+(63+5+76+76+30)/5
+
+RR(20): p1(20,8),p2(5,0),p3(20,23),p4(20,15),p5(8,0),p1(8,0),p3(20,3),p4(15,0),p3(3,0)
+
+p1: 53
+
+p2: 20
+
+p3: 25+36+15=76
+
+p4: 45+36=81
+
+p5: 55
+
+(53+20+76+81+55)/5
+
+SJF: p2(5), p1(28), p5(8), p4(35), p3(43)
+
+(5+0+76+41+23)/5
+
+
+
+***
+
+### 三、(5‘)
+
+请详细描述一个用户态线程调用sleep()系统调用后,操作系统所执行的任务。
+
+
+答案:
+
+系统调用过程:mode-switch, 查表(syscall handling), 执行系统调用代码
+
+sleep() 将当前进程放入waiting队列(设置alarm)
+
+CPU调度(context switch)
+
+系统调用结束,返回,mode-switch
+
+mode-switch/context-switch/mode-switch各一分,syscall过程1分,CPU调度1分
+
+
+
+***
+
+### 四、(20')
+
+对于读者/写者(readers-writers)问题,请用信号量(semaphore)写一个写者不会发生饥饿(starvation)的程序伪码(6')(要求给出完整的信号量定义/初始化,并说明信号量的用途;给出完整的程序框架,读和写的具体内容可用注释表示)。并详细分析:
+
+1)程序能够确保读者之间共享读操作,写操作和其它所有操作互斥(3');
+
+2)程序不会发生死锁(3');
+
+3)写者不会发生饥饿(4');
+
+4)读者的并发程度(4')。
+
+
+答案:
+
+略(各种写法)
+
+
+
+***
+
+### 五、(12')
+
+请对下图的场景用资源分配图(Resource Allocation Graph)进行建模,说明什么表示成资源,什么表示成进程(4')。请根据资源分配图判断是否产生了死锁,并分析原因(4‘)。请说明死锁的四个必要条件是什么,在下图所示情况下哪些条件满足了,哪些不满足(4')
+
+
+
+
+答案:
+
+图:略(汽车为进程,桥上2个位置为资源,有不同的表示方法)
+
+四个必要条件满足
+
+
+
+***
+
+### 六、(12’)
+
+现有5个进程(P0-P4),3类资源(A:9, B:5, C:5),当前的系统状态如下:
+
+
+
+| | Allocation A | Allocation B | Allocation C | Max A | Max B | Max C |
+| --- | --- | --- | --- | --- | --- | --- |
+| P0 | 0 | 1 | 0 | 7 | 5 | 3 |
+| P1 | 2 | 0 | 0 | 3 | 2 | 2 |
+| P2 | 3 | 0 | 2 | 9 | 0 | 2 |
+| P3 | 2 | 1 | 1 | 2 | 2 | 2 |
+| P4 | 0 | 0 | 2 | 4 | 3 | 3 |
+
+系统剩余的资源为:Available: (2, 3, 0)
+
+请问:
+
+a) 如果系统不允许资源抢占,系统当前是否处于安全状态?如果不处于安全状态,请写出可能发生死锁的进程,并画出它们之间的等待图(wait-for graph);如果处于安全状态,请写出进程执行的序列。(8')
+
+b) 请问系统是否一定发生死锁?为什么?(4‘)
+
+
+答案:
+
+a. 不安全。图略
+
+b. 不一定:max不一定同时达到(或主动释放)
+
+
+
+***
+
+### 七、(11')
+
+a) 请写出使用旁路查找表(Translation Look-aside Table)和二级页表时,根据逻辑地址获取物理内存地址的过程(包括错误检查过程)(5‘)。
+
+b) 已知一次相联存储器的访问需要0.1毫秒,一次内存访问需要1毫秒,旁路查找表的命中率为30%,请计算此时(使用旁路查找表的二级页表)的有效访问时间(effective access time)(3')。
+
+c) 如果要求平均访问时间达到1.5毫秒,请问旁路查找表的命中率应该至少为多少?(3')
+
+
+答案:
+
+a. 要点:TLB判断,页表valid/出错判断,先查一级页表再查二级页表
+
+b. $(1+0.1)\times30\%+(3+0.1)\times70\%$
+
+c. $(1+0.1)\times x\%+(3+0.1)\times(1-x\%)\le 1.5$
+
+
+
+***
+
+### 八、(19')
+
+名词辨析:请写出以下各组概念中每个概念的含义,以及它们之间的联系和区别(包括优缺点)。
+
+a) 段式(segmentation)内存管理和页式(paging)内存管理(5')
+
+b) 内核态(kernel mode)和用户态(user mode)(3')
+
+c) 多道程序(multi-programming)、多线程(multi-threading)以及分时(time-sharing)(6')
+
+d) 微内核(mico-kernel)和模块化内核(modular kernel)(5')
+
+
+答案:
+
+略。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..ce713b2
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,599 @@
+---
+title: 2011-2012学年下学期期末
+---
+
+## 2011-2012学年下学期期末试卷(A)(含答案)
+
+### 一、是非题(4' x 8)
+
+请判断以下论断正确与否。正确的用 T 表示;错误的用 F 表示,并指出为何错误。
+
+1. Belady 异常(Belady anomaly)是指某一个页面替换算法在任何情况下,分配给一个进程的页框(page frame)越多,则缺页率越高。
+
+
+ 答案:
+
+ F. 指有可能出现这种情况
+
+
+
+ ***
+
+2. 在类 UNIX 系统(如 Linux)中,一个目录的权限为:`rwx------`,表示:目录的所有者(owner)对于该目录具有读写权限,并且可以执行目录中的所有可执行文件。
+
+
+ 答案:
+
+ F. 可以进入该目录
+
+
+
+ ***
+
+3. RAID 技术有助于增强存储系统的可靠性(availability),但是会增加存储系统的响应时间(response time),并降低访问的吞吐率(throughput)。
+
+
+ 答案:
+
+ F. striping 可以在降低响应时间,提高吞吐率。
+
+
+
+ ***
+
+4. 假脱机(spooling)方式常被用于处理字符设备(character device),如终端,的 I/O 操作。
+
+
+ 答案:
+
+ F. 常用于打印机,非字符设备。
+
+
+
+ ***
+
+5. “特洛伊木马(Troy horse)“程序是具有自我复制能力的代码片段,能够通过自我复制在程序间或计算机系统间进行传播。
+
+
+ 答案:
+
+ F. 病毒具有自我传播能力;或特洛伊木马指利用环境做非法操作的程序。
+
+
+
+ ***
+
+6. 在微内核(micro-kernel)结构的操作系统中,虚拟内存(virtual memory)管理是在微内核内部的。
+
+
+ 答案:
+
+ F. 只有 CPU 调度和进程间通信是必须在微内核内部。
+
+
+
+ ***
+
+7. 发生缺页(page fault)的进程会直接从”运行(running)“状态进入”就绪(ready)“状态。
+
+
+ 答案:
+
+ F. 进入 waiting 状态
+
+
+
+ ***
+
+8. 如果有两个进程竞争使用两个独占(dedicated)的 I/O 设备,有可能会发生死锁。
+
+
+ 答案:
+
+ T.
+
+
+
+***
+
+### 二、名词辨析(28‘)
+
+请分别说明以下每组名词中每一个的含义,并说明它们之间的区别和联系
+
+1. (4‘)页面(page)和页框(frame)
+
+
+ 答案:
+
+ 页面:地址空间中划分成的一样大小的连续空间
+
+ 页框:用于放置页面的内存空间
+
+
+
+ ***
+
+2. (6’)文件控制块(file control block, FCB),inode,和目录
+
+
+ 答案:
+
+ FCB:操作系统用于管理文件的基本属性的数据结构,需要存放在磁盘上
+
+ inode:类 unix 操作系统的 FCB 结构
+
+ 目录:文件的逻辑集合
+
+
+
+ ***
+
+3. (4‘)文件的写(write)权限和追加(append)权限
+
+
+ 答案:
+
+ 写权限:可以在文件中的任何位置写入
+
+ 追加权限:只可以在文件的末尾写入(不能覆盖已有数据)
+
+
+
+ ***
+
+4. (4‘)文件系统的格式化(format)和低级格式化(low-level format)
+
+
+ 答案:
+
+ 格式化:建立文件系统的操作
+
+ 低级格式化:建立基本文件系统(basic file system)的操作,即划分块的操作
+
+
+
+ ***
+
+5. (4‘)文件的链接(link)和复制(copy)
+
+
+ 答案:
+
+ 链接:不复制文件内容,但创建一个新的目录项(指向已经存在的文件)
+
+ 复制:复制文件的内容
+
+
+
+ ***
+
+6. (6’)阻塞的(blocking)I/O 操作、非阻塞的(non-blocking)I/O 操作、异步的(asynchronous)I/O 操作
+
+
+ 答案:
+
+ 阻塞 i/o:开始操作后停止,等到 i/o 结束后再继续
+
+ 非阻塞 i/o:开始操作后继续进行其它工作
+
+ 异步 i/o:开始操作后继续其它工作,但在 i/o 结束后得到通知,对 i/o 结果进行响应 1
+
+
+
+***
+
+### 三、计算、问答题(30‘)
+
+1. (3' x 3)已知磁道访问请求队列:98, 183, 37, 14, 122, 65, 124, 67,当前磁头位置为53,方向为 53=>0,请分别计算 FIFO(先进先出),SSTF(最短寻道时间优先),SCAN 调度下响应所有请求的磁头移动距离,并写出每种调度的响应顺序。
+
+
+ 答案:
+
+ ```text
+ FIFO: 53, 98, 183, 37, 14, 122, 65, 124, 67.
+ (98-53)+(183-98)+(183-37)+(37-14)+(122-14)+(122-65)+(124-65)+(124-67)=45+85+146+23+108+57+59+57=580
+
+ SSTF: 53, 65, 67, 98, 122, 124, 183, 37, 14.
+ 12+2+31+24+2+59+146+23=299
+
+ SCAN: 53, 37, 14, (0), 65, 67, 98, 122, 124, 183.
+ 53+183=236
+ ```
+
+
+
+ ***
+
+2. (4')请问 SSTF 是否是磁头调度算法中最优的?为什么?(如果是最优的,请证明,否则请举出反例)
+
+
+ 答案:
+
+ 否。如 1 中示例。
+
+
+
+ ***
+
+3. (10‘)现有两个进程 P1 和 P2,当前的页面访问序列分别为:
+
+ ```text
+ P1: 1, 2, 3, 4, 1, 2, 5
+ P2: 6, 7, 8, 6, 7, 6, 7
+ ```
+
+ 这两个进程总共可有 5 个页框可供使用。假设使用 LRU 替换策略,页框分配采用固定分配(即分配后不可修改),请问如何在两个进程间分配页框可以达到缺页率最低?请写出替换序列,和缺页率计算过程(4’);并证明该分配对于给出的序列是最优的(6‘)。
+
+
+ 答案:
+
+ 2, 3 (10 次缺页)
+
+ 1, 1, 3, 4, 1, 2, 5
+
+ 2, 2, 3, 4, 1, 2
+
+
+
+ 6, 6, 6, 6, 6, 6, 6
+
+ 7, 7, 7, 7, 7, 7
+
+ 8, 8, 8, 8, 8
+
+ 证明:
+
+ 1. 给 P2 更多页面不会减少 P2 的缺页率;
+ 2. 给 P1 3 个页面不会减少 P1 的缺页率,但是会增加 P2 的缺页率;
+ 3. 给 P1 4 个页面,P1 的缺页次数为 5,但是 P2 的缺页次数为 7。
+
+
+
+ ***
+
+4. (7’)请简述直接内存访问(DMA)方式 I/O 的过程(可用图表示)(4‘),并说明为何 CPU 和 DMA 模块都需要通过内存总线访问内存,却仍然能够加快 I/O 访问的速度。(3‘)
+
+
+ 答案:
+
+ 
+
+ Cycle stealing
+
+
+
+***
+
+### 四、(10‘)设计题
+
+某系统,磁盘块大小为 4KB,需要存储的文件中每一条记录大小相同,都是 3KB,但是不同文件中的记录条数差别很大。每条记录都有一个唯一的键值(key)。对于文件内容,也就是记录的访问有两种:顺序访问和按键值访问。文件内容只追加,不修改,不删除。请参考文件块分配中的连续分配(contiguous allocation)、链接分配(linked allocation)、索引分配(indexed allocation)等方法,设计一种磁盘块分配方法,并回答以下问题:
+
+1. (4‘)请简述分配方法,以及块分配、顺序访问、按键值访问的算法;
+
+ ***
+
+2. (2’)请分析该方法的顺序访问、按键值访问的效率;
+
+ ***
+
+3. (2’)请分析该方法的磁盘利用率;
+
+ ***
+
+4. (2’)请分析该设计的优缺点。
+
+
+ 答案:
+
+ 略。
+
+
+
+***
+
+## 2011-2012学年下学期期末试卷(B)(含答案)
+
+### 一、是非题(4' x 8=32')
+
+请判断以下论断正确与否。正确的用T表示;错误的用F表示,并指出为何错误。
+
+1. 线程都保存有各自的栈信息、CPU状态(寄存器、指令计数器等)、堆信息,以及打开文件列表等。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+2. 段表由各个进程自己管理,进程可在用户态对段表进行更新。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+3. 分时(time-sharing)是为了在操作系统中支持同时运行多个程序,从而提高CPU的利用率而提出的。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+4. Windows的实现将图形界面功能在核心态,有利于图形界面功能的效率。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+5. 进程不会因为申请、使用共享资源发生死锁。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+6. 在类UNIX系统(如Linux)中,一个文件的权限为:`rwxr-x---`,表示:目录的所有者(owner)同组用户对于该文件具有读和执行权限。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+7. “计算机病毒“程序是具有自我复制能力的代码片段,能够通过自我复制在程序间或计算机系统间进行传播。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+8. 对于键盘这样的低速字符设备,采用DMA方式进行数据交换是不合适的。
+
+
+ 答案:
+
+ T
+
+
+
+***
+
+### 二、名词辨析(4'x7=28‘)
+
+请分别说明以下每组名词中每一个的含义,并说明它们之间的区别和联系
+
+1. 死锁(deadlock)与饥饿(starvation)
+
+
+ 答案:
+
+ 死锁:多个进程循环等待对方,都无法继续执行
+
+ 饥饿:某个或某些进程由于无法得到资源长时间无法执行
+
+ 死锁必然发生饥饿,但是饥饿不一定发生死锁
+
+
+
+ ***
+
+2. 程序控制输入输出(programmed I/O)与直接内存访问(DMA)
+
+
+ 答案:
+
+ PIO:CPU直接发出对于I/O的指令
+
+ DMA:CPU在交换开始、结束时介入,其他时候由DMA控制器协调I/O设备和内存间利用总线的数据交换。
+
+ DMA通常能够节省大量中断和CPU介入的时间,有利于大批量数据的交换
+
+
+
+ ***
+
+3. 分时(time-sharing)与多道程序(multi-programming)
+
+
+ 答案:
+
+ 分时:将时间划分成时间片,进程按时间片轮流执行
+
+ 多道:系统中存在多个程序同时执行
+
+ 分时主要针对提高系统的响应速度,改善用户体验;多道主要针对增加系统的利用率。
+
+
+
+ ***
+
+4. 长程调度(long-term scheduling)与中程调度(mid-term scheduling)
+
+
+ 答案:
+
+ 长程调度:操作系统决定到底有多少进程能够从“new”状态进入就绪状态的调度
+
+ 中程调度:操作系统决定哪些进程的地址空间能够保留在内存中,哪些进程的地址空间需要被交换到外存的调度
+
+ 长程调度被用于平衡系统资源利用率与并发进程个数;中程调度被用于控制运行与就绪进程有足够的内存、较低的缺页率能够运行。
+
+
+
+ ***
+
+5. 二级存储(secondary storage)与三级存储(tertiary storage)
+
+
+ 答案:
+
+ 二级存储:通常指磁盘,用于存储文件、交换空间、虚存
+
+ 三级存储:较慢、但具有较大容量的持久存储介质,包括光盘、磁带等,通常用于转储、备份
+
+ 和三级存储相比,二级存储通常访问速度较快、单位容量价格较高。三级存储通常具有存储介质与存储驱动器分离的特点,所以价格较低,也也导致随机访问速度较慢。
+
+
+
+ ***
+
+6. 条带化(striping)和镜像(mirror)
+
+
+ 答案:
+
+ 两者都是RAID中常用的技术。前者将一个数据单元的内容按序存放于多个磁盘,以增加系统响应请求所能取得的带宽;后者通过存储副本增加系统容错能力。
+
+
+
+ ***
+
+7. 页式内存管理和段式内存管理
+
+
+ 答案:
+
+ 页的大小是相同的,段大小不同。段往往是程序逻辑的抽象,在有些情况下对于用户(程序员)是可见的。页通常是作为管理方便而使用的,对用户不可见。
+
+
+
+***
+
+### 三、计算、问答题(30‘)
+
+1. 请简述在一个支持有向无环图目录结构的文件系统中,链接一个普通文件(非目录文件)时操作系统需要执行哪些操作。(5')
+
+
+ 答案:
+
+ 查看/更新引用计数,更新目录文件
+
+
+
+ ***
+
+2. 请问哪种文件块分配方式有利于顺序访问文件的效率,为什么?。(5')
+
+
+ 答案:
+
+ 顺序分配,因为行为可预测,预取效果好
+
+
+
+ ***
+
+3. 采用按需调页(demand paging),现有3个页框,分别存储着页面号2,3,4三个页面。已知接下来的页面访问顺序为1,2,3,4,1,2,5,1,2,3,4,5。使用时钟算法(clock algorithm)作为页面替换算法。(10分)
+
+ a) 请计算会发生的缺页次数(假设初始时在页框内的页面的引用位(reference bit)都是1,2/3/4三个页面按序存放,初始时指针指向页面2)?(7分)
+
+
+ 答案:
+
+ ```text
+ 2(1*), 3(1), 4(1): 1x
+ 1(1), 3(0*), 4(0): 2x
+ 1(1), 2(1), 4(0*): 3x
+ 1(1*), 2(1), 3(1): 4x
+ 4(1), 2(0*), 3(0): 1x
+ 4(1), 1(1), 3(0*): 2x
+ 4(1*), 1(1), 2(1): 5x
+ 5(1), 1(0*), 2(0): 1
+ 5(1), 1(1*), 2(0): 2
+ 5(1), 1(1*), 2(1): 3x
+ 5(0), 3(1), 2(0*): 4x
+ 5(0*), 3(1), 4(1): 5
+ 5(1), 3(1), 4(1)
+ 9次缺页
+ ```
+
+
+
+ b) 请写出这一访问序列所对应的工作集。(3分)
+
+
+ 答案:
+
+ {1,2,3,4,5}
+
+
+
+ ***
+
+4. 已知磁盘访问队列98, 183, 37, 122, 14, 124, 65, 67(标号为柱面号),当前磁头位置为53。(10分)
+
+ a) 请写出一种最优的磁头移动序列,并计算磁头移动距离。(5分)
+
+
+ 答案:
+
+ ```text
+ 53, 37, 14, 65, 67, 98, 122, 124, 183
+ (53-14)+(183-14)=39+169=208
+ ```
+
+
+
+ b) 请问这一序列和哪种调度算法的结果是一致的?(2分)
+
+
+ 答案:
+
+ LOOK
+
+
+
+ c) 请问这种调度算法能否保证在任意情况下是最优的?为什么?(3分)
+
+
+ 答案:
+
+ 不能,与磁头移动的初始移动方向有关
+
+
+
+***
+
+### 四、(10‘)设计题
+
+在一个需要频繁读和追加数据(即写在文件末尾)的场合,有写操作,但没有插入操作。已知每次读或写操作都会读出或写入相当大规模的数据(但未必是磁盘块大小的整数倍),但是开始读或写的位置可能出现在文件的任何地方。
+
+1. 请问:连续磁盘块分配、链接分配、索引分配分别是否适合这一场景(3');
+
+ ***
+
+2. 假设在FCB中,还剩余256B的空间,请参考UNIX文件系统的i-node结构,设计一个多级的包含直接块和间接索引的块管理方式,并分析该方式与以上三种方式相比的优缺点。(7')
+
+
+ 答案:
+
+ 略
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2012-2013\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2012-2013\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..31df595
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2012-2013\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,226 @@
+---
+title: 2012-2013学年下学期期中
+---
+
+## 2012-2013学年下学期期中试卷(含答案)
+
+### 说明
+
+- 原卷标题:操作系统 2013年 期中考试试题
+
+### 一、多项选择题(5‘x5=25',每题有一个或多个答案,答错不给分,少答按比例给分)
+
+1. 当系统中的进程增多时,以下哪些(个)情况不可能出现(不考虑死锁):
+
+ A. CPU利用率增高
+
+ B. CPU利用率降低
+
+ C. 磁盘I/O增多
+
+ D. 磁盘I/O减少
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+2. 以下那些(个)操作会使得一个进程从运行(running)状态转换为就绪(ready)状态:
+
+ A. 在可占先(preemptive)系统中,高优先级进程被创建
+
+ B. 分时系统中,时间片到
+
+ C. 当前运行进程发生缺页中断
+
+ D. 当前运行进程调用yield(),主动放弃使用CPU
+
+
+ 答案:
+
+ A, B, D
+
+
+
+ ***
+
+3. 对于死锁,以下哪些(个)描述是正确的:
+
+ A. 死锁避免(deadlock avoidance)中,不安全的状态必然发生死锁
+
+ B. 死锁避免(deadlock avoidance)中,发生死锁必然处于不安全状态
+
+ C. 资源分配图中有环(以资源类型和进程为节点),必然发生死锁
+
+ D. 如果要求每个进程必须一次申请所有需要的资源,如果不能满足其要求,则不分配任何资源,那么死锁不可能发生
+
+
+ 答案:
+
+ B, D
+
+
+
+ ***
+
+4. 以下描述正确的是:
+
+ A. 中断处理程序(interrupt handler)是进程的一部分,在进程的地址空间运行
+
+ B. 中断处理程序(interrupt handler)必须运行在内核态
+
+ C. 微内核体系结构下,进程间通讯(inter-processing communication)必须在微内核内
+
+ D. 分时(time sharing)的目的是提高CPU和I/O的并行度
+
+
+ 答案:
+
+ B, C
+
+
+
+ ***
+
+5. 关于线程,以下说法正确的是:
+
+ A. 用户态线程(无核心态线程或LWP)阻塞,可能会阻塞线程
+
+ B. 多处理器环境下,线程间同步不能使用关中断实现
+
+ C. 线程控制块中包含CPU寄存器状态
+
+ D. 在支持核心态线程的系统中,CPU调度的单位仍然是进程
+
+
+ 答案:
+
+ A, B, C
+
+
+
+***
+
+### 二、(21')
+
+假设线程有运行(running)、就绪(ready)、等待(waiting)四种状态。请分别说明什么时候会发生以下状态转换:
+
+a) 运行 ==> 等待 (4')
+
+b) 就绪 ==> 运行 (4')
+
+c) 等待 ==> 就绪 (4')
+
+d) 请证明SJF调度策略在非抢占(non-preemptive)情况下是最优的 (9')。
+
+***
+
+### 三、(8')
+
+现有四个进程P0, P1, P2, P3,三类资源A, B, C,各有7、5、5个。资源分配矩阵如下:
+
+| | A | B | C |
+| --- | --- | --- | --- |
+| P0 | 0 | 1 | 0 |
+| P1 | 2 | 0 | 0 |
+| P2 | 3 | 0 | 3 |
+| P3 | 2 | 2 | 2 |
+
+资源请求矩阵如下:
+
+| | A | B | C |
+| --- | --- | --- | --- |
+| P0 | 0 | 0 | 0 |
+| P1 | 2 | 0 | 2 |
+| P2 | 0 | 0 | 0 |
+| P3 | 1 | 0 | 0 |
+
+可用资源向量为:
+
+| A | B | C |
+| --- | --- | --- |
+| 0 | 2 | 0 |
+
+请问:目前是否存在死锁?如果不存在死锁,请给出一个能够让所有进程执行完的序列;如果存在死锁请画出进程的等待图 (8')
+
+***
+
+### 四、(12')
+
+请说明:
+
+1. 进程创建时(如在类UNIX操作系统中,连续执行fork()和exec()系统调用),操作系统所需要进行那些工作,它们的代价如何(大,中,小)。(8')
+
+
+ 答案:
+
+ a. 构造PCB,代价小
+
+ b. 设置地址空间映射,代价中
+
+ c. 复制父进程地址空间内容,代价大
+
+ d. 复制I/O状态,代价中
+
+
+
+ ***
+
+2. 为什么线程创建比进程快,它主要节省了以上哪个步骤的代价?(4')
+
+
+ 答案:
+
+ 同一进程的不同线程共享资源,因此以上b, c, d三项代价几乎都可节省
+
+
+
+***
+
+### 五、(10')
+
+假设有三个进程A,B和C,A和B只使用CPU,各需要200毫秒,进程C使用10毫秒CPU然后进行40毫秒I/O,然后再使用10毫秒CPU接着40毫秒I/O,依此重复,总共也是200毫秒。假设三个进程的到达次序是ABC。
+
+1. 请计算使用FIFO调度,三个进程的平均等待时间和平均完成时间(4')
+
+
+ 答案:
+
+ A,B,C
+
+ 平均等待时间:(0+200+400)/3=200
+
+ 平均完成时间:(200+400+600)/3=400
+
+
+
+ ***
+
+2. 请列出使用100毫秒为时间片长度,使用轮询(round-robin)调度时,三个进程的执行次序以及每次执行的时间(6')
+
+
+ 答案:
+
+ A100, B100, C10, A100(f)C40, B100(f), C10, C40, C10, C40, C10, C40(f)
+
+
+
+***
+
+### 六、(24')
+
+有家理发店,店里有一个理发师、一把理发椅和n把等候理发的顾客椅子。
+
+(1). 如果没有顾客则理发师便在理发椅上看报纸;
+
+(2). 当有一个顾客到达时,首先查看理发师在干什么,如果在看报纸则告诉理发师理发,然后坐到理发椅上开始理发;如果理发师正在理发,则查看是否有空的椅子可坐:如果有,他就坐下等待;如果没有,则离开;
+
+(3). 理发师为一位顾客理完发后,查看是否有人等待,如有则唤醒一位为其理发,如没有则在理发椅上看报纸;
+
+(4). 顾客不分优先级
+
+请使用信号量实现多线程情况下的Barber()和Customer()两个函数(请自行定义信号量,并进行初始化)(12’),并详细说明实现的正确性(逐条说明是否能够满足以上四条规则,如何保证竞争条件的互斥,是否会发生死锁,是否会发生饥饿,是否公平)(12‘)。
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2012-2013\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2012-2013\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..3dcd79c
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2012-2013\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,990 @@
+---
+title: 2012-2013学年下学期期末
+---
+
+## 2012-2013学年下学期期末试卷(A)(含答案)
+
+### 一、判断题(请判断以下叙述的正误,用 T 和 F 表示,并对错误的叙述进行改正,说明理由。20 分,每题 2 分)
+
+1. 分页或分段系统必须采用虚拟存储技术。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+2. 以索引方式组织盘块(block)空间的文件中,索引表的每个表项描述一个文件盘块,含有相应盘块的逻辑盘块号和物理盘块号。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+3. 最短寻道时间优先调度(SSTF)算法是每次选择离磁头当前位置最近的 I/O 请求,其寻道长度必然是最短的,但有可能出现饥饿现象。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+4. 微内核操作系统中,CPU 调度、进程间通讯和虚存管理功能必须在微内核中实现。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+5. 对于鼠标这样的低速字符设备,采用 DMA 方式进行数据交换是不合适的。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+6. 在目录文件中,必须保存文件名和文件控制块信息。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+7. 在虚存管理时,采用先进先出(FIFO)页面替换策略,必然会发生 Belady 异常(即分配页框越多,缺页率反而越高)。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+8. 页表由各个进程自己管理,进程可在用户态对页表进行更新。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+9. 假脱机(spooling)方式常被用于处理字符设备(character device),如终端,的 I/O 操作。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+10. RAID 技术有助于增强存储系统的可靠性(availability),降低存储系统的响应时间(response time),但是会降低访问的吞吐率(throughput)。
+
+
+ 答案:
+
+ F
+
+
+
+***
+
+### 二、单选题(30 分,每题 2 分)
+
+1. 地址空间的容量只受 ______ 的限制。
+
+ A. 物理内存大小
+
+ B. 磁盘空间大小
+
+ C. 内存和外存可使用总容量
+
+ D. 计算机地址位数
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+2. 采用分段式存储管理的系统中,若地址用 24 位表示,其中 8 位表示段号,则允许每段的最大长度是 ______。
+
+ A. $2^{24}$
+
+ B. $2^{16}$
+
+ C. $2^8$
+
+ D. $2^{32}$
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+3. 在分页系统中,一个进程的页表如下所示:
+
+ | Page No. | Frame No. |
+ | --- | --- |
+ | 0 | 2 |
+ | 1 | 1 |
+ | 2 | 6 |
+ | 3 | 3 |
+ | 4 | 7 |
+
+ 如果页面大小为 $4\ \text{KB}$,则逻辑地址 0 所对应的物理地址为 ______。
+
+ A. 8192
+
+ B. 4096
+
+ C. 2048
+
+ D. 1024
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+对于接下来的 3 个问题,假设某作业访问页面的顺序为 2, 3, 2, 1, 5, 2, 4, 5, 3, 2, 5, 2,分配给该作业三个内存块。
+
+4. 采用 FIFO 页面置换算法会产生 ______ 次缺页中断。
+
+ A. 7
+
+ B. 8
+
+ C. 9
+
+ D. 10
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 采用 LRU 页面置换算法会产生 ______ 次缺页中断。
+
+ A. 6
+
+ B. 7
+
+ C. 8
+
+ D. 9
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+6. 采用最优页面(OPT)置换算法会产生 ______ 次缺页中断。
+
+ A. 5
+
+ B. 6
+
+ C. 7
+
+ D. 8
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+对于接下来的 4 个问题,假定某磁盘共有 50 个柱面(编号为 0~49),如果在为访问 12 号柱面的请求者服务后,当前正在为访问 14 号柱面的请求者服务,同时有若干个请求者在等待服务,它们依次要访问的柱面号为:8、15、9、35、25、30、40 和 5(以上是按请求时间先后排序的),请选择最准确的答案。
+
+7. 如果采用先来先服务(FCFS)调度算法,则满足所有这些请求过程中磁臂移过的总磁道数为 ______。
+
+ A. 50
+
+ B. 105
+
+ C. 120
+
+ D. 130
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+8. 如果采用最短寻道时间优先(SSTF)调度算法,则满足所有这些请求过程中磁臂移过的总磁道数为 ______。
+
+ A. 46
+
+ B. 47
+
+ C. 48
+
+ D. 49
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+9. 如果采用电梯调度算法(SCAN),则满足所有这些请求过程中磁臂移过的总磁道数为 ______。
+
+ A. 51
+
+ B. 61
+
+ C. 79
+
+ D. 44
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+10. 如果采用循环扫描(C-SCAN)调度算法,则满足所有这些请求过程中磁臂移过的总磁道数为 ______。
+
+ A. 44
+
+ B. 97
+
+ C. 48
+
+ D. 93
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+11. 以下哪一种程序(或程序片段)会自我复制、传播,进而威胁系统的安全?
+
+ A. 计算机病毒
+
+ B. 特洛伊木马
+
+ C. 逻辑炸弹
+
+ D. 操作系统自举(bootstrap)文件
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+12. 以下哪种存储设备通常只支持顺序访问?
+
+ A. 光盘
+
+ B. 磁盘
+
+ C. 磁带
+
+ D. U 盘
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+13. 当发生抖动(或称为颠簸,thrashing)时,以下哪种现象不会出现?
+
+ A. 处于等待(waiting)状态的进程数增多
+
+ B. CPU 利用率增高
+
+ C. 磁盘 I/O 增多
+
+ D. 长程调度(long-term scheduling)允许更多的进程进入就绪(ready)状态
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+14. 以下哪个功能不是由设备驱动程序提供的?
+
+ A. 提供标准的设备访问系统调用(如 open(), read() 等)
+
+ B. 提供中断处理程序
+
+ C. 提供 DMA 控制功能
+
+ D. 提供内核直接访问设备的接口
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+15. 以下哪种数据结构必须存放在持久存储介质上?
+
+ A. 进程控制块
+
+ B. 页表
+
+ C. 文件控制块
+
+ D. 打开文件列表
+
+
+ 答案:
+
+ C
+
+
+
+***
+
+### 三、简答题(25 分,每题 5 分)
+
+1. 假定某请求分页系统中,内存有效访问时间(effective access time)为 1 微秒(1 微秒=$10^{-6}$ 秒),二级存储平均访问时间为 10 毫秒(1 毫秒=$10^{-3}$ 秒),试问如果希望虚拟存储系统的有效访问时间仅比内存增加不超过 $10\%$,则要求页面缺页率不大于多少?
+
+
+ 答案:
+
+ 设页面缺页率为 f,则虚存的平均访问时间为:
+
+ $(1-f)*1+10000*f=1+9999f$
+
+ 如果希望虚存的平均访问时间相比内存增加不超过 $10\%$,则
+
+ $1+9999f<1*(1+10\%)$ 也即 $1+9999f<1.1$
+
+ $f<0.1/9999 \approx 1/100000$
+
+
+
+ ***
+
+2. 假设某系统使用位图(bitmap)来管理空闲磁盘空间,而该位图在一次系统崩溃中损坏了,试问有没有办法恢复该位示图?如果可以,请简述重构该位示图的方法。并分析重构所需的代价。
+
+
+ 答案:
+
+ 先将位图所有位清零,然后从根目录开始,遍历搜索系统中的每个文件,对于找到的每个文件,获取分配给该文件的盘块信息,将位图中的相应位置为 1,直至遍历结束,新的位图就重构好了。
+
+
+
+ ***
+
+3. 请简述在一个支持有向无环图目录结构的文件系统中,删除一个普通文件(非目录文件)时操作系统需要执行哪些操作。
+
+
+ 答案:
+
+ 查看/更新引用计数,如果为零,更新目录文件,释放 FCB,释放磁盘数据块
+
+
+
+ ***
+
+4. 请简述页面替换算法中的 LRU 替换与时钟算法(第二次机会),并详细比较两者各自的优缺点。
+
+
+ 答案:
+
+ 要点:队列的维护代价
+
+
+
+ ***
+
+5. 请简述前向页表、反向页表、哈希页表(或称为散列页表)的数据结构,并分析其各自的优点。
+
+
+ 答案:
+
+ 要点:空间代价,查找代价
+
+
+
+***
+
+### 四、综合题(25 分)
+
+1. (10')假设文件系统的盘块大小为 $4\ \text{KB}$,某文件的物理存储方式采用链接方式,该文件首 5 个盘块的盘块号分别为 20、54、80、95 和 100。假如要访问该文件的第 15000 字节单元,请回答以下问题:
+
+ (1)要访问的字节单元在哪个盘块上?其盘块号为多少?该字节单元是盘块内的第几字节?
+
+ (2)要访问该字节单元需要访问多少个盘块?试图示上述的访问过程。(假如该文件的 FCB 已载入内存)
+
+
+ 答案:
+
+ 该字节所在盘块的逻辑块号:$B=15000/4096=3$ (2 分)
+
+ 所以该盘块的物理盘块号为:95 (2 分)
+
+ 块内位移:$S=15000 \bmod 4096=2712$ (2 分)
+
+ 该字节所在盘块为该文件的第四个盘块
+
+ 所以,要依次访问前面三个盘块后才可以获取该第四个盘块的指针,一共要进行磁盘 I/O 操作的次数为: $3+1=4$ (2 分)
+
+ 图示上述的访问过程(略) (2 分)
+
+
+
+ ***
+
+2. (15')假设有文件系统使用 i-node 如图所示。其中一个磁盘块大小为 $4\ \text{KB}$,一个磁盘块指针大小为 32 位($4\ \text{B}$),直接块(direct block)大小为 $2\ \text{KB}$,其它索引块大小和一个磁盘块一样大小。假设有一个 $4\ \text{MB}$ 大小的文件,其 i-node 已在内存中(direct block 也在内存中),文件的其它部分都在磁盘上,不考虑缓存。请问:
+
+ a) 访问其第一个字节,第 $1\ \text{K}$ 个字节,第 $1\ \text{M}$ 个字节,第 $2\ \text{M}$ 个字节,第 $3\ \text{M}$ 个字节,和最后一个字节分别需要访问几个磁盘块(2'x5=10)?
+
+ b) 该文件系统最大能支持多大的文件(5')?
+
+ 
+
+
+ 答案:
+
+ a) $1\ \text{K}$: 1, $1\ \text{M}$: 1, $2\ \text{M}$: 1, $3\ \text{M}$: 2, 最后:2
+
+ b) $2\text{K}/4*4\text{K}+4\text{K}/4*4\text{K}+4\text{K}/4*4\text{K}/4*4\text{K}$
+
+
+
+***
+
+## 2012-2013学年下学期期末试卷(B)(含答案)
+
+### 说明
+
+- 本卷原卷标注为“软院A卷”,实则与上一张卷子内容不同,故当作B卷标记。
+
+### 一、判断题(请判断以下叙述的正误,用 T 和 F 表示,并对错误的叙述进行改正,说明理由。20 分,每题 2 分)
+
+1. 线程都保存有各自的栈信息和 CPU 状态(寄存器、指令计数器等)。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+2. 页表由各个进程自己管理,进程可在用户态对页表进行更新。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+3. 单 CPU 环境下由于任何时刻只有一个进程(线程)能够运行,因此操作系统不需要实现同步与互斥支持。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+4. 在微内核结构的操作系统中,进程间通讯可以不在微内核内。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+5. 在抢占式(preemptive)操作系统中,进程不会因为申请、使用资源发生死锁。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+6. 对于像打印机这样的低速设备,采用 DMA 方式进行数据交换是不合适的;
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+7. 在虚存管理时,采用 LRU 页面替换策略,可能会发生 Belady 异常(即分配页框越多,缺页率反而越高);
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+8. RAID 技术总是以牺牲磁盘访问性能来换取容错性的提高。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+9. 目录文件其实就是文件控制块(FCB)。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+10. 操作系统内核是一个特殊的进程,在系统启动后以运行(running)或者就绪(ready)状态存在。
+
+
+ 答案:
+
+ F
+
+
+
+***
+
+### 二、单选题(20 分,每题 2 分)
+
+1. 当发生抖动(或称为颠簸,thrashing)时,以下哪种现象不会出现?
+
+ A. 处于等待(waiting)状态的进程数增多
+
+ B. CPU 利用率增高
+
+ C. 磁盘 I/O 增多
+
+ D. 长程调度(long-term scheduling)允许更多的进程进入就绪(ready)状态
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 多 CPU 共享内存环境下,以下哪种实现临界区的方法无效?
+
+ A. 使用 test_and_set 机器指令实现“忙等”(busy waiting)
+
+ B. Peterson 算法
+
+ C. 关中断
+
+ D. 使用 swap 机器指令实现“忙等”
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+3. 以下哪种情况仍然可能会发生死锁?
+
+ A. 资源都是可共享的;
+
+ B. 每一种资源的数量都超过单个进程所需这类资源的最大值;
+
+ C. 空闲资源能够满足任意一个进程还需要的资源需求;
+
+ D. 每个进程必须一次申请、获得所需的所有资源
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. 以下哪种数据结构必须存放在持久存储介质上?
+
+ A. 进程控制块
+
+ B. 页表
+
+ C. 文件控制块
+
+ D. 打开文件列表
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 以下哪种海量存储技术对于提升存储系统的容错性没有直接帮助?
+
+ A. 无冗余(non-redundant)的条带化(striping)
+
+ B. 映像(mirroring)
+
+ C. 按位奇偶校验(bit-interleaved parity)
+
+ D. 按块奇偶校验(block-interleaved parity)
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+6. 以下哪一种程序(或程序片段)常通过伪装成其它程序,引诱用户运行,从而威胁系统的安全?
+
+ A. 计算机病毒
+
+ B. 特洛伊木马
+
+ C. 逻辑炸弹
+
+ D. 操作系统自举(bootstrap)文件
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+7. 以下哪一种机制能够帮助系统管理员防止攻击者窃听在公共网络上传输的数据?
+
+ A. 加密
+
+ B. 认证
+
+ C. 访问控制矩阵
+
+ D. 防火墙
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+8. 以下哪种存储设备不需要进行空闲块管理?
+
+ A. 只读光盘
+
+ B. 磁盘
+
+ C. 磁带
+
+ D. U 盘
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+9. 以下哪个操作不是磁盘格式化进行的?
+
+ A. 划分扇区和磁道
+
+ B. 建立空闲 FCB 列表
+
+ C. 建立空闲块列表
+
+ D. 设定根目录文件
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+10. 以下哪种数据结构不必以内核态进行访问?
+
+ A. 进程控制块
+
+ B. 页表
+
+ C. 文件控制块
+
+ D. 以上皆非
+
+
+ 答案:
+
+ D
+
+
+
+***
+
+### 三、简答题(20 分,每题 5 分)
+
+1. 程序控制输入输出(programmed I/O)和直接内存访问(DMA)哪种对于高速 I/O 访问效率较高,为什么?。(5')
+
+
+ 答案:
+
+ PIO 时,CPU 需要介入每一次数据交换;DMA 方式时,CPU 只在数据交换开始/结束时介入,其它时候,由 DMA 控制器协调 I/O 设备和内存利用总线进行数据交换。由于此时 CPU 和 I/O 设备几乎并行,因此与 PIO 方式相比,节省了大量中断、CPU 介入时间。
+
+
+
+ ***
+
+2. 请简述在一个支持有向无环图目录结构的文件系统中,链接一个普通文件(非目录文件)时操作系统需要执行哪些操作。(5')
+
+
+ 答案:
+
+ 查看/更新引用计数,更新目录文件
+
+
+
+ ***
+
+3. 请问哪种文件块分配方式有利于顺序访问文件的效率,为什么?。(5')
+
+
+ 答案:
+
+ 顺序分配,因为行为可预测,预取效果好。
+
+
+
+ ***
+
+4. 请简述磁盘访问效率由哪些部分决定,并分析如何提高文件系统中顺序访问文件的效率。(5')
+
+
+ 答案:
+
+ 定位时间+传输速度。前者又包括:旋转速度和寻道事件
+
+
+
+***
+
+### 四、辨析题:请分别解释以下每组的两个名词,并列举他们的区别(25 分,每题 5 分)
+
+1. 死锁(deadlock)与饥饿(starvation)
+
+
+ 答案:
+
+ 死锁:多个进程循环等待对方,都无法继续执行
+
+ 饥饿:某个或某些进程由于无法得到资源长时间无法执行
+
+ 死锁必然发生饥饿,但是饥饿不一定发生死锁
+
+
+
+ ***
+
+2. 程序控制输入输出(programmed I/O)与直接内存访问(DMA)
+
+
+ 答案:
+
+ PIO:CPU 直接发出对于 I/O 的指令
+
+ DMA:CPU 在交换开始、结束时介入,其他时候由 DMA 控制器协调 I/O 设备和内存间利用总线的数据交换。
+
+ DMA 通常能够节省大量中断和 CPU 介入的时间,有利于大批量数据的交换
+
+
+
+ ***
+
+3. 分时(time-sharing)与多道程序(multi-programming)
+
+
+ 答案:
+
+ 分时:将时间划分成时间片,进程按时间片轮流执行
+
+ 多道:系统中存在多个程序同时执行
+
+ 分时主要针对提高系统的响应速度,改善用户体验;多道主要针对增加系统的利用率。
+
+
+
+ ***
+
+4. 长程调度(long-term scheduling)与中程调度(mid-term scheduling)
+
+
+ 答案:
+
+ 长程调度:操作系统决定到底有多少进程能够从“new”状态进入就绪状态的调度
+
+ 中程调度:操作系统决定哪些进程的地址空间能够保留在内存中,哪些进程的地址空间需要被交换到外存的调度
+
+ 长程调度被用于平衡系统资源利用率与并发进程个数;中程调度被用于控制运行与就绪进程有足够的内存、较低的缺页率能够运行。
+
+
+
+ ***
+
+5. 二级存储(secondary storage)与三级存储(tertiary storage)
+
+
+ 答案:
+
+ 二级存储:通常指磁盘,用于存储文件、交换空间、虚存
+
+ 三级存储:较慢、但具有较大容量的持久存储介质,包括光盘、磁带等,通常用于转储、备份
+
+ 和三级存储相比,二级存储通常访问速度较快、单位容量价格较高。三级存储通常具有存储介质与存储驱动器分离的特点,所以价格较低,也也导致随机访问速度较慢。
+
+
+
+***
+
+### 五、设计题(10 分)
+
+在一个需要频繁读和追加数据(即写在文件末尾)的场合,有写操作,但没有插入操作。已知每次读或写操作都会读出或写入相当大规模的数据(但未必是磁盘块大小的整数倍),但是开始读或写的位置可能出现在文件的任何地方。
+
+a) 请问:连续磁盘块分配、链接分配、索引分配分别是否适合这一场景,并给出理由(3');
+
+b) 假设在 FCB 中,还剩余 $256\ \text{B}$ 的空间,请参考 UNIX 文件系统的 i-node 结构,设计一个多级的包含直接块和间接索引的块管理方式,并分析该方式与以上三种方式相比的优缺点。(7')
+
+
+答案:
+
+略
+
+
+
+***
+
+### 六、证明题(5 分)
+
+请证明 LRU 页面替换策略不会导致 Belady 异常。
+
+
+答案:
+
+略(可用数学归纳法或反证法)
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..2163774
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,371 @@
+---
+title: 2013-2014学年上学期期中
+---
+
+## 2013-2014学年上学期期中试卷(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学软件学院期中考试卷(2013—2014学年第一学期)
+
+### 一、是非题(请判断以下论述是否正确。正确的标T;错误的标F,指出错误所在并修正)(2’*4=8’)
+
+1. 页表由各个进程自己管理,进程可在用户态对页表进行更新。
+
+
+ 答案:
+
+ F,页表由操作系统管理。
+
+
+
+ ***
+
+2. 单CPU环境下由于任何时刻只有一个进程(线程)能够运行,因此操作系统不需要实现同步与互斥支持。
+
+
+ 答案:
+
+ F,临界资源只与访问他的进线程数有关,与系统正在运行的进线程数无关。
+
+
+
+ ***
+
+3. 在微内核结构的操作系统中,CPU调度必然在微内核内。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+4. 在抢占式(preemptive)操作系统中,进程不会因为申请、使用资源发生死锁。
+
+
+ 答案:
+
+ T
+
+ :::tip
+ 原参考答案将本题判为 T,疑似有误。抢占式调度允许操作系统抢占 CPU,但不代表进程持有的资源可以被抢占,因此系统仍可能满足死锁的必要条件。
+ :::
+
+
+
+***
+
+### 二、(32')问答题
+
+1. (5')请详细描述一个用户态线程调用sleep()系统调用后,操作系统所执行的任务。并分析其中每一个步骤的代价大小。
+
+
+ 答案:
+
+ 1、系统调用过程:mode-switch, 查表(syscall handling), 执行系统调用代码。代价中
+
+ 2、sleep() 将当前进程放入waiting队列(设置alarm)代价小
+
+ 3、CPU调度(context switch)代价大
+
+ 4、系统调用结束,返回,mode-switch 代价中
+
+
+
+ ***
+
+2. (12')假设线程有运行(running)、就绪(ready)和等待(waiting)三种状态。请分别说明什么时候会发生以下状态转换:
+
+ a) 运行 ==> 等待 (4')
+
+
+ 答案:
+
+ running-->waiting:等待i/o、信号量P操作...
+
+ 针对running-->waiting部分同学写的系统中断,这个解释是不完整的,系统中断分为多种情况,当前线程发出缺页中断等中断时,系统会进行中断处理并将该线程阻塞,但若是外部的时钟中断或i/o中断到达,系统在处理这些中断时,当前线程会进入就绪队列。
+
+
+
+ b) 就绪 ==> 运行 (4')
+
+
+ 答案:
+
+ ready-->running:时间片到,前一进程结束/等待...
+
+
+
+ c) 等待 ==> 就绪 (4')
+
+
+ 答案:
+
+ waiting-->ready:i/o结束、获得信号量,...
+
+
+
+ ***
+
+3. (15')请简述计算机系统启动,直到运行第一个用户应用程序,然后派生出第二个线程的整个过程中的可能的步骤,并分析每一个步骤的代价(大/中/小),说明理由。
+
+
+ 答案:
+
+ 计算机启动过程:硬件检测、加载引导程序(Bootstrap)代价中
+
+ 将操作系统内核加载至内存、初始化并运行操作系统代价大
+
+ 操作系统构建进程树,创建用户进程代价中
+
+ 用户进程创建:初始化PCB(中),生成地址映射(小),拷贝用户程序到地址空间(大),根据需要创建线程
+
+ 线程创建:初始化TCB、寄存器状态等(小),相比进程创建代价小。
+
+
+
+ ***
+
+### 三、(43')计算题
+
+1. (15')使用段页式内存管理,段表和页表都存放在主存中,所有要访问的页面都在主存中。页表项可以缓存在快表(或称旁路转换缓存,TLB)中。一次内存访问的代价为 $200\ \text{ns}$,一次TLB访问代价为 $10\ \text{ns}$。
+
+ a). 请写出以上段页式内存访问的处理流程(也可以用图示表示)(5')
+
+
+ 答案:
+
+ a. 访问段表,检查是否违法,获取页表地址
+
+ b. 访问快表,如果miss goto c,否则goto d
+
+ c. 访问内存页表
+
+ d. 访问内存
+
+
+
+ b). 假设TLB的命中率为50%,请计算进程对内存的有效访问时间 (effective access time)(5')
+
+
+ 答案:
+
+ 答:
+
+ $200 + 50\% \times 10 + (1-50\%) \times 210 + 200$
+
+ $= 510\text{ns}$
+
+
+
+ c). 如果要求进程对内存的有效访问时间不大于500ns,请问TLB的命中率必须提高到多少?(5')
+
+
+ 答案:
+
+ 答:
+
+ $200+ x \times 10 + (1-x) \times 210 + 200$
+
+ $=610-200x\le 500$
+
+ $x\ge 110/200=55\%$
+
+
+
+ ***
+
+2. (16') 已知就绪队列中已有4个进程,所需要的CPU时间按到达次序分别为28,5,43,35个毫秒;在第10毫秒到达第五个进程,它所需要的CPU时间为8个毫秒。请写出在先来先服务(First-Come-First-Serve,FCFS)、以5毫秒和20毫秒为单位的轮询(Round-Robin)、最短作业优先(Shortest Job First)这四种不同的CPU调度下,这些进程的调度序列(可用甘特图(Gantt Chart)表示)(3' x 4),并分别计算四种不同情况下的平均响应时间(平均等待时间)(1' x 4)。
+
+
+ 答案:
+
+ FCFS: 28, 5, 43, 35, 8.
+
+ 平均响应时间=平均等待时间=$(28+33+76+(111-10))/5=47.6$
+
+ RR(5):
+
+ ```text
+ p1(5,23),p2(5,0),p3(5,38),p4(5,30),p1(5,18),p5(5,3),p3(5,33),p4(5,25),p1(5,13),p5(3,0),
+ p3(5,28),p4(5,20),p1(5,8),p3(5,23),p4(5,15),p1(5,3),p3(5,18),p4(5,10),p1(3,0),p3(5,13),
+ p4(5,5),p3(5,8),p4(5,0),p3(5,3),p3(3,0)
+ ```
+
+ p1: $15+15+13+10+10=63$
+
+ p2: $5$
+
+ p3: $10+15+13+10+10+8+5+5=76$
+
+ p4: $15+15+13+10+10+8+5=76$
+
+ p5: $15+15=30$
+
+ 平均响应时间=$(0+5+10+15+25-10)/5=9$
+
+ 平均等待时间=$(63+5+76+76+30)/5=50$
+
+ RR(20):
+
+ ```text
+ p1(20,8),p2(5,0),p3(20,23),p4(20,15),p5(8,0),p1(8,0),p3(20,3),p4(15,0),p3(3,0)
+ ```
+
+ p1: $53$
+
+ p2: $20$
+
+ p3: $25+36+15=76$
+
+ p4: $45+36=81$
+
+ p5: $55$
+
+ 平均响应时间=$(0+20+25+45+65-10)/5=29$
+
+ 平均等待时间=$(53+20+76+81+55)/5=57$
+
+ SJF:
+
+ p2(5), p1(28), p5(8), p4(35), p3(43)
+
+ 平均响应时间=平均等待时间=$(5+0+76+41+23)/5$
+
+
+
+ ***
+
+3. (12')现有5个进程(P0-P4),3类资源(A:9, B:5, C:5),当前的系统状态如下:
+
+ 
+
+ 系统剩余的资源为:Available: (2, 3, 0)
+
+ 请问:
+
+ a) 如果系统不允许资源抢占,系统当前是否处于安全状态?如果不处于安全状态,请写出可能发生死锁的进程,并画出它们之间的等待图(wait-for graph);如果处于安全状态,请写出进程执行的序列。(8')
+
+ b) 请问系统是否一定发生死锁?为什么?(4‘)
+
+
+ 答案:
+
+ a) 不安全。
+
+ 5个线程都可能产生死锁,出现死锁的可能情况有多种,所以任意写一种即可。等待图由于是多实例等待图,没有标准的画法,因此只要表现出互相之间的等待关系即可。单实例等待图为重点,多实例等待图我也不太会画=。=你们谁要是会的话教我。。
+
+ b) 不一定。各线程资源请求不一定同时达到max,或部分线程主动释放资源。
+
+ 这里部分同学写的在抢占情况下不一定死锁,这么说虽然没错,但是实际在非抢占情况下也不一定死锁,所以这里大家留意一下。不安全表示着有死锁的可能,但死锁并不是一定发生的。
+
+
+
+ ***
+
+### 四、(17')设计题
+
+1. (5') 请使用二元信号量(binary semaphore,即值只能为0或1的信号量)实现计数信号量(counting semaphore,取值可为任意整数)。
+
+
+ 答案:
+
+ 这道题的解决思路主要关注两点:1、计数信号量的机制,当信号量为正数时,任何wait线程可以获得资源,当信号量为0或负数时,所有wait线程要等待,直到有新的资源返还才可以执行。2、在实现上,通过对value值的增减实现资源调配,当value小于等于0时意味着当前线程应当进入阻塞状态,并等待signal的唤醒,而signal端在返还资源时,若当前value为负数意味着有线程在等待,此时应当唤醒一个wait线程,将返还的资源给它。
+
+ 这里面有多种实现方法,首先书上的6.5.2实现里面有计数信号量的相关代码:
+
+ ```c
+ wait(semaphore *S) {
+ S->value--;
+ if (S->value < 0) {
+ add this process to S->list;
+ block();
+ }
+ }
+
+ signal(semaphore *S) {
+ S->value++;
+ if (S->value <= 0) {
+ remove a process P from S->list;
+ wakeup(P);
+ }
+ }
+ ```
+
+ 此外,借用二进制信号量也可以实现:
+
+ ```c
+ semaphore binary=0;
+
+ wait(semaphore *S) {
+ S->value--;
+ if (S->value < 0) {
+ wait(binary);
+ }
+ }
+
+ signal(semaphore *S) {
+ S->value++;
+ if (S->value <= 0) {
+ signal(binary);
+ }
+ }
+ ```
+
+
+
+ ***
+
+2. (12')有A、B两个线程,需要协同工作。A和B的程序逻辑分别如下:
+
+ ```c
+ A()
+ {
+ A的自身处理代码;
+ // A和B的同步点,即双方都要执行完自身代码;
+ A的协同代码;
+ }
+
+ B()
+ {
+ B的自身处理代码;
+ // A和B的同步点,即双方都要执行完自身代码;
+ B的协同代码;
+ }
+ ```
+
+ (8')请使用信号量,实现A和B的第4行同步点;
+
+ (4')请说明为什么你的实现是正确的;你的实现是否会导致死锁。
+
+
+ 答案:
+
+ 同步点的主要目的是保证A、B两个线程在执行后续协同代码之前,已经完成了各自的自身处理代码。因此每个线程同步点的设计原则是在同步点处确认对方也已经到达同步点。因此设计非常简单:
+
+ ```c
+ semaphore a=0,b=0;
+
+ A
+ {
+ signal(b); //告知对方我已到达同步点
+ wait(a); //等待对方的通知信号
+ }
+
+ B
+ {
+ signal(a);
+ wait(b);
+ }
+ ```
+
+ 这里需要注意死锁问题:1、wait不能在signal之前,或者说两个线程的wait至少有一个不在signal之前,否则两个线程都在等待对方信号,但都无法发送出信号,导致死锁。2、信号的初始化必须为0,否则假设a为1,则A线程完全可以不需要等待B线程执行就可以一直顺畅的执行下去,破坏了同步点的作用。部分同学在自己的设计方案中忽略了这个问题,导致方案错误。
+
+ 此外,该设计思路不需要限定A与B线程的执行顺序,部分同学通过互斥信号量的方式限定了A和B的执行顺序,虽然也可以最终实现协同,但从代码效率上来讲并不好。
+
+ 基本上答案已经包含在a)的设计思路中了,正确的设计思路不会导致死锁。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203.md"
new file mode 100644
index 0000000..ecae810
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203.md"
@@ -0,0 +1,499 @@
+---
+title: 2013-2014学年下学期月考
+---
+
+## 2013-2014学年下学期月考试卷(含答案)
+
+### 说明
+
+- 日期:2014.3
+
+### 一、多选题(本大题共 5 小题,每小题 3 分,共 15 分)
+
+1. 以下哪些(个)操作会使得一个进程从运行(running)状态转换为就绪(ready)状态( )
+
+ A. 在可占先(preemptive)系统中,高优先级进程被创建
+
+ B. 分时系统中,时间片到
+
+ C. 当前运行进程发生缺页中断
+
+ D. 当前运行进程调用 yield(),主动放弃使用 CPU
+
+ ***
+
+2. 当从“新建(new)”状态进入“就绪(ready)”状态的进程增多时,下面哪种情况不会发生( )
+
+ A. I/O 操作的频度升高;
+
+ B. CPU 利用率下降
+
+ C. CPU 利用率上升
+
+ D. 进程的平均响应时间减少
+
+ ***
+
+3. 以下描述正确的是( )
+
+ A. 中断处理程序(interrupt handler)是进程的一部分,在进程的地址空间运行
+
+ B. 中断处理程序(interrupt handler)必须运行在内核态
+
+ C. 微内核体系结构下,进程间通讯(inter-processing communication)必须在微内核内
+
+ D. 分时(time sharing)的目的是提高 CPU 和 I/O 的并行度
+
+ ***
+
+4. 以下哪些(个)对于微内核操作系统的描述是正确的?( )
+
+ A. Microsoft Windows 是微内核操作系统,但 Linux 不是;
+
+ B. 进程间通信必须在微内核内实现;
+
+ C. 因为用户进程不应访问页表,因此虚存应该在微内核内实现;
+
+ D. 操作系统设计时采用微内核结构可以提高操作系统执行的效率。
+
+ ***
+
+5. 以下对于线程的描述哪些(个)是错误的( )
+
+ A. 一个用户态线程的阻塞(block)会引起它所属的整个进程(包括其中的其它线程)的阻塞;
+
+ B. 同一个进程的不同线程可以共享地址空间中的堆;
+
+ C. 线程间通信必须通过内核态系统调用进行;
+
+ D. 同一个进程的不同线程必须维护各自的调用栈和 CPU 状态。
+
+***
+
+### 二、辨析题:请分别解释以下每组的两个名词,并列举他们的区别。(30 分,每小题 5 分)
+
+1. 分时(time-sharing)与多道程序(multi-programming)
+
+
+ 答案:
+
+ 分时:将时间划分成时间片,进程按时间片轮流执行
+
+ 多道:系统中存在多个程序同时执行
+
+ 区别:分时主要针对提高系统的响应速度,改善用户体验;多道主要针对增加系统的利用率。
+
+
+
+ ***
+
+2. 长程调度(long-term scheduling)与中程调度(mid-term scheduling)
+
+
+ 答案:
+
+ 长程调度:操作系统决定到底有多少进程能够从“new”状态进入就绪状态的调度
+
+ 中程调度:操作系统决定哪些进程的地址空间能够保留在内存中,哪些进程的地址空间需要被交换到外存的调度
+
+ 区别:长程调度被用于平衡系统资源利用率与并发进程个数;中程调度被用于控制运行与就绪进程有足够的内存、较低的缺页率能够运行。
+
+
+
+ ***
+
+3. 网络操作系统和分布式操作系统
+
+
+ 答案:
+
+ 网络操作系统:支持网络的操作系统
+
+ 分布式操作系统:可管理分布式系统的操作系统
+
+ 区别:采用分布式操作系统,分布的计算机对于用户是透明的。
+
+
+
+ ***
+
+4. 微内核和模块化内核
+
+
+ 答案:
+
+ 微内核:操作系统内核只包含最基本的功能(进程调度和进程间通讯)
+
+ 模块化内核:操作系统内核的一些功能可以作为模块挂载
+
+ 区别:微内核中内核和其它操作系统的功能模块(如虚存管理)在不同的地址空间运行,模块化内核中它们在一个地址空间。
+
+
+
+ ***
+
+5. 核心态和用户态
+
+
+ 答案:
+
+ 核心态:操作系统内核执行的受保护的状态
+
+ 用户态:用户进程执行所在的状态
+
+ 区别:处于用户态只能访问进程的地址空间,用户态需要通过中断或系统调用才能进入核心态。
+
+
+
+ ***
+
+6. 最短作业优先调度和最短剩余时间优先调度
+
+
+ 答案:
+
+ 最短作业优先调度:进程调度时,挑选执行时间最短的作业进行执行
+
+ 最短剩余时间优先调度:进程调度时,挑选剩余执行时间最短的作业进行执行
+
+ 区别:前者是不可占先的(non-preemptive)
+
+
+
+***
+
+### 三、综合分析题(39 分)
+
+1. (10 分)
+
+ (1)进程创建时(如在类 UNIX 操作系统中,连续执行 fork() 和 exec() 系统调用),操作系统所需要进行那些工作,它们的代价如何(大,中,小)。(6 分)
+
+
+ 答案:
+
+ 进程创建时,操作系统工作如下:
+
+ a. 构造 PCB,代价小
+
+ b. 设置地址空间映射,代价中
+
+ c. 复制父进程地址空间内容,代价大
+
+ d. 复制 I/O 状态,代价中
+
+
+
+ (2)为什么线程创建比进程快,它主要节省了以上哪个步骤的代价?(4 分)
+
+
+ 答案:
+
+ 同一进程的不同线程共享资源,因此以上 b, c, d 三项代价几乎都可节省
+
+
+
+ ***
+
+2. 请详细描述一个用户态线程调用 sleep() 系统调用后,操作系统所执行的任务。(8 分)
+
+
+ 答案:
+
+ 1. 系统调用过程:mode-switch, 查表(syscall handling), 执行系统调用代码。
+
+ 2. sleep() 将当前进程放入 waiting 队列(设置 alarm)
+
+ 3. CPU 调度(context switch)
+
+ 4. 系统调用结束,返回,mode-switch
+
+
+
+ ***
+
+3. (12 分)请标注以下进程状态转换图中状态转换的箭头方向(标于图上)(每个 0.5 分),并例举其中每一种状态转换的一个例子(每个 1 分)。
+
+ 
+
+
+ 答案:
+
+ (1): new --> ready:从 shell 启动程序或者 fork 进程
+
+ (2): running -> ready:高优先级程序运行,时间片到,...
+
+ (3): ready --> running:时间片到,前一进程结束/等待...
+
+ (4): running --> terminated:exit
+
+ (5): running --> waiting:等待 i/o、信号量 P 操作...
+
+ (6): waiting --> ready:i/o 结束、获得信号量,...
+
+ (7): waiting --> suspended:虚存时,内存不够
+
+ (8): suspended --> ready:得到 i/o 结束、获得信号量,...
+
+
+
+ ***
+
+4. 判断下列每句话是否正确,并说明理由。(9 分,每小题 3 分)
+
+ (1)线程都保存有各自的栈信息、CPU 状态(寄存器、指令计数器等)、堆信息,以及打开文件列表等。
+
+
+ 答案:
+
+ F
+
+
+
+ (2)对于内核支持的线程,当该线程执行系统调用被阻塞时,不仅该线程被阻塞,而且同一进程内的所有线程都会被阻塞。
+
+
+ 答案:
+
+ F
+
+
+
+ (3)对于用户级线程,由于所有有关线程管理的代码都是在用户程序库内部实现的,因此可以在不支持线程机制的操作系统平台上实现。而且在不干扰系统调度的前提下,可以指定特定的调度算法。
+
+
+ 答案:
+
+ T
+
+
+
+***
+
+### 四、计算题:(16 分)
+
+已知就绪队列中已有 4 个进程,所需要的 CPU 时间按到达次序分别为 28,5,43,35 个毫秒;在第 10 毫秒到达第五个进程,它所需要的 CPU 时间为 8 个毫秒。请写出在先来先服务(First-Come-First-Serve,FCFS)、以 5 毫秒和 20 毫秒为单位的轮询(Round-Robin)、最短作业优先(Shortest Job First)这四种不同的 CPU 调度下,这些进程的调度序列(可用甘特图(Gantt Chart)表示)(3 分 x 4),并分别计算四种不同情况下的平均等待时间(1 分 x 4)。
+
+
+答案:
+
+FCFS: 调度序列 28, 5, 43, 35, 8. 平均等待时间=(28+33+76+(111-10))/5
+
+RR(5): 调度序列
+
+p1(5,23),p2(5,0),p3(5,38),p4(5,30), p5(5,3),p1(5,18) ,p3(5,33),p4(5,25), p5(3,0),p1(5,13) p3(5,28),p4(5,20),p1(5,8),p3(5,23),p4(5,15),p1(5,3),p3(5,18),p4(5,10),p1(3,0),p3(5,13), p4(5,5),p3(5,8),p4(5,0),p3(5,3),p3(3,0)
+
+计算 RR(5)的平均等待时间 p1: 20+13+10+10+10=63
+
+p2: 5
+
+p3: 10+15+13+10+10+8+5+5=76
+
+p4: 15+15+13+10+10+8+5=76
+
+p5: 10+15=25
+
+平均等待时间=(63+5+76+76+25)/5=49
+
+RR(20) 调度序列 p1(20,8),p2(5,0),p3(20,23),p4(20,15),p5(8,0),p1(8,0),p3(20,3),p4(15,0),p3(3,0)
+
+计算 RR(20)的平均等待时间 p1: 53
+
+p2: 20
+
+p3: 25+36+15=76
+
+p4: 45+36=81
+
+p5: 55
+
+平均等待时间= (53+20+76+81+55)/5
+
+SJF 调度序列 p2(5), p1(28), p5(8), p4(35), p3(43)
+
+平均等待时间= (5+0+76+41+23)/5
+
+
+
+***
+
+## 2013-2014学年下学期月考试卷(含答案)
+
+### 说明
+
+- 日期:2014.5
+
+### 一、选择题(每个 5 分,共 20 分)
+
+1. 以下对于目录及其实现的描述,错误的是:( )
+
+ A. 目录是文件的集合,是一种逻辑概念,通常用文件实现
+
+ B. 目录文件中存放的就是目录中文件的文件控制块(file control block)
+
+ C. 目录中可以有子目录,形成嵌套结构
+
+ D. 目录中的“.”和“..”通常分别代表该目录本身和其父目录
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 当发生抖动(或称为颠簸,thrashing)时,以下哪种现象不会出现?( )
+
+ A. 处于等待(waiting)状态的进程数增多
+
+ B. CPU 利用率增高
+
+ C. 磁盘 I/O 增多
+
+ D. 长程调度(long-term scheduling)允许更多的进程进入就绪(ready)状态
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+3. 以下对于目录及其实现的描述,正确的是:( )
+
+ A. 目录就是文件控制块(file control block)
+
+ B. 目录是文件控制块的集合,它通常使用一种特殊的文件控制块实现
+
+ C. 通过链接,文件在不同目录下可以有不同的文件名;目录虽然也可以链接,但是不能有不同目录名
+
+ D. 根目录的父目录是其本身
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+4. 以下哪种数据结构必须存放在持久存储介质上?( )
+
+ A. 进程控制块
+
+ B. 页表
+
+ C. 文件控制块
+
+ D. 打开文件列表
+
+
+ 答案:
+
+ C
+
+
+
+***
+
+### 二、简述题(20 分)
+
+请分别简述在一个支持有向无环图目录结构的文件系统中,进行下列操作时,操作系统需要执行哪些操作。
+
+1. 删除一个普通文件(非目录文件)
+
+
+ 答案:
+
+ 查看/更新引用计数,如果为零,更新目录文件,释放 FCB,释放磁盘数据块
+
+
+
+ ***
+
+2. 链接一个普通文件(非目录文件)
+
+
+ 答案:
+
+ 查看/更新引用计数,更新目录文件
+
+
+
+***
+
+### 三、解答题(60 分)
+
+1. 采用按需调页(demand paging),现有 3 个页框,分别存储着页面号 2,3,4 三个页面。已知接下来的页面访问顺序为 1,2,3,4,1,2,5,1,2,3,4,5。使用时钟算法(clock algorithm)作为页面替换算法。(20 分)
+
+ 请计算会发生的缺页次数(假设初始时在页框内的页面的引用位(reference bit)都是 1,2/3/4 三个页面按序存放,初始时指针指向页面 2)?(10 分)
+
+
+ 答案:
+
+ ```text
+ 2(1*), 3(1), 4(1): 1x
+ 1(1), 3(0*), 4(0): 2x
+ 1(1), 2(1), 4(0*): 3x
+ 1(1*), 2(1), 3(1): 4x
+ 4(1), 2(0*), 3(0): 1x
+ 4(1), 1(1), 3(0*): 2x
+ 4(1*), 1(1), 2(1): 5x
+ 5(1), 1(0*), 2(0): 1
+ 5(1), 1(1*), 2(0): 2
+ 5(1), 1(1*), 2(1): 3x
+ 5(0), 3(1), 2(0*): 4x
+ 5(0*), 3(1), 4(1): 5
+ 5(1), 3(1), 4(1)
+ 9次缺页
+ ```
+
+
+
+ 请写出这一访问序列所对应的工作集。(10 分)
+
+
+ 答案:
+
+ {1,2,3,4,5}
+
+
+
+ ***
+
+2. 假设某作业访问页面的顺序为 2, 3, 2, 1, 5, 2, 4, 5, 3, 2, 5, 2,分配给该作业三个内存块。分别写出采用 FIFO、LRU、OPT 页面置换算法时,页面走向;并给出缺页中断次数。
+
+
+ 答案:
+
+ 9、8、6 次
+
+
+
+ ***
+
+3. 假设有文件系统使用 i-node 如图所示。其中一个磁盘块大小为 $4\ \text{KB}$,一个磁盘块指针大小为 32 位($4\ \text{B}$),直接块(direct block)大小为 $2\ \text{KB}$,其它索引块大小和一个磁盘块一样大小。假设有一个 $4\ \text{MB}$ 大小的文件,其 i-node 已在内存中(direct block 也在内存中),文件的其它部分都在磁盘上,不考虑缓存。请问:
+
+ 
+
+ a) 访问其第一个字节,第 $1\ \text{K}$ 个字节,第 $1\ \text{M}$ 个字节,第 $2\ \text{M}$ 个字节,第 $3\ \text{M}$ 个字节,和最后一个字节分别需要访问几个磁盘块?
+
+
+ 答案:
+
+ $1\ \text{K}$: 1, $1\ \text{M}$: 1, $2\ \text{M}$: 1, $3\ \text{M}$: 2,最后:2
+
+
+
+ b) 该文件系统最大能支持多大的文件?
+
+
+ 答案:
+
+ $2\text{K}/4*4\text{K}+4\text{K}/4*4\text{K}+4\text{K}/4*4\text{K}/4*4\text{K}$
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..4be67b8
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,346 @@
+---
+title: 2013-2014学年下学期期中
+---
+
+## 2013-2014学年下学期期中试卷(含答案)
+
+### 说明
+
+- 原卷标题:操作系统 2014年 期中考试试题
+
+### 一、是非题(请判断以下论述是否正确。正确的标T;错误的标F,指出错误所在并修正)(2’*4=8’)
+
+1. 页表由各个进程自己管理,进程可在用户态对页表进行更新。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+2. 单CPU环境下由于任何时刻只有一个进程(线程)能够运行,因此操作系统不需要实现同步与互斥支持。
+
+
+ 答案:
+
+ F
+
+
+
+ ***
+
+3. 在微内核结构的操作系统中,CPU调度必然在微内核内。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+4. 在抢占式(preemptive)操作系统中,进程不会因为申请、使用资源发生死锁。
+
+
+ 答案:
+
+ T
+
+
+
+***
+
+### 二、(32')问答题
+
+1. (5')请详细描述一个用户态线程调用sleep()系统调用后,操作系统所执行的任务。并分析其中每一个步骤的代价大小。
+
+
+ 答案:
+
+ 略
+
+ 1、系统调用过程:mode-switch, 查表(syscall handling), 执行系统调用代码。代价大
+
+ 2、sleep() 将当前进程放入waiting队列(设置alarm)代价要具体分析决定,一般较小
+
+ 3、CPU调度(context switch)代价中
+
+ 4、系统调用结束,返回,mode-switch 代价小
+
+
+
+ ***
+
+2. (12')假设线程有运行(running)、就绪(ready)和等待(waiting)三种状态。请分别说明什么时候会发生以下状态转换:
+
+ a) 运行 ==> 等待 (4')
+
+
+ 答案:
+
+ 执行→阻塞
+
+ 正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
+
+
+
+ b) 就绪 ==> 运行 (4')
+
+
+ 答案:
+
+ 处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成运行状态。
+
+
+
+ c) 等待 ==> 就绪 (4')
+
+
+ 答案:
+
+ 等待状态的进程在等待的事件发生后,就又具备了继续执行的条件,该进程状态由等待状态改为就绪状态,插到就绪队列。
+
+
+
+ ***
+
+3. (15')请简述计算机系统启动,直到运行第一个用户应用程序,然后派生出第二个线程的整个过程中的可能的步骤,并分析每一个步骤的代价(大/中/小),说明理由。
+
+
+ 答案:
+
+ 以上可供参考,主要观点答对就可以。
+
+ 装入引导程序,代价中
+
+ 主要数据结构初始化,代价中
+
+ 生成用户的图形用户界面 ,代价大
+
+ 存储空间,与文件系统有关的初始化,代价大
+
+ 运行第一个用户应用程序,创建进程,代价大
+
+ 派生出第二个线程,代价小
+
+
+
+ ***
+
+### 三、(43')计算题
+
+1. (15')使用段页式内存管理,段表和页表都存放在主存中,所有要访问的页面都在主存中。页表项可以缓存在快表(或称旁路转换缓存,TLB)中。一次内存访问的代价为 $200\ \text{ns}$,一次TLB访问代价为 $10\ \text{ns}$。
+
+ a). 请写出以上段页式内存访问的处理流程(也可以用图示表示)(5')
+
+
+ 答案:
+
+ a. 访问段表,检查是否违法,获取页表地址
+
+ b. 访问快表,如果miss goto c,否则goto d
+
+ c. 访问内存页表
+
+ d. 访问内存
+
+
+
+ b). 假设TLB的命中率为50%,请计算进程对内存的有效访问时间 (effective access time)(5')
+
+
+ 答案:
+
+ $200 + 50\% \times 10 + (1-50\%) \times 210 + 200$
+
+ $= 510\text{ns}$
+
+
+
+ c). 如果要求进程对内存的有效访问时间不大于500ns,请问TLB的命中率必须提高到多少?(5')
+
+
+ 答案:
+
+ $200+ x \times 10 + (1-x) \times 210 + 200$
+
+ $=610-200x\le 500$
+
+ $x\ge 110/200=55\%$
+
+
+
+ ***
+
+2. (16') 已知就绪队列中已有4个进程,所需要的CPU时间按到达次序分别为28,5,43,35个毫秒;在第10毫秒到达第五个进程,它所需要的CPU时间为8个毫秒。请写出在先来先服务(First-Come-First-Serve,FCFS)、以5毫秒和20毫秒为单位的轮询(Round-Robin)、最短作业优先(Shortest Job First)这四种不同的CPU调度下,这些进程的调度序列(可用甘特图(Gantt Chart)表示)(3' x 4),并分别计算四种不同情况下的平均响应时间(1' x 4)。
+
+
+ 答案:
+
+ FCFS: (0+28+33+76+(111-10))/5 = 47.5
+
+ RR(5):
+
+ p1: 0
+
+ p2: 5
+
+ p3: 10
+
+ p4: 15
+
+ p5: 20 - 10
+
+ (0+5+10+15+10)/5 = 8
+
+ RR(20):
+
+ p1: 0
+
+ p2: 20
+
+ p3: 25
+
+ p4: 45
+
+ p5: 65 - 10
+
+ (0+20+25+45+55)/5 = 29
+
+ SJF:
+
+ p2:0
+
+ p1:5
+
+ p5:33 – 10
+
+ p4:41
+
+ p3:76
+
+ (5+0+23+41+76)/5 = 29
+
+
+
+ ***
+
+3. (12')现有5个进程(P0-P4),3类资源(A:9, B:5, C:5),当前的系统状态如下:
+
+ 
+
+ | | Allocation A | Allocation B | Allocation C | Max A | Max B | Max C |
+ | --- | --- | --- | --- | --- | --- | --- |
+ | P0 | 0 | 1 | 0 | 7 | 5 | 3 |
+ | P1 | 2 | 0 | 0 | 3 | 2 | 2 |
+ | P2 | 3 | 0 | 2 | 9 | 0 | 2 |
+ | P3 | 2 | 1 | 1 | 2 | 2 | 2 |
+ | P4 | 0 | 0 | 2 | 4 | 3 | 3 |
+
+ 系统剩余的资源为:Available: (2, 3, 0)
+
+ 请问:
+
+ a) 如果系统不允许资源抢占,系统当前是否处于安全状态?如果不处于安全状态,请写出可能发生死锁的进程,并画出它们之间的等待图(wait-for graph);如果处于安全状态,请写出进程执行的序列。(8')
+
+ b) 请问系统是否一定发生死锁?为什么?(4‘)
+
+
+ 答案:
+
+ a) 不安全。等待图:
+
+ 
+
+ b) 不一定:max不一定同时达到(或主动释放)
+
+
+
+ ***
+
+### 四、(17')设计题
+
+1. (5') 请使用二元信号量(binary semaphore,即值只能为0或1的信号量)实现计数信号量(counting semaphore,取值可为任意整数)。
+
+
+ 答案:
+
+ 计数信号量:信号量的值在0到一个大于1的限制值
+
+ ```c
+ Semaphore b =1 (binary semaphore)
+ int s=1;
+ s表示资源数目,计数信号量, 0.. n
+
+ while(true)
+ {
+ P(b)
+ s=s-1;
+ V(b)
+ s = s+1;
+ }
+ ```
+
+
+
+ ***
+
+2. (12')有A、B两个线程,需要协同工作。A和B的程序逻辑分别如下:
+
+ ```c
+ A()
+ {
+ A的自身处理代码;
+ // A和B的同步点,即双方都要执行完自身代码;
+ A的协同代码;
+ }
+
+ B()
+ {
+ B的自身处理代码;
+ // A和B的同步点,即双方都要执行完自身代码;
+ B的协同代码;
+ }
+ ```
+
+ a)(8')请使用信号量,实现A和B的第4行同步点;
+
+ b)(4')请说明为什么你的实现是正确的;你的实现是否会导致死锁。
+
+
+ 答案:
+
+ a)
+
+ ```c
+ Semaphore SA =1,SB=1;
+ A()
+ {
+ P(SA);
+ A的自身处理代码;
+ V(SA);
+ // A和B的同步点,即双方都要执行完自身代码;
+ P(SB)
+ A的协同代码;
+ V(SB)
+ }
+
+ B()
+ {
+ P(SB);
+ B的自身处理代码;
+ V(SB);
+ // A和B的同步点,即双方都要执行完自身代码;
+ P(SA)
+ A的协同代码;
+ V(SA)
+ }
+ ```
+
+ b) 不会死锁,不会出现资源环路等待。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..68a231b
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,466 @@
+---
+title: 2013-2014学年下学期期末
+---
+
+## 2013-2014学年下学期期末试卷(A)(含答案)
+
+### 一、判断题(20 分,每题 2 分。正确的用 T 表示;错误的用 F 表示,并修正,未修正的不给分)
+
+1. 一个用户进程执行系统调用时,运行在核心态、系统上下文中。
+
+
+ 答案:
+
+ F(很可能在用户上下文)
+
+
+
+ ***
+
+2. 当一个用户进程执行系统调用时,该用户进程可能从运行状态转换为就绪状态,也可能从运行状态转换为等待状态。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+3. 只使用二元信号量和计数器,而不使用计数信号量,是无法实现有界缓冲区问题(bounded-buffer)的。
+
+
+ 答案:
+
+ F(二者其实等价,可实现)
+
+
+
+ ***
+
+4. 不安全状态未必会导致死锁的发生;始终处于安全状态也不能保证死锁一定不会发生。
+
+
+ 答案:
+
+ F(安全一定无死锁)
+
+
+
+ ***
+
+5. 页表和 FCB 一样,应该存放在磁盘上,由操作系统内核进行管理,在需要的时候调入内存使用。
+
+
+ 答案:
+
+ F(页表存内存)
+
+
+
+ ***
+
+6. I/O 设备的驱动程序代码应该运行在使用该 I/O 设备的进程的用户态。
+
+
+ 答案:
+
+ F(核心态运行)
+
+
+
+ ***
+
+7. 发生缺页中断的进程将从运行态转换为就绪态。
+
+
+ 答案:
+
+ F(等待)
+
+
+
+ ***
+
+8. 目录是一种特殊的文件,其内容只能由操作系统中文件系统相关的代码在内核态访问。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+9. 并非所有的二级或三级存储设备都需要磁盘调度。
+
+
+ 答案:
+
+ T
+
+
+
+ ***
+
+10. 逻辑炸弹(logic bomb)会通过特殊的程序逻辑引起计算机硬件爆炸。
+
+
+ 答案:
+
+ F(通常不爆炸)
+
+
+
+***
+
+### 二、单选题(30 分,每题 3 分)
+
+1. 以下哪种调度算法在各自的应用场景下不一定是最优的:
+
+ A. CPU 调度,非抢占情况下的最短作业优先(对平均等待时间);
+
+ B. CPU 调度,抢占情况下的最短剩余时间优先(对平均等待时间);
+
+ C. 磁盘调度,最短寻道时间优先(对寻道时间);
+
+ D. 页面替换,最优调度(或称为最长不会使用优先)(对缺页率)。
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+2. 磁盘调度时,访问序列中记录的是:
+
+ A. 磁盘号;
+
+ B. 扇区号;
+
+ C. 柱面号;
+
+ D. 磁道号。
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+3. 关机时,操作系统的内核存储在:
+
+ A. 内存中;
+
+ B. BIOS 中;
+
+ C. 文件系统中;
+
+ D. 磁盘的主引导记录(MBR,master boot record)中。
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+4. 以下哪种情况不会发生:
+
+ A. 进程数越多,CPU 利用率越低;
+
+ B. 进程数越多,缺页率越高;
+
+ C. 单个进程的页框数越多,该进程的工作集越大;
+
+ D. 单个进程的页框数越多,该进程缺页率越高。
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 能够检测磁盘坏道和坏块的操作是:
+
+ A. 磁盘快速格式化;
+
+ B. 磁盘格式化;
+
+ C. 磁盘低级格式化;
+
+ D. 磁盘分区。
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+6. 以下对于无法放入内存的页面的叙述,错误的是:
+
+ A. 这些页面可以存放在磁盘上的 swap 分区中;
+
+ B. 这些页面可以存放在磁盘文件系统中的特殊文件中;
+
+ C. 每个进程可以直接访问属于自己地址空间的页面;
+
+ D. 无论存放在哪里,这些页面无法由用户态的程序直接访问。
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+7. 在一个教师与学生共享使用的 Linux 系统中,已知任课教师 wnqian 有目录:`/home/wnqian/os/exam/`,用于存放试题和答案。该目录的所有者是 wnqian,所属的组中包括 wnqian 和历年的助教(每年不同)。该目录下还有 `/home/wnqian/os/exam/2013`,`/home/wnqian/os/exam/2014` 等目录,分别存放各年的试题。助教应只能访问担任助教当年的目录。请问,对于 `/home/wnqian/os/exam/` 目录,以下哪种权限设置是最合理的,符合最小权限原则?
+
+ A. `rwxrwx---`
+
+ B. `rwxr-xr-x`
+
+ C. `rwx--x---`
+
+ D. `rw-------`
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+8. 以下哪种数据访问任务和存储介质的组合是不合适的?
+
+ A. 日志存放于磁带;
+
+ B. 日志存放于磁盘;
+
+ C. 页面交换文件存放于 u 盘;
+
+ D. 备份数据存放于光盘。
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+9. 以下哪种信息可不存放在文件控制块中?
+
+ A. 文件大小;
+
+ B. 文件访问权限;
+
+ C. 文件所属目录;
+
+ D. 文件数据存放位置指针。
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+10. 以下哪种手段对降低缺页率没有直接帮助?
+
+ A. 增加页框;
+
+ B. 预取页面;
+
+ C. 插入不必要的 I/O 指令;
+
+ D. 减少系统中同时运行的进程数目。
+
+
+ 答案:
+
+ C
+
+
+
+***
+
+### 三、简答题(20 分,每题 5 分)
+
+1. 试简述 Unix 系统是如何实现对文件 `/usr/lib/abc` 的访问的。
+
+
+ 答案:
+
+ 答题要点:迭代访问目录;内核态 FCB 访问;打开文件列表操作。
+
+
+
+ ***
+
+2. 试简述采用 DMA 方式进行 I/O 操作的整个过程,并说明 DMA 方式适合哪种类型的 I/O 操作,并解释原因。
+
+
+ 答案:
+
+ 答题要点:cycle-stealing;块设备,大量数据(连续)交换;CPU 不用直接介入;
+
+
+
+ ***
+
+3. 试简述用户进程进行 I/O 操作至 I/O 操作完成的整个过程,说明其中的系统调用和中断处理过程,并特别说明其中涉及的模式转换(mode switch)和上下文切换(context switch)的时间和次数。
+
+
+ 答案:
+
+ 答题要点:
+
+ 
+
+
+
+ ***
+
+4. 试简述缺页中断处理的详细过程(从发生缺页中断开始至页面调度结束,进程继续执行为止),并指明每一个步骤中,处理所处的上下文环境和模式。
+
+
+ 答案:
+
+ 答题要点:
+
+ What does OS do on a Page Fault?:
+
+ 1. Choose an old page to replace: who?(discussed later)
+
+ 2. If old page modified(“D=1”), write contents back to disk
+
+ 3. Change its PTE and any cached TLB to be invalid
+
+ 4. Load new page into memory from disk
+
+ 5. Update page table entry, invalidate TLB for new entry
+
+ 6. Continue thread from original faulting location: Can we?
+
+
+
+***
+
+### 四、计算、设计题(30 分,每题 10 分)
+
+1. 某磁盘磁头访问范围为 1000(编号为 0~999),如果在为访问 365 的请求者服务后,当前正在为访问 350 的请求者服务,同时有若干个请求者在等待服务,它们依次要访问的编号为(以请求时间先后顺序排列):
+
+ 128,879,697,480,110,381
+
+ (1)分别用先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)和循环扫描(CSCAN)算法进行磁盘调度时,试确定实际的服务次序。
+
+ (2)假设磁臂在寻道时相邻编号移动的平均时间为 $0.4\ \text{ms}$,按实际服务次序计算(1)中四种算法下磁臂移动的总距离以及总寻道时间。
+
+
+ 答案:
+
+ 参考答案:
+
+ (1)FCFS:
+
+ 服务次序:(350)128,879,697,480,110,381
+
+ 总磁道数:$(350-128)+(879-128)+(879-110)+(381-110)=2013$
+
+ 寻道时间:$2013\times0.4=805.2\ \text{ms}$
+
+ (2)SSTF:
+
+ 服务次序:(350)381,480,697,879,128,110
+
+ 总磁道数:$(879-350)+(879-110)=1298$
+
+ 寻道时间:$1298\times0.4=519.2\ \text{ms}$
+
+ (3)SCAN:
+
+ 服务次序:(350)128,110,381,480,697,879
+
+ 总磁道数:$(350-110)+(879-110)=1009$
+
+ 寻道时间:$1009\times0.4=403.6\ \text{ms}$
+
+
+
+ ***
+
+2. 已知页面访问序列为:1, 2, 3, 4, 1, 2, 4, 1, 3, 5,分配的页框数为 3。
+
+ (1)请分别用 FIFO、LRU、时钟算法,写出调页的过程,并计算缺页率。
+
+ (2)请问时钟算法是否会导致 Belady 异常,为什么?
+
+
+ 答案:
+
+ 参考答案:
+
+ FIFO:
+
+ 1*, 2*, 3*,4*, 1*, 2*, 4, 1, 3*, 5*, 8 次
+
+ LRU:
+
+ 1*, 2*, 3*, 4*, 1*, 2*, 4, 1, 3*, 5*, 8 次
+
+ 时钟算法:
+
+ 和初始时钟位置有关
+
+ 可能会
+
+
+
+ ***
+
+3. 已知一个磁盘块大小为 $16\ \text{KB}$,一个磁盘地址长度为 4 字节。现有大小为 1 个磁盘块的 i-node 结构,其中包含 1 个三级索引指针、1 个 2 级索引指针、1 个 1 级索引指针,剩余空间全部用于存放直接指针。请问:
+
+ (1)这一结构最多能够管理多大的文件?
+
+ (2)如果要访问第 $512\ \text{MB}$ 的数据(从 0 开始,只访问 1 个字节),至少需要访问几次磁盘?请写出计算过程。
+
+
+ 答案:
+
+ $16\ \text{K}/4=4\ \text{K}$(4096)
+
+ 直接指针:$4096-3$,容量:$4093\times16\ \text{KB}<64\ \text{MB}$
+
+ 一级指针:$1\times4096\times16\ \text{KB}=64\ \text{MB}$
+
+ 二级指针:$4096\times4096\times16\ \text{KB}=256\ \text{GB}$
+
+ 三级指针:$4096\times4096\times4096\times16\ \text{KB}$
+
+ 二级指针块内,3 次磁盘访问
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203.md"
new file mode 100644
index 0000000..acc1d29
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203.md"
@@ -0,0 +1,1083 @@
+---
+title: 2014-2015学年下学期月考
+---
+
+## 2014-2015学年下学期月考试卷(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学软件学院月考试卷(2014—2015 学年第二学期)
+- 日期:2015.3
+
+### 一、判断题(15 分,每小题 3 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 线程都保存有各自的栈信息、CPU 状态(寄存器、指令计数器等)、堆信息,以及打开文件列表等。
+
+
+ 答案:
+
+ 错。线程保存栈信息、CPU 状态;而堆信息,以及打开文件列表等是进程保存的。
+
+ (线程实现了资源和调度单位相分离)
+
+
+
+ ***
+
+2. 对于内核支持的线程,当该线程执行系统调用被阻塞时,不仅该线程被阻塞,而且同一进程内的所有线程都会被阻塞。
+
+
+ 答案:
+
+ 错。只有当前进程被阻塞,其它进程可以继续执行。
+
+
+
+ ***
+
+3. 在微内核结构的操作系统中,进程间通讯可以不在微内核内。
+
+
+ 答案:
+
+ 错。进程通讯是内核的核心功能,对微内核系统,也在微内核内实现。
+
+
+
+ ***
+
+4. 向操作系统传递参数只能通过寄存器实现。
+
+
+ 答案:
+
+ 错。还可以通过堆栈传递等
+
+
+
+ ***
+
+5. 当前运行进程发生缺页中断,进程将进入 Ready 队列
+
+
+ 答案:
+
+ 错。进入 waiting 队列。
+
+
+
+***
+
+### 二、不定项选择题(15 分,每小题 3 分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 以下哪些(个)操作会使得一个进程从运行(running)状态转换为就绪(ready)状态( )
+
+ A. 在可占先(preemptive)系统中,高优先级进程被创建
+
+ B. 分时系统中,时间片到
+
+ C. 当前运行进程发生缺页中断
+
+ D. 当前运行进程调用 yield( ),主动放弃使用 CPU
+
+
+ 答案:
+
+ ABD
+
+
+
+ ***
+
+2. 当从“新建(new)”状态进入“就绪(ready)”状态的进程增多时,下面哪种情况不会发生( )
+
+ A. I/O 操作的频度升高;
+
+ B. CPU 利用率下降
+
+ C. CPU 利用率上升
+
+ D. 进程的平均响应时间减少
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+3. 以下描述正确的是( )
+
+ A. 中断处理程序(interrupt handler)是进程的一部分,在进程的地址空间运行
+
+ B. 中断处理程序(interrupt handler)必须运行在内核态
+
+ C. 微内核体系结构下,进程间通讯(inter-processing communication)必须在微内核内
+
+ D. 分时(time sharing)的目的是提高 CPU 和 I/O 的并行度
+
+
+ 答案:
+
+ BC
+
+
+
+ ***
+
+4. 以下哪些(个)对于微内核操作系统的描述是正确的?( )
+
+ A. Microsoft Windows 是微内核操作系统,但 Linux 不是;
+
+ B. 进程间通信必须在微内核内实现;
+
+ C. 因为用户进程不应访问页表,因此虚存应该在微内核内实现;
+
+ D. 操作系统设计时采用微内核结构可以提高操作系统执行的效率。
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 以下对于线程的描述哪些(个)是错误的( )
+
+ A. 一个用户态线程的阻塞(block)会引起它所属的整个进程(包括其中的其它线程)的阻塞;
+
+ B. 同一个进程的不同线程可以共享地址空间中的堆;
+
+ C. 线程间通信必须通过内核态系统调用进行;
+
+ D. 同一个进程的不同线程必须维护各自的调用栈和 CPU 状态。
+
+
+ 答案:
+
+ C
+
+
+
+***
+
+### 三、辨析题(30 分,每小题 6 分)
+
+分别解释以下每组的两个名词,并列举他们的区别。
+
+1. 分时(time-sharing)与多道程序(multi-programming)
+
+
+ 答案:
+
+ 分时:将时间划分成时间片,进程按时间片轮流执行
+
+ 多道:系统中存在多个程序同时执行
+
+ 区别:分时主要针对提高系统的响应速度,改善用户体验;多道主要针对增加系统的利用率。
+
+
+
+ ***
+
+2. 长程调度(long-term scheduling)与中程调度(mid-term scheduling)
+
+
+ 答案:
+
+ 长程调度:操作系统决定到底有多少进程能够从“new”状态进入就绪状态的调度
+
+ 中程调度:操作系统决定哪些进程的地址空间能够保留在内存中,哪些进程的地址空间需要被交换到外存的调度
+
+ 区别:长程调度被用于平衡系统资源利用率与并发进程个数;中程调度被用于控制运行与就绪进程有足够的内存、较低的缺页率能够运行。
+
+
+
+ ***
+
+3. 中断(Interrupt)和陷阱(Trap)
+
+
+ 答案:
+
+ An interrupt is a hardware-generated change of flow within the system. An interrupt handler is summoned to deal with the cause of the interrupt; control is then returned to the interrupted context and instruction. A trap is a software-generated interrupt. An interrupt can be used to signal the completion of an I/O to obviate the need for device polling. A trap can be used to call operating system routines or to catch arithmetic errors.
+
+
+
+ ***
+
+4. 微内核和模块化内核
+
+
+ 答案:
+
+ 微内核:操作系统内核只包含最基本的功能(进程调度和进程间通讯)
+
+ 模块化内核:操作系统内核的一些功能可以作为模块挂载
+
+ 区别:微内核中内核和其它操作系统的功能模块(如虚存管理)在不同的地址空间运行,模块化内核中它们在一个地址空间。
+
+
+
+ ***
+
+5. 核心态和用户态
+
+
+ 答案:
+
+ 核心态:操作系统内核执行的受保护的状态
+
+ 用户态:用户进程执行所在的状态
+
+ 区别:处于用户态只能访问进程的地址空间,用户态需要通过中断或系统调用才能进入核心态。
+
+
+
+***
+
+### 四、综合题(40 分)
+
+1. 请简要说明“机制(mechanism)”和“策略(policy)”分离的优点。(5 分)
+
+
+ 答案:
+
+ Mechanism and policy must be separate to ensure that systems
+
+ are easy to modify. No two system installations are the same, so each
+
+ installation may want to tune the operating system to suit its needs.
+
+ With mechanism and policy separate, the policy may be changed at will
+
+ while the mechanism stays unchanged. This arrangement provides a
+
+ more flexible system.
+
+
+
+ ***
+
+2. 调度队列有哪几种?请简单说明(5 分)
+
+
+ 答案:
+
+ Ready 队列。已经调入内存在 Ready 状态等待执行的进程队列。
+
+ I/O 队列。在特定的 I/O 设备资源上等待资源的出现的队列。每个 I/O 设备都有一个相应的队列。
+
+ job 队列。Job queue -- set of all processes in the system
+
+
+
+ ***
+
+3. 进程创建时(如在类 UNIX 操作系统中,连续执行 fork() 和 exec() 系统调用),操作系统所需要进行那些工作,它们的代价如何(大,中,小)。为什么线程创建比进程快,它主要节省了以上哪个步骤的代价?(10 分)
+
+
+ 答案:
+
+ a. 构造 PCB,代价小
+
+ b. 设置地址空间映射,代价中
+
+ c. 复制父进程地址空间内容,代价大
+
+ d. 复制 I/O 状态,代价中
+
+ (2)为什么线程创建比进程快,它主要节省了以上哪个步骤的代价?(4 分)
+
+ 答:同一进程的不同线程共享资源,因此以上 b, c, d 三项代价几乎都可节省
+
+
+
+ ***
+
+4. 请详细描述一个用户态线程调用 sleep() 系统调用后,操作系统所执行的任务。(8 分)
+
+
+ 答案:
+
+ 1. 系统调用过程:mode-switch, 查表(syscall handling), 执行系统调用代码。
+
+ 2. sleep() 将当前进程放入 waiting 队列(设置 alarm)
+
+ 3. CPU 调度(context switch)
+
+ 4. 系统调用结束,返回,mode-switch
+
+
+
+ ***
+
+5. 假设某操作系统进程有 5 个状态,分别为:new, ready, running,waiting,terminated。请画出其状态转移图,需标注进程转换的条件。(12 分)
+
+
+ 答案:
+
+ 
+
+
+
+***
+
+## 2014-2015学年下学期月考试卷(二)(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学软件学院月考试卷(二)(2014—2015 学年第二学期)
+
+### 一、判断题(15 分,每小题 3 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 发生缺页中断的进程将从运行态转换为等待态。
+
+
+ 答案:
+
+ 对。
+
+
+
+ ***
+
+2. 段页式内存分配方案可以同时避免产生外部碎片和内部碎片。
+
+
+ 答案:
+
+ 错,段页式分配仍然也可能会产生内部碎片。
+
+
+
+ ***
+
+3. Belady 异常是指过多缺页导致 Swap in,swap out 增多,即 I/O 操作增多,从而引起 CPU 利用率下降,导致操作系统增加更多的用户进程进入系统,反过来导致更多缺页的现象。
+
+
+ 答案:
+
+ 错,以上是 Thrashing(颠簸,抖动);Belady 异常是指“分配页框越多,缺页率反而越高”。
+
+
+
+ ***
+
+4. 虚拟内存的容量只受计算机系统地址位数的限制。
+
+
+ 答案:
+
+ 错,还受限于物理内存和磁盘的大小。
+
+
+
+ ***
+
+5. 基于转换表缓冲区(TLB)的数据访问最多只需要两次内存访问。
+
+
+ 答案:
+
+ 错,最多几次内存访问取决于分页策略,段页式、散列页表或者多级页表可能需要多于两次内存访问。
+
+
+
+***
+
+### 二、单项选择题(15 分,每小题 3 分)
+
+1. 虚拟存储的基础是程序局部性理论,它的基本含义是( )。
+
+ A. 代码的顺序执行
+
+ B. 程序执行时对内存访问的不均匀性
+
+ C. 变量的连续访问
+
+ D. 指令的局部性
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 采用分段式存储管理的系统中,若地址用 32 位表示,其中 12 位表示段号,则允许每段的最大长度是:
+
+ A. 12
+
+ B. 20
+
+ C. $2^{12}$
+
+ D. $2^{20}$
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+3. 使用段页式内存管理,段表和页表都存放在主存中,所有要访问的页面都在主存中。页表项可以缓存在转换表缓冲区(TLB)中。一次内存访问的代价为 $100\ \text{ns}$,一次 TLB 访问代价为 $10\ \text{ns}$。假设 TLB 的命中率为 50%,请问进程对内存的有效访问时间(effective access time)是:
+
+ A. $110\ \text{ns}$
+
+ B. $210\ \text{ns}$
+
+ C. $160\ \text{ns}$
+
+ D. $320\ \text{ns}$
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. 某作业访问页面的顺序为 2, 3, 2, 1, 5, 2, 4, 5, 3, 2, 5, 2,分配给该作业三个框,则采用 LRU 页面置换算法会产生几次缺页中断?
+
+ A. 5
+
+ B. 6
+
+ C. 7
+
+ D. 8
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 以下对于按需调页的页面替换算法的描述,正确的是:
+
+ A. 在缺页率上,最优调页必然优于(或相当于)LRU 算法;
+
+ B. 先进先出(FIFO)算法必然会导致页框越多,缺页率越高;
+
+ C. LRU 算法在替换页面查找效率上优于 FIFO 算法;
+
+ D. 以上皆错。
+
+
+ 答案:
+
+ A
+
+
+
+***
+
+### 三、辨析题(30 分,每小题 6 分)
+
+分别解释以下每组的两个名词,并列举他们的区别。
+
+1. 逻辑地址与物理地址
+
+
+ 答案:
+
+ 逻辑地址:又称为虚拟地址,由程序产生的与段相关的偏移地址部分;
+
+ 物理地址:出现在 CPU 外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址;
+
+ 区别:物理地址通常是唯一的,而逻辑地址与物理地址可以是多对一的关系;而且用户程序通常只能操作逻辑地址,通过操作系统提供的保护机制,物理地址对用户程序是透明的。
+
+
+
+ ***
+
+2. Valid/invalid bit 与 dirty bit.
+
+ ***
+
+3. 动态加载 vs 动态链接
+
+
+ 答案:
+
+ 动态加载:P280. 例程仅在被调用时加载。未被使用的例程不会被加载。
+
+ 动态链接:P281. 程序仅在被调用时链接。被链接的程序一般是系统库函数。
+
+ 区别。P282
+
+
+
+ ***
+
+4. 页表和转换表缓冲区(TLB)
+
+
+ 答案:
+
+ 页表:在分页的内存管理策略中,页表实现了逻辑地址向物理地址的转换,通常保持在内存中;
+
+ 转换表缓冲区:它是一段小且专用的快速硬件缓冲,其中保持了页表中的一部分条目。
+
+ 区别:转换表缓冲区的访问速度远快于内存访问,因此比页表访问具有更高的时间效率,但是由于缓冲区通常是很小的一部分空间,因此只能容纳页表中很少的一部分。
+
+
+
+ ***
+
+5. 最优置换策略和 LRU 置换策略
+
+
+ 答案:
+
+ 最优置换策略:按需调页时,置换最长时间不会使用的页。
+
+ LRU 置换策略:按需调页时,置换最长时间没有使用的页。
+
+ 区别:由于我们未知进程运行需要的页,最优置换算法难以实现,可以使用最长时间没有使用的页来近似最长时间不会使用的页。
+
+
+
+***
+
+### 四、综合题(40 分)
+
+1. 五个内存块大小依次为 $100\ \text{KB}$, $500\ \text{KB}$, $200\ \text{KB}$, $300\ \text{KB}$, $600\ \text{KB}$。分别用 first-fit, best-fit, 以及 worst-fit 算法处理 $212\ \text{KB}$, $417\ \text{KB}$, $112\ \text{KB}$, and $426\ \text{KB}$ (按序)的内存请求,请说明各算法的分配情况。对于当前情况,那种算法比较好?
+
+
+ 答案:
+
+ Answer:
+
+ (a) First-fit:
+
+ 1 212K is put in 500K partition
+
+ 2 417K is put in 600K partition
+
+ 3 112K is put in 288K partition (new partition 288K = 500K - 212K)
+
+ 4 426K must wait
+
+ (b) Best-fit:
+
+ 1 212K is put in 300K partition
+
+ 2 417K is put in 500K partition
+
+ 3 112K is put in 200K partition
+
+ 4 426K is put in 600K partition
+
+ (c) Worst-fit:
+
+ 1 212K is put in 600K partition
+
+ 2 417K is put in 500K partition
+
+ 3 112K is put in 388K partition
+
+ 4 426K must wait
+
+ In this example, best-fit turns out to be the best
+
+
+
+ ***
+
+2. (1)某系统段表如下,求以下逻辑地址的物理地址。(5 分)。
+
+ (a) 0, 0x430000;(b) 1, 0x10000;(c) 2, 0x500000;
+
+ (d) 3,0x400000; (e) 4, 0x112000
+
+ | 段号 | 基地址 | 长度 |
+ | --- | --- | --- |
+ | 0 | 0x219000 | 0x600000 |
+ | 1 | 0x2300000 | 0x14000 |
+ | 2 | 0x90000 | 0x100000 |
+ | 3 | 0x1327000 | 0x580000 |
+ | 4 | 0x1952000 | 0x96000 |
+
+
+ 答案:
+
+ a. 0x219000 + 0x430000 = 0x649000
+
+ b. 0x2300000 + 0x10000 = 0x2310000
+
+ c. illegal reference, trap to operating system
+
+ d. 0x1327000 + 0x400000 = 0x1727
+
+ :::tip
+ 此处原参考答案疑似有误:题目为 `3, 0x400000`,但参考答案写作 `0x1327000 + 0x400000 = 0x1727`,结果看起来被截断或写错。这里按原参考答案保留。
+ :::
+
+ e. illegal reference, trap to operating system
+
+
+
+ (2)某 32 位系统采用分页技术进行内存分配,页大小为 $4\ \text{KB}$。某进程的页表如下,请在内存中定位下列虚拟地址的物理地址:0x0c73, 0x1e41, 0x2b4c, 0x37bb, 0x580b(5 分)。
+
+ | 页号 | 框号 | i/v |
+ | --- | --- | --- |
+ | 0 | 4 | v |
+ | 1 | 2 | v |
+ | 2 | 5 | v |
+ | 3 | 3 | v |
+ | 4 | 8 | i |
+
+
+ 答案:
+
+ 0x0c73 --> 0x4c73
+
+ 0x1e41 --> 0x2e41
+
+ 0x2b4c --> 0x5b4c
+
+ 0x37bb --> 0x37bb
+
+ 0x480b --> 超出了页表长度,非法内存访问
+
+ :::tip
+ 此处题目最后一个地址为 `0x580b`,但原参考答案写作 `0x480b --> 超出了页表长度,非法内存访问`。这里按原参考答案保留。
+ :::
+
+
+
+ ***
+
+3. 请解释多级页表、反向页表、散列页表(或叫“哈希”页表)的概念(可画图表示),并从地址翻译的效率、内存空间占用这两个角度,详细分析对于 64 位 CPU 的计算机,这三种技术各自的优缺点。(10 分)
+
+
+ 答案:
+
+ 略
+
+
+
+ ***
+
+4. (10 分)现有两个进程 P1 和 P2,当前的页面访问序列分别为:
+
+ P1: 1, 2, 3, 4, 1, 2, 5
+
+ P2: 6, 7, 8, 6, 7, 6, 7
+
+ 这两个进程总共可有 5 个页框可供使用。假设使用 LRU 替换策略,页框分配采用固定分配(即分配后不可修改),请问如何在两个进程间分配页框可以达到缺页率最低?请写出替换序列,和缺页率计算过程(4 分);并证明该分配对于给出的序列是最优的(6 分)。
+
+
+ 答案:
+
+ 2, 3 (10 次缺页)
+
+ 1, 1, 3, 4, 1, 2, 5
+
+ 2, 2, 3, 4, 1, 2
+
+
+
+ 6, 6, 6, 6, 6, 6, 6
+
+ 7, 7, 7, 7, 7, 7
+
+ 8, 8, 8, 8, 8
+
+ 证明:
+
+ 1. 给 P2 更多页面不会减少 P2 的缺页率;
+ 2. 给 P1 3 个页面不会减少 P1 的缺页率,但是会增加 P2 的缺页率;
+ 3. 给 P1 4 个页面,P1 的缺页次数为 5,但是 P2 的缺页次数为 7。
+
+
+
+***
+
+## 2014-2015学年下学期月考试卷(三)(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学软件学院月考试卷(三)(2014—2015 学年第二学期)
+- 日期:2015.5
+
+### 一、判断题(15 分,每小题 3 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 当一个操作系统采用连续内存分配方案时,只可能产生外部碎片。
+
+
+ 答案:
+
+ 错,在相同大小连续内存分配方案中也可能会产生内部碎片。
+
+
+
+ ***
+
+2. 在虚存管理时,采用 LRU 页面替换策略可能发生 Belady 异常(即分配页框越多,缺页率反而越高)。
+
+
+ 答案:
+
+ 错,LRU 和 Optimal 算法都不可能发生 Belady 异常;只有 FIFO 可能发生 Belady 异常。
+
+
+
+ ***
+
+3. 从有效内存访问时间来看,基于转换表缓冲区(TLB)的分页策略一定优于纯分页策略。
+
+
+ 答案:
+
+ 错,如果 TLB 的命中率特别低,基于转换表缓冲区的分页策略可能比纯分页策略要差。
+
+
+
+ ***
+
+4. 在按需分页中,通过安装更快的 CPU 可以改善多道程序程度过高而导致的系统颠簸。
+
+
+ 答案:
+
+ 错,颠簸是由于多道程序程度过高,导致缺页率大幅增加,而 CPU 利用率急剧下降。此时,很多进程在等待 I/O,因此即使安装更快的 CPU 也无助于改善系统颠簸。
+
+
+
+ ***
+
+5. 页表由各个进程自己管理,进程可在用户态对页表进行更新。
+
+
+ 答案:
+
+ 错,首先不是所有的页表都是进程自己管理,如反向页表是操作系统管理的;其次,页表的修改只有在内核态进行更新。
+
+
+
+***
+
+### 二、单项选择题(15 分,每小题 3 分)
+
+1. 采用分段式存储管理的系统中,若地址用 24 位表示,其中 8 位表示段号,则允许每段的最大长度是:
+
+ A. $2^{24}$
+
+ B. $2^{16}$
+
+ C. $2^8$
+
+ D. $2^{32}$
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 使用段页式内存管理,段表和页表都存放在主存中,所有要访问的页面都在主存中。页表项可以缓存在转换表缓冲区(TLB)中。一次内存访问的代价为 $100\ \text{ns}$,一次 TLB 访问代价为 $10\ \text{ns}$。假设 TLB 的命中率为 50%,请问进程对内存的有效访问时间(effective access time)是:
+
+ A. $110\ \text{ns}$
+
+ B. $160\ \text{ns}$
+
+ C. $260\ \text{ns}$
+
+ D. $320\ \text{ns}$
+
+
+ 答案:
+
+ C ($100+50\%\times 10+50\%\times 110+100=260$)
+
+
+
+ ***
+
+对于接下来的 3 个问题,假设某作业访问页面的顺序为 2, 3, 2, 1, 5, 2, 4, 5, 3, 2, 5, 2,分配给该作业三个内存块。
+
+3. 采用 FIFO 页面置换算法会产生 $\underline{\qquad}$ 次缺页中断。
+
+ A. 7
+
+ B. 8
+
+ C. 9
+
+ D. 10
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+4. 采用 LRU 页面置换算法会产生 $\underline{\qquad}$ 次缺页中断。
+
+ A. 6
+
+ B. 7
+
+ C. 8
+
+ D. 9
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 采用最优页面(OPT)置换算法会产生 $\underline{\qquad}$ 次缺页中断。
+
+ A. 5
+
+ B. 6
+
+ C. 7
+
+ D. 8
+
+
+ 答案:
+
+ B
+
+
+
+***
+
+### 三、辨析题(30 分,每小题 6 分)
+
+分别解释以下每组的两个名词,并列举他们的区别。
+
+1. 内部碎片与外部碎片
+
+
+ 答案:
+
+ 内部碎片:某一区域或某一页中,未被占据其位置的作业所使用的区域。直到作业完成,释放页或区域,这个空间才能被系统所利用。
+
+ 外部碎片:还没有分配出去,但是由于大小太小而无法分配给申请空间的新进程的内存空间空闲块。
+
+ 区别:外部碎片不属于任何一个进程,如果不使用压缩算法直到内存断点为止;而内部碎片隶属于一个进程,随着进程释放内存空间而释放。
+
+
+
+ ***
+
+2. 页式内存管理和段式内存管理
+
+
+ 答案:
+
+ 页式内存管理:将逻辑地址空间和物理地址空间分成同样大小的片,利用页表实现逻辑地址空间向物理地址空间的转换。
+
+ 段式内存管理:将逻辑地址空间进行分段,每段大小可变,利用段表实现逻辑地址空间向物理地址空间的转换。
+
+ 区别:分段直接对物理地址空间划分,可能会产生外部碎片和内部碎片,而分页技术同时对逻辑地址空间和物理地址空间进行划分,它只产生外部碎片;帧大小普遍小于段的大小,但是页表通常远远大于段表的大小,从而造成分页的地址转换开销比较大。
+
+
+
+ ***
+
+3. 哈希页表和反向页表
+
+
+ 答案:
+
+ 哈希页表:以虚拟页号为键,物理帧号为值建立哈希页表,发生碰撞的页表项以链表数据结构组织。
+
+ 反向页表:反向页表对每个物理内存帧才有一个条目,而且每个页表项按照物理内存帧号进行排序。
+
+ 区别:哈希页表针对某一个进程而建立的多级页表结构,而反向页表是针对整个操作系统而建立页表结构
+
+
+
+ ***
+
+4. 最优置换和 LRU 置换
+
+
+ 答案:
+
+ 最优置换:按需调页时,置换最长时间不会使用的页。
+
+ LRU 置换:按需调页时,置换最长时间没有使用的页。
+
+ 区别:由于我们未知进程运行需要的页,最优置换算法难以实现,可以使用最长时间没有使用的页来近似最长时间不会使用的页。
+
+
+
+ ***
+
+5. 按需调页和交换
+
+
+ 答案:
+
+ 按需调页:进程执行过程中,在需要时才调入相应的物理页,这种技术称为按需调页,又称为懒惰交换。
+
+ 交换:把处于等待状态的进程从内存中移到二级存储,并释放该进程占用的内存空间,这一过程称为交换。
+
+ 区别:按需调页细粒度地实现进程中的某个或某些内存页和二级存储间的交换,而交换是整个进程的所占用内存空间与二级存储间的交换。
+
+
+
+***
+
+### 四、综合题(40 分)
+
+1. 简述缺页中断处理的详细过程(从发生缺页中断开始至页面调度结束),并指明每个步骤中,处理所处的上下文环境和模式。(10 分)
+
+
+ 答案:
+
+ How does OS handle a Page Fault?
+
+ 1. Choose an old page to replace in terms of a page-replacement algorithm
+
+ 2. If old page modified (“D=1”), write contents back to disk
+
+ 3. Change its PTE and any cached TLB to be invalid
+
+ 4. Load new page into memory from disk
+
+ 5. Update page table entry, validate TLB for new entry
+
+ 6. Continue thread from the new location via accessing the page table
+
+
+
+ ***
+
+2. 一个 32 位的操作系统,内存大小为 $2\ \text{GB}$,采用分页技术进行内存分配,如果每页的大小为 $4\ \text{KB}$:(10 分)
+
+ a) 请说明各需多少位表示虚拟地址、物理地址、虚拟页号、物理帧号和偏移量(5 分)?
+
+
+ 答案:
+
+ VA: 32, PA: 31, pages:20,# frames:19,offset:12
+
+
+
+ b) 如果某进程的页表如下,请在内存中定位下列虚拟地址的物理地址:3187, 7745, 11084, 14267, 18443(5 分)。
+
+ | PageID | FrameID |
+ | --- | --- |
+ | 0 | 4 |
+ | 1 | 2 |
+ | 2 | 5 |
+ | 3 | 3 |
+
+
+ 答案:
+
+ 3187 -> 19571
+
+ 7745 -> 11841
+
+ 11084 -> 23372
+
+ 14267 -> 14267
+
+ 18843 超出了页表长度,非法内存访问
+
+
+
+ ***
+
+3. 采用按需调页(demand paging),现有 3 个页框,分别存储着页面号 2,3,4 三个页面。已知接下来的页面访问顺序为 1,2,3,4,1,2,5,1,2,3,4,5。使用时钟算法(clock algorithm)作为页面替换算法。(10 分)
+
+ 请计算会发生的缺页次数(假设初始时在页框内的页面的引用位(reference bit)都是 1,2/3/4 三个页面按序存放,初始时指针指向页面 2)?(7 分)
+
+
+ 答案:
+
+ 9 次缺页
+
+ 
+
+
+
+ 请写出这一内存访问序列所对应的时间段中的工作集(3 分)
+
+
+ 答案:
+
+ {1,2,3,4,5}
+
+
+
+ ***
+
+4. 现有两个进程 P1 和 P2,当前的页面访问序列分别为:P1: 1, 2, 3, 4, 1, 2, 5 和 P2: 6, 7, 8, 6, 7, 6, 7。这两个进程总共可有 5 个页框可供使用。假设使用 LRU 替换策略,页框分配采用固定分配(即分配后不可修改),请问如何在两个进程间分配页框可以达到缺页率最低?
+
+ a) 请分别写出两个进程的替换序列,并计算总的缺页次数(6 分)。
+
+
+ 答案:
+
+ 2, 3 (10 次缺页) (1+4 也是 10 次,也算正确,答案不唯一)
+
+ 1, 1, 3, 4, 1, 2, 5
+
+ 2, 2, 3, 4, 1, 2
+
+
+
+ 6, 6, 6, 6, 6, 6, 6
+
+ 7, 7, 7, 7, 7, 7
+
+ 8, 8, 8, 8, 8
+
+
+
+ b)并证明这种帧分配对于给定的内存访问序列是最优的(4 分)。
+
+
+ 答案:
+
+ 证明: a. 给 P2 更多页面不会减少 P2 的缺页率
+
+ b. 给 P1 3 个页面不会减少 P1 的缺页率,但是会增加 P2 的缺页率;
+
+ c. 给 P1 4 个页面,P1 的缺页次数为 5,但是 P2 的缺页次数为 7。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..ef8d382
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,489 @@
+---
+title: 2014-2015学年下学期期中
+---
+
+## 2014-2015学年下学期期中试卷(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学软件学院期中考试卷(2014—2015学年第二学期)
+
+### 一、判断题(30分,每小题3分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 银行家算法只能保证系统处在安全状态,但不能保证死锁不发生。
+
+
+ 答案:
+
+ 错。银行家算法只能检测是否处于安全状态,并不能保证系统处于安全状态;此外,安全状态一定无死锁。
+
+ :::tip
+ 原参考答案中“只能检测是否处于安全状态,并不能保证系统处于安全状态”的表述疑似不准确。银行家算法会在分配前进行安全性检查,并拒绝会使系统进入不安全状态的资源分配。
+ :::
+
+
+
+ ***
+
+2. 要实现临界区,必须采用基于硬件的解决办法。
+
+
+ 答案:
+
+ 错。可以用基于软件/算法的方法,例如Peterson算法、信号量、管程等。
+
+
+
+ ***
+
+3. 不安全状态未必会导致死锁的发生;始终处于安全状态也不能保证死锁一定不会发生。
+
+
+ 答案:
+
+ 错。安全一定无死锁。
+
+
+
+ ***
+
+4. 单CPU环境下由于任何时刻只有一个进程(线程)能够运行,因此操作系统不需要实现同步与互斥支持。
+
+
+ 答案:
+
+ 错。单CPU环境下可能不需要互斥,因为不会同时有两个进程要求进入临界区;但是当多个进程需要顺序执行时,需要同步机制保证多个进程顺序执行。
+
+ :::tip
+ 原参考答案关于互斥的解释疑似有误。单CPU环境仍可能因抢占或中断发生交错访问,因此访问共享临界资源时仍需要互斥机制。
+ :::
+
+
+
+ ***
+
+5. 在抢占式(preemptive)操作系统中,进程不会因为申请、使用资源发生死锁。
+
+
+ 答案:
+
+ 对。抢占式操作系统违反了死锁发生的充分条件之一。
+
+ :::tip
+ 原参考答案将本题判为“对”,疑似混淆了CPU抢占与资源抢占。抢占式调度允许操作系统抢占CPU,但不代表进程持有的资源可以被抢占,因此仍可能发生资源死锁。
+ :::
+
+
+
+ ***
+
+6. 将“二值”或者“布尔”信号量的初值设为1作为互斥信号量,采用P、V原语操作可解决互斥问题。
+
+
+ 答案:
+
+ 对。信号量的P原语相当于获得排他性的资源访问锁,而V原语则释放这个锁。
+
+
+
+ ***
+
+7. 由于资源数少于进程对资源的需求数,因而产生资源的竞争,所以这种资源的竞争必然会引起死锁。
+
+
+ 答案:
+
+ 错。资源竞争是引起死锁的根本原因,但是并非必然引起死锁,而是在操作不当的情况可能引起死锁。
+
+
+
+ ***
+
+8. 一个用户进程在执行过程中,遇到硬件中断,中断处理程序运行在核心态、用户上下文中。
+
+
+ 答案:
+
+ 错。中断处理程序运行在系统上下文中。
+
+
+
+ ***
+
+9. 死锁是指因相互竞争资源使得系统中有多个阻塞进程的情况。
+
+
+ 答案:
+
+ 错。根据银行家算法,在当前时刻,无论有多少进程处于阻塞状态,只要找到一个安全序列说明整个系统处于安全状态,系统就不会出现死锁。
+
+
+
+ ***
+
+10. 进程所请求的一次打印输出结束后,将使进程状态从运行态变为就绪态。
+
+
+ 答案:
+
+ 错。等待态变为就绪态。
+
+
+
+***
+
+### 二、多项选择题(15分,每小题3分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 以下哪种情况仍然可能会发生死锁?( )
+
+ A. 资源都是可共享的;
+
+ B. 每一种资源的数量都超过单个进程所需这类资源的最大值;
+
+ C. 空闲资源能够满足任意一个进程还需要的资源需求;
+
+ D. 每个进程必须一次申请、获得所需的所有资源
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 对于死锁,以下哪些(个)描述是正确的:( )
+
+ A. 死锁避免(deadlock avoidance)中,不安全的状态必然发生死锁
+
+ B. 死锁避免(deadlock avoidance)中,发生死锁必然处于不安全状态
+
+ C. 资源分配图中有环(以资源类型和进程为节点),必然发生死锁
+
+ D. 如果要求每个进程必须一次申请所有需要的资源,如果不能满足其要求,则不分配任何资源,那么死锁不可能发生
+
+
+ 答案:
+
+ B, D
+
+
+
+ ***
+
+3. 以下描述正确的是:( )
+
+ A. 中断处理程序(interrupt handler)是进程的一部分,在进程的地址空间运行
+
+ B. 中断处理程序(interrupt handler)必须运行在内核态
+
+ C. 微内核体系结构下,进程间通讯(inter-processing communication)必须在微内核内
+
+ D. 分时(time sharing)的目的是提高CPU和I/O的并行度
+
+
+ 答案:
+
+ B, C
+
+
+
+ ***
+
+4. 一个正在运行的进程,当所分配的时间片用完后,将其挂在( )。
+
+ A.等待队列
+
+ B.运行队列
+
+ C.就绪队列
+
+ D.任意一个队列
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 以下那个操作不会使得一个进程从运行(running)状态转换为就绪(ready)状态:( )
+
+ A. 在可占先(preemptive)系统中,高优先级进程被创建
+
+ B. 分时系统中,时间片到
+
+ C. 当前运行进程发生缺页中断
+
+ D. 当前运行进程调用yield(),主动放弃使用CPU
+
+
+ 答案:
+
+ C
+
+
+
+***
+
+### 三、辨析题(30分,每小题6分)
+
+分别解释以下每组的两个名词,并列举他们的区别。
+
+1. 死锁(deadlock)与饥饿(starvation)
+
+
+ 答案:
+
+ 死锁:多个进程循环等待对方,都无法继续执行
+
+ 饥饿:某个或某些进程由于无法得到资源长时间无法执行
+
+ 死锁必然发生饥饿,但是饥饿不一定发生死锁
+
+
+
+ ***
+
+2. 同步和互斥
+
+
+ 答案:
+
+ 同步:并发进程之间相互合作,完成一项工作,它们之间有一定的时序关系。互相约束,其表现为一个进程等待另一个进程的变量结果.
+
+ 互斥:并发进程之间相互竞争临界资源的排他性关系
+
+ 区别:基于信号量的实现中,同步中的P,V原语在不同的临界区中出现,而在互斥中它们被临界区所分割;此外,它们的初值不同,同步中信号量的初值为0,而互斥中初值为1。
+
+
+
+ ***
+
+3. 线程和进程
+
+
+ 答案:
+
+ 答题要点:从定义、调度、并发性、系统开销和拥有资源角度说明即可。
+
+
+
+ ***
+
+4. 微内核和模块化内核
+
+
+ 答案:
+
+ 微内核:操作系统内核只包含最基本的功能(进程调度和进程间通讯)
+
+ 模块化内核:操作系统内核的一些功能可以作为模块挂载
+
+ 区别:微内核中内核和其它操作系统的功能模块(如虚存管理)在不同的地址空间运行,模块化内核中它们在一个地址空间。
+
+
+
+ ***
+
+5. 管程与进程
+
+
+ 答案:
+
+ 管程:是一种并发性的构造,它包括用于分配一个共享资源或一组共享资源的数据和过程。为了完成分配资源的功能,进程必须调用特定的管程入口。管程(Monitor)采用资源集中管理的方法,将系统中的资源用某种数据结构抽象地表示出来。由于临界区是访问共享资源的代码段,因而建立一个管程来管理进程提出的访问请求。采用这种方式对共享资源的管理就可以借助数据结构及其上实施操作的若干过程来进行;对共享资源的申请和释放可以通过管程在数据结构上的操作来实现。
+
+ 进程:略
+
+ 区别:管程是进程间通信的一种实现方式,与进程有质的不同。
+
+
+
+***
+
+### 四、综合题(25分)
+
+1. (5分)
+
+ 已知生产者、消费者问题的代码如下:
+
+ 生产者:
+
+ ```c
+ Producer () {
+ while (true) {
+ /* produce an item and
+ put in nextProduced */
+ while (count == BUF_SIZE)
+ ; // do nothing
+ buffer [in] = nextProduced;
+ in = (in + 1) % BUF_SIZE;
+ count++;
+ }
+ }
+ ```
+
+ 消费者:
+
+ ```c
+ Consumer () {
+ while (true) {
+ while (count == 0)
+ ; // do nothing
+ nextConsumed = buffer[out];
+ out = (out + 1) % BUF_SIZE;
+ count--;
+ /* consume the item in
+ nextConsumed */
+ }
+ }
+ ```
+
+ 请使用信号量(semaphore),修改现有代码,实现生产者和消费者可能会引起资源竞争的代码的互斥,并分析该实现是否正确、是否会发生死锁。
+
+
+ 答案:
+
+ 答:
+
+ ```c
+ Semaphore full = 0;
+ Semaphore empty = BUF_SIZE;
+ Semaphore mutex = 1; // 初始化1分
+
+ 生产者:
+ Producer () {
+ while (true) {
+ /* produce an item and
+ put in nextProduced */
+ Wait (empty);
+ Wait (mutex);
+ buffer [in] = nextProduced;
+ in = (in + 1) % BUF_SIZE;
+ count++;
+ Signal (mutex);
+ Signal (full);
+ }
+ }
+
+ 消费者:
+ Consumer () {
+ while (true) {
+ Wait (full);
+ Wait (mutex);
+ nextConsumed = buffer[out];
+ out = (out + 1) % BUF_SIZE;
+ count--;
+ Signal (mutex);
+ Signal (empty);
+ /* consume the item in
+ nextConsumed */
+ }
+ }
+ ```
+
+
+
+ ***
+
+2. (10分)
+
+ 假设有三个进程A,B和C,A和B只使用CPU,各需要200毫秒,进程C使用10毫秒CPU然后进行40毫秒I/O,然后再使用10毫秒CPU接着40毫秒I/O,依此重复,总共也是200毫秒。假设三个进程的到达次序是ABC。
+
+ a) 请计算采用FIFO调度,计算三个进程的平均等待时间和平均完成时间,画出甘特图(4分)
+
+
+ 答案:
+
+ 答:(甘特图略)
+
+ A,B,C
+
+ 平均等待时间:$(0+200+400)/3=200$
+
+ 平均完成时间:$(200+400+600)/3=400$
+
+
+
+ b) 请列出使用100毫秒为时间片长度,使用轮询(round-robin)调度时,画出甘特图求取三个进程的执行次序,并计算每次执行的时间(6分)
+
+
+ 答案:
+
+ 答:A100, B100, C10, A100(f)C40, B100(f), C10, C40, C10, C40, C10, C40(f)
+
+ (甘特图略)
+
+
+
+ ***
+
+3. (10分)
+
+ 现有四个进程P0, P1, P2, P3,三类资源A, B, C,各有7、5、5个。资源分配矩阵如下:
+
+ | | A | B | C |
+ | --- | --- | --- | --- |
+ | P0 | 0 | 1 | 0 |
+ | P1 | 2 | 0 | 0 |
+ | P2 | 3 | 0 | 3 |
+ | P3 | 2 | 2 | 2 |
+
+ 资源请求矩阵如下:
+
+ | | A | B | C |
+ | --- | --- | --- | --- |
+ | P0 | 0 | 0 | 0 |
+ | P1 | 2 | 0 | 2 |
+ | P2 | 0 | 0 | 0 |
+ | P3 | 1 | 0 | 0 |
+
+ 可用资源向量为:
+
+ | A | B | C |
+ | --- | --- | --- |
+ | 0 | 2 | 0 |
+
+ a) 请问:目前是否存在死锁?如果不存在死锁,请给出一个能够让所有进程执行完的序列(5分)
+
+
+ 答案:
+
+ 答:不存在死锁
+
+ | 进程 | A | B | C |
+ | --- | --- | --- | --- |
+ | P0 | 0 | 3 | 0 |
+ | P2 | 3 | 3 | 3 |
+ | P1 | 5 | 3 | 3 |
+ | P3 | 7 | 5 | 5 |
+
+
+
+ b) 假设此时又来一个进程P4,申请资源(2, 2, 0),请问如果把2个资源B的实例分配给P4,假设除已经获得和正在请求的资源外,所有进程不再请求其它资源,是否处于安全状态(为什么)?(5分)
+
+
+ 答案:
+
+ 答:安全
+
+ 此时可用资源向量为:0 0 0
+
+ | 进程 | A | B | C |
+ | --- | --- | --- | --- |
+ | P2 | 3 | 0 | 3 |
+ | P1 | 5 | 0 | 3 |
+ | P4 | 5 | 2 | 3 |
+ | P0 | 5 | 3 | 3 |
+ | P3 | 7 | 5 | 5 |
+
+ 仍然都能执行完.
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2015-2016\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2015-2016\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..cbf5e07
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2015-2016\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,437 @@
+---
+title: 2015-2016学年上学期期中
+---
+
+## 2015-2016学年上学期期中试卷(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学软件学院期中考试卷(2015—2016学年第一学期)
+
+### 一、判断题(15分,每小题3分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 要互斥地进入临界区,必须采用基于硬件的解决办法。
+
+
+ 答案:
+
+ 错。可以用基于软件/算法的方法,例如Peterson算法。
+
+
+
+ ***
+
+2. 单CPU环境下由于任何时刻只有一个进程(线程)能够运行,因此操作系统不需要实现同步与互斥控制。
+
+
+ 答案:
+
+ 错。单CPU环境下,并发执行的进程之间也需要实现同步与互斥。
+
+
+
+ ***
+
+3. 对于内核支持的线程,当该线程执行系统调用被阻塞时,不仅该线程被阻塞,而且同一进程内的所有线程都会被阻塞。
+
+
+ 答案:
+
+ 错。只有当前线程被阻塞,其它线程可以继续执行。
+
+
+
+ ***
+
+4. 多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。
+
+
+ 答案:
+
+ 对。
+
+
+
+ ***
+
+5. 线程都保存有各自的栈信息、CPU状态(寄存器、指令计数器等)、堆信息,以及打开文件列表等。
+
+
+ 答案:
+
+ 错。线程保存栈信息、CPU状态;而堆信息,以及打开文件列表等是进程保存的。
+
+
+
+***
+
+### 二、不定项选择题(15分,每小题3分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 对于死锁,以下哪些(个)描述是正确的:( )
+
+ A. 死锁避免(deadlock avoidance)中,不安全的状态必然发生死锁
+
+ B. 死锁避免(deadlock avoidance)中,发生死锁必然处于不安全状态
+
+ C. 资源分配图中有环(以资源类型和进程为节点),必然发生死锁
+
+ D. 如果要求每个进程必须一次申请所有需要的资源,如果不能满足其要求,则不分配任何资源,那么死锁不可能发生
+
+
+ 答案:
+
+ B, D
+
+
+
+ ***
+
+2. 当系统中的进程增多时,以下哪些(个)情况不可能出现(不考虑死锁)。( )
+
+ A. CPU利用率增高
+
+ B. CPU利用率降低
+
+ C. 磁盘I/O增多
+
+ D. 磁盘I/O减少
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+3. 关于线程,以下说法正确的是( )
+
+ A. 用户态线程(无核心态线程或LWP)阻塞,可能会阻塞线程
+
+ B. 多处理器环境下,线程间同步不能使用关中断实现
+
+ C. 线程控制块中包含CPU寄存器状态
+
+ D. 在支持核心态线程的系统中,CPU调度的单位仍然是进程
+
+
+ 答案:
+
+ A, B, C
+
+
+
+ ***
+
+4. 多CPU共享内存环境下,以下哪种实现临界区的方法无效?( )
+
+ A. 使用test_and_set机器指令实现“忙等”(busy waiting)
+
+ B. Peterson算法
+
+ C. 关中断
+
+ D. 使用swap机器指令实现“忙等”
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 一个正在运行的进程,当所分配的时间片用完后,将其挂在( )。
+
+ A.等待队列
+
+ B.运行队列
+
+ C.就绪队列
+
+ D.任意一个队列
+
+
+ 答案:
+
+ C
+
+
+
+***
+
+### 三、辨析题(30分,每小题6分)
+
+分别解释以下每组的两个名词,并列举他们的区别。
+
+1. 死锁(deadlock)与饥饿(starvation)
+
+
+ 答案:
+
+ 死锁:多个进程循环等待对方,都无法继续执行。
+
+ 饥饿:某个或某些进程由于无法得到资源长时间无法执行。
+
+ 死锁必然发生饥饿,但是饥饿不一定发生死锁。
+
+
+
+ ***
+
+2. 对称多处理系统调度与非对称多处理系统调度
+
+
+ 答案:
+
+ Symmetric Multiprocessing (SMP) – each processor makes its own scheduling decisions.
+
+ Asymmetric multiprocessing – only one processor accesses the system data structures, alleviating the need for data sharing.
+
+
+
+ ***
+
+3. 进程的同步与互斥
+
+
+ 答案:
+
+ 同步:并发进程之间相互合作,完成一项工作,它们之间有一定的时序关系。互相约束,其表现为一个进程等待另一个进程的变量结果.
+
+ 互斥:并发进程之间相互竞争临界资源的排他性关系
+
+
+
+ ***
+
+4. 管程与进程
+
+
+ 答案:
+
+ 管程:是一种并发性的构造,它包括用于分配一个共享资源或一组共享资源的数据和过程。为了完成分配资源的功能,进程必须调用特定的管程入口。管程(Monitor)采用资源集中管理的方法,将系统中的资源用某种数据结构抽象地表示出来。由于临界区是访问共享资源的代码段,因而建立一个管程来管理进程提出的访问请求。采用这种方式对共享资源的管理就可以借助数据结构及其上实施操作的若干过程来进行;对共享资源的申请和释放可以通过管程在数据结构上的操作来实现。
+
+ 进程:进程是计算机中的程序关于某数据集合的一次运行活动。在传统操作系统中,它是资源拥有的基本单元。进程之间同样可以并发执行。进程虽然拥有自己的系统资源,但也因此导致创建或撤销进程开销都十分的大,切换、通信、同步也会比线程之间的实现更加复杂。
+
+
+
+ ***
+
+5. 微内核和模块化内核
+
+
+ 答案:
+
+ 微内核:操作系统内核只包含最基本的功能(进程调度和进程间通讯)
+
+ 模块化内核:操作系统内核的一些功能可以作为模块挂载
+
+ 区别:微内核中内核和其它操作系统的功能模块(如虚存管理)在不同的地址空间运行,模块化内核中它们在一个地址空间。
+
+
+
+***
+
+### 四、综合题(40分,每题10分)
+
+1. 假设有三个进程A,B和C,A和B只使用CPU,各需要200毫秒,进程C使用10毫秒CPU然后进行40毫秒I/O,然后再使用10毫秒CPU接着40毫秒I/O,依此重复,总共也是200毫秒。假设三个进程的到达次序是ABC。
+
+ a) 请计算采用FIFO调度,计算三个进程的平均等待时间和平均完成时间,画出甘特图(4分)
+
+
+ 答案:
+
+ 答:(甘特图略)
+
+ A,B,C
+
+ 平均等待时间:$(0+200+400)/3=200$
+
+ 平均完成时间:$(200+400+600)/3=400$
+
+
+
+ b) 请列出使用100毫秒为时间片长度,使用轮询(round-robin)调度时,画出甘特图求取三个进程的执行次序,并计算每次执行的时间(6分)
+
+
+ 答案:
+
+ 答:A100, B100, C10, A100(f)C40, B100(f), C10, C40, C10, C40, C10, C40(f)
+
+ (甘特图略)
+
+
+
+ ***
+
+2. 桌上有一个空盘,最多可以容纳两个水果,每次只能放入或取出一个水果。爸爸专向盘中放苹果,妈妈专向盘中放橘子。儿子专门等吃盘中橘子,女儿专门等吃盘中苹果,请用PV操作实现爸爸、妈妈、儿子、女儿之间的同步与互斥操作。
+
+
+ 答案:
+
+ 设置4个信号量:
+
+ empty:表示还可以向盘中放几个水果,初值为2;
+
+ apple:表示已放入盘中的水果,初值为0;
+
+ orange:表示已放入盘中的橘子,初值为0;
+
+ mutex: 对盘子互斥访问,初值为1.
+
+ :::tip
+ 原参考答案将apple解释为“已放入盘中的水果”,结合题意和后续代码,此处应指“已放入盘中的苹果”。
+ :::
+
+ ```c
+ Semaphore mutex=1,empty=2,apple = 0,orange=0;
+
+ Main()
+ {
+ Conbegin
+ father();
+ mother();
+ son();
+ daughter();
+ Coend
+ }
+
+ father()
+ {
+ while (true)
+ {
+ P(empty)
+ P(mutex)
+ 向盘中放水果;
+ V(mutex);
+ V(apple);
+ }
+ }
+
+ mother()
+ {
+ while (true)
+ {
+ P(empty)
+ P(mutex)
+ 向盘中放水果;
+ V(mutex);
+ V(orange);
+ }
+ }
+
+ son()
+ {
+ while (true)
+ {
+ P(orange);
+ P(mutex);
+ 从盘中取橘子
+ V(mutex);
+ V(empty);
+ 吃橘子;
+ }
+ }
+
+ daughter()
+ {
+ while (true)
+ {
+ P(apple)
+ P(mutex)
+ 从盘中取苹果;
+ V(mutex);
+ V(empty);
+ 吃苹果;
+ }
+ }
+ ```
+
+
+
+ ***
+
+3. 请详细描述一个用户态线程调用sleep()系统调用后,操作系统所执行的任务。
+
+
+ 答案:
+
+ (1)系统调用过程:mode-switch, 查表(syscall handling), 执行系统调用代码
+
+ (2)sleep() 将当前进程放入waiting队列(设置alarm)
+
+ (3)CPU调度(context switch)
+
+ (4)系统调用结束,返回,mode-switch
+
+
+
+ ***
+
+4. 现有四个进程P0, P1, P2, P3,三类资源A, B, C,各有7、5、5个。资源分配矩阵如下:
+
+ | | A | B | C |
+ | --- | --- | --- | --- |
+ | P0 | 0 | 1 | 0 |
+ | P1 | 2 | 0 | 0 |
+ | P2 | 3 | 0 | 3 |
+ | P3 | 2 | 2 | 2 |
+
+ 资源请求矩阵如下:
+
+ | | A | B | C |
+ | --- | --- | --- | --- |
+ | P0 | 0 | 0 | 0 |
+ | P1 | 2 | 0 | 2 |
+ | P2 | 0 | 0 | 0 |
+ | P3 | 1 | 0 | 0 |
+
+ 可用资源向量为:
+
+ | A | B | C |
+ | --- | --- | --- |
+ | 0 | 2 | 0 |
+
+ a) 请问:目前是否存在死锁?如果不存在死锁,请给出一个能够让所有进程执行完的序列(5分)
+
+
+ 答案:
+
+ 答:不存在死锁
+
+ | 进程 | A | B | C |
+ | --- | --- | --- | --- |
+ | P0 | 0 | 3 | 0 |
+ | P2 | 3 | 3 | 3 |
+ | P1 | 5 | 3 | 3 |
+ | P3 | 7 | 5 | 5 |
+
+
+
+ b) 假设此时又来一个进程P4,申请资源(2, 2, 0),请问如果把2个资源B的实例分配给P4,假设除已经获得和正在请求的资源外,所有进程不再请求其它资源,是否处于安全状态(为什么)?(5分)
+
+
+ 答案:
+
+ 答:安全
+
+ 此时可用资源向量为:0 0 0
+
+ | 进程 | A | B | C |
+ | --- | --- | --- | --- |
+ | P2 | 3 | 0 | 3 |
+ | P1 | 5 | 0 | 3 |
+ | P4 | 5 | 2 | 3 |
+ | P0 | 5 | 3 | 3 |
+ | P3 | 7 | 5 | 5 |
+
+ 仍然都能执行完.
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2015-2016\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2015-2016\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..f53ce4f
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2015-2016\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,516 @@
+---
+title: 2015-2016学年上学期期末
+---
+
+## 2015-2016学年上学期期末试卷(A)(含答案)
+
+### 一、单项选择题(20 分,每题 2 分)
+
+1. 操作系统的发展过程是( )。
+
+ A. 设备驱动程序组成的原始操作系统,管理程序,操作系统
+
+ B. 原始操作系统,操作系统,管理程序
+
+ C. 管理程序,原始操作系统,操作系统
+
+ D. 管理程序,操作系统,原始操作系统
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+2. 下面关于操作系统的叙述中正确的是( )。
+
+ A. 从响应时间的角度来看,实时系统与分时系统无本质差别
+
+ B. 多道运行是现代操作系统的特征之一,它是指宏观和微观上都并行
+
+ C. 操作系统的特征是并行性、共享性、虚拟性和不确定性
+
+ D. 在分时系统中,响应时间约等于时间片乘用户数,因此只要时间片足够小其响应时间一定能改善
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+3. 在进程状态的转换中,( )是不可能的。
+
+ A. 运行状态 $\to$ 就绪状态
+
+ B. 阻塞状态 $\to$ 运行状态
+
+ C. 运行状态 $\to$ 阻塞状态
+
+ D. 阻塞状态 $\to$ 就绪状态
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. 一个正在运行的进程,当所分配的时间片用完后,将其挂在( )。
+
+ A. 等待队列
+
+ B. 运行队列
+
+ C. 就绪队列
+
+ D. 任意一个队列
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 在有 $n$ 个进程共享一个临界区,如果最多允许 $m$ 个进程($m
+ 答案:
+
+ A
+
+
+
+ ***
+
+6. 资源静态分配法破坏了死锁产生的( )条件来预防死锁的发生。
+
+ A. 互斥控制
+
+ B. 保持和等待
+
+ C. 不可剥夺控制
+
+ D. 循环等待
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+7. 在可变分区管理方案中,若采用“最佳适应”分配算法,通常将空闲区按( )排列。
+
+ A. 容量递增
+
+ B. 容量递减
+
+ C. 地址递增
+
+ D. 地址递减
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+8. 虚拟存储的基础是程序局部性理论,它的基本含义是( )。
+
+ A. 代码的顺序执行
+
+ B. 程序执行时对内存访问的不均匀性
+
+ C. 变量的连续访问
+
+ D. 指令的局部性
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+9. 文件系统中实现按名存取的功能是通过( )来实现的。
+
+ A. 查磁盘空间
+
+ B. 查文件目录
+
+ C. 查磁盘控制器
+
+ D. 查位示图
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+10. 下面的叙述中,( )不是设备管理中引入缓冲机制的主要原因。
+
+ A. 缓和 CPU 和 I/O 设备间的速度不匹配问题
+
+ B. 减少对 CPU 的中断频率和放宽对 CPU 响应时间的限制
+
+ C. 提高 CPU 和 I/O 设备间的并行性
+
+ D. 节省系统内存
+
+
+ 答案:
+
+ D
+
+
+
+***
+
+### 二、填空题(10 分,每题 2 分)
+
+1. 在引入线程的系统中,将进程作为 $\underline{\qquad}$ 的单位,线程作为 $\underline{\qquad}$ 的单位。因此将线程称为“轻量级”的进程。
+
+
+ 答案:
+
+ 资源分配;调度或者占有 CPU
+
+
+
+ ***
+
+2. 在存储管理中,引入快表的目的是 $\underline{\qquad}$。在操作系统中,把不可中断执行的操作称为 $\underline{\qquad}$。
+
+
+ 答案:
+
+ 加快查询变换表的速度;原语
+
+
+
+ ***
+
+3. 在段页式存储管理中,用 $\underline{\qquad}$ 方法来管理逻辑存储空间,用 $\underline{\qquad}$ 方法来管理物理存储空间。
+
+
+ 答案:
+
+ 分段;分页
+
+
+
+ ***
+
+4. 使用段页式内存管理,段表和页表都存放在主存中,所有要访问的页面都在主存中。页表项可以缓存在转换表缓冲区(TLB)中。一次内存访问的代价为 $90\ \text{ns}$,一次 TLB 访问代价为 $10\ \text{ns}$。假设 TLB 的命中率为 $50\%$,请问,进程对内存的有效访问时间是 $\underline{\qquad}$。
+
+
+ 答案:
+
+ $235\ \text{ns}$
+
+
+
+ ***
+
+5. 廉价冗余阵列可组成一个大容量磁盘系统,它利用交叉存储 $\underline{\qquad}$ 来提高磁盘系统的存取速度,而利用 $\underline{\qquad}$ 来增加磁盘系统的可靠性。
+
+
+ 答案:
+
+ 技术;容错技术
+
+
+
+***
+
+### 三、判断题(20 分,每题 2 分)
+
+1. 进程同步是进程与进程间的间接制约问题,进程互斥是进程与进程间的直接制约问题。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+2. 单 CPU 环境下由于任何时刻只有一个进程(线程)能够运行,因此操作系统不需要实现同步与互斥支持。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+3. 页表由各个进程自己管理,进程可在用户态对页表进行更新。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+4. 位示图只能用在磁盘空间的管理。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+5. 临界区是指进程中用于实现进程互斥的那段代码。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+6. 逻辑文件有两种形式流式文件和记录式文件,源程序文件属于记录式文件,学生选课文件属于流式文件。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+7. 当某进程执行 P 操作时,首先对 S 信号量减 1,当 $S \le 0$ 时表示资源得不到满足,系统将执行 P 操作的进程插入等待队列。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+8. 文件的物理结构不仅与外存的分配方式相关,还与存储介质的特性相关,通常在磁带上只适合使用顺序的存储结构。( )
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+9. 采用资源静态分配算法可以预防死锁的发生。( )
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+10. 并发是并行的不同表述,其原理是相同的。( )
+
+
+ 答案:
+
+ 错
+
+
+
+***
+
+### 四、简答题(20 分,每题 5 分)
+
+1. 什么是死锁?什么是饥饿?请说明两者之间的关系。什么是同步?什么是互斥?
+
+
+ 答案:
+
+ 死锁:多个进程循环等待对方,都无法继续执行
+
+ 饥饿:某个或某些进程由于无法得到资源长时间无法执行
+
+ 死锁必然发生饥饿,但是饥饿不一定发生死锁
+
+ 同步:并发进程之间相互合作,完成一项工作,它们之间有一定的时序关系。互相约束,其表现为一个进程等待另一个进程的变量结果.
+
+ 互斥:并发进程之间相互竞争临界资源的排他性关系
+
+
+
+ ***
+
+2. 介绍信号量的含义,简单描述 P/V 机制,并给出 P 操作和 V 操作实现方法。
+
+
+ 答案:
+
+ (1)P、V操作是两条原语,定义如下:
+
+ P操作:P操作记为 $P(S)$,其中 $S$ 为一信号量,它执行时主要完成下述动作:
+
+ $S=S-1$
+
+ 若 $S>=0$,则进程继续运行。
+
+ 若 $S<0$,则该进程被阻塞,并将它插入该信号量的等待队列中。
+
+ V操作:V操作记为 $V(S)$,其中 $S$ 为一信号量,它执行时主要完成下述动作:
+
+ $S=S+1$
+
+ 若 $S>0$,则进程继续运行。
+
+ 若 $S<=0$,则从信号量的等待队列中移出队首进程。使其变为就绪状态。
+
+
+
+ ***
+
+3. 分页存储管理中,页表的功能是什么?当系统中的地址空间变得非常大时(如 32 位地址空间),会给页表的设计带来什么样的新问题?请给出一种解决方案。
+
+
+ 答案:
+
+ 页表主要功能是完成逻辑地址与物理地址之间的映射。如果地址空间非常大,会造成页表非常大,使得其占据内存空间非常大。其主要解决方法为采用多级页表的方法。
+
+
+
+ ***
+
+4. 辨析概念:管程与进程。
+
+
+ 答案:
+
+ 管程:是一种并发性的构造,它包括用于分配一个共享资源或一组共享资源的数据和过程。为了完成分配资源的功能,进程必须调用特定的管程入口。管程(Monitor)采用资源集中管理的方法,将系统中的资源用某种数据结构抽象地表示出来。由于临界区是访问共享资源的代码段,因而建立一个管程来管理进程提出的访问请求。采用这种方式对共享资源的管理就可以借助数据结构及其上实施操作的若干过程来进行;对共享资源的申请和释放可以通过管程在数据结构上的操作来实现。
+
+ 进程:进程是计算机中的程序关于某数据集合的一次运行活动。在传统操作系统中,它是资源拥有的基本单元。进程之间同样可以并发执行。进程虽然拥有自己的系统资源,但也因此导致创建或撤销进程开销都十分的大,切换、通信、同步也会比线程之间的实现更加复杂。
+
+
+
+***
+
+### 五、问答题(30 分,每题 10 分)
+
+1. 有三个用户进程 A、B 和 C,在运行过程中都要使用系统中的一台打印机输出计算结果。
+
+ 说明 A、B、C 进程之间存在什么样的制约关系?
+
+ 为保证这三个进程能正确地打印出各自的结果,请用信号量和 P、V 操作写出各自的有关申请、使用打印机的代码。要求给出信号量的含义和初值。
+
+
+ 答案:
+
+ 1)存在互斥关系。
+
+ 2)设定信号量为mutex,其初值为1。
+
+ A进程 B进程 C进程
+
+ `P(mutex)` `P(mutex)` `P(mutex)`
+
+ 使用打印机 使用打印机 使用打印机
+
+ `V(mutex)` `V(mutex)` `V(mutex)`
+
+
+
+ ***
+
+2. 在采用页式存储管理的系统中,某任务 J 的逻辑地址空间为 4 页(每页 $2048\ \text{B}$),且已知该任务的页面映象表如下:
+
+ | 页号 | 帧号 |
+ | --- | --- |
+ | 0 | 2 |
+ | 1 | 4 |
+ | 2 | 6 |
+ | 3 | 8 |
+
+ 试借助地址变换图(画出地址变换图)求出有效逻辑地址 4865 所对应的物理地址。
+
+
+ 答案:
+
+ 页号:$4865 / 2048 = 2$
+
+ 页内位移:$4865 - 2048 \times 2 = 769$
+
+ 通过页表得知物理块号为 6,将物理块号与逻辑地址中的页内位移拼接,形成物理地址,即:
+
+ $6 \times 2048 + 769 = 13057$
+
+
+
+ ***
+
+3. 某操作系统的文件管理采用直接索引和多级索引混合方式,文件索引表共有 10 项,其中前 8 项是直接索引项,第 9 项是一次间接索引项,第 10 项是二次间接索引项,假定物理块的大小是 $2\ \text{K}$,每个索引项占用 $4\ \text{B}$,问:
+
+ 该文件系统中最大的文件可以达到多大?
+
+ 假定一个文件的实际大小是 $128\ \text{MB}$,该文件实际占用磁盘空间多大(包括间接索引块)?
+
+
+ 答案:
+
+ 1) $8 \times 2\text{K} + \dfrac{2\text{K}}{4\text{B}} \times 2\text{K} + \dfrac{2\text{K}}{4\text{B}} \times \left(\dfrac{2\text{K}}{4\text{B}}\right) \times 2\text{K} = 513\text{M} + 16\text{K}$
+
+ 2) 直接块:$8 \times 2\text{K} = 16\text{KB}$,索引块 0 个。
+
+ 一级间接块:$\dfrac{2\text{K}}{4\text{B}} \times 2\text{K} = 1\text{MB}$,一级索引块 1 个,即 $2\text{K}$。
+
+ 剩下:$128\text{MB} - 1\text{MB} - 16\text{KB} = 130032\text{KB}$
+
+ $130032\text{KB} \,/\, \left(\dfrac{2\text{K}}{4\text{B}} \times 2\text{K}\right) = 127$ 块(取整)
+
+ 二级索引块 1 个,一级间接索引块需要 127 个,即 $(127+1)\times 2\text{K} = 256\text{K}$
+
+ 占用空间:$128\text{MB} + 0\text{K} + 2\text{K} + 256\text{K} = 131330\text{K} = 128\text{M} + 258\text{K}$
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2015-2016\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2015-2016\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203.md"
new file mode 100644
index 0000000..a45d8b0
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2015-2016\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203.md"
@@ -0,0 +1,374 @@
+---
+title: 2015-2016学年下学期月考
+---
+
+## 2015-2016学年下学期月考试卷(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学软件学院月考试卷(二)(2015—2016 学年第二学期)
+
+### 一、判断题(15 分,每小题 3 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 当一个操作系统采用连续内存分配方案时,只可能产生外部碎片。
+
+
+ 答案:
+
+ 错,在相同大小连续内存分配方案中也可能会产生内部碎片。
+
+
+
+ ***
+
+2. 在虚存管理时,采用 LRU 页面替换策略可能发生 Belady 异常(即分配页框越多,缺页率反而越高)。
+
+
+ 答案:
+
+ 错,LRU 和 Optimal 算法都不可能发生 Belady 异常;只有 FIFO 可能发生 Belady 异常。
+
+
+
+ ***
+
+3. 从有效内存访问时间来看,基于转换表缓冲区(TLB)的分页策略一定优于纯分页策略。
+
+
+ 答案:
+
+ 错,如果 TLB 的命中率特别低,基于转换表缓冲区的分页策略可能比纯分页策略要差。
+
+
+
+ ***
+
+4. 在按需分页中,通过安装更快的 CPU 可以改善多道程序程度过高而导致的系统颠簸。
+
+
+ 答案:
+
+ 错,颠簸是由于多道程序程度过高,导致缺页率大幅增加,而 CPU 利用率急剧下降。此时,很多进程在等待 I/O,因此即使安装更快的 CPU 也无助于改善系统颠簸。
+
+
+
+ ***
+
+5. 页表由各个进程自己管理,进程可在用户态对页表进行更新。
+
+
+ 答案:
+
+ 错,首先不是所有的页表都是进程自己管理,如反向页表是操作系统管理的;其次,页表的修改只有在内核态进行更新。
+
+
+
+***
+
+### 二、单项选择题(15 分,每小题 3 分)
+
+1. 采用分段式存储管理的系统中,若地址用 24 位表示,其中 8 位表示段号,则允许每段的最大长度是:
+
+ A. $2^{24}$
+
+ B. $2^{16}$
+
+ C. $2^8$
+
+ D. $2^{32}$
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 使用段页式内存管理,段表和页表都存放在主存中,所有要访问的页面都在主存中。页表项可以缓存在转换表缓冲区(TLB)中。一次内存访问的代价为 $100\ \text{ns}$,一次 TLB 访问代价为 $10\ \text{ns}$。假设 TLB 的命中率为 50%,请问进程对内存的有效访问时间(effective access time)是:
+
+ A. $110\ \text{ns}$
+
+ B. $160\ \text{ns}$
+
+ C. $260\ \text{ns}$
+
+ D. $320\ \text{ns}$
+
+
+ 答案:
+
+ C($100+50\%\times10+50\%\times110+100=260$)
+
+
+
+ ***
+
+对于接下来的 3 个问题,假设某作业访问页面的顺序为 2, 3, 2, 1, 5, 2, 4, 5, 3, 2, 5, 2,分配给该作业三个内存块。
+
+3. 采用 FIFO 页面置换算法会产生 $\underline{\qquad}$ 次缺页中断。
+
+ A. 7
+
+ B. 8
+
+ C. 9
+
+ D. 10
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+4. 采用 LRU 页面置换算法会产生 $\underline{\qquad}$ 次缺页中断。
+
+ A. 6
+
+ B. 7
+
+ C. 8
+
+ D. 9
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 采用最优页面(OPT)置换算法会产生 $\underline{\qquad}$ 次缺页中断。
+
+ A. 5
+
+ B. 6
+
+ C. 7
+
+ D. 8
+
+
+ 答案:
+
+ B
+
+
+
+***
+
+### 三、辨析题(30 分,每小题 6 分)
+
+分别解释以下每组的两个名词,并列举他们的区别。
+
+1. 内部碎片与外部碎片
+
+
+ 答案:
+
+ 内部碎片:某一区域或某一页中,未被占据其位置的作业所使用的区域。直到作业完成,释放页或区域,这个空间才能被系统所利用。
+
+ 外部碎片:还没有分配出去,但是由于大小太小而无法分配给申请空间的新进程的内存空间空闲块。
+
+ 区别:外部碎片不属于任何一个进程,如果不使用压缩算法直到内存断点为止;而内部碎片隶属于一个进程,随着进程释放内存空间而释放。
+
+
+
+ ***
+
+2. 页式内存管理和段式内存管理
+
+
+ 答案:
+
+ 页式内存管理:将逻辑地址空间和物理地址空间分成同样大小的片,利用页表实现逻辑地址空间向物理地址空间的转换。
+
+ 段式内存管理:将逻辑地址空间进行分段,每段大小可变,利用段表实现逻辑地址空间向物理地址空间的转换。
+
+ 区别:分段直接对物理地址空间划分,可能会产生外部碎片和内部碎片,而分页技术同时对逻辑地址空间和物理地址空间进行划分,它只产生外部碎片;帧大小普遍小于段的大小,但是页表通常远远大于段表的大小,从而造成分页的地址转换开销比较大。
+
+
+
+ ***
+
+3. 哈希页表和反向页表
+
+
+ 答案:
+
+ 哈希页表:以虚拟页号为键,物理帧号为值建立哈希页表,发生碰撞的页表项以链表数据结构组织。
+
+ 反向页表:反向页表对每个物理内存帧才有一个条目,而且每个页表项按照物理内存帧号进行排序。
+
+ 区别:哈希页表针对某一个进程而建立的多级页表结构,而反向页表是针对整个操作系统而建立页表结构。
+
+
+
+ ***
+
+4. 最优置换和 LRU 置换
+
+
+ 答案:
+
+ 最优置换:按需调页时,置换最长时间不会使用的页。
+
+ LRU 置换:按需调页时,置换最长时间没有使用的页。
+
+ 区别:由于我们未知进程运行需要的页,最优置换算法难以实现,可以使用最长时间没有使用的页来近似最长时间不会使用的页。
+
+
+
+ ***
+
+5. 按需调页和交换
+
+
+ 答案:
+
+ 按需调页:进程执行过程中,在需要时才调入相应的物理页,这种技术称为按需调页,又称为懒惰交换。
+
+ 交换:把处于等待状态的进程从内存中移到二级存储,并释放该进程占用的内存空间,这一过程称为交换。
+
+ 区别:按需调页细粒度地实现进程中的某个或某些内存页和二级存储间的交换,而交换是整个进程的所占用内存空间与二级存储间的交换。
+
+
+
+***
+
+### 四、综合题(40 分)
+
+1. 简述缺页中断处理的详细过程(从发生缺页中断开始至页面调度结束),并指明每个步骤中,处理所处的上下文环境和模式。(10 分)
+
+
+ 答案:
+
+ How does OS handle a Page Fault?:
+
+ 1. Choose an old page to replace in terms of a page-replacement algorithm
+
+ 2. If old page modified(“D=1”), write contents back to disk
+
+ 3. Change its PTE and any cached TLB to be invalid
+
+ 4. Load new page into memory from disk
+
+ 5. Update page table entry, validate TLB for new entry
+
+ 6. Continue thread from the new location via accessing the page table
+
+
+
+ ***
+
+2. 一个 32 位的操作系统,内存大小为 $2\ \text{GB}$,采用分页技术进行内存分配,如果每页的大小为 $4\ \text{KB}$:(10 分)
+
+ a) 请说明各需多少位表示虚拟地址、物理地址、虚拟页号、物理帧号和偏移量(5 分)?
+
+
+ 答案:
+
+ VA: 32, PA: 31, pages: 20,# frames: 19,offset: 12
+
+
+
+ b) 如果某进程的页表如下,请在内存中定位下列虚拟地址的物理地址:3187, 7745, 11084, 14267, 18443(5 分)。
+
+ | PageID | FrameID |
+ | --- | --- |
+ | 0 | 4 |
+ | 1 | 2 |
+ | 2 | 5 |
+ | 3 | 3 |
+
+
+ 答案:
+
+ 3187 -> 19571, 7745 -> 11841,
+
+ 11084 -> 23372, 14267 -> 14267
+
+ 18843 超出了页表长度,非法内存访问
+
+ :::tip
+ 题目中为 18443,参考答案写作 18843;此处按参考答案保留。
+ :::
+
+
+
+ ***
+
+3. 采用按需调页(demand paging),现有 3 个页框,分别存储着页面号 2,3,4 三个页面。已知接下来的页面访问顺序为 1,2,3,4,1,2,5,1,2,3,4,5。使用时钟算法(clock algorithm)作为页面替换算法。(10 分)
+
+ a) 请计算会发生的缺页次数(假设初始时在页框内的页面的引用位(reference bit)都是 1,2/3/4 三个页面按序存放,初始时指针指向页面 2)?(7 分)
+
+
+ 答案:
+
+ 9 次缺页
+
+
+
+ b) 请写出这一内存访问序列所对应的时间段中的工作集(3 分)
+
+
+ 答案:
+
+ {1,2,3,4,5}
+
+
+
+ ***
+
+4. 现有两个进程 P1 和 P2,当前的页面访问序列分别为:
+
+ P1: 1, 2, 3, 4, 1, 2, 5
+
+ P2: 6, 7, 8, 6, 7, 6, 7
+
+ 这两个进程总共可有 5 个页框可供使用。假设使用 LRU 替换策略,页框分配采用固定分配(即分配后不可修改),请问如何在两个进程间分配页框可以达到缺页率最低?
+
+ a) 请分别写出两个进程的替换序列,并计算总的缺页次数(6 分)。
+
+
+ 答案:
+
+ 2, 3 (10 次缺页)(1+4 也是 10 次,也算正确,答案不唯一)
+
+ 1, 1, 3, 4, 1, 2, 5
+
+ 2, 2, 3, 4, 1, 2
+
+
+
+ 6, 6, 6, 6, 6, 6, 6
+
+ 7, 7, 7, 7, 7, 7
+
+ 8, 8, 8, 8, 8
+
+
+
+ b) 并证明这种帧分配对于给定的内存访问序列是最优的(4 分)。
+
+
+ 答案:
+
+ 证明:
+
+ a. 给 P2 更多页面不会减少 P2 的缺页率;
+
+ b. 给 P1 3 个页面不会减少 P1 的缺页率,但是会增加 P2 的缺页率;
+
+ c. 给 P1 4 个页面,P1 的缺页次数为 5,但是 P2 的缺页次数为 7。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203.md"
new file mode 100644
index 0000000..8a050e1
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203.md"
@@ -0,0 +1,732 @@
+---
+title: 2016-2017学年上学期月考
+---
+
+## 2016-2017学年上学期月考试卷(含答案)
+
+### 说明
+
+- 日期:2016.10
+- 原卷标题:华东师范大学软件学院月考试卷(2016—2017学年第一学期)
+
+### 一、判断题(15 分,每小题 3 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 线程都保存有各自的栈信息、CPU 状态(寄存器、指令计数器等)、堆信息,以及打开文件列表等。
+
+
+ 答案:
+
+ 错。线程保存栈信息、CPU 状态;而堆信息,以及打开文件列表等是进程保存的。
+
+ (线程实现了资源和调度单位相分离)
+
+
+
+ ***
+
+2. 向操作系统传递参数只能通过寄存器实现。
+
+
+ 答案:
+
+ 错。还可以通过堆栈传递等
+
+
+
+ ***
+
+3. 在微内核结构的操作系统中,进程间通讯可以不在微内核内。
+
+
+ 答案:
+
+ 错。进程通讯是内核的核心功能,对微内核系统,也在微内核内实现。
+
+
+
+ ***
+
+4. 对于内核支持的线程,当该线程执行系统调用被阻塞时,不仅该线程被阻塞,而且同一进程内的所有线程都会被阻塞。
+
+
+ 答案:
+
+ 错。只有当前进程被阻塞,其它进程可以继续执行。
+
+
+
+ ***
+
+5. 当前运行进程发生缺页中断,进程将进入 Ready 队列
+
+
+ 答案:
+
+ 错。进入 waiting 队列。
+
+
+
+***
+
+### 二、不定项选择题(15 分,每小题 3 分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 以下哪些(个)操作会使得一个进程从运行(running)状态转换为就绪(ready)状态( )
+
+ A. 在可占先(preemptive)系统中,高优先级进程被创建
+
+ B. 分时系统中,时间片到
+
+ C. 当前运行进程发生缺页中断
+
+ D. 当前运行进程调用 yield( ),主动放弃使用 CPU
+
+
+ 答案:
+
+ ABD
+
+
+
+ ***
+
+2. 当从“新建(new)”状态进入“就绪(ready)”状态的进程增多时,下面哪种情况不会发生( )
+
+ A. I/O 操作的频度升高;
+
+ B. CPU 利用率下降
+
+ C. CPU 利用率上升
+
+ D. 进程的平均响应时间减少
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+3. 以下描述正确的是( )
+
+ A. 中断处理程序(interrupt handler)是进程的一部分,在进程的地址空间运行
+
+ B. 中断处理程序(interrupt handler)必须运行在内核态
+
+ C. 微内核体系结构下,进程间通讯(inter-processing communication)必须在微内核内
+
+ D. 分时(time sharing)的目的是提高 CPU 和 I/O 的并行度
+
+
+ 答案:
+
+ BC
+
+
+
+ ***
+
+4. 以下哪些(个)对于微内核操作系统的描述是正确的?( )
+
+ A. Microsoft Windows 是微内核操作系统,但 Linux 不是;
+
+ B. 进程间通信必须在微内核内实现;
+
+ C. 因为用户进程不应访问页表,因此虚存应该在微内核内实现;
+
+ D. 操作系统设计时采用微内核结构可以提高操作系统执行的效率。
+
+
+ 答案:
+
+ B
+
+ 宏内核(模块化内核)结构的例子:传统的 UNIX 内核,BSD 伯克利大学发行的版本;Linux 内核;MS-DOS,Windows 9x(Windows 95,98,Me);
+
+ 混合内核:Windows NT、Windows 2000、Windows XP、Windows Server 2003 以及 Windows Vista 和 Windows 7 等基于 NT 技术的微软视窗操作系统。
+
+
+
+ ***
+
+5. 以下对于线程的描述哪些(个)是错误的( )
+
+ A. 一个用户态线程的阻塞(block)会引起它所属的整个进程(包括其中的其它线程)的阻塞;
+
+ B. 同一个进程的不同线程可以共享地址空间中的堆;
+
+ C. 线程间通信必须通过内核态系统调用进行;
+
+ D. 同一个进程的不同线程必须维护各自的调用栈和 CPU 状态。
+
+
+ 答案:
+
+ C
+
+
+
+***
+
+### 三、辨析题(30 分,每小题 6 分)
+
+分别解释以下每组的两个名词,并列举他们的区别。
+
+1. 分时(time-sharing)与多道程序(multi-programming)
+
+
+ 答案:
+
+ 分时:将时间划分成时间片,进程按时间片轮流执行
+
+ 多道:系统中存在多个程序同时执行
+
+ 区别:分时主要针对提高系统的响应速度,改善用户体验;多道主要针对增加系统的利用率。
+
+
+
+ ***
+
+2. 长程调度(long-term scheduling)与中程调度(mid-term scheduling)
+
+
+ 答案:
+
+ 长程调度:操作系统决定到底有多少进程能够从“new”状态进入就绪状态的调度
+
+ 中程调度:操作系统决定哪些进程的地址空间能够保留在内存中,哪些进程的地址空间需要被交换到外存的调度
+
+ 区别:长程调度被用于平衡系统资源利用率与并发进程个数;中程调度被用于控制运行与就绪进程有足够的内存、较低的缺页率能够运行。
+
+
+
+ ***
+
+3. 网络操作系统和分布式操作系统
+
+
+ 答案:
+
+ 网络操作系统:支持网络的操作系统
+
+ 分布式操作系统:可管理分布式系统的操作系统
+
+ 区别:采用分布式操作系统,分布的计算机对于用户是透明的。
+
+
+
+ ***
+
+4. 微内核和模块化内核
+
+
+ 答案:
+
+ 微内核:操作系统内核只包含最基本的功能(进程调度和进程间通讯)
+
+ 模块化内核:操作系统内核的一些功能可以作为模块挂载
+
+ 区别:微内核中内核和其它操作系统的功能模块(如虚存管理)在不同的地址空间运行,模块化内核中它们在一个地址空间。
+
+
+
+ ***
+
+5. 核心态和用户态
+
+
+ 答案:
+
+ 核心态:操作系统内核执行的受保护的状态
+
+ 用户态:用户进程执行所在的状态
+
+ 区别:处于用户态只能访问进程的地址空间,用户态需要通过中断或系统调用才能进入核心态。
+
+
+
+***
+
+### 四、综合题(40 分)
+
+1. 请简要说明你对以下图的理解。(5 分)
+
+ 
+
+
+ 答案:
+
+ 操作系统工作过程是被中断驱动的,An operating system is interrupt driven。
+
+ CPU 在用户程序处理过程中,遇到中断请求后,要进行中断处理。
+
+ 进程从用户程序执行状态转换到中断处理状态之间要进行上下文的保护。因此在 Transfer done 以后,CPU 保护上下文的信息后对中断进行响应。
+
+ I/O 设备和 CPU 并行工作。在 I/O 请求后,设备进行数据 Transfer 时,CPU 在同时工作。
+
+
+
+ ***
+
+2. 调度队列有哪几种?请简单说明(5 分)
+
+
+ 答案:
+
+ Ready 队列。已经调入内存在 Ready 状态等待执行的进程队列。
+
+ I/O 队列。在特定的 I/O 设备资源上等待资源的出现的队列。每个 I/O 设备都有一个相应的队列。
+
+ job 队列。Job queue -- set of all processes in the system
+
+
+
+ ***
+
+3. 进程创建时(如在类 UNIX 操作系统中,连续执行 fork() 和 exec() 系统调用),操作系统所需要进行那些工作,它们的代价如何(大,中,小)。为什么线程创建比进程快,它主要节省了以上哪个步骤的代价?(10 分)
+
+
+ 答案:
+
+ a. 构造 PCB,代价小
+
+ b. 设置地址空间映射,代价中
+
+ c. 复制父进程地址空间内容,代价大
+
+ d. 复制 I/O 状态,代价中
+
+ (2)为什么线程创建比进程快,它主要节省了以上哪个步骤的代价?(4 分)
+
+ 答:同一进程的不同线程共享资源,因此以上 b, c, d 三项代价几乎都可节省
+
+
+
+ ***
+
+4. 请详细描述一个用户态线程调用 sleep() 系统调用后,操作系统所执行的任务。(8 分)
+
+
+ 答案:
+
+ 1. 系统调用过程:mode-switch, 查表(syscall handling), 执行系统调用代码。
+
+ 2. sleep() 将当前进程放入 waiting 队列(设置 alarm)
+
+ 3. CPU 调度(context switch)
+
+ 4. 系统调用结束,返回,mode-switch
+
+
+
+ ***
+
+5. 请给出以下图中操作系统进程状态的概念和状态之间转换的一个例子(12 分)。
+
+ 
+
+
+ 答案:
+
+ 参考答案:(进程状态的概念略)
+
+ (1): new-->ready:从 shell 启动程序或者 fork 进程
+
+ (2): running->ready:高优先级程序运行,时间片到,...
+
+ (3): ready-->running:时间片到,前一进程结束/等待...
+
+ (4): running-->terminated:exit
+
+ (5): running-->waiting:等待 i/o、信号量 P 操作...
+
+ (6): waiting-->ready:i/o 结束、获得信号量,...
+
+ (7): waiting-->suspended:虚存时,内存不够
+
+ (8): suspended-->ready:得到 i/o 结束、获得信号量,...
+
+
+
+***
+
+## 2016-2017学年上学期月考试卷(三)(含答案)
+
+### 说明
+
+- 日期:2016.12
+- 原卷标题:华东师范大学软件学院月考试卷(三)(2014—2015学年第二学期),但卷内老师的批注为16年11月,因此标题为误标
+
+### 一、判断题(15 分,每小题 3 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 发生缺页中断的进程将从运行态转换为等待态。
+
+
+ 答案:
+
+ 对。
+
+
+
+ ***
+
+2. 段页式内存分配方案可以同时避免产生外部碎片和内部碎片。
+
+
+ 答案:
+
+ 错,段页式分配仍然也可能会产生内部碎片。
+
+
+
+ ***
+
+3. Belady 异常是指过多缺页导致 Swap in,swap out 增多,即 I/O 操作增多,从而引起 CPU 利用率下降,导致操作系统增加更多的用户进程进入系统,反过来导致更多缺页的现象。
+
+
+ 答案:
+
+ 错,以上是 Thrashing(颠簸,抖动);Belady 异常是指“分配页框越多,缺页率反而越高”。
+
+
+
+ ***
+
+4. 虚拟内存的容量只受计算机系统地址位数的限制。
+
+
+ 答案:
+
+ 错,还受限于物理内存和磁盘的大小。
+
+
+
+ ***
+
+5. 基于转换表缓冲区(TLB)的数据访问最多只需要两次内存访问。
+
+
+ 答案:
+
+ 错,最多几次内存访问取决于分页策略,段页式、散列页表或者多级页表可能需要多于两次内存访问。
+
+
+
+***
+
+### 二、单项选择题(15 分,每小题 3 分)
+
+1. 虚拟存储的基础是程序局部性理论,它的基本含义是( )。
+
+ A. 代码的顺序执行
+
+ B. 程序执行时对内存访问的不均匀性
+
+ C. 变量的连续访问
+
+ D. 指令的局部性
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 采用分段式存储管理的系统中,若地址用 32 位表示,其中 12 位表示段号,则允许每段的最大长度是:
+
+ A. 12
+
+ B. 20
+
+ C. $2^{12}$
+
+ D. $2^{20}$
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+3. 使用段页式内存管理,段表和页表都存放在主存中,所有要访问的页面都在主存中。页表项可以缓存在转换表缓冲区(TLB)中。一次内存访问的代价为 $100\ \text{ns}$,一次 TLB 访问代价为 $10\ \text{ns}$。假设 TLB 的命中率为 50%,请问进程对内存的有效访问时间(effective access time)是:
+
+ A. $110\ \text{ns}$
+
+ B. $210\ \text{ns}$
+
+ C. $160\ \text{ns}$
+
+ D. $320\ \text{ns}$
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. 某作业访问页面的顺序为 2, 3, 2, 1, 5, 2, 4, 5, 3, 2, 5, 2,分配给该作业三个框,则采用 LRU 页面置换算法会产生几次缺页中断?
+
+ A. 5
+
+ B. 6
+
+ C. 7
+
+ D. 8
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 以下对于按需调页的页面替换算法的描述,正确的是:
+
+ A. 在缺页率上,最优调页必然优于(或相当于)LRU 算法;
+
+ B. 先进先出(FIFO)算法必然会导致页框越多,缺页率越高;
+
+ C. LRU 算法在替换页面查找效率上优于 FIFO 算法;
+
+ D. 以上皆错。
+
+
+ 答案:
+
+ A
+
+
+
+***
+
+### 三、辨析题(30 分,每小题 6 分)
+
+分别解释以下每组的两个名词,并列举他们的区别。
+
+1. 逻辑地址与物理地址
+
+
+ 答案:
+
+ 逻辑地址:又称为虚拟地址,由程序产生的与段相关的偏移地址部分;
+
+ 物理地址:出现在 CPU 外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址;
+
+ 区别:物理地址通常是唯一的,而逻辑地址与物理地址可以是多对一的关系;而且用户程序通常只能操作逻辑地址,通过操作系统提供的保护机制,物理地址对用户程序是透明的。
+
+
+
+ ***
+
+2. Valid/invalid bit 与 dirty bit.
+
+ ***
+
+3. 动态加载 vs 动态链接
+
+
+ 答案:
+
+ 动态加载:P280. 例程仅在被调用时加载。未被使用的例程不会被加载。
+
+ 动态链接:P281. 程序仅在被调用时链接。被链接的程序一般是系统库函数。
+
+ 区别。P282
+
+
+
+ ***
+
+4. 页表和转换表缓冲区(TLB)
+
+
+ 答案:
+
+ 页表:在分页的内存管理策略中,页表实现了逻辑地址向物理地址的转换,通常保持在内存中;
+
+ 转换表缓冲区:它是一段小且专用的快速硬件缓冲,其中保持了页表中的一部分条目。
+
+ 区别:转换表缓冲区的访问速度远快于内存访问,因此比页表访问具有更高的时间效率,但是由于缓冲区通常是很小的一部分空间,因此只能容纳页表中很少的一部分。
+
+
+
+ ***
+
+5. 最优置换策略和 LRU 置换策略
+
+
+ 答案:
+
+ 最优置换策略:按需调页时,置换最长时间不会使用的页。
+
+ LRU 置换策略:按需调页时,置换最长时间没有使用的页。
+
+ 区别:由于我们未知进程运行需要的页,最优置换算法难以实现,可以使用最长时间没有使用的页来近似最长时间不会使用的页。
+
+
+
+***
+
+### 四、综合题(40 分)
+
+1. 五个内存块大小依次为 $100\ \text{KB}$, $500\ \text{KB}$, $200\ \text{KB}$, $300\ \text{KB}$, $600\ \text{KB}$。分别用 first-fit, best-fit, 以及 worst-fit 算法处理 $212\ \text{KB}$, $417\ \text{KB}$, $112\ \text{KB}$, and $426\ \text{KB}$ (按序)的内存请求,请说明各算法的分配情况。对于当前情况,那种算法比较好?
+
+
+ 答案:
+
+ Answer:
+
+ (a) First-fit:
+
+ 212K is put in 500K partition
+
+ 417K is put in 600K partition
+
+ 112K is put in 288K partition (new partition 288K = 500K − 212K)
+
+ 426K must wait
+
+ (b) Best-fit:
+
+ 212K is put in 300K partition
+
+ 417K is put in 500K partition
+
+ 112K is put in 200K partition
+
+ 426K is put in 600K partition
+
+ (c) Worst-fit:
+
+ 212K is put in 600K partition
+
+ 417K is put in 500K partition
+
+ 112K is put in 388K partition
+
+ 426K must wait
+
+ In this example, best-fit turns out to be the best
+
+
+
+ ***
+
+2. (1)某系统段表如下,求以下逻辑地址的物理地址。(5 分)。
+
+ (a) 0, 0x430000;(b) 1, 0x10000;(c) 2, 0x500000;
+
+ (d) 3,0x400000; (e) 4, 0x112000
+
+ | 段号 | 基地址 | 长度 |
+ | --- | --- | --- |
+ | 0 | 0x219000 | 0x600000 |
+ | 1 | 0x2300000 | 0x14000 |
+ | 2 | 0x90000 | 0x100000 |
+ | 3 | 0x1327000 | 0x580000 |
+ | 4 | 0x1952000 | 0x96000 |
+
+
+ 答案:
+
+ a. 0x219000 + 0x430000 = 0x649000
+
+ b. 0x2300000 + 0x10000 = 0x2310000
+
+ c. illegal reference, trap to operating system
+
+ d. 0x1327000 + 0x400000 = 0x1727
+
+ e. illegal reference, trap to operating system
+
+
+
+ (2)某 32 位系统采用分页技术进行内存分配,页大小为 $4\ \text{KB}$。某进程的页表如下,请在内存中定位下列虚拟地址的物理地址:0x0c73, 0x1e41, 0x2b4c, 0x37bb, 0x580b(5 分)。
+
+ | 页号 | 框号 | i/v |
+ | --- | --- | --- |
+ | 0 | 4 | v |
+ | 1 | 2 | v |
+ | 2 | 5 | v |
+ | 3 | 3 | v |
+ | 4 | 8 | i |
+
+
+ 答案:
+
+ 0x0c73 --> 0x4c73
+
+ 0x1e41 --> 0x2e41
+
+ 0x2b4c --> 0x5b4c
+
+ 0x37bb --> 0x37bb
+
+ 0x480b --> 超出了页表长度,非法内存访问
+
+
+
+ ***
+
+3. 请解释多级页表、反向页表、散列页表(或叫“哈希”页表)的概念(可画图表示),并从地址翻译的效率、内存空间占用这连个角度,详细分析对于 64 位 CPU 的计算机,这三种技术各自的优缺点。(10 分)
+
+
+ 答案:
+
+ 略
+
+
+
+ ***
+
+4. (10 分)现有两个进程 P1 和 P2,当前的页面访问序列分别为:
+
+ P1: 1, 2, 3, 4, 1, 2, 5
+
+ P2: 6, 7, 8, 6, 7, 6, 7
+
+ 这两个进程总共可有 5 个页框可供使用。假设使用 LRU 替换策略,页框分配采用固定分配(即分配后不可修改),请问如何在两个进程间分配页框可以达到缺页率最低?请写出替换序列,和缺页率计算过程(4 分);并证明该分配对于给出的序列是最优的(6 分)。
+
+
+ 答案:
+
+ 2, 3 (10 次缺页)
+
+ 1, 1, 3, 4, 1, 2, 5
+
+ 2, 2, 3, 4, 1, 2
+
+
+
+ 6, 6, 6, 6, 6, 6, 6
+
+ 7, 7, 7, 7, 7, 7
+
+ 8, 8, 8, 8, 8
+
+ 证明:
+
+ 1. 给 P2 更多页面不会减少 P2 的缺页率;
+ 2. 给 P1 3 个页面不会减少 P1 的缺页率,但是会增加 P2 的缺页率;
+ 3. 给 P1 4 个页面,P1 的缺页次数为 5,但是 P2 的缺页次数为 7。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..a495934
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,429 @@
+---
+title: 2016-2017学年上学期期中
+---
+
+## 2016-2017学年上学期期中试卷(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学计算机科学与软件工程学院期中考试卷(2016—2017学年第一学期)
+
+### 一、判断题(30分,每小题3分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 如果信号量S的当前值为 -5 时,则表示系统中共有 5 个等待的进程。
+
+
+ 答案:
+
+ 错。S=-5表示当前有5个进程等待进入该信号量所对应的临界区。
+
+
+
+ ***
+
+2. 取值为0或者1的信号量只能实现互斥访问。
+
+
+ 答案:
+
+ 错。信号量可以实现互斥和同步。
+
+
+
+ ***
+
+3. 发生死锁时系统一定处于不安全状态。
+
+
+ 答案:
+
+ 对。发生死锁时找不到一个安全序列。
+
+
+
+ ***
+
+4. 资源分配图中存在环时,系统中某些进程处于死锁状态。
+
+
+ 答案:
+
+ 错。当每种资源实例个数为一时,在环中的每个进程处于死锁状态。但是当资源实例数量不唯一时,不一定处于死锁状态。
+
+
+
+ ***
+
+5. 如果一个进程只需要一个资源即可完成,那么这个进程一定不会处于死锁状态。
+
+
+ 答案:
+
+ 对。因为不满足死锁必要条件中的持有并等待。
+
+
+
+ ***
+
+6. 在多处理器系统中,通过关中断的方式可以解决进程间互斥访问的问题。
+
+
+ 答案:
+
+ 错。在多处理器系统中,关中断不能保重临界区的互斥访问。
+
+
+
+ ***
+
+7. 进程所请求打开的文件打开后,将使进程状态从运行态变为就绪态。
+
+
+ 答案:
+
+ 错。等待态变为就绪态。
+
+
+
+ ***
+
+8. 在生产者-消费者问题中,生产者进程和消费者进程只要解决互斥访问的问题即可。
+
+
+ 答案:
+
+ 错。当buffer为空时,只有等待生成者进程完成一个产品生成后,消费者才可以消费。因此,还要解决进程间同步的问题。
+
+
+
+ ***
+
+9. 死锁是指因进程间相互竞争资源,使得系统中有多个进程因得不到所需资源而处于阻塞的状态。
+
+
+ 答案:
+
+ 错。根据银行家算法,在当前时刻,无论有多少进程处于阻塞状态,只要找到一个安全序列说明整个系统处于安全状态,系统就不会出现死锁。
+
+
+
+ ***
+
+10. 管程中对条件变量的signal()和信号量中的signal()操作具有相同的效果。
+
+
+ 答案:
+
+ 错。管程中对条件变量的signal()可以什么都不做,而信号量中的signal()操作必然改变信号量的值。
+
+
+
+***
+
+### 二、多项选择题(15分,每小题3分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 以下哪种情况仍然可能会发生死锁?( )
+
+ A. 资源都是不共享的;
+
+ B. 每个进程必须一次申请、获得所需的所有资源
+
+ C. 空闲资源能够满足任意一个进程还需要的资源需求
+
+ D. 每一种资源的数量都超过单个进程所需这类资源的最大值
+
+
+ 答案:
+
+ AD
+
+
+
+ ***
+
+2. 对于死锁,以下哪些(个)描述是正确的:( )
+
+ A. 系统中每个进程都需要多个资源才能运行结束,则系统可能会处于死锁状态
+
+ B. 资源分配图中有环(以资源类型和进程为节点),必然发生死锁
+
+ C. 死锁避免(deadlock avoidance)中,发生死锁必然处于不安全状态
+
+ D. 如果每个进程可以分批申请所需的资源,如果不能满足其要求,则让其忙等,那么死锁不可能发生
+
+
+ 答案:
+
+ AC
+
+
+
+ ***
+
+3. 以下描述正确的是:( )
+
+ A. 中断处理程序(interrupt handler)是进程的一部分,在进程的地址空间中运行
+
+ B. 中断处理程序(interrupt handler)必须运行在内核态
+
+ C. 微内核体系结构下,进程间通讯(inter-processing communication)必须在微内核内
+
+ D. 分时(time sharing)的目的是改善用户体验
+
+
+ 答案:
+
+ BCD
+
+
+
+ ***
+
+4. 一个正在运行的进程,当所分配的时间片用完后,不可能将其挂在( )。
+
+ A.等待队列
+
+ B.运行队列
+
+ C.就绪队列
+
+ D.无法确定
+
+
+ 答案:
+
+ AB
+
+
+
+ ***
+
+5. 以下那个操作会使得一个进程从运行(running)状态转换为就绪(ready)状态:( )
+
+ A. 进程提交I/O请求
+
+ B. 分时系统中,时间片到
+
+ C. 当前运行进程发生缺页中断
+
+ D. 当前运行进程调用yield(),主动放弃使用CPU
+
+
+ 答案:
+
+ BD
+
+
+
+***
+
+### 三、辨析题(30分,每小题6分)
+
+分别解释以下每组的两个名词,并列举他们的区别。
+
+1. 死锁(deadlock)与饥饿(starvation)
+
+
+ 答案:
+
+ 死锁:多个进程循环等待对方,都无法继续执行
+
+ 饥饿:某个或某些进程由于无法得到资源长时间无法执行
+
+ 死锁必然发生饥饿,但是饥饿不一定发生死锁
+
+
+
+ ***
+
+2. P原语和V原语
+
+
+ 答案:
+
+ P原语为阻塞原语,负责把当前进程由运行状态转换为阻塞状态或者忙等状态,直到另外一个进程唤醒它或者跳出忙等。操作为:申请一个空闲资源,把信号量减1,若成功,则退出;若失败,则该进程被阻塞或忙等;
+
+ V原语为唤醒原语,负责把一个被阻塞的进程唤醒或者跳出忙等,在唤醒的机制中有一个参数表,存放着等待被唤醒的进程信息。操作为:释放一个被占用的资源,把信号量加1,如果发现有被阻塞的进程,则选择一个唤醒之;或者跳出忙等状态。
+
+ P原语和V原语是操作信号量的两个重要方法,它们对信号量施行相反的操作,但是在解决互斥和同步时又需要他们配合完成。
+
+
+
+ ***
+
+3. 不安全状态和死锁
+
+
+ 答案:
+
+ 不安全状态:指在当前的系统状态下,找不到一个安全序列使得当前所有的进程能够运行结束。
+
+ 死锁:多个进程循环等待对方,都无法继续执行
+
+ 区别:死锁一定处于不安全状态,但是不安全状态不一定死锁。
+
+
+
+ ***
+
+4. 进程调度和进程通讯
+
+
+ 答案:
+
+ 进程调度:是指协调、分配进程占用系统CPU资源的算法。
+
+ 进程通讯:是操作系统负责不同进程间共享内存、磁盘文件、打印机等硬件的方法。
+
+ 区别:进程调度只负责进程间CPU资源的共享,而进程间通讯主要负责非CPU资源的共享。
+
+
+
+ ***
+
+5. 线程与进程
+
+
+ 答案:
+
+ 线程:线程是轻量级的进程,是资源调度的最小单位。
+
+ 进程:是执行中的程序,是资源分配的最小单位。
+
+ 区别:从定义、调度、并发性、系统开销和拥有资源角度说明即可。
+
+
+
+***
+
+### 四、综合题(25分)
+
+1. (10分)假设生产者-消费者问题中,buffer大小为n。已知运用信号量解决该问题的代码如下。请将这段代码补充完整。
+
+
+ 答案:
+
+ ```c
+ Semaphore full = 0;
+ Semaphore empty = n;
+ Semaphore mutex = 1;
+
+ 生产者:
+ Producer () {
+ while (true) {
+ /* produce an item and put in nextProduced */
+ wait (empty);
+ wait (mutex);
+ buffer [in] = nextProduced;
+ in = (in + 1) % BUF_SIZE;
+ count ++;
+ signal (mutex);
+ signal (full);
+ }
+ }
+
+ 消费者:
+ Consumer () {
+ while (true) {
+ wait (full);
+ wait (mutex);
+ nextConsumed = buffer[out];
+ out = (out + 1) % BUF_SIZE;
+ count --;
+ signal (mutex);
+ signal (empty);
+ /* consume the item in nextConsumed */
+ }
+ }
+ ```
+
+
+
+ ***
+
+2. (8分)四个进程需要运行的时间(单位:毫秒)和到达顺序如下:
+
+ | 进程 | 需要CPU时间 | 优先级 |
+ | --- | --- | --- |
+ | P1 | 9 | 3 |
+ | P2 | 2 | 1 |
+ | P3 | 3 | 2 |
+ | P4 | 2 | 4 |
+
+ a) 请利用甘特图展示四个进程分别在FCFS、SJF、RR(时间片大小为1ms)和非抢占优先级(数值越小优先级越高)四种调度算法下的执行过程。
+
+ b) 请计算每个进程在a) 中提到的四种调度算法下的等待时间。
+
+ c) 请问a) 中哪种调度算法使得平均等待时间最少?
+
+
+ 答案:
+
+ a) 甘特图略
+
+ b)
+
+ | 进程 | FCFS | SJF | RR | 优先级调度 |
+ | --- | --- | --- | --- | --- |
+ | P1 | 0 | 7 | 6 | 5 |
+ | P2 | 9 | 0 | 4 | 0 |
+ | P3 | 11 | 4 | 7 | 2 |
+ | P4 | 14 | 2 | 6 | 14 |
+ | 平均 | 8.5 | 3.25 | 5.6 | 5.2 |
+
+ c) SJF 调度算法使得平均等待时间最少。
+
+
+
+ ***
+
+3. (7分)现有四个进程P0, P1, P2, P3,三类资源A, B, C,各有7、5、5个。最大资源需求和资源分配矩阵如图所示。
+
+ 
+
+ a) 请问当前系统可用资源数量和每个进程需要的资源数量分别是多少?(2分)
+
+ b) 请问:目前是否存在死锁?如果不存在死锁,请给出一个能够让所有进程执行完的序列(3分)
+
+ c) 假设此时又来一个进程P4,申请资源(2, 2, 0),请问如果把2个资源B的实例分配给P4,假设除已经获得和正在请求的资源外,所有进程不再请求其它资源,是否处于安全状态(为什么)?(2分)
+
+
+ 答案:
+
+ a) 答:可用资源数量为(0 2 0),need矩阵为
+
+ | 进程 | A | B | C |
+ | --- | --- | --- | --- |
+ | P0 | 0 | 0 | 0 |
+ | P1 | 2 | 0 | 2 |
+ | P2 | 0 | 0 | 0 |
+ | P3 | 1 | 0 | 0 |
+
+ b) 答:不存在死锁
+
+ | 进程 | A | B | C |
+ | --- | --- | --- | --- |
+ | P0 | 0 | 3 | 0 |
+ | P2 | 3 | 3 | 3 |
+ | P1 | 5 | 3 | 3 |
+ | P3 | 7 | 5 | 5 |
+
+ c) 答:安全
+
+ 此时可用资源向量为:0 0 0
+
+ | 进程 | A | B | C |
+ | --- | --- | --- | --- |
+ | P2 | 3 | 0 | 3 |
+ | P1 | 5 | 0 | 3 |
+ | P4 | 5 | 2 | 3 |
+ | P0 | 5 | 3 | 3 |
+ | P3 | 7 | 5 | 5 |
+
+ 仍然都能执行完.
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..21db5d7
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,541 @@
+---
+title: 2016-2017学年上学期期末
+---
+
+## 2016-2017学年上学期期末试卷(A)(含答案)
+
+### 一、单项选择题(每题 2 分,共 20 分)
+
+1. 操作系统的基本职能是( )
+
+ A. 提供用户界面,方便用户使用
+
+ B. 提供方便的可视化
+
+ C. 控制和管理系统内各种资源,有效地组织多道程序的运行
+
+ D. 提供功能强大的网络管理工具
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+2. 在操作系统中,进程的最基本特征是( )。
+
+ A. 动态性和并发性
+
+ B. 顺序性和可再现性
+
+ C. 与程序的对应性
+
+ D. 执行过程的封闭性
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+3. 当进程因时间片用完而让出处理机时,该进程应转变为( )状态。
+
+ A. 等待
+
+ B. 就绪
+
+ C. 运行
+
+ D. 完成
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. 运行的进程在信号量 $S$ 上做 P 操作后,当 $S<0$ 时,进程进入信号量的( )
+
+ A. 等待队列
+
+ B. 提交队列
+
+ C. 后备队列
+
+ D. 就绪队列
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+5. 在有 $n$ 个进程共享一个互斥段,如果最多允许 $m$ 个进程($m
+ 答案:
+
+ A
+
+
+
+ ***
+
+6. 在可变分区存储管理中,最优适应分配算法要求对空闲区表项按( )进行排列。
+
+ A. 地址从大到小
+
+ B. 地址从小到大
+
+ C. 尺寸从小到大
+
+ D. 尺寸从大到小
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+7. 解决“碎片”问题最好的存储管理方法是( )
+
+ A. 页面存储管理
+
+ B. 段式存储管理
+
+ C. 多重分区管理
+
+ D. 可变分区管理
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+8. 在以下的文件物理存储组织形式中,( )常用于存放大型的系统文件。
+
+ A. 连续文件
+
+ B. 串连文件
+
+ C. 索引文件
+
+ D. 多重索引文件
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+9. 当每类资源只有一个个体时,下列说法中不正确的是( )。
+
+ A. 有环必死锁
+
+ B. 死锁必有环
+
+ C. 有环不一定死锁
+
+ D. 被锁者一定全在环中
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+10. 为了允许不同用户的文件具有相同的文件名,通常在文件系统中采用( )。
+
+ A. 重名翻译
+
+ B. 多级目录
+
+ C. 约定
+
+ D. 文件名
+
+
+ 答案:
+
+ B
+
+
+
+***
+
+### 二、填空题(每题 2 分,共 10 分)
+
+1. 通常,线程的定义是 $\underline{\qquad}$。在现代操作系统中,资源的分配单位是 $\underline{\qquad}$,而处理机的调度单位是 $\underline{\qquad}$。
+
+
+ 答案:
+
+ 进程中可执行单元;进程;线程
+
+
+
+ ***
+
+2. 进程控制的功能是负责进程状态的变化,当执行了一条进程等待原语后,该进程的状态将由 $\underline{\qquad}$ 状态转变为 $\underline{\qquad}$ 状态。
+
+
+ 答案:
+
+ 运行;阻塞
+
+
+
+ ***
+
+3. 磁盘访问时间包含:$\underline{\qquad}$、$\underline{\qquad}$、和 $\underline{\qquad}$。
+
+
+ 答案:
+
+ 寻道时间、旋转延迟时间、存取时间
+
+
+
+ ***
+
+4. 死锁的四个必要条件是 $\underline{\qquad}$,$\underline{\qquad}$,$\underline{\qquad}$、$\underline{\qquad}$。
+
+
+ 答案:
+
+ 持有并等待,互斥操作,不可抢夺资源、循环等待资源。
+
+
+
+ ***
+
+5. 在段页式存储管理中,用 $\underline{\qquad}$ 方法来管理逻辑存储空间,用 $\underline{\qquad}$ 方法来管理物理存储空间。
+
+
+ 答案:
+
+ 段式;页式
+
+
+
+***
+
+### 三、判断题(每小题 2 分,共 20 分)
+
+1. 采用多道程序设计的系统中,系统的程序道数越多,系统的效率就越高。( )
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+2. 采用资源静态分配算法可以预防死锁的发生。( )
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+3. 一个作业由若干作业步组成,在多道程序系统中这些作业步可以并发执行。( )
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+4. 分段存储管理的特点是按逻辑关系将作业划分为若干段,以段为单位装入内存。( )
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+5. 磁盘调度的目标是使磁盘旋转周数最少。( )
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+6. 作业调度是处理机的高级调度,进程调度是处理机的低级调度。( )
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+7. 并发是并行的不同表述,其原理是相同的。( )
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+8. 临界区是指进程中用于实现进程互斥的那段代码。( )
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+9. 在内存的可变分区管理中,最佳配置算法的性能最好,所以现代操作系统中多采用该算法。( )。
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+10. LRU 算法可能会导致 Belady 异常。( )
+
+
+ 答案:
+
+ ×
+
+
+
+***
+
+### 四、简答题(每小题 5 分,共 20 分)
+
+1. 什么是进程?什么是线程?简述线程与进程间的区别。
+
+
+ 答案:
+
+ 线程:也叫轻量级的进程,它是一个基于进程的运行单位,它可以不占有资源,一个进程可以有一个线程或者多个线程(至少一个),这些线程共享此进程的代码、Data 和部分管理信息,但是每个线程都有它自己的 PC、Stack 和其他。
+
+ 线程与进程的区别主要表现在以下几个方面:
+
+ (1)地址空间和资源不同:进程间相互独立;同一进程的各个线程之间却共享它们。
+
+ (2)通信不同:进程间可以使用 IPC 通信,线程之间可以直接读写进程数据段来进行通信;但是需要进程同步和互斥手段的辅助,以保证数据的一致性。
+
+ (3)调度和切换不同:线程上下文切换比进程上下文的切换要快得多。
+
+
+
+ ***
+
+2. 请画出进程的三个基本状态的转换图,并举例说明引起进程状态之间变迁的原因。
+
+
+ 答案:
+
+ 状态转换图如下:
+
+ 
+
+ 1)就绪到执行:处于就绪状态的进程,在调度程序为之分配了处理器之后,该进程就进入执行状态。
+
+ 2)执行到就绪:正在执行的进程,如果分配给它的时间片用完,则暂停执行,该进程就由执行状态转变为就绪状态。
+
+ 3)执行到阻塞:如果正在执行的进程因为发生某事件(例如:请求 I/O,申请缓冲空间等)而使进程的执行受阻,则该进程将停止执行,由执行状态转变为阻塞状态。
+
+ 4)阻塞到就绪:处于阻塞状态的进程,如果引起其阻塞的事件发生了,则该进程将解除阻塞状态而进入就绪状态。
+
+
+
+ ***
+
+3. 请简单比较分页和分段存储管理方式的区别。
+
+
+ 答案:
+
+ (1)页是信息的物理单位,段则是信息的逻辑单位。
+
+ (2)页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
+
+ (3)分页的作业地址空间是一维的,即单一的线性地址空间,而分段的作业地址空间则是二维的。
+
+
+
+ ***
+
+4. 请比较 Valid/invalid bit 与 dirty bit 的不同。
+
+
+ 答案:
+
+ Valid/ invalid bit 是页表项中指示页表项是否在内存中的标识位,如果是 valid 表示页表项在内存中,否则该页表项被换出到磁盘上;
+
+ Dirty bit 是页表项中指示页表项是否被修改,如果 dirty bit 为 1 表示页表项被修改,在该页表项被页面算法选中换出到磁盘时,需要先将该页表项的内容刷到磁盘上,再将该页面放入虚存中,否则直接换出到虚存中。
+
+
+
+***
+
+### 五、问答题(每题 10 分,共 30 分)
+
+1. 有一个桥如图所示,桥上的车流如箭头所示。桥上不允许两车交会,但允许同方向多辆车依次通行(即桥上可以有多个同方向的车)。请用 P、V 操作实现交通管理以防止桥上拥塞的程序。
+
+ 
+
+
+ 答案:
+
+ 由于桥上不允许两车相会,故桥应该被互斥访问,而同一方向上允许多辆车依次通过,即临界区允许多个实例访问。用一个信号量来互斥访问临界区。由于不能允许某一个方向的车完全“控制”桥,应保证最多某一个方向上连续通过一定数量的车后,必须让另外一个方向的车通过。用另外两个信号量来实现这个。
+
+ 故:
+
+ 设 smutex 用来控制从南向北车辆数量 s 的互斥信号量
+
+ nmutex 用来控制从南向北车辆数量 n 的互斥信号量
+
+ wait 用来控制会车的互斥访问
+
+ ```text
+ semaphore smutex = 1;
+ semaphore nmutex = 1;
+ semaphore wait = 1;
+ int s = 0;
+ int n = 0;
+
+ main(){
+ begin
+ south();
+ north();
+ end
+ }
+
+ south(){
+ P(smutex);
+ if s = 0 then P(wait);
+ s++;
+ V(smutex);
+ pass the bridge;
+ P(smutex);
+ s--;
+ if s = 0 then V(wait);
+ V(smutex);
+ }
+
+ north(){
+ P(nmutex);
+ if n = 0 then P(wait);
+ n++;
+ V(nmutex);
+ pass the bridge;
+ P(nmutex);
+ n--;
+ if n = 0 then V(wait);
+ V(nmutex);
+ }
+ ```
+
+
+
+ ***
+
+2. 某计算机系统主存采用请求分页管理技术,主存容量为 $1\ \text{MB}$,被划分为 256 块,每块大小为 $4\ \text{KB}$。假设某个作业共有 5 个页面,其中 0,1,2 三个页面已分别装入到主存 4,9,11 三个物理块中,另外两个页面没有装入主存。该作业的页面变换表(PMT)如下表所示。表中的状态为 0 表示页面已经装入到内存中,为 1 表示没有装入内存。
+
+ | 页号 | 块号 | 状态 |
+ | --- | --- | --- |
+ | 0 | 4 | 0 |
+ | 1 | 9 | 0 |
+ | 2 | 11 | 0 |
+ | 3 | - | 1 |
+ | 4 | - | 1 |
+
+ 问题:
+
+ ① 若给定一个逻辑地址为 9016,其物理地址是多少?给出其物理地址的计算过程。
+
+
+ 答案:
+
+ 在请求分页的存储管理系统中,系统是通过查页表来进行地址转换的。对于本题中采用的页面大小为 $4\ \text{KB}$,即页内相对地址为 12 位。首先从虚拟地址中分离出页号和页内地址。$[9016/4096]=2$,所以页号为 2,页内地址为 824。查页表知道 2 号页对应的物理块号为 11,即物理地址为:$11*4096=45056$,再加上页内地址后其真正的物理地址为:45880。
+
+
+
+ ② 若给定一个逻辑地址为 12388,其物理地址是多少?地址变换过程中会出现什么问题?
+
+
+ 答案:
+
+ $[12388/4096]=3$,所以页号为 3,页内地址为 100。查页表可知 3 号页状态为 1,说明该页尚未装入内存,地址变换过程中会发生缺页中断,不能直接得到物理地址。
+
+
+
+ ***
+
+3. 在分页虚拟存储管理系统中,假定系统为某个进程分配了 4 个页帧,页的访问顺序为 7,1,2,0,3,0,4,2,3,0,3,2,7,0,1,若采用 FIFO 调度算法、OPT、LRU 调度算法时,分别产生多少次缺页中断?写出过程.
+
+
+ 答案:
+
+ 答案:都是 8 次缺页中断
+
+ 
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203.md"
new file mode 100644
index 0000000..eb9c5d5
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203.md"
@@ -0,0 +1,381 @@
+---
+title: 2017-2018学年上学期月考
+---
+
+## 2017-2018学年上学期月考试卷(含答案)
+
+### 说明
+
+- 日期:2017.12
+
+### 一、判断题(30 分,每小题 3 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 在页式存储管理中,用户应将自己的程序划分成若干相等的页。
+
+
+ 答案:
+
+ 错。不是将用户程序分成相等的页,是将物理空间分成若干相等的页。
+
+ 【陈闻杰】我认为理由应该是:分页是系统分的而不是用户自己分的。(用户(逻辑、虚拟)空间分成页的说法也可以,物理空间分成 frame(框或帧,或叫物理页))
+
+
+
+ ***
+
+2. 快表 TLB 采用了哈希散列的方式,将物理帧号与逻辑页号相连,实现页表的快速查找。
+
+
+ 答案:
+
+ 错,本质上是使用关联存储技术。
+
+
+
+ ***
+
+3. 操作系统的所有程序都必须常驻内存。
+
+
+ 答案:
+
+ 错。只有 kernel 部分常驻内存。
+
+
+
+ ***
+
+4. 在段式存储管理中,段的大小是根据用户程序的模块进行划分的,将内存区域划分为长度不相等的区域。
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+5. 页式存储分配,会产生内碎片,而无外碎片,段式存储管理中,则只有外碎片。
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+6. 段式存储中,可以使用段表中的标识位,实现地址保护。而在分页环境下,无法实现地址保护
+
+
+ 答案:
+
+ 错。在分页环境下的内存保护由关联到每个帧的保护位完成。这些位通常保存在页表中。一个位可以定义一个页是读写还是只读属性。可以检查保护位来确定有没有对一个只读页进行写操作。
+
+
+
+ ***
+
+7. 动态重定位技术,使得程序占用的内存空间动态可变,不必连续存放在一处。
+
+
+ 答案:
+
+ 对。
+
+
+
+ ***
+
+8. 采用反向页表的系统,整个系统只有一个页表。
+
+
+ 答案:
+
+ 对。
+
+
+
+ ***
+
+9. 逻辑地址空间是由 CPU 生成的,也被称为虚拟地址,而物理地址是指内存存储单元所管理的内容。
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+10. MMU 存储管理单元的主要任务是实现将逻辑地址映射为物理地址,实现了动态重定位。
+
+
+ 答案:
+
+ 对
+
+
+
+***
+
+### 二、不定项选择题(15 分,每空 3 分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 使用段页式内存管理,段表和页表都存放在主存中,所有要访问的页面都在主存中。页表项可以缓存在转换表缓冲区(TLB)中。一次内存访问的代价为 $120\ \text{ns}$,一次 TLB 访问代价为 $8\ \text{ns}$。假设 TLB 的命中率为 50%,请问进程对内存的有效访问时间(effective access time)是( )
+
+ A. $248\ \text{ns}$
+
+ B. $260\ \text{ns}$
+
+ C. $180\ \text{ns}$
+
+ D. $308\ \text{ns}$
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+2. 一个 32 位物理地址的计算机系统,如果采用页式存储管理方式,一个页的大小为 $4\ \text{K}$,程序代码及数据均采用按字节编址,那么在页内进行寻址需要( )位物理地址。
+
+ A. 2
+
+ B. 12
+
+ C. 8
+
+ D. 1
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+3. 上题中,该计算机的物理内存容量为( )
+
+ A. 2G
+
+ B. 4G
+
+ C. 1M
+
+ D. 1G
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. 在利用资源分配图进行单实例的资源分配时,下图所示的状态为( )。
+
+ 
+
+ 图 1 资源分配图
+
+ A. 安全状态
+
+ B. 不安全状态
+
+ C. 死锁状态
+
+ D. 不能确定
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 利用多级反馈队列进行调度时,以下描述正确的是( )
+
+ A. 如果一个进程需要使用过多的 CPU 时间,那么它可能在调度过程中被移到更低级的优先级队列中
+
+ B. 任何一个进程在进入待调度的队列等待时,首先进入优先级最高的队列
+
+ C. 一般情况下,各个队列的时间片是随着优先级的增加而减少的
+
+ D. 多级反馈队列调度算法不能使大作业得到及时响应
+
+
+ 答案:
+
+ A B C
+
+
+
+***
+
+### 三、简单回答以下问题(15 分,每小题 5 分)
+
+1. 请说明段页式存储管理和分段存储管理的区别,要求从原理、地址变换和优缺点进行比较。
+
+
+ 答案:
+
+ (1)原理及地址变换
+
+ 段页式存储管理是将用户程序分成若干个段,并为每一个段赋予一个段名;再把每个段分成若干个页。在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段表长。进行地址变换时,首先利用段号 S,将它与段表长 TL 进行比较。若 S
+
+ ***
+
+2. 安全状态、不安全状态和死锁的区别和联系。
+
+
+ 答案:
+
+ 安全状态:如果存在一个序列,其对所有进程分配资源,以便完成其对应的任务,并且确保系统不会有死锁发生,这个系统则是处于安全状态。
+
+ (安全状态:指系统能按某种进程顺序(P1, P2, ...,Pn)(称〈P1, P2, ..., Pn〉序列为安全序列)来为每个进程 Pi 分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成)
+
+ 不安全状态:如果系统无法找到这样一个安全序列,其对所有进程分配资源,以便完成其对应的任务。
+
+ 死锁:是一种进程之间的僵持状态,一些进程中每个持有一定数量的资源,同时他们又同时请求等待另一些被占有的资源。
+
+ 关系:对进程分配单实例资源时,利用资源分配图来判断,如果是安全状态,一定不会产生死锁,予以分配资源,如果是不安全状态,会导致死锁发生,不能进行该次资源请求的分配。
+
+
+
+ ***
+
+3. API 与系统调用的区别和联系。
+
+
+ 答案:
+
+ API 是函数的定义,规定了这个函数的功能,跟内核无直接关系。API 是一个提供给应用程序的接口函数,供与程序员直接使用的。
+
+ 系统调用是通过中断向内核发请求,实现内核提供的某些服务。系统调用则不与程序员进行交互的,它根据 API 函数要求,通过一个软中断机制向内核提交请求,以获取内核服务的接口。
+
+ API 需要一个或多个系统调用来完成特定功能。并不是所有的 API 函数都和系统调用一一对应;有时,一个 API 函数会需要几个系统调用来共同完成其功能。
+
+
+
+***
+
+### 四、综合题(40 分)
+
+1. 假设有三个进程 A,B 和 C。A 和 B 只使用 CPU,各需要 800 毫秒,进程 C 使用 10 毫秒 CPU 然后进行 90 毫秒 I/O,然后再使用 100 毫秒 CPU 接着 100 毫秒 I/O,按照这样的规律进行下去, 总共进行 900 毫秒。假设三个进程的到达次序是 ABC,同时到达。
+
+ (1)请计算使用 FIFO 调度,三个进程的平均等待时间和平均周转时间(10 分)。
+
+ (2)请计算使用 100 毫秒为时间片长度,使用轮询(round-robin)调度时,三个进程的平均等待时间和平均周转时间(10 分)。
+
+
+ 答案:
+
+ 答案:(蓝色表示 IO)
+
+ (1) A800,B800, C10,C90,C100,C100,
+
+ C10,C90,C100,C100 C10,C90,C100,C100 C3 个周期
+
+ A 等待时间:0ms;
+
+ B 等待时间:800ms;
+
+ C 等待时间:800 + 800 = 1600ms;
+
+ 平均等待时间:(0 + 800 + 1600)/3 = 800ms;
+
+ A 周转时间:800ms;
+
+ B 周转时间:800 + 800 = 1600ms;
+
+ C 周转时间:800 + 800 + 900 = 2500ms;
+
+ 平均周转时间:(800 + 1600 + 2500)/3 = 1633.33ms
+
+ (2) A100,B100,C10, A100(C90),B100,C100,
+
+ A100(C100),B100,C10, A100(C90),B100,C100
+
+ A100(C100),B100,C10, A100(C90),B100,C100
+
+ A100(C100),
+
+ C 做完了 900 毫秒,只剩 A 和 B
+
+ A 做了 7*100,还剩 100ms,B 做了 6*100,还剩 200ms,故之后:
+
+ B100,A100,B100
+
+ A 等待时间:6*100 + 3*10 + 3*100 + 100 = 1030ms;
+
+ B 等待时间:7*100 + 3*10 + 3*100 + 100 = 1130ms;
+
+ C 等待时间:200 +(10 + 100)*3 + 100*2 = 730
+
+ 平均等待时间:(1030 + 1130 + 730)/3 = 963.33ms;
+
+ A 周转时间:3*210 + 3*300 + 100 + 2*100 = 1830ms;
+
+ B 周转时间:3*210 + 3*300 + 100 + 3*100 = 1930ms;
+
+ C 周转时间:3*210 + 300*3+100(I/0) = 1630
+
+ 平均周转时间:(1830 + 1930 +1630)/3 = 1796.67ms
+
+
+
+ ***
+
+2. (1)请画出分页内存管理(无 TLB)的硬件结构图。 (10 分)
+
+ 
+
+ (2)假设某进程的页表内容如下表所示。页面大小为 4KB。有效位为 0 表示页面不在内存。请问虚地址 0x2362、0x1565 对应的物理地址是多少。(10 分)
+
+ | 页号(page number) | 框号(frame number) | 有效位(valid bit) |
+ | --- | --- | --- |
+ | 0 | 0x101 | 1 |
+ | 1 | 0x838 | 0 |
+ | 2 | 0x254 | 1 |
+
+
+ 答案:
+
+ 页面大小为 4KB,即 $2^{12}$,即页内偏移占 12 位,页号占剩余高位。可得以上虚地址的页号分别如下:
+
+ 0x2362:页号=2。 框号:0x254,物理地址:0x254362。
+
+ 0x1565H:页号=1,框无效,将产生缺页中断。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..3f7ddce
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,558 @@
+---
+title: 2017-2018学年上学期期中
+---
+
+## 2017-2018学年上学期期中试卷(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学软件学院期中试卷(2017—2018学年第一学期)
+
+### 一、判断题(30分,每小题3分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 时间片轮转调度算法的关键点是设置时间片的大小,该算法本质上是支持抢占式及FCFS调度方式。
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+2. 进程是CPU调度的基本单位,而线程是系统资源分配的单位。
+
+
+ 答案:
+
+ 错,线程是CPU调度的基本单位,而进程是系统资源分配的单位
+
+
+
+ ***
+
+3. 操作系统的主要功能包括:进程管理、内存管理、文件管理、存储管理、安全设置等,其中进程管理主要涉及进程调度管理、进程控制块PCB。
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+4. 线程的实现机制主要是通过多线程模型实现,多线程模型包括:多对一模型、一对一模型、多对多模型,Java线程模型属于多对一模型。
+
+
+ 答案:
+
+ 错,java线程应该属于多对多的线程模型。
+
+
+
+ ***
+
+5. 资源分配图中存在环时,系统中某些进程可能处于死锁状态。
+
+ :::tip
+ 题干使用“可能”,而参考答案判为“错”。参考答案的解释只能说明资源分配图中有环时“不一定”发生死锁,并不能否定“可能”发生死锁,题干与参考答案之间存在表述冲突。
+ :::
+
+
+ 答案:
+
+ 错。当每种资源实例个数为1时,在环中的每个进程处于死锁状态。但是当资源实例数量不唯一时,不一定处于死锁状态。
+
+
+
+ ***
+
+6. 如果信号量S的当前值为 -6 时,则表示系统中共有6 个等待的进程。
+
+
+ 答案:
+
+ 错。S=-6表示当前有6个进程等待进入该信号量所对应的临界区。
+
+
+
+ ***
+
+7. 对称多处理技术SMP是最为普通的多处理器设计技术,其所有的处理器是对等的,且彼此独立运行。而集群系统是通过局域网连接的多个计算机系统。
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+8. 虚拟机的设计采用了分层方法,将操作系统的内核和硬件都作为硬件来考虑。例如JVM,其为java程序抽象化了底层系统,以提供平台无关的。
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+9. 进程控制块是描述进程状态和特性的数据结构,一个进程可以和其它进程共用一个进程控制块。
+
+
+ 答案:
+
+ 错,不可以共用PCB,其是进程的唯一标识。
+
+
+
+ ***
+
+10. 进程的就绪队列,可以使用链表来实现,其头节点指向链表的第一个和最后一个PCB块的指针,PCB之间是通过索引连接的。
+
+
+ 答案:
+
+ 错,每个PCB包括一个指向就绪队列的下一个PCB的指针域。
+
+
+
+***
+
+### 二、不定项选择题(15分,每小题3分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 下面有关进程的描述,正确的有( )。
+
+ A. 正在运行的进程调用yield( )时,可以主动放弃使用CPU。
+
+ B. 进程P和Q的并发执行是指P和Q同时使用CPU。
+
+ C. 线程是进程的一个实体。
+
+ D. 进程是具有一定独立功能的程序在某个数据集合上的一次运行。
+
+
+ 答案:
+
+ A C D
+
+
+
+ ***
+
+2. 关于线程,以下说法错误的是( )。
+
+ A. 用户态线程(无核心态线程或LWP)阻塞,可能会阻塞线程。
+
+ B. 多处理器环境下,线程间同步不能使用关中断实现。
+
+ C. 线程控制块中包含CPU寄存器状态。
+
+ D. 在支持核心态线程的系统中,CPU调度的单位仍然是进程。
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+3. 下对操作系统内核的运行方式的描述,正确的是( )。
+
+ A. 操作系统是一个以内核态运行的独立进程;
+
+ B. 操作系统内核运行时不能访问其它进程的地址空间;
+
+ C. 只有在硬件中断发生时,操作系统内核才会运行;
+
+ D. 操作系统内核可以以内核态在用户进程上下文中运行。
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+4. 以下( )仍然可能会发生死锁。
+
+ A. 资源都是可共享的;
+
+ B. 每一种资源的数量都超过单个进程所需这类资源的最大值;
+
+ C. 空闲资源能够满足任意一个进程还需要的资源需求;
+
+ D. 每个进程必须一次申请、获得所需的所有资源
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 下面关于进程同步、互斥的说法,错误的是( )。
+
+ A. 由于进程间的合作和资源共享产生了同步的问题。
+
+ B. 由于系统中资源使用的排他性,需要进程对临界资源的互斥访问。
+
+ C.P、V操作都是原语操作,利用信号量的P、V操作可以交换大量信息。
+
+ D.并发进程在访问共享资源时,与访问的顺序无关。
+
+
+ 答案:
+
+ C D
+
+
+
+***
+
+### 三、简单回答以下问题(15分,每小题5分)
+
+1. 请说明分时系统的时间片轮转法和多级反馈队列调度算法的区别和联系,并阐述各自有哪些优缺点。
+
+
+ 答案:
+
+ 多级反馈队列调度算法:设置多个就绪队列,并为各个队列赋予不同的优先级别和不同的时间片;第一个队列优先级最高,进程执行的时间片最少,新创建的进程挂到第一个优先级的队列后,然后按照FCFS排队等待。当轮转到其执行时,如果在其时间片内完成,便可以撤离系统;如果不能完成,便别挂入第二级队列尾部;仅当第一个队列为空闲时,调度程序才调度第二级队列中的进程运行,依次类推。新进程可以抢占低优先级进程占有的处理机。
+
+ 优点:小作业响应快,大作业也能快速得到响应。例如:
+
+ 
+
+ 时间片轮转法主要思想:时间片轮转调度是一种最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。
+
+ 联系:时间片轮转法可以作为多级反馈队列调度算法组成的一个部分,即对多级反馈队列中某个队列采用时间片轮转的方法。
+
+
+
+ ***
+
+2. 简述管程和进程概念之间的区别和联系。
+
+
+ 答案:
+
+ 管程:是一种并发性的构造,它包括用于分配一个共享资源或一组共享资源的数据和过程。为了完成分配资源的功能,进程必须调用特定的管程入口。
+
+ 管程(Monitor)采用资源集中管理的方法,将系统中的资源用某种数据结构抽象地表示出来。
+
+ 由于临界区是访问共享资源的代码段,因而建立一个管程来管理进程提出的访问请求。采用这种方式对共享资源的管理就可以借助数据结构及其上实施操作的若干过程来进行;对共享资源的申请和释放可以通过管程在数据结构上的操作来实现。
+
+ 进程:进程是计算机中的程序关于某数据集的一次运行活动。在传统操作系统中,它是资源拥有的基本单元。进程之间可以并发执行。进程虽然拥有自己的系统资源,但也因此导致创建或撤销进程开销都很大,切换、通信、同步也会比线程之间的实现更加复杂。进程存在的标志是进程控制块.
+
+ 进程可以通过管程对临界资源进行排它使用.
+
+
+
+ ***
+
+3. 请举例说明进程同步和互斥的含义,并说明它们之间区别和联系。并说明它们与信号量的关系。
+
+
+ 答案:
+
+ 进程同步:并发进程之间相互合作,完成一项工作,它们之间有一定的时序关系。互相约束(其表现例如:一个进程等待另一个进程的变量结果. 采用私用信号量协同处理。
+
+ 例:并发进程的同步关系。(需要展开说明:略)
+
+ 
+
+ 进程间的互斥:并发进程之间相互竞争临界资源的排他性关系。使用公用信号量mutex互斥处理
+
+ 例如: 过独木桥(互斥关系)。(举例不唯一,要展开说明)
+
+ 
+
+ 例如:P1 和P2进行共享打印机等。
+
+ 进程之间协同工作,既需要同步控制也需要对临界资源互斥访问。
+
+
+
+***
+
+### 四、综合题(40分)
+
+1. (15分)某单处理机系统的部分进程状态转换图如下,请说明:
+
+ 
+
+ a) A,B,C的状态分别是什么?(3分)
+
+
+ 答案:
+
+ A:Ready,B:Running C:Waiting
+
+
+
+ b) 引起状态转换1,2,3,4的典型事件分别是什么?(4分)
+
+
+ 答案:
+
+ 1:当进程调度程序从就绪队列中选取一个进程投入运行;
+
+ 2:正在执行的进程如因时间片用完而被暂停执行;
+
+ 3:正在执行的进程因等待的事件尚未发生而无法执行(如进程请求完成I/O)
+
+ 4:当进程等待的事件发生时(如I/O完成)。
+
+
+
+ c) 当我们观察系统中某些进程时,能够看到某个进程产生的一次状态转换能引起另一进程作一次状态转换。在什么情况下,当一个进程发生转换3时能立即引起另一个进程发生转换l?(2分)
+
+
+ 答案:
+
+ (要点即可)
+
+ 如果就绪队列非空,则一个进程的转换3会立即引起另一个进程的转换1。这是因为一个进程发生转换3意味着正在执行的进程由执行状态变为阻塞状态,这时处理机空闲,进程调度程序必然会从就绪队列中选取一个进程并将它投入运行,因此只要就绪队列非空,一个进程的转换3能立即引起另一个进程的转换1。
+
+
+
+ d) 试说明是否会发生下述因果转换:(6分)
+
+ (a) 2->1; (b) 3->2; (c) 4->1
+
+
+ 答案:
+
+ (a) 2->1:发生转换2时,就必然引起另一进程的转换1。因为当发生转换2时,正在执行的进程从执行状态变为就绪状态,进程调度程序必然会从就绪队列中选取一个进程投入运行,即发生转换1。
+
+ (b) 3->2:某个进程的转换3决不可能引起另一进程发生转换2。这是因为当前执行进程从执行状态变为阻塞状态.不可能又从执行状态变为就绪状态。
+
+ (c) 4->1:当处理机空闲且就绪队列为空时,某一进程的转换4就会引起该进程的转换1。因为此时处理机空闲,一旦某个进程发生转换4,就意味着有一个进程从阻塞状态变为就绪状态,因而调度程序就会将就绪队列中的此进程投入运行。
+
+
+
+ ***
+
+2. (15分)桌子上有一只盘子,每次只能放入一只水果。爸爸专向盘中放苹果,妈妈专向盘中放桔子,一个儿子专等吃盘中的桔子,一个女儿专等吃盘中的苹果。请利用wait(), signal() 操作实现他们之间的同步。
+
+ ```c
+ main ( )
+ {
+ #CO_BEGIN //以下并发执行
+ father ( );
+ mother();
+ son ( );
+ daughter ( );
+ #CO_END
+ }
+ ```
+
+
+ 答案:
+
+ (写出主体框架即可)
+
+ ```c
+ Mutex mutex=1; // 访问盘子的互斥量,避免冲突
+ Semaphore apple=0; // 盘中苹果个数(本题只能放一个,也可以用mutex)
+ Semaphore orange=0;
+ Semaphore plate=1; // 空盘数
+
+ Father()
+ {
+ While(1)
+ {
+ wait(plate);
+ wait(mutex)
+ put_apple();
+ Signal(mutex);
+ Signal(apple);
+ }
+ }
+
+ Mother()
+ {
+ While(1)
+ {
+ wait(plate);
+ wait(mutex)
+ put_orange();
+ Signal(mutex);
+ Signal(orange);
+ }
+ }
+
+ Son()
+ {
+ While(1)
+ {
+ wait(orange);
+ wait(mutex)
+ get_orange();
+ Signal(mutex);
+ Signal(plate);
+ }
+ }
+
+ Daughter()
+ {
+ While(1)
+ {
+ wait(apple);
+ wait(mutex)
+ get_apple();
+ Signal(mutex);
+ Signal(plate);
+ }
+ }
+ ```
+
+
+
+ ***
+
+3. (10分)假设有三个进程A,B和C。A和B只使用CPU,各需要1000毫秒,进程C使用10毫秒CPU然后进行90毫秒I/O,然后再使用100毫秒CPU接着100毫秒I/O,总共也是1000毫秒。假设三个进程的到达次序是ABC。
+
+ :::tip
+ 题干只描述了进程C的一次“10毫秒CPU、90毫秒I/O、100毫秒CPU、100毫秒I/O”过程,并称其总共也是1000毫秒,但没有说明该模式如何重复至1000毫秒。参考答案在后两问中按周期重复计算,因此相应的轮转序列和计算结果无法由题干唯一推出。
+ :::
+
+ a) 请计算使用FIFO调度,三个进程的平均等待时间和平均周转时间(2分)
+
+
+ 答案:
+
+ 答:A,B,C
+
+ 平均等待时间:$(0+1000+2000)/3=1000$
+
+ 平均周转时间:$(1000+2000+3000)/3=2000$
+
+
+
+ b) 请计算使用100毫秒为时间片长度,使用轮询(round-robin)调度时,三个进程的平均等待时间和平均周转时间(4分)
+
+
+ 答案:
+
+ 答:
+
+ A100,B100,C10, A100,B100,C100, A100,B100,C10, A100,B100,C100……
+
+ 过程:
+
+ A100,B100,C10, A100,B100,C100
+
+ A100,B100,C10, A100,B100,C100
+
+ A100,B100,C10, A100,B100,C100
+
+ A100,B100,C10, A100,B100
+
+ A100,B100, A100,B100
+
+ 平均等待时间:
+
+ $$
+ \begin{aligned}
+ (&0+110+200+110+200+110+200+110+100+100+\\
+ &100+110+200+110+200+110+200+110+100+100+\\
+ &200+200+200+200+200+200+200)/3=1326.67
+ \end{aligned}
+ $$
+
+ 平均周转时间:
+
+ $$
+ \begin{aligned}
+ (&210\times4+300\times3+200\times2+100+\\
+ &210\times4+300\times3+200\times2+100+100+\\
+ &210\times4+300\times3)/3=2106.67
+ \end{aligned}
+ $$
+
+
+
+ c) 请计算使用10毫秒为时间片长度,使用轮询(round-robin)调度时,三个进程的平均等待时间和平均周转时间(4分)
+
+
+ 答案:
+
+ 答:
+
+ A10,B10,C10(C的10ms CPU), A10,B10,A10,B10,A10,B10,A10,B10 A10,B10
+
+ (C的90ms I/O)
+
+ C10,A10,B10, C10,A10,B10
+
+ C10,A10,B10, C10,A10,B10
+
+ C10,A10,B10, C10,A10,B10
+
+ C10,A10,B10, C10,A10,B10
+
+ C10,A10,B10, C10,A10,B10
+
+ (C的100ms CPU)
+
+ (C的100msI/O)
+
+ A10,B10, A10,B10
+
+ A10,B10, A10,B10
+
+ A10,B10,
+
+ 三个周期以后:
+
+ C还剩10毫秒,B还剩($1000-21\times10\times3=370$)
+
+ A还剩($1000-21\times10\times3=370$)
+
+ 以下($370/10=37$)个周期
+
+ C10
+
+ A10,B10,
+
+ A10,B10,
+
+ ……
+
+ 平均等待时间:
+
+ A等待时间:$32\times10\times3+10+36\times10=1330$
+
+ B等待时间:$32\times10\times3+10+37\times10=1340$
+
+ C等待时间:$23\times3\times10=690$
+
+ 平均等待时间:$(1330+1340+690)/3=1120$
+
+ 平均周转时间:
+
+ A的周转时间:$53\times3\times10+10+36\times2\times10+10=2330$
+
+ B的周转时间:$53\times3\times10+10+37\times2\times10=2340$
+
+ C的周转时间:$53\times3\times10+10+90=1660$
+
+ 平均周转时间:$(2330+2340+1660)/3=2110$
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..c7936fc
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,565 @@
+---
+title: 2017-2018学年上学期期末
+---
+
+## 2017-2018学年上学期期末试卷(A)(含答案)
+
+### 一、单项选择题(20 分,每题 2 分)
+
+1. 在进程两种状态的转换中,( )是不可能的。
+
+ A. 运行状态→就绪状态
+
+ B. 运行状态→阻塞状态
+
+ C. 就绪状态→运行状态
+
+ D. 阻塞状态→运行状态
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+2. 在下列问题中,( )不是操作系统关心的主要问题。
+
+ A. 管理计算机裸机
+
+ B. 设计、提供用户程序与计算机硬件系统的界面
+
+ C. 管理计算机系统资源
+
+ D. 高级程序设计语言的编译器
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+3. 发生中断以后进入的中断处理程序属于( )。
+
+ A. 用户程序
+
+ B. 可能是用户程序,也可能是操作系统程序
+
+ C. 操作系统程序
+
+ D. 单独的程序,既不是用户程序,也不是操作系统程序
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+4. 设两个进程共用一个临界资源,其互斥信号量为 `mutex`,当 `mutex=1` 时表示( )。
+
+ A. 一个进程进入了临界区,另一个进程等待
+
+ B. 没有一个进程进入临界区
+
+ C. 两个进程都进入了临界区
+
+ D. 两个进程都在等待
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 系统中有 4 个用户进程,且当前 CPU 在用户态下运行,那么最多可能有( )个用户进程处于就绪状态。
+
+ A. 5
+
+ B. 4
+
+ C. 3
+
+ D. 2
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+6. 资源的按序分配策略可以破坏( )。
+
+ A. 互斥使用资源
+
+ B. 占有且等待资源
+
+ C. 非剥夺资源
+
+ D. 循环等待资源
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+7. 在采用段式存储管理中,每当 CPU 要从内存中取数据时,需要访问内存( )次。
+
+ A. 1
+
+ B. 2
+
+ C. 3
+
+ D. 4
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+8. 以下页面置换算法中,( )不是基于程序执行的局部性理论。
+
+ A. 先进先出调度算法
+
+ B. LRU
+
+ C. LFU
+
+ D. 第二次机会算法
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+9. 文件目录项中不包含的信息是( )。
+
+ A. 文件控制块的物理位置
+
+ B. 文件名
+
+ C. 文件访问权限说明
+
+ D. 文件所在的物理位置
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+10. Spooling 系统为用户提供虚拟的( )。
+
+ A. 独占设备
+
+ B. 共享设备
+
+ C. 主存储器
+
+ D. 处理机
+
+
+ 答案:
+
+ B
+
+
+
+***
+
+### 二、填空题(10 分,每题 2 分)
+
+1. 并发性是指两个或者多个事件在同一时间间隔内发生。具体地,在单处理器系统中,多道程序的并发是指在一段时间内,宏观上有多个程序在同时运行,但微观上这些程序只能是交替执行,并发执行的单位是( )或者( )。
+
+
+ 答案:
+
+ 进程;线程
+
+
+
+ ***
+
+2. 产生死锁的原因可能是进程之间的( ),例如系统中的打印机的数量不足,无法同时满足多个进程对打印机的需求;另一个主要原因可能是进程之间的( ),例如多个进程在运行中请求和释放资源的先后不合理。
+
+
+ 答案:
+
+ 竞争资源;推进顺序不合理
+
+
+
+ ***
+
+3. 在基本分页的管理方式中,进程的每个页面可以离散装入内存的物理块中。为了方便在内存中找到每个页面对应的物理位置,系统为每个进程建立一张表,称为( )。
+
+
+ 答案:
+
+ 页表
+
+
+
+ ***
+
+4. 内存管理的主要工作包括以下内容:第一是( ),其是将逻辑地址转换为物理地址;第二是内存容量的扩充;第三是( ),其为了保证内存中各个作业互不干扰,在各自的存储空间中运行。
+
+
+ 答案:
+
+ 地址变换;内存保护
+
+
+
+ ***
+
+5. 磁盘是一种被多个进程共享的设备,对多个进程请求访问磁盘时,应采用一种适当的调度算法,减少进程对磁盘的平均访问时间,常见的磁盘调度算法有( )。
+
+
+ 答案:
+
+ FCFS 算法、SSTF 算法、SCAN 算法、C-SCAN 算法、LOOK 算法、C-LOOK 算法
+
+
+
+***
+
+### 三、判断题(20 分,每题 2 分,请划√或×)
+
+1. 在页式存储管理中,采用反向页表进行管理时,整个系统只有一个页表。( )
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+2. 抖动是由于缺页调度算法的某些问题而引起的。( )
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+3. 磁盘调度的目标是使磁盘旋转周数最少。( )
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+4. 任何两个并发进程之间一定存在同步或互斥关系。( )
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+5. 进程控制块中的所有信息必须常驻内存。( )
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+6. 原语是一种不可分割的操作。( )
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+7. 一旦出现死锁,所有进程都处于僵持状态。( )
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+8. 引入缓冲的主要目的是提高 I/O 设备的利用率。( )
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+9. 磁盘上的文件都是以记录为单位进行读写的。( )
+
+
+ 答案:
+
+ ×
+
+
+
+ ***
+
+10. 在分时操作系统中,经常采用时间片轮转算法(Round Robin)调度进程。( )
+
+
+ 答案:
+
+ √
+
+
+
+***
+
+### 四、简答题(20 分,每小题 5 分)
+
+1. 什么是虚拟存储技术,使用虚拟存储技术有什么优点?
+
+
+ 答案:
+
+ 虚拟存储技术是一种存储管理技术,用以完成用小的内存实现在大的虚空间中程序的运行工作。它是由操作系统提供的一个假想的特大存储器。但是虚拟存储器的容量并不是无限的,它由计算机的地址结构长度所确定,另外虚存容量的扩大是以牺牲 CPU 工作时间以及内、外存交换时间为代价的。
+
+ 使用虚拟存储技术的好处是:小空间执行大程序,可在较小的可用内存中执行较大的用户程序;提供较大的用户空间,提供给用户可用的虚拟内存空间通常大于物理内存;内存可容纳更多的并发程序,可在内存中容纳更多程序并发执行。
+
+
+
+ ***
+
+2. 避免死锁和检测死锁是死锁两个主要问题。(1)银行家算法可以有效地避免死锁,请简述银行家算法的主要思想。(2)对于单实例和多实例的情况,分别阐述如何检测死锁,其主要思想是什么?
+
+
+ 答案:
+
+ 银行家算法是一种避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但银行家算法在进行资源分配之前,应先计算此次分配资源的安全性,若分配资源后,进入安全状态,则分配;否则不予以分配,进程必须等待。为实现银行家算法,系统必须设置若干数据结构。
+
+ 对于单实例的情况,采用等待图进行检测,即系统需要维护等待图并周期性地检查图中是否有环,通过等待图中存在环的事实,判断系统死锁发生的情况。
+
+ 对于多实例情况,一般采用死锁检测算法,对于系统中设置一个 Finish 的向量,每个进程对应的 Finish 分量初值为 false,如果对于任何进程申请的资源得到了满足,其对应的 Finish 分量置为 true。在操作系统动态运行时,无论怎样给运行的进程进行分配资源,总有一些进程的 Finish 的值仍为 false,此时,可以判断系统有死锁发生;如果所有进程的 Finish 分量都为 true,则系统无死锁发生。
+
+
+
+ ***
+
+3. 试简述什么是 SPOOLing 技术,并以打印机设备为例说明 SPOOLing 系统的特点及功能实现。
+
+
+ 答案:
+
+ SPOOLing 技术是在通道技术和多道程序设计基础上产生的一种技术,SPOOLing 技术通常称为“假脱机技术”,是处理关于慢速字符设备如何与计算机主机交换信息的技术,它由主机和相应的通道共同承担作业的输入输出工作,利用磁盘作为后援存储器,实现外围设备同时联机操作。它在输入和输出之间增加了“输入井”和“输出井”的排队转储环节,以消除用户的“联机”等待时间。
+
+ 以打印机为例,SPOOLing 系统将独占设备打印机改造为共享设备,实现了虚拟设备功能,提高了 I/O 处理的效率,缓和了 CPU 与低速 I/O 设备速度不匹配的矛盾。具体地,对于共享打印机的各个进程,它们的打印输出文件形成了一个输出队列,由输出 SPOOLing 系统控制这些进程的文档进行打印,依次将队列中的文件实际打印输出。
+
+ 在 SPOOLing 系统中,实际上并没有为任何进程分配物理设备,而只是在输入井和输出井中,为各个进程分配一块存储区、建立一张 I/O 请求表。这样,便把独占设备改造为共享设备。
+
+ 如果有进程要求打印输出时,SPOOLing 系统并不是将这台打印机直接分配给进程,对于每个进程实现了虚拟打印机设备的功能,每一进程都认为自己独占这一设备,不过该设备(打印机)是逻辑上的共享设备,实际上并没有为任何进程分配实际的物理(打印机)设备。总之,利用 SPOOLing 实现了多个进行共享使用设备的功能。
+
+
+
+ ***
+
+4. 简单说明分段存储管理的地址变换过程,要求考虑无 TLB(Translation Lookaside Buffer)的情况。
+
+
+ 答案:
+
+ 在不考虑 TLB 情况下,分段存储管理中从进程的逻辑地址到物理地址的变换过程为:在系统中设置了段表寄存器,用于存放段表始址和段表长度 TL。在进行地址变换时,系统将逻辑地址中的段号 S 与段表长度 TL 进行比较。若 S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址 d 是否超过该段的段长 SL。若超过,即 d>SL,同样发出越界中断信号;若未越界,则将该段的基址 d 与段内地址相加,即可得到要访问的内存物理地址。
+
+
+
+***
+
+### 五、问答题(30 分,每题 10 分)
+
+1. 生产围棋的工人不小心将相等数量的黑子和白子混合装在一个盒子里。现要用自动分拣系统将黑子和白子分开,该系统由两个并发执行的进程 Pa 和 Pb 组成。系统功能如下:Pa 专拣黑子,Pb 专拣白子;每次都只能拣一个子,当一个进程拣子时,不允许另一个进程去拣子;当一个进程拣子后,必须让另一个进程进行拣子。试解答以下问题,实现对两个拣子并发进程进行描述:
+
+ (1)写出对信号量的定义及其初值的设置。(3 分)
+
+ (2)利用所定义的信号量,采用 P、V 操作,描述两个进程拣子的并发过程。(7 分)
+
+
+ 答案:
+
+ (仅供参考)
+
+ (1)信号量及其初值:
+
+ 同步信号量 int S1;初值为 1,允许拣黑子,如果为 0,表示不允许拣黑子。
+
+ int S2;初值为 1,允许拣白子,如果为 0,表示不允许拣白子。
+
+ 互斥信号量 int mutex;初值为 1,允许进入盒子临界空间进行拣子,如果为 0,表示不允许进入盒子临界区。
+
+ (2)并发过程描述:
+
+ ```text
+ main()
+ {
+ Semaphore S1,mutex,S2;
+ S1=1; mutex=1; S2=0;
+ Cobegin
+ processPa();
+ processPb();
+ Coend
+ }
+
+ processPa()
+ {
+ while (1)
+ {
+ P(S1);
+ P(mutex);
+ 拣黑子;
+ V(mutex);
+ V(S2);
+ }
+ }
+
+ processPb()
+ {
+ while (1)
+ {
+ P(S2);
+ P(mutex);
+ 拣白子;
+ V(mutex);
+ V(S1);
+ }
+ }
+ ```
+
+
+
+ ***
+
+2. 一个多道批处理系统中仅有 P1 和 P2 两个作业,以非抢占方式运行。P2 比 P1 晚到达 $5\ \text{ms}$。它们的计算和 I/O 操作的顺序如下:
+
+ P1:计算 $60\ \text{ms}$,I/O $80\ \text{ms}$,计算 $20\ \text{ms}$;
+
+ P2:计算 $120\ \text{ms}$,I/O $40\ \text{ms}$,计算 $40\ \text{ms}$。
+
+ 请解答以下问题:
+
+ (1)如果不考虑调度和切换时间,则完成两个作业需要的时间最少是多少?请给出具体分析过程和结果,可以画图加以说明。(5 分)
+
+ (2)请计算两个作业的平均等待时间和平均周转时间。(5 分)
+
+
+ 答案:
+
+ (1)为了使得完成两个作业需要的时间最少,就要使 CPU 等待时间最少。所以并发过程如图所示:
+
+ 
+
+ 时间:$60+120+40+40=260\ \text{ms}$
+
+ 分析并发的过程(略)
+
+ (2)P1 等待时间:$120-80=40$
+
+ P2 等待时间:$60-5=55$
+
+ 两个作业的平均等待时间:$(55+40)/2=47.5\ \text{ms}$
+
+ P1 周转时间:$60+120+20=200\ \text{ms}$
+
+ P2 周转时间:$260-5=255\ \text{ms}$
+
+ 平均周转时间为:$(200+255)/2=227.5\ \text{ms}$
+
+
+
+ ***
+
+3. 某操作系统的文件管理采用直接索引和多级索引混合方式,文件索引表共有 10 项,其中前 8 项是直接索引项,第 9 项是一次间接索引项,第 10 项是二次间接索引项,假设物理块的大小是 $2\ \text{K}$,并且每个索引项占 4 字节。请解答以下问题。
+
+ (1)计算并说明该文件系统中的最大文件可以达到多大。(4 分)
+
+ (2)假定一个文件是 $128\ \text{M}$ 字节,包括间接索引块的情况下,该文件占用磁盘空间多大?(6 分)
+
+
+ 答案:
+
+ (1)混合索引包括 8 个直接索引和 1 个一级间接索引,和一个二级间接索引项。
+
+ 直接索引对应的空间:$8*2\text{KB}=16\text{K}$
+
+ 一级间接索引对应的空间:$2*1024/4*2\text{KB}=1\text{MB}$
+
+ 二级间接索引对应的空间:$(2*1024/4)*(2*1024/4)*2\text{KB}=512\text{M}$
+
+ 所以 $16\text{K}+1\text{M}+512\text{M}$ 约为 $513\text{M}$
+
+ (2)解法 1:
+
+ 设每块可以存储的索引项个数为 k,那么 $k=2*1024/4=512$
+
+ 计算文件数据部分需要多少块:$128\text{MB}/2\text{KB}=65536$ 块
+
+ 直接索引不产生索引块:直接索引以外的数据块数:$65536-8=65528$
+
+ 一个一级间接索引以外的数据块:$65528-512=65016$
+
+ 需要一个二级间接索引,索引需要 $(1+[65016/512])=128$ 个索引块
+
+ 文件实际占磁盘空间:
+
+ $(65536+1+128)*2\text{K}$ 约为 $128.25\text{M}$
+
+ 解法 2:$(126*4+512*126*4+8*4)/1024/1014+128=128.25\text{M}$
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203.md"
new file mode 100644
index 0000000..28ed0fd
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203.md"
@@ -0,0 +1,695 @@
+---
+title: 2018-2019学年上学期月考
+---
+
+## 2018-2019学年上学期月考试卷(含答案)
+
+### 说明
+
+- 日期:2018.10
+
+### 一、判断题(20 分,每小题 4 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 开关中断以及读时钟数据都属于特权指令。
+
+
+ 答案:
+
+ 错。读时钟数据不属于特权指令。
+
+
+
+ ***
+
+2. 用于控制生产流水线、进行工业处理控制的操作系统是实时系统。
+
+
+ 答案:
+
+ 对。
+
+
+
+ ***
+
+3. 从“新建”状态进入“就绪”状态的进程增多时,CPU 利用率一定不会受到影响。
+
+
+ 答案:
+
+ 错。CPU 利用率可能会下降。
+
+
+
+ ***
+
+4. Google’s Chrome 浏览器,每次打开一个新页面时,无需建立新的 PCB。
+
+
+ 答案:
+
+ 错。每次打开一个新页面时,创建新的进程,因此需要建立新的 PCB。
+
+
+
+ ***
+
+5. 微内核的设计中,将文件管理的模块放置在用户空间来实现。
+
+
+ 答案:
+
+ 对。
+
+
+
+***
+
+### 二、不定项选择题(20 分,每小题 4 分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 当 CPU 执行系统调用时,一般处于( )。
+
+ A. 执行态
+
+ B. 用户态
+
+ C. 就绪态
+
+ D. 内核态
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+2. 以下哪些对于微内核操作系统的描述是正确的?( )
+
+ A. 微内核具有较高移植性,可以对微内核部分进行移植修改;
+
+ B. 进程间通信必须在微内核内实现;
+
+ C. 微内核是一个完整操作系统;
+
+ D. 操作系统设计时采用微内核结构可以提高操作系统执行的效率。
+
+
+ 答案:
+
+ A、B
+
+
+
+ ***
+
+3. 下列说法正确的是( )
+
+ A. 虚拟机允许同一物理设备上安装任意多个操作系统;
+
+ B. OpenStack 是一个开源的云计算管理平台项目;
+
+ C. VMware 可以提供虚拟化服务;
+
+ D. Java 虚拟机有自己设置的硬件。如,处理器、堆栈、寄存器等,还具有相应的指令系统;
+
+
+ 答案:
+
+ B、C、D
+
+
+
+ ***
+
+4. UNIX 操作系统是典型的( )。
+
+ A. 多道批处理系统;
+
+ B. 分时系统;
+
+ C. 实时系统;
+
+ D. 分布式系统。
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 以下对操作系统内核的运行方式的描述,正确的是:( )
+
+ A. 操作系统是一个在内核态运行独立的进程;
+
+ B. 操作系统内核运行时能访问其它进程的地址空间;(这句话是不是少了“不”字)
+
+ C. 只有在硬件中断发生时,操作系统内核才会运行;
+
+ D. 操作系统内核可以以内核态在用户进程上下文中运行。
+
+
+ 答案:
+
+ D
+
+
+
+***
+
+### 三、辨析题(20 分,每小题 5 分)
+
+分别解释以下每组的两个名词,并列举他们的区别。
+
+1. 中断(Interrupt)和陷阱(Trap)
+
+
+ 答案:
+
+ An interrupt is a hardware-generated change of flow within the system. An interrupt handler is summoned to deal with the cause of the interrupt; control is then returned to the interrupted context and instruction.
+
+ A trap is a software-generated interrupt. An interrupt can be used to signal the completion of an I/O to obviate the need for device polling. A trap can be used to call operating system routines or to catch arithmetic errors.
+
+
+
+ ***
+
+2. 长程调度(long-term scheduling)与中程调度(mid-term scheduling)
+
+
+ 答案:
+
+ 长程调度:操作系统决定到底有多少进程能够从“new”状态进入就绪状态的调度。
+
+ 中程调度:操作系统决定哪些进程的地址空间能够保留在内存中,哪些进程的地址空间需要被交换到外存的调度。
+
+ 区别:长程调度被用于平衡系统资源利用率与并发进程个数;中程调度被用于控制运行与就绪进程有足够的内存、较低的缺页率能够运行。
+
+
+
+ ***
+
+3. 用户程序(user program)和进程(process)
+
+
+ 答案:
+
+ (1)用户程序可以由进程构成,一个用户程序可以包括一个或者几个进程。
+
+ (2)进程是动态的,程序是静态的:程序是有序代码的集合,进程是程序的执行。进程有核心态/用户态。
+
+ (3)进程是暂时的,程序是永久的;进程是一个状态变化的过程,程序可以长久保存。
+
+ (4)进程和程序的组成不同,进程的组成包括程序段、数据和进程控制块(即进程状态信息)。
+
+
+
+ ***
+
+4. API 和系统调用
+
+
+ 答案:
+
+ API 是函数的定义,规定了函数的功能,跟内核无直接关系。系统调用是通过中断向内核发请求,实现内核提供的某些服务。API 需要一个或多个系统调用来完成特定功能。
+
+ API 是一个提供给应用程序的接口函数,与程序员进行直接交互的;系统调用则不与程序员进行交互的,它根据 API 函数,通过一个软中断机制向内核提交请求,以获取内核服务的接口。
+
+ 并不是所有的 API 函数都对应一个系统调用,有的 API 函数需要几个系统调用来共同完成其功能。
+
+
+
+***
+
+### 四、综合题(40 分)
+
+1. 结合下面的图示,请论述 CPU 和 I/O 的并行过程。进程之间上下文切换发生在哪一处?为什么有延迟?(10 分)
+
+ 
+
+
+ 答案:
+
+ (1)CPU 与 I/O 的并行过程:
+
+ 首先 I/O 发出请求,传输数据,此时 CPU 仍正常执行自己的计算工作,I/O 设备与 CPU 并行工作。数据传输完成后,CPU 先保存当下的数据和信息即上下文切换(B 与 C 之间),然后 CPU 对 I/O 中断进行处理。处理完成后 CPU 返回刚才的进程。
+
+ (2)上下文切换发生在 BC 和 FG 之间。
+
+ (3)BC 和 FG 段的延迟是因为进程的上下文保存耗时,包括进程有关地各种寄存器的值,例如通用寄存器、程序计数器 PC、程序状态字寄存器 PS,以及机器指令代码集(或称正文段)、数据集、各种堆栈值及 PCB 结构;同时也要载入中断处理程序。
+
+
+
+ ***
+
+2. 结合图 2 的实例,请说明引入进程概念后,程序并发执行的过程,并进一步说明程序并发执行的优点。(10 分)
+
+ 
+
+
+ 答案:
+
+ (简要答案)进程是计算机中的程序的一次动态执行,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
+
+ 进程是操作系统中最基本、重要的概念。
+
+ 为了实现程序的并发执行,实现系统资源共享,把计算机中的程序分成进程,然后系统的各种设备在可以实现分时共享,提高程序和任务的并发度,进一步提高资源的利用率。
+
+
+
+ ***
+
+3. 假设某操作系统进程有 5 个状态,请结合图 3 说明进程的从创建到终止的生命期内各种状态转换及引起转换的事件。(10 分)
+
+ 
+
+
+ 答案:
+
+ 上图主要分为五个状态:
+
+ new(创建):为一个新进程创建必要的信息,让该进程进入就绪状态,此时进程处于新建态。
+
+ terminated(终止):当一个进程结束后,它将进入终止状态。
+
+ ready:进程已经就绪,等待分配处理器(CPU)
+
+ running:进程获得 CPU,该进程处于运行状态
+
+ running-ready:进程时间片用完
+
+ running-waiting:正在执行的进程发生某事件(如 I/O 请求、申请缓冲区失败),暂时无法继续执行,即进程受到阻塞。
+
+ waiting-ready:I/O 事件完成,阻塞状态转换为就绪状态
+
+ running-terminated:进程结束
+
+
+
+ ***
+
+4. 结合图 4 说明进程之间上下文切换的过程,具体说明涉及进程 PCB 的哪些信息,并指明代价高与低。(10 分)
+
+ 
+
+
+ 答案:
+
+ 保存与重新调入上下文信息,操作系统需要对以下内容进行保存与重新调入:
+
+ (1)计算机系统中执行该进程有关的各种寄存器的值(代价较低)
+
+ 例如通用寄存器、程序状态字寄存器 PS、程序计数器 PC 等
+
+ (2)程序段在经过编译之后形成的机器指令代码集(或称正文段)、数据集(代价较高)
+
+ (3)各种堆栈值(代价较低)
+
+ (4)PCB 结构。(代价较低)
+
+
+
+***
+
+## 2018-2019学年上学期月考试卷(含答案)
+
+### 说明
+
+- 考察内容:文件与 I/O
+
+### 一、判断题(30 分,每小题 3 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 在页式存储管理中,用户应将自己的程序划分成若干相等的页。
+
+
+ 答案:
+
+ 错。分页是系统分的而不是用户自己分的。
+
+
+
+ ***
+
+2. 快表 TLB 采用了哈希散列的方式,将物理帧号与逻辑页号相连,实现页表的快速查找。
+
+
+ 答案:
+
+ 错。本质上是使用关联存储技术。
+
+
+
+ ***
+
+3. 操作系统的所有程序都必须常驻内存。
+
+
+ 答案:
+
+ 错。只有 kernel 部分常驻内存。
+
+
+
+ ***
+
+4. 在段式存储管理中,段的大小是根据用户程序的模块进行划分的,将内存区域划分为长度不相等的区域。
+
+
+ 答案:
+
+ 对。
+
+
+
+ ***
+
+5. 在虚存系统中只要磁盘空间无限大,作业就能拥有任意大的编址空间。
+
+
+ 答案:
+
+ 对。
+
+
+
+ ***
+
+6. 段式存储中,可以使用段表中的标识位,实现地址保护。而在分页环境下,无法实现地址保护。
+
+
+ 答案:
+
+ 错。在分页环境下的内存保护由关联到每个帧的保护位完成。这些位通常保存在页表中。一个位可以定义一个页是读写还是只读属性。可以检查保护位来确定有没有对一个只读页进行写操作。
+
+
+
+ ***
+
+7. 对磁盘进行移臂调度优化的目的是为了缩短启动时间。
+
+
+ 答案:
+
+ 错。应该是缩短寻道时间。
+
+
+
+ ***
+
+8. 采用反向页表的系统,整个系统只有一个页表。
+
+
+ 答案:
+
+ 对。
+
+
+
+ ***
+
+9. 逻辑地址空间是由 CPU 生成的,也被称为虚拟地址,而物理地址是指内存存储单元所管理的内容。
+
+
+ 答案:
+
+ 对。
+
+
+
+ ***
+
+10. MMU 存储管理单元的主要任务是实现将逻辑地址映射为物理地址,实现了动态重定位,并提供硬件机制的内存访问权限检查。
+
+
+ 答案:
+
+ 对。
+
+
+
+***
+
+### 二、不定项选择题(15 分,每空 3 分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 使用段页式内存管理,段表和页表都存放在主存中,所有要访问的页面都在主存中。页表项可以缓存在转换表缓冲区(TLB)中。一次内存访问的代价为 $120\ \text{ns}$,一次 TLB 访问代价为 $8\ \text{ns}$。假设 TLB 的命中率为 50%,请问进程对内存的有效访问时间(effective access time)是( )。
+
+ A. $248\ \text{ns}$
+
+ B. $260\ \text{ns}$
+
+ C. $180\ \text{ns}$
+
+ D. $308\ \text{ns}$
+
+
+ 答案:
+
+ D
+
+ $120+50\%*8+50\%*(120+8)+120=308\ \text{ns}$
+
+
+
+ ***
+
+2. 一个 32 位物理地址的计算机系统,如果采用页式存储管理方式,一个页的大小为 $4\ \text{K}$,程序代码及数据均采用按字节编址,那么在页内进行寻址需要( )位物理地址。
+
+ A. 2
+
+ B. 12
+
+ C. 8
+
+ D. 1
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+3. 上题中,该计算机的物理内存容量为( )
+
+ A. 2G
+
+ B. 4G
+
+ C. 1M
+
+ D. 1G
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. 以下存储管理方式中,会产生内部碎片的是( )
+
+ A. 分段虚拟存储管理
+
+ B. 分页虚拟存储管理
+
+ C. 段页式分区管理
+
+ D. 固定式分区管理
+
+
+ 答案:
+
+ B、C、D
+
+
+
+ ***
+
+5. 既可以随机访问又可顺序访问的有( )
+
+ A. 光盘
+
+ B. 磁带
+
+ C. U 盘
+
+ D. 磁盘
+
+
+ 答案:
+
+ A、C、D
+
+
+
+***
+
+### 三、简单回答以下问题(15 分,每小题 5 分)
+
+1. 请说明段页式存储管理和分段存储管理的区别,要求从原理、地址变换和优缺点进行比较。
+
+
+ 答案:
+
+ (1)原理及地址变换
+
+ 段页式存储管理是将用户程序分成若干个段,并为每一个段赋予一个段名;再把每个段分成若干个页。在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段表长。进行地址变换时,首先利用段号 S,将它与段表长 TL 进行比较。若 S
+
+ ***
+
+2. 请说明什么是抖动以及产生抖动的原因。
+
+
+ 答案:
+
+ (1)如果多道程序过高,页面在内存和外存之间频繁调度,以至于调度页面所需要的时间比进程实际运行的时间还多,此时系统效率急剧下降,甚至导致系统崩溃,这种现象叫抖动。
+
+ (2)原因是同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁地出现缺页,必须请求系统将所缺之页调入内存,于是系统中排队等待页面调进调出的进程数增加,从而导致抖动。
+
+
+
+ ***
+
+3. 交换技术与虚拟存储技术中的调入调出技术的区别与联系。
+
+
+ 答案:
+
+ 相同点:都要在内存与外存之间交换信息。
+
+ 区别:交换技术调入、调出整个进程,因此一个进程的大小要受到内存容量大小的限制;而虚存中使用的调入、调出技术在整个内存和外存之间来回传递的是页面或分段,而不是整个进程,而使得进程的地址映射具有了更大的灵活性,且允许进程的大小比可用的内存空间大。
+
+
+
+***
+
+### 四、综合题(40 分)
+
+1. 假设一个磁盘驱动器有 5000 个柱面,从 0 到 4999。该驱动器目前正在处理请求柱面 2150,以前请求柱面为 1805。按 FIFO 顺序等待请求队列是:
+
+ 2069, 1212, 2296, 2800, 544, 1618, 356, 1523, 4965, 3681
+
+ 问题:从当前磁头位置开始,针对以下每个磁盘调度算法,磁臂移动以满足所有等待请求的磁道访问序列及总的移动距离。(10 分)
+
+ a. FCFS
+
+ b. SSTF
+
+ c. SCAN
+
+ d. C-LOOK
+
+
+ 答案:
+
+ a. FCFS 顺序是 2150, 2069, 1212, 2296, 2800, 544, 1618, 356, 1523, 4965, 3681。
+
+ 磁头移动的距离为:$81+857+1084+504+2256+1074+1262+1167+3442+1284=13011$
+
+ b. SSTF 顺序是 2150, 2069, 2296, 2800, 3681, 4965, 1618, 1523, 1212, 544, 356。
+
+ 磁头移动的距离:$81+227+504+881+1284+3347+95+311+668+188=7586$
+
+ c. SCAN 顺序是 2150, 2296, 2800, 3681, 4965, (4999), 2069, 1618, 1523, 1212, 544, 356
+
+ 磁头移动的距离:$146+504+881+1284+34+2930+451+95+311+668+188=7492$。
+
+ d. C-LOOK 顺序是:2150, 2296, 2800, 3681, 4965, 356, 544, 1212, 1523, 1618, 2069。
+
+ 磁头移动的距离:$146+504+881+1284+4609+188+668+311+95+451=9137$
+
+
+
+ ***
+
+2. 假定磁盘转速为 $20\ \text{ms}$/圈,磁盘格式化时每个磁道被分成 10 扇区,今有 10 个逻辑记录(每个记录的大小刚好与扇区大小相等)存放在同一磁道上,处理程序每次从磁盘读出一个记录后要花 $4\ \text{ms}$ 进行处理,现在要求顺序处理这 10 个记录,若磁头现在正处于首个逻辑记录的始点位置。按逆时针方向安排 10 个逻辑记录(磁盘顺时针方向转),处理程序处理完这 10 个记录所花费的时间是多少?(10 分)
+
+ 
+
+
+ 答案:
+
+ 读一个逻辑记录需 $2\ \text{ms}$ 时间,读出记录后还需要 $4\ \text{ms}$ 时间进行处理,故当磁头处于某记录的始点时,处理它共需 $6\ \text{ms}$ 时间。逻辑记录是按逆时针方向安排的,因此系统处理完一个逻辑记录后将磁头转到下一个逻辑记录的始点需要 $16\ \text{ms}$ 时间。
+
+ 
+
+ 注意:磁盘结果如下,因为磁盘顺时针旋转,所以当先访问 1 时,在访问 2,磁盘需要顺时针旋转 8 个扇区,才能到达 2,故处理完一个逻辑记录后将磁头转到下一个逻辑记录的初始点需要 $2\ \text{ms}*8=16\ \text{ms}$ 的时间。
+
+ 从而可以计算出处理程序处理完这 10 个逻辑记录所需的时间为:$6+9*(16+6)=204\ \text{ms}$
+
+
+
+ ***
+
+3. 请画出分页内存管理(无 TLB)的硬件结构图,并进行简单的解释说明。(10 分)
+
+ 
+
+
+ 答案:
+
+ 1)物理地址:内存单元的真正地址。
+
+ 逻辑地址:CPU 所生成的地址。逻辑地址是不唯一的。
+
+ 2)分页使得进程的物理地址空间可以是非连续的。
+
+ 物理内存被划分为小块,每块被称为帧(Frame)。分配内存时,帧是分配时的最小单位。在逻辑内存中,与帧对应的是页(Page)。逻辑地址的表示方式是:前部分是页码,后部分是页内位移量。
+
+ 3)每个操作系统都有自己的方法来保存页表。绝大多数都会为每个进程分配一个页表。现在由于页表都比较大,所以放在内存中(以往是放在一组专用寄存器里),其指针存在进程控制块(PCB)里,当进程被调度程序选中投入运行时,系统将其页表指针从进程控制块中取出并送入用户寄存器中。随后可以根据此首地址访问页表。
+
+ 页表的存储方式是 TLB 和内存。若没有 TLB,操作系统需要两次内存访问,来完成逻辑地址到物理地址的转换,访问页表是第一次访问内存,目的是通过逻辑页号查找出对应的物理页框号,然后根据页框号和页内位移量构成物理地址,进一步根据这一物理地址进行第二次访问内存,获取数据或者代码。
+
+
+
+ ***
+
+4. 假设某进程的页表内容如下表所示,页面大小为 $4\ \text{KB}$,有效位为 0 表示页面不在内存。请问虚地址 0x2362、0x1565 对应的物理地址是多少。(10 分)
+
+ | 页号(page number) | 框号(frame number) | 有效位(valid bit) |
+ | --- | --- | --- |
+ | 0 | 0x101 | 1 |
+ | 1 | 0x838 | 0 |
+ | 2 | 0x254 | 1 |
+
+
+ 答案:
+
+ 页面大小为 $4\ \text{KB}$,即 $2^{12}$,即页内偏移占 12 位,页号占剩余高位。可得以上虚地址的页号分别如下:
+
+ 0x2362:页号 = 2。框号:0x254,物理地址:0x254362。
+
+ 0x1565H:页号 = 1,框无效,将产生缺页中断。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..271d5ee
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,374 @@
+---
+title: 2018-2019学年上学期期中
+---
+
+## 2018-2019学年上学期期中试卷(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学软件学院操作系统期中试卷(2018—2019学年第一学期)
+
+### 一、判断题(20分,每小题4分)
+
+正确的打√,错误的打×,如错误请说明理由。
+
+1. 作业调度是高级调度,而进程调度是低级调度。
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+2. 时间片越小,系统的响应时间就越小,系统的效率就越高。
+
+
+ 答案:
+
+ × 时间片减小可以降低响应时间。但是进程切换开销占比增大,会降低系统效率。
+
+
+
+ ***
+
+3. 资源分配图中存在环时,系统进程处于死锁状态。
+
+
+ 答案:
+
+ ×。当每种资源实例个数为1时,在环中的每个进程处于死锁状态。但是当资源实例数量不唯一时,不一定处于死锁状态。
+
+
+
+ ***
+
+4. 进程A与进程B共享变量S1,需要互斥:进程B与进程C共享变量S2,需要互斥。从而,进程A与进程C也必须互斥。
+
+
+ 答案:
+
+ × 互斥没有传递性。
+
+
+
+ ***
+
+5. 进程执行的相对速度不能由进程自己来控制
+
+
+ 答案:
+
+ √
+
+
+
+***
+
+### 二、不定项选择题(20分,每小题4分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 操作系统提供给程序员的接口是( )。
+
+ A. 进程
+
+ B. 系统调用
+
+ C. 库函数
+
+ D. SHELL
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 下列的进程状态变化中,不可能发生的变化是( )。
+
+ A.运行一就绪
+
+ B.运行一等待
+
+ C.等待一运行
+
+ D.等待一就绪
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+3. 下列描述正确的是( )
+
+ A. 中断优先级是由硬件规定的
+
+ B. 进程间通信机制是微内核的一部分;
+
+ C. 只有在硬件中断发生时,操作系统内核才会运行;
+
+ D. 中断技术是多道程序并发处理的必要条件。
+
+
+ 答案:
+
+ A, B, D
+
+
+
+ ***
+
+4. 在单处理机系统中,操作的“原子”性可以通过( )来实现。
+
+ A. 特权指令
+
+ B. 访管指令
+
+ C. 屏蔽中断
+
+ D. 系统调用
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 在多级队列调度和多级反馈队列的调度的叙述中,正确的是( )。
+
+ A.多级反馈队列的调度中就绪队列的设置不是像多级队列调度一样按作业性质划分,而是按时间片的大小划分
+
+ B.多级队列调度用到优先权,而多级反馈队列调度中没有用到优先权
+
+ C.多级队列调度中的进程固定在某一个队列中,而多级反馈队列调度中的进程不固定
+
+ D.多级队列调度中每个队列按作业性质不同而采用不同的调度算法,而多级反馈队列调度中除了个别队列外,均采用相同的调度算法
+
+
+ 答案:
+
+ A
+
+ :::tip
+ 原参考答案只给出A,疑似不完整。C描述了进程能否在不同队列间移动,D描述了各队列所采用的调度算法,也符合多级队列调度与多级反馈队列调度的典型区别。
+ :::
+
+
+
+***
+
+### 三、辨析简答题(20分,每小题5分)
+
+1. 比较核心态和用户态
+
+
+ 答案:
+
+ 核心态:操作系统内核执行的受保护的状态
+
+ 用户态:用户进程执行所在的状态
+
+ 区别:处于用户态只能访问进程的地址空间,用户态需要通过中断或系统调用才能进入核心态。
+
+
+
+ ***
+
+2. 描述进程与线程的关系。
+
+
+ 答案:
+
+ 对于单线程的进程(或者没有线程概念的进程),进程及时资源管理的单位,也是任务调度的单位。
+
+ 对于多线程的进程,线程是任务调度单位,进程是资源管理单位。
+
+ 线程相关的硬件资源包括:CPU的寄存器以及堆栈,进程相关的资源包括除堆栈外的其他内存,打开文件列表等。
+
+
+
+ ***
+
+3. 比较并发(concurrent)与并行(parallel)。
+
+
+ 答案:
+
+ 并发:一个时间间隔内有多个任务在执行。(宏观上“同时”运行)
+
+ 并行:同一个时刻内有多个任务在执行。(微观上同时运行,必须有多个执行硬件的支持)
+
+ (下图仅作参考说明,不作为答案一部分)
+
+ 
+
+
+
+ ***
+
+4. 比较死锁预防措施与死锁避免措施。(5分)
+
+
+ 答案:
+
+ (1)预防死锁:主要是破坏产生死锁的必要条件之一:(1)互斥(2)占有与等待(3)不抢占(4)循环等待。该方法是最容易实现的,是一种粗粒度的解决方法,但系统资源利用率较低。
+
+ (2)避免死锁:通过资源分配图(单实例资源),银行家算法(多实例资源)等,在执行的过程中小心的计算资源需求与供应关系,避免死锁的发生。该算法需要较多的数据结构,实现起来比较困难,但资源利用率最高。
+
+
+
+***
+
+### 四、综合题(40分)
+
+1. (15分)有5个任务A,B,C,D,E。它们几乎同时到达,预计它们的运行时间为10,6,2,4,8ms。其优先级分别为3,5,2,1和4(这里5为最高优先级)。对于下列每一种调度算法,计算其平均进程周转时间(进程切换开销可不考虑)。
+
+ a) 先来先服务(按A,B,C,D,E顺序)算法。(5分)
+
+
+ 答案:
+
+ 采用FCFS的调度算法时,各任务在系统中的执行情况如下表所示:
+
+ | 执行次序 | 运行时间 | 优先数 | 等待时间 | 周转时间 |
+ | --- | --- | --- | --- | --- |
+ | A | 10 | 3 | 0 | 10 |
+ | B | 6 | 5 | 10 | 16 |
+ | C | 2 | 2 | 16 | 18 |
+ | D | 4 | 1 | 18 | 22 |
+ | E | 8 | 4 | 22 | 30 |
+
+ 所以,进程的平均周转时间为:
+
+ $T=(10+16+18+22+30)/5=19.2\ \text{ms}$
+
+
+
+ b) 优先级调度算法。(5分)
+
+
+ 答案:
+
+ 采用优先级调度算法时,各任务在系统中的执行情况如下表所示:
+
+ | 执行次序 | 运行时间 | 优先数 | 等待时间 | 周转时间 |
+ | --- | --- | --- | --- | --- |
+ | B | 6 | 5 | 0 | 6 |
+ | E | 8 | 4 | 6 | 14 |
+ | A | 10 | 3 | 14 | 24 |
+ | C | 2 | 2 | 24 | 26 |
+ | D | 4 | 1 | 26 | 30 |
+
+ 所以,进程的平均周转时间为:
+
+ $T=(6+14+24+26+30)/5=20\ \text{ms}$
+
+
+
+ c) 时间片轮转算法(时间片2ms)。(5分)
+
+
+ 答案:
+
+ 采用时间片轮转算法时,假定时间片为2min,各任务的执行情况是:(A,B,C,D,E),(A,B,D,E),(A,B,E),(A,E),(A)。设A~E五个进程的周转时间依次为T1~T5,显然,
+
+ $T1=30\text{ms},\ T2=22\text{ms},\ T3=6\text{ms},\ T4=16\text{ms},\ T5=28\text{ms}$
+
+ 所以,进程的平均周转时间为:
+
+ $T=(30+22+6+16+28)/5=20.4\text{ms}$
+
+ :::tip
+ 题干规定时间片为2ms,而原参考答案写成“2min”,此处疑似单位笔误。
+ :::
+
+
+
+ ***
+
+2. (15分)某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票少于20名购票者时,则厅外的购票者可立即进入,否则需在外面等待。若把一个购票者看作一个进程,请回答下列问题:
+
+ a)(5分)用P、V操作管理这些并发进程时,应怎样定义信号量?写出信号量的初值以及信号量各种取值的含义。
+
+
+ 答案:
+
+ (1)定义一信号量S,初始值为20。
+
+ $S>0$ S的值表示可继续进入售票厅的人数;
+
+ $S=0$ 表示售票厅中已有20名购票者;
+
+ $S<0$ $|S|$的值为等待进入售票厅中的人数。
+
+
+
+ b)(5分)根据所定义的信号量,把应执行的P、V操作填入下述程序中,以保证进程能够正确地并发执行。
+
+ ```text
+ Cobegin PROCESS Pi(i=1,2,…)
+ Begin
+ 进入售票厅;
+ 购票;
+ 退出;
+ End;
+ Coend
+ ```
+
+
+ 答案:
+
+ (2)
+
+ ```text
+ P(S);
+ 进入售票厅;
+ 购票;
+ 退出;
+ V(S);
+ ```
+
+
+
+ c)(5分)若欲购票者最多为n个人,写出信号量可能的变化范围(最大值和最小值)。
+
+
+ 答案:
+
+ (3)S的最大值为20,S的最小值为20-N,N为某一时刻需要进入售票厅的最多人数。
+
+
+
+ ***
+
+3. (10分)某时刻进程的资源使用情况如下所示。
+
+ 
+
+ 此时的安全序列是什么?
+
+
+ 答案:
+
+ 无。
+
+ $[0,2,1] \ge \mathrm{Need}_{P1}\ [0,0,1]$
+
+ P1: $[0,2,1]+[2,0,0]=[2,2,1]\ge \mathrm{Need}_{P4}: [2,0,0]$
+
+ P4:$[2,2,1]+[0,0,1]=[2,2,2]$ 剩下进程(P2,P3)不能完成
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..28b65ed
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,488 @@
+---
+title: 2018-2019学年上学期期末
+---
+
+## 2018-2019学年上学期期末试卷(A)(含答案)
+
+### 一、单项选择题(30分,每题3分)
+
+1. 操作系统的目标是( )
+
+ A. 执行用户程序更容易
+
+ B. 使计算机系统更便于使用
+
+ C. 计算机硬件利用效率更高
+
+ D. 以上均是
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+2. 系统上电后,下面程序中哪个最先运行?( )
+
+ A. 内核程序
+
+ B. 引导程序
+
+ C. 登录程序
+
+ D. 自启动程序
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+3. 下面那项不在 PCB 中?( )
+
+ A. 进程状态
+
+ B. 进程号
+
+ C. 进程名
+
+ D. 打开文件列表
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+4. 降低进程优先级的合理时机是( )。
+
+ A. 进程的时间片用完
+
+ B. 进程刚完成 I/O,进入就绪队列
+
+ C. 进程长期处于就绪队列中
+
+ D. 进程从就绪状态转为运行态
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+5. 同一个进程的不同线程,具有独立的( )
+
+ A. 文件
+
+ B. 栈
+
+ C. 数据段
+
+ D. 代码段
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+6. 一般而言,下列哪种调度算法响应时间最短?( )
+
+ A. FCFS
+
+ B. SJF
+
+ C. SRTF
+
+ D. RR
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+7. 下面哪个 bit 不在页表里?( )
+
+ A. Mode bit
+
+ B. valid-invalid bit
+
+ C. Dirty bit
+
+ D. reference bit
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+8. 下面哪个控制块只存在于内存中?( )
+
+ A. PCB
+
+ B. FCB
+
+ C. BCB
+
+ D. VCB
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+9. 菊花链(daisy chain)是一种( )
+
+ A. 总线结构
+
+ B. 星型结构
+
+ C. 并行结构
+
+ D. 分布式结构
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+10. 以下哪种存储设备通常只支持顺序访问?( )
+
+ A. 软盘
+
+ B. 固态硬盘
+
+ C. 磁带
+
+ D. 光盘
+
+
+ 答案:
+
+ C
+
+
+
+***
+
+### 二、判断题(20分,每题2分,请划√或×)
+
+1. 现代操作系统都是中断驱动的。陷阱、异常、轮询是软中断的几种形式,通过类似中断处理的方式进行处理。( )
+
+
+ 答案:
+
+ ×。错在“轮询”。
+
+
+
+ ***
+
+2. 系统调用是操作系统提供的服务的编程接口。( )
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+3. 微内核架构中 CPU 调度、内存管理、文件系统等模块运行在内核模式。( )
+
+
+ 答案:
+
+ X。错在“文件系统”。
+
+
+
+ ***
+
+4. 磁盘上的文件是以页面为单位读写的。( )
+
+
+ 答案:
+
+ ×。错在“页面”。
+
+
+
+ ***
+
+5. 目录是文件的集合,是一种逻辑概念,可以用文件实现。( )
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+6. 银行家算法破坏了死锁必要条件中的“请求和保持”条件( )
+
+
+ 答案:
+
+ X(预防 vs. 避免)
+
+
+
+ ***
+
+7. 逻辑地址空间的容量取决于逻辑地址位数( )。
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+8. 磁盘划分扇区和磁道称为格式化。( )
+
+
+ 答案:
+
+ X。错在“格式化”。
+
+
+
+ ***
+
+9. 索引结构的文件物理结构适合随机访问且易于文件扩展( )。
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+10. 文件指针(fp)存在于系统的打开文件列表中( )
+
+
+ 答案:
+
+ X。错在“系统的”。
+
+
+
+***
+
+### 三、简答题(20分,每题5分)
+
+1. (5分)请简述 DMA 的过程,说明为什么 DMA 对于高速 I/O 访问效率较高。
+
+
+ 答案:
+
+ (过程参见英文教材第九版 P596 图 13.6,如下图,图不需要画出来)
+
+ 程序控制 I/O(PIO)时,CPU 需要介入每一次数据交换;DMA 方式时,CPU 只在数据交换开始/结束时介入,其它时候,由 DMA 控制器协调 I/O 设备和内存利用总线进行数据交换。由于此时 CPU 和 I/O 设备几乎并行,因此与 PIO 方式相比,节省了大量中断、CPU 介入时间。
+
+
+
+ ***
+
+2. (5分)简要比较短程调度和长程调度。
+
+
+ 答案:
+
+ P113.
+
+
+
+ ***
+
+3. (5分)简要比较静态链接和动态链接。
+
+
+ 答案:
+
+ P357
+
+ Static linking -- system libraries and program code combined by the loader into the binary program image
+
+ Dynamic linking --linking postponed until execution time
+
+ Dynamic linking is particularly useful for libraries
+
+
+
+ ***
+
+4. (5分)简要说明目录结构、FCB 及相互的关系。
+
+
+ 答案:
+
+ P546
+
+
+
+***
+
+### 四、应用题(30分,每题10分)
+
+1. (10分)某页式内存管理系统中,页面大小为 $4KB$,一次内存的访问时间是 $100ns$,一次快表(TLB)的访问时间是 $10ns$,处理一次缺页的平均时间为 $0.1s$(已含更新 TLB 和页表的时间),进程占用物理内存框数固定为 2,采用最近最少使用置换算法(LRU)和局部淘汰策略。某时刻某进程的页表内容如下表所示,此时 TLB 内容无效。
+
+ | 页号 | 框号 | 有效位(0无效) |
+ | --- | --- | --- |
+ | 0 | 0x163 | 1 |
+ | 1 | 0x138 | 0 |
+ | 2 | 0x551 | 1 |
+
+ 设有逻辑地址访问序列 0x2345、0x1357、0x26AE,请问:
+
+ 依次访问上述三个逻辑地址,其物理地址各是多少?各需多少时间?(给出计算过程。)
+
+ 补充说明:地址转换时先访问 TLB,若 TLB 未命中,再访问页表(忽略访问页表之后的 TLB 更新时间)。
+
+
+ 答案:
+
+ 因为页大小为 $4KB$,所以逻辑地址中的低 12 位表示页内地址,剩余高位表示页号。则用十六进制表示,低三位数字为页内地址,最高位数字为页号。
+
+ (1)0x2345:页号为 2,页内地址为 0x345。
+
+ 先访问快表(需时 $10ns$),
+
+ 未命中,再访问内存中的页表($100ns$),
+
+ 页表项中的有效位指示该页在内存,根据该页对应的框号形成**物理地址(0x551345)**再次访问内存($100ns$),
+
+ 【共计】$10ns+100ns*2=210ns$。(3分)
+
+ (2)0x1357:页号为 1,页内地址为 0x357。
+
+ 先访问快表 $10ns$,
+
+ 未命中,再访问内存中的页表 $100ns$,
+
+ 页表项中的有效位指示页 1 不在内存,访问时发生缺页。目前页 0、页 2 在内存,根据 LRU 置换算法和局部淘汰策略,将页 0 换出页 1 换入,因此页 1 对应的框号为 0x163,则逻辑地址 0x1357 的**物理地址为 0x163357**。处理缺页 $0.1s=10^8ns$,
+
+ 再次访问快表 $10ns$
+
+ 命中,根据该页对应的框号形成物理地址再次访问内存 $100ns$,
+
+ 【共计】$10ns+100ns+10^8ns+100ns+10ns \approx 10^8ns$。(4分)
+
+ (3)0x26AE:页号为 2,页内地址为 6AEH。
+
+ 由于访问 0x2345 时已将页 2 的表项写入 TLB,因此访问快表 $10ns$,
+
+ 命中,根据该页对应的框号形成**物理地址(0x5516AE)**访问内存 $100ns$,
+
+ 【共计】共计 $10ns+100ns=110ns$。(3分)
+
+
+
+ ***
+
+2. (10分)某学校计算机教室有 50 台计算机,全天开放供学生自主上机实验,坐满后须在教室外排队等候。第一个进教室的学生需要开灯,最后一个出教室的需要关灯。请用信号量的方法,使用 `wait` 和 `signal` 等操作来描述学生(Student)进程的并发过程。须包含对信号量的定义及其初值的设置。
+
+
+ 答案:
+
+ ```c
+ int stu_count=0; //学生人数
+ Semaphore mutex=1; //互斥量,对临界段进行操作,处理stu_count及开关灯
+ Semaphore sem_seats=50; //同步信号量,剩余座位,初值为50,负数表示等候人数
+
+ Student()
+ {
+ do {
+ wait(mutex);
+ wait(sem_seats);
+ stu_count++;
+ if (stu_count == 1)
+ {
+ /* 开灯 */
+ }
+ signal(mutex);
+
+ /* 进教室自习 */
+ wait(mutex);
+ stu_count--;
+ if (stu_count == 0)
+ {
+ /* 关灯 */
+ }
+ signal(sem_seats);
+ signal(mutex);
+ } while (true);
+ }
+ ```
+
+
+
+ ***
+
+3. (10分)假定磁盘的磁臂现在处于第 10 柱面,由外向内运动(柱面号由小到大)。现有一组磁盘请求以 60、8、15、4、20、40 柱面的次序到达磁盘驱动器,磁臂移动一个柱面需要 $6ms$,请完成下面的问题:
+
+ (1)访问磁盘所需的时间由哪几部分构成?(3分)
+
+ (2)采用 SSTF 算法和 SCAN 算法进行磁盘调度,请分别给出柱面访问序列,计算平均寻道时间。(4分)
+
+ (3)如果把磁盘换成固态盘,用什么算法比较合适,说明理由。(3分))
+
+
+ 答案:
+
+ 磁盘访问时间由:寻道时间、旋转延迟时间和数据传输时间三部分构成。**(3分)**
+
+ SSTF算法:**(2分)**
+
+ 柱面访问序列为:8、4、15、20、40、60
+
+ 平均寻道时间为:$(2+4+5+5+20+20)\times6/6=56ms$
+
+ SCAN算法:**(2分)**
+
+ 柱面访问序列为:15、20、40、60、8、4
+
+ 平均寻道时间为:$(5+5+20+20+52+4)\times6/6=106ms$
+
+ (3)用 FCFS 即可。固态盘没有寻道时间、旋转延迟时间,支持随机访问,按先来先服务即可。(3分)
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2019-2020\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2019-2020\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..40e124f
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2019-2020\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,351 @@
+---
+title: 2019-2020学年上学期期中
+---
+
+## 2019-2020学年上学期期中试卷(含答案)
+
+### 说明
+
+- 日期:2019.10
+- 原卷中第一题判断题的2、6小题被划掉,原因未知
+
+### 一、判断题(20 分,每小题 4 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 时间片轮转调度算法、短进程优先调度算法、先来先服务调度算法,及高响应比优先调度算法都没有综合考虑进程等待时间和执行时间。
+
+
+ 答案:
+
+ 错。高响应比优先调度算法综合考虑进程等待时间和执行时间
+
+
+
+ ***
+
+2. 多级反馈队列的调度中就绪队列按时间片的大小划分。
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+2. 多级反馈队列中,进程可以在不同队列中移动
+
+
+ 答案:
+
+ √
+
+
+
+ ***
+
+3. 在生产者-消费者问题中,生产者进程和消费者进程只要解决互斥访问的问题即可。
+
+
+ 答案:
+
+ 错。当 buffer 为空时,只有等待生产者进程完成一个产品生成后,消费者才可以消费。因此,还要解决进程间同步的问题。
+
+
+
+ ***
+
+4. 进程执行的相对速度与资源无关。
+
+
+ 答案:
+
+ 错。进程执行的相对速度与资源有关,例如一个进程执行时需要的资源不能满足要求时,只好等待该资源。
+
+
+
+ ***
+
+5. 在多处理器系统中,通过关中断的方式可以解决进程间互斥访问的问题。
+
+
+ 答案:
+
+ 错。在多处理器系统中,关中断不能保证临界区的互斥访问。
+
+
+
+ ***
+
+5. 在微内核(micro-kernel)结构的操作系统中,虚拟内存(virtual memory)管理是在微内核内部的。
+
+
+ 答案:
+
+ 错。只有 CPU 调度和进程间通信是必须在微内核内部。
+
+
+
+***
+
+### 二、不定项选择题(20 分,每小题 4 分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 当 CPU 执行操作系统代码时,处理器处于( )
+
+ A. 执行态
+
+ B. 用户态
+
+ C. 就绪态
+
+ D. 内核态
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+2. UNIX 操作系统是典型的( )
+
+ A. 多道批处理系统
+
+ B. 分时系统
+
+ C. 实时系统
+
+ D. 分布式系统
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+3. 以关于线程,以下说法正确的是( )
+
+ A. 用户态线程(无核心态线程或 LWP)阻塞,可能会阻塞线程
+
+ B. 多处理器环境下,线程间同步不能使用关中断实现
+
+ C. 线程控制块中包含 CPU 寄存器状态
+
+ D. 在支持核心态线程的系统中,CPU 调度的单位仍然是进程
+
+
+ 答案:
+
+ A, B, C
+
+
+
+ ***
+
+4. 一个正在运行的进程,当所分配的时间片用完后,将其挂在( )。
+
+ A. 等待队列
+
+ B. 运行队列
+
+ C. 就绪队列
+
+ D. 任意一个队列
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+5. 若 P、V 操作的信号量 S 初值为 2,当前值为-1,则表示有( )等待进程。
+
+ A. 0 个
+
+ B. 1 个
+
+ C. 2 个
+
+ D. 3 个
+
+
+ 答案:
+
+ B
+
+
+
+***
+
+### 三、辨析题(20 分,每小题 5 分)
+
+分别解释以下每组的两个名词,并列举它们的区别和联系
+
+1. 进程和管程
+
+ ***
+
+2. 多级反馈队列调度与 FCFS
+
+ ***
+
+3. 死锁(deadlock)与饥饿(starvation)
+
+
+ 答案:
+
+ 死锁:多个进程循环等待对方,都无法继续执行
+
+ 饥饿:某个或某些进程由于无法得到资源长时间无法执行
+
+ 死锁必然发生饥饿,但是饥饿不一定发生死锁
+
+
+
+ ***
+
+4. 互斥量和信号量
+
+
+ 答案:
+
+ 1) 互斥量用于线程的互斥,信号量用于线程的同步。
+
+ 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。
+
+ 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
+
+ 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
+
+ 2) 互斥量值只能为 0/1,信号量值可以为非负整数。
+
+ 也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量时,也可以完成一个资源的互斥访问。
+
+ 3)互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
+
+
+
+***
+
+### 四、综合题(40 分)
+
+1. 四个进程需要运行的时间(单位:毫秒)和到达顺序如下:(10 分)
+
+ | 进程 | 需要 CPU 时间 | 优先级 |
+ | --- | --- | --- |
+ | P1 | 9 | 3 |
+ | P2 | 2 | 1 |
+ | P3 | 3 | 2 |
+ | P4 | 2 | 4 |
+
+ a) 请利用甘特图展示四个进程分别在 FCFS、SJF、RR 和非抢占优先级四种调度算法下的执行过程。
+
+ b) 请计算每个进程在 a) 中提到的四种调度算法下的等待时间。
+
+ c) 请问 a) 中哪种调度算法使得平均等待时间最少?
+
+
+ 答案:
+
+ (b)
+
+ | 进程 | FCFS | SJF | RR | 优先级调度 |
+ | --- | --- | --- | --- | --- |
+ | P1 | 0 | 7 | 6 | 5 |
+ | P2 | 9 | 0 | 4 | 0 |
+ | P3 | 11 | 4 | 7 | 2 |
+ | P4 | 14 | 2 | 6 | 14 |
+ | 平均 | 8.5 | 3.25 | 5.6 | 5.2 |
+
+ (c) SJF 调度算法使得平均等待时间最少。
+
+
+
+ ***
+
+2. 请举例详细说明什么是进程之间的同步和互斥,为什么中断不适合在多处理器系统中实现原语的同步?(10 分)
+
+
+ 答案:
+
+ 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
+
+ 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
+
+ 在实际的多道程序系统中,这种连续循环浪费了 CPU 时间。操作中信号量整数值的修改应当不可被分割地执行,且不能被中断,运行在处理器上的是内核级线程而用户级程序所对应的内核线程是需要进行调度的,所以不确保禁止中断实现同步原语的方法有效。
+
+
+
+ ***
+
+3. “生产者-消费者”问题演变 2(既有同步,也有互斥):一个缓冲区,多个生产者,多个消费者,生产者不断地生产,消费者不断地消费。只有缓冲区为空时生产者才能放产品,只有缓冲区有数据,消费者才能取产品。用 PV 操作写出相应的代码段。(10 分)
+
+
+ 答案:
+
+ 缓冲区变成临界资源,不允许多个进程同时操作缓冲区,既不允许多个生产者同时放产品,也不允许多个消费者同时取产品。那么需要增加信号量 mutex 实现对缓冲区的互斥访问,初值为 1.
+
+ full 和 empty 范围分别变成[-n,1]和[-m,1],其中 n 是消费者进程数量,m 是生产者进程数量。
+
+ ```c
+ Semaphore mutex = 1, empty = 1, full = 0;
+
+ main()
+ {
+ // begin
+ Producer();
+ Consumer();
+ // end
+ }
+ ```
+
+ ```c
+ Producer()
+ {
+ While(true)
+ {
+ wait(empty);
+ wait(mutex)
+ putdata;
+ signal (mutex)
+ signal(full);
+ }
+ }
+
+ Consumer()
+ {
+ While(true)
+ {
+ wait(full);
+ wait(mutex)
+ getdata;
+ signal (mutex)
+ signal(empty);
+ }
+ }
+ ```
+
+
+
+ ***
+
+4. 举例说明什么是多级反馈队列调度算法,其有哪些优点,根据例子具体详细说明。(10 分)
+
+
+ 答案:
+
+ 多级反馈队列调度算法是一种性能较好的作业低级调度策略,能够满足各类用户的需要。对于分时交互型短作业,系统通常可在第一队列(高优先级队列)规定的时间片内让其完成工作,使终端型用户都感到满意;对短的批处理作业,通常,只需在第一或第一、第二队列(中优先级队列)中各执行一个时间片就能完成工作,周转时间仍然很短;对长的批处理作业,它将依次在第一、第二、……,各个队列中获得时间片并运行,决不会出现得不到处理的情况。此系统模拟了多级反馈队列调度算法及其实现。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2019-2020\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2019-2020\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..27dfe99
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2019-2020\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,175 @@
+---
+title: 2019-2020学年上学期期末
+---
+
+## 2019-2020学年上学期期末试卷(A)
+
+### 一、判断题(20 分,每小题 4 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 当一个操作系统采用连续内存分配方案时,只可能产生外部碎片。( )
+
+ ***
+
+2. 当从“新建(new)”状态进入“就绪(ready)”状态的进程增多时,进程的平均响应时间不会减少。( )
+
+ ***
+
+3. 微内核不是一个完整操作系统,只是为构建通用操作系统提供基础。( )
+
+ ***
+
+4. 文件系统的 inode 的初始化是在磁盘分区操作中进行的。( )
+
+ ***
+
+5. 假脱机(spooling)方式常用于处理字符设备(character device),如终端的 I/O 操作。( )
+
+***
+
+### 二、不定项选择题(24 分,每小题 3 分)
+
+选择一个或多个正确答案。
+
+1. 以下( )对降低缺页率没有直接帮助。
+
+ A. 增加页框
+
+ B. 插入不必要的 I/O 指令
+
+ C. 减少系统中同时运行的进程数目
+
+ D. 预取页面
+
+ ***
+
+2. 以下哪个操作不会使一个进程从运行(running)状态转换为就绪(ready)状态。
+
+ A. 在可占先(preemptive)系统中,高优先级进程被创建
+
+ B. 分时系统中,时间片到
+
+ C. 当前运行进程发生缺页中断
+
+ D. 当前运行进程调用 yield(),主动放弃使用 CPU
+
+ ***
+
+3. 关于死锁,以下说法正确的是( )。
+
+ A. 死锁避免(deadlock avoidance)中,不安全的状态必然发生死锁
+
+ B. 死锁避免(deadlock avoidance)中,发生死锁必然处于不安全状态
+
+ C. 资源分配图中有环(以资源类型和进程为节点),必然发生死锁
+
+ D. 如果要求每个进程必须一次申请所有需要的资源,如果不能满足其需要,则不分配任何资源,那么死锁不可能发生
+
+ ***
+
+4. 关于线程,以下说法正确的是( )。
+
+ A. 用户态线程(无核心态线程或 LWP)阻塞,可能会阻塞进程
+
+ B. 多处理器环境下,线程间同步不能使用关中断实现
+
+ C. 线程控制块中包含 CPU 寄存器状态
+
+ D. 在支持核心态线程的系统中,CPU 调度的单位仍然是进程
+
+ ***
+
+5. 下面关于操作系统的叙述中正确的是( )。
+
+ A. 从响应时间的角度来看,实时系统与分时系统无本质差别
+
+ B. 多道运行是现代操作系统的特征之一,它是指宏观和微观上都并行
+
+ C. 操作系统的特征是并行性、共享性、虚拟性和不确定性
+
+ D. 在分时系统中,响应时间 $\approx$ 时间片 $\times$ 用户数,因此只要时间片足够小其响应时间一定能改善
+
+ ***
+
+6. 下面的叙述中,( )不是设备管理中引入缓冲机制的主要原因。
+
+ A. 缓和 CPU 和 I/O 设备间的速度不匹配问题
+
+ B. 减少对 CPU 的中断频率和放宽对 CPU 响应时间的限制
+
+ C. 提高 CPU 和 I/O 设备间的并行性
+
+ D. 节省系统内存
+
+ ***
+
+7. 在可变分区管理方案中,若采用“最佳适应”分配算法,通常将空闲区按( )排列。
+
+ A. 容量递增
+
+ B. 容量递减
+
+ C. 地址递增
+
+ D. 地址递减
+
+ ***
+
+8. 某作业访问页面的顺序为 2, 3, 2, 1, 5, 2, 4, 5, 3, 2, 5, 2,分配给该作业三个内存块,则采用 LRU 页面置换算法会产生( )次缺页中断?
+
+ A. 7
+
+ B. 8
+
+ C. 9
+
+ D. 10
+
+***
+
+### 三、简答题(20 分,每题 5 分)
+
+1. 什么是管程?什么是进程?请说明两者之间的关系。
+
+ ***
+
+2. 什么是系统调用,它的作用有哪些?
+
+ ***
+
+3. 微内核结构的优缺点是什么?
+
+ ***
+
+4. 举例说明什么是同步和异步通信?它们的优缺点分别是什么?
+
+***
+
+### 四、问答题(36 分,每题 18 分)
+
+1. 采用银行家算法实现死锁避免策略。假设系统中有 3 种资源类型(A, B, C)和 5 个进程 P1、P2、P3、P4 和 P5。A 资源的数量是 17,B 资源的数量是 5,C 资源的数量是 20,在 T0 时刻系统状态如下表所示。
+
+ | 进程 | 最大资源需求量 A | 最大资源需求量 B | 最大资源需求量 C | 已分配资源数量 A | 已分配资源数量 B | 已分配资源数量 C |
+ | --- | --- | --- | --- | --- | --- | --- |
+ | P1 | 5 | 5 | 9 | 2 | 1 | 2 |
+ | P2 | 5 | 3 | 6 | 4 | 0 | 2 |
+ | P3 | 4 | 0 | 11 | 4 | 0 | 5 |
+ | P4 | 4 | 2 | 5 | 2 | 0 | 4 |
+ | P5 | 4 | 2 | 4 | 3 | 1 | 4 |
+
+ 解答下列问题:
+
+ (1)T0 时刻是否为安全状态?若是,请给出安全序列。
+
+ (2)在 T0 时刻,若进程 P2 请求资源(0,3,4),是否能够实施资源分配?为什么?
+
+ (3)在(2)的基础上,若进程 P4 请求资源(2,0,1),是否能够实施资源分配?为什么?
+
+ ***
+
+2. 一个文件系统中有一个 20MB 大文件和一个 20KB 小文件,当分别采用连续、链接、链接索引、二级索引和 UNIX System V 分配方案时(每块大小为 4096B,每块地址用 4B 表示),问:
+
+ (1)各文件系统管理的最大的文件是多少?
+
+ (2)每种方案对大、小两文件各需要多少专用块来记录文件的物理地址(说明各块的用途)?
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2020-2021\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2020-2021\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..2687807
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2020-2021\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,575 @@
+---
+title: 2020-2021学年上学期期中
+---
+
+## 2020-2021学年上学期期中试卷(含答案)
+
+### 说明
+
+- 原卷标题:华东师范大学期中考试试卷2020—2019学年第一学期,应为误写
+
+### 一、判断题(20 分,每小题 2 分)
+
+判断下列每句话是否正确,如错误请说明理由。
+
+1. 如果信号量 S 的当前值为 -6 时,则表示系统中共有 6 个等待的进程。
+
+
+ 答案:
+
+ 错。S=-6 表示当前有 6 个进程等待进入该信号量所对应的临界区。
+
+
+
+ ***
+
+2. 取值为 0 或者 1 的信号量只能实现互斥访问。
+
+
+ 答案:
+
+ 错。信号量可以实现互斥和同步。
+
+
+
+ ***
+
+3. 线程都保存有各自的栈信息、CPU 状态(寄存器、指令计数器等)、堆信息,以及打开文件列表等。
+
+
+ 答案:
+
+ 错。线程保存栈信息、CPU 状态;而堆信息,以及打开文件列表等是进程保存的。
+
+ (线程实现了资源和调度单位相分离)
+
+
+
+ ***
+
+4. 资源分配图中存在环时,系统中某些进程处于死锁状态。
+
+
+ 答案:
+
+ 错。当每种资源实例个数为一时,在环中的每个进程处于死锁状态。但是当资源实例数量不唯一时,不一定处于死锁状态。
+
+
+
+ ***
+
+5. 在微内核结构的操作系统中,进程间通讯可以不在微内核内。
+
+
+ 答案:
+
+ 错。进程通讯是内核的核心功能,对微内核系统,也在微内核内实现。
+
+
+
+ ***
+
+6. 在多处理器系统中,通过关中断的方式可以解决进程间互斥访问的问题。
+
+
+ 答案:
+
+ 错。在多处理器系统中,关中断不能保证临界区的互斥访问。
+
+
+
+ ***
+
+7. 进程所请求打开的文件打开后,将使进程状态从运行态变为就绪态。
+
+
+ 答案:
+
+ 错。等待态变为就绪态。
+
+
+
+ ***
+
+8. 在生产者-消费者问题中,生产者进程和消费者进程只要解决互斥访问的问题即可。
+
+
+ 答案:
+
+ 错。当 buffer 为空时,只有等待生成者进程完成一个产品生成后,消费者才可以消费。因此,还要解决进程间同步的问题。
+
+
+
+ ***
+
+9. 时间片轮转算法,核心思想是限定任务每次执行的时间,SJF 策略和 STCF 策略,RR 策略不仅无需预知任务的运行时间,且不会出现长任务饥饿的情况。
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+10. 管程中对条件变量的 signal()和信号量中的 signal()操作具有相同的效果。
+
+
+ 答案:
+
+ 错。管程中对条件变量的 signal()可以什么都不做,而信号量中的 signal()操作必然改变信号量的值。
+
+
+
+***
+
+### 二、不定项选择题(30 分,每小题 3 分)
+
+每题有一个或多个答案,答错、少选、多选均不给分。
+
+1. 下列哪个计算机系统的组件定义了使用系统资源解决计算问题的方法?( )
+
+ A. 应用程序
+
+ B. 操作系统
+
+ C. 计算机硬件
+
+ D. 计算机 logo
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 以下哪种进程间通信在微内核中使用?( )
+
+ A. 消息传递
+
+ B. 共享内存
+
+ C. 套接字通信
+
+ D. 全部都是
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+3. 下面哪一个包含可执行代码?( )
+
+ A. 文本(text)部分
+
+ B. 数据(data)部分
+
+ C. 堆(heap)部分
+
+ D. 栈(stack)部分
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+4. 以下哪种情况可能会导致进程从 CPU 中移出?( )
+
+ A. I/O 请求
+
+ B. 创建一个子进程
+
+ C. 中断或者时间片到期
+
+ D. 全部都会
+
+
+ 答案:
+
+ ABCD
+
+
+
+ ***
+
+5. 多线程编程具有以下哪些好处?( )
+
+ A. 反应性
+
+ B. 资源共享
+
+ C. 经济
+
+ D. 可扩展性
+
+ E. 全部都是
+
+
+ 答案:
+
+ ABCDE
+
+
+
+ ***
+
+6. ( )是一个用于计算通过向具有并行和串行组件的应用程序中添加其他计算内核而可能获得的性能提升的方法。
+
+ A. 任务并行
+
+ B. 数据并行
+
+ C. 数据分割
+
+ D. 阿姆达尔(Amdahl)定律
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+7. 可以在以下哪种情况下进行抢占式调度?( )
+
+ A. 当进程从运行状态切换到等待状态时
+
+ B. 当进程从等待状态切换到就绪状态时
+
+ C. 进程终止时
+
+ D. 以上都不是
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+8. 以下哪种调度算法可能会出现护航效应(convoy effect)?( )
+
+ A. SJF
+
+ B. FCFS
+
+ C. RR
+
+ D. Multilevel queue
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+9. 假设 count 是一个变量名,以下哪个操作是原子的?( )
+
+ A. count++
+
+ B. count--
+
+ C. 两者都是
+
+ D. 两者都不是
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+10. 通常认为 OpenMP 中的临界区编译器指令比标准互斥锁更易于使用,因为( )
+
+ A. 进入和退出代码由 OpenMP 库管理,从而减少了编程错误的可能性。
+
+ B. 程序员不必担心竞争条件。
+
+ C. 线程不能在临界区内部阻塞。
+
+ D. 不会发生死锁。
+
+
+ 答案:
+
+ A
+
+
+
+***
+
+### 三、简答题(15 分,每小题 5 分)
+
+1. 列举 3 种减少上下文切换(context switch)开销的方法。
+
+
+ 答案:
+
+ - 使用较少的内核线程(例如,事件驱动编程或有界线程池)。
+ - 减少模式切换的次数(例如,用户级调度)。
+ - 使用较少切换线程的调度算法(例如,FIFO 而不是 RR)。
+
+ (每个要点包含多个可能的答案。列出部分即可)
+
+
+
+ ***
+
+2. SRTF 在什么指标上是最优的;在什么指标上 FCFS 优于 RR?
+
+
+ 答案:
+
+ SRTF(最短剩余时间调度)具有最佳平均响应时间的调度。
+
+ FCFS 在吞吐量指标上优于 RR,也节省了上下文切换的开销。
+
+
+
+ ***
+
+3. 某系统的线程有 3 个状态分别是 Ready,Running 和 Waiting,请列出所有可能的转化情况和典型条件。
+
+
+ 答案:
+
+ 1. Ready->Running:当进程调度程序从就绪队列中选取一个进程投入运行;
+
+ 2. Running->Ready:正在执行的进程如因时间片用完而被暂停执行;
+
+ 3. Running->Waiting:正在执行的进程因等待的事件尚未发生而无法执行(如进程请求完成 I/O);
+
+ 4. Waiting->Ready:当进程等待的事件发生时(如 I/O 完成)。
+
+
+
+***
+
+### 四、综合题(35 分)
+
+1. (10 分)下面有三段程序,对每段程序,判断在程序的所有进程结束后,file.txt 可能的内容是?(多选)
+
+ A. (空)
+
+ B. a
+
+ C. b
+
+ D. aa
+
+ E. ab
+
+ F. ba
+
+ G. bb
+
+ 提示:
+
+ - open、fopen、fork、pthread_create、malloc、realloc 调用默认成功。
+ - read、write、dup、dup2 调用默认成功(如果文件描述符参数合法)。
+ - 必要的头文件已包含。
+ - file.txt 初始为空。
+ - 所有进程都能进展,但对调度先后没有预设。
+
+ **程序一:**
+
+ ```c
+ int main(int argc, char** argv)
+ {
+ if (fork() == 0) {
+ int fd1 = open("file.txt", O_WRONLY);
+ write(fd1, "a", 1);
+ } else {
+ int fd2 = open("file.txt", O_WRONLY);
+ write(fd2, "b", 1);
+ }
+ }
+ ```
+
+
+ 答案:
+
+ BC
+
+
+
+ **程序二:**
+
+ ```c
+ char buffer;
+
+ int main(int argc, char** argv)
+ {
+ int fd = open("file.txt", O_WRONLY);
+ if (fork() == 0) {
+ buffer = 'a';
+ } else {
+ buffer = 'b';
+ }
+ write(fd, &buffer, 1);
+ }
+ ```
+
+
+ 答案:
+
+ EF
+
+
+
+ **程序三:**
+
+ ```c
+ int fd;
+
+ void* helper(void* arg)
+ {
+ write(fd, "a", 1);
+ }
+
+ int main(int argc, char** argv)
+ {
+ fd = open("file.txt", O_WRONLY);
+ pthread_t thread;
+ pthread_create(&thread, NULL, helper, NULL);
+ write(fd, "b", 1);
+ }
+ ```
+
+
+ 答案:
+
+ CEF
+
+
+
+ ***
+
+2. (25 分,每小题 5 分)阅读以下 C 程序,回答相应死锁与调度的问题。
+
+ ```c
+ pthread_mutex_t x, y, z;
+
+ void* a(void* arg)
+ {
+ pthread_mutex_lock(&y);
+ pthread_mutex_lock(&z);
+ pthread_mutex_unlock(&y);
+ pthread_mutex_unlock(&z);
+ return NULL;
+ }
+
+ void* b(void* arg)
+ {
+ pthread_mutex_lock(&z);
+ pthread_mutex_lock(&x);
+ pthread_mutex_unlock(&z);
+ pthread_mutex_unlock(&x);
+ return NULL;
+ }
+
+ void* c(void* arg)
+ {
+ pthread_mutex_lock(&x);
+ pthread_mutex_lock(&y);
+ pthread_mutex_unlock(&x);
+ pthread_mutex_unlock(&y);
+ return NULL;
+ }
+
+ int main(int argc, char** argv)
+ {
+ pthread_mutex_init(&x, NULL);
+ pthread_mutex_init(&y, NULL);
+ pthread_mutex_init(&z, NULL);
+
+ pthread_t a_thread, b_thread, c_thread;
+
+ pthread_create(&a_thread, NULL, a, NULL);
+ pthread_create(&b_thread, NULL, b, NULL);
+ pthread_create(&c_thread, NULL, c, NULL);
+
+ pthread_join(&a_thread, NULL);
+ pthread_join(&b_thread, NULL);
+ pthread_join(&c_thread, NULL);
+
+ return 0;
+ }
+ ```
+
+ (1)写出一种导致死锁的执行顺序。执行顺序是指线程获取和释放锁的序列。以类似以下语句序列的形式写出,例如“THREAD 调用 lock_acquire(LOCK)”或“THREAD 调用 lock_release(LOCK)”,其中 THREAD 指 a, b, c 之一,LOCK 指 x, y, z 之一。
+
+
+ 答案:
+
+ a 调用 lock_acquire(&y),
+
+ b 调用 lock_acquire(&z),
+
+ c 调用 lock_acquire(&x),
+
+ a 调用 lock_acquire(&z),
+
+ b 调用 lock_acquire(&x),
+
+ c 调用 lock_acquire(&y)
+
+
+
+ (2)在以上你提供的执行顺序中,第一个不安全(unsafe)的状态是什么,它在序列中发生的位置?
+
+
+ 答案:
+
+ 上述执行顺序中的第一个不安全状态是 a 持有 y、b 持有 z、c 持有 x。它出现在前三个语句之后。
+
+
+
+ (3)是否可以通过改变每个线程解锁互斥锁的顺序来解决死锁?(如是请写出;如否请解释)
+
+
+ 答案:
+
+ 不,因为死锁发生在任何线程解锁互斥锁之前。
+
+
+
+ (4)假设底层操作系统使用 FCFS 调度程序。对于这个特定的调度程序,程序容易死锁吗?(如是请写出;如否请解释)
+
+
+ 答案:
+
+ 不。FCFS 调度程序会运行每个线程直到结束。因此,锁没有竞争问题(所有锁操作都不会阻塞)。
+
+
+
+ (5)使用抢占式线程调度程序会消除死锁的可能性吗?
+
+
+ 答案:
+
+ 不,不会消除死锁的可能性。虽然抢占式调度程序会从线程抢占 CPU,但它不会抢占他们持有的锁。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
new file mode 100644
index 0000000..931af94
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -0,0 +1,1438 @@
+---
+title: 2021-2022学年下学期期末
+---
+
+## 2021-2022学年下学期期末试卷(A)
+
+### 一、选择题
+
+1. ( )不是操作系统的功能。
+
+ A. CPU 管理
+
+ B. 存储管理
+
+ C. 网络管理
+
+ D. 数据管理
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+2. 计算机开机后,操作系统最终被加载到( )。
+
+ A. BIOS
+
+ B. ROM
+
+ C. EPROM
+
+ D. RAM
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+3. 要实现两个进程互斥,设一个互斥信号量 `mutex`,当 `mutex` 为 0 时,表示( )。
+
+ A. 没有进程进入临界区
+
+ B. 有一个进程进入临界区
+
+ C. 有一个进程进入临界区,另外一个进程在等候
+
+ D. 两个进程都进入临界区
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. 与单道程序相比,多道程序系统的优点是( )
+
+ I. CPU 利用率高
+
+ II. 系统开销小
+
+ III. 系统吞吐量大
+
+ IV. I/O 设备利用率高
+
+ A. 仅 I、III
+
+ B. 仅 I、IV
+
+ C. 仅 II、III
+
+ D. 仅 I、III、IV
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+5. 为多道程序提供的共享资源不足时,可能会产生死锁,但是,不当的( )也可能产生死锁。
+
+ A. 进程调度顺序
+
+ B. 进程的优先级
+
+ C. 时间片大小
+
+ D. 进程推进顺序
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+6. 下列关于 SPOOLing 技术的叙述中,错误的是( )
+
+ A. 需要外存的支持
+
+ B. 需要多道程序设计技术的支持
+
+ C. 可以让多个作业共享一台独占设备
+
+ D. 由用户作业控制设备与输入/输出之间的数据传送
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+7. 用户程序发出磁盘 I/O 请求后,系统的正确处理流程是( )
+
+ A. 用户程序→系统调用处理程序→中断处理程序→设备驱动程序
+
+ B. 用户程序→系统调用处理程序→设备驱动程序→中断处理程序
+
+ C. 用户程序→设备驱动程序→系统调用处理程序→中断处理程序
+
+ D. 用户程序→设备驱动程序→中断处理程序→系统调用处理程序
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+8. 已知某磁盘的平均转速为 $r$ 秒/转,平均寻找时间为 $T$ 秒,每个磁道可以存储的字节数为 $N$,现向该磁盘读写 $b$ 字节的数据,采用随机寻道的方法,每道的所有扇区组成一个簇,其平均访问时间是( )。
+
+ A. $(r+T)b/N$
+
+ B. $b/NT$
+
+ C. $r(b/N+T)$
+
+ D. $bT/N+r$
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+9. 某文件系统的簇和磁盘块大小分别为 $1KB$ 和 $512B$,若一个文件的大小为 $1026B$,则系统分配给该文件的磁盘空间大小是( )。
+
+ A. $1026B$
+
+ B. $1536B$
+
+ C. $1538B$
+
+ D. $2048B$
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+10. 当系统发生抖动(Trashing)时,可以采取的有效措施是( )。
+
+ I. 撤销部分进程
+
+ II. 增大磁盘交换区的容量
+
+ III. 提高用户进程的优先级
+
+ A. 仅 I
+
+ B. 仅 II
+
+ C. 仅 III
+
+ D. 仅 I、II
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+11. 系统为某进程分配了 4 个页框,该进程已访问的页号序列为 2,0,2,9,3,4,2,8,2,4,8,4,5,若进程要访问的下页的页号为 7,依据 LRU 算法,应淘汰的页号是( )。
+
+ A. 2
+
+ B. 3
+
+ C. 4
+
+ D. 8
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+12. 要保证一个程序在主存中被改变了存放位置后仍能正确地执行,则对主存空间应采用( )技术。
+
+ A. 静态重定位
+
+ B. 动态重定位
+
+ C. 动态分配
+
+ D. 静态分配
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+### 二、填空题
+
+13. 当多个线程协作完成一项任务时,线程间必须通过 $\underline{\qquad}$ 来实现协作工作。
+
+
+ 答案:
+
+ PV 操作
+
+
+
+ ***
+
+14. 在 $\underline{\qquad}$ 和 $\underline{\qquad}$ 存储管理中,页式存储管理提供的逻辑地址是连续的。
+
+
+ 答案:
+
+ 页式、段式
+
+
+
+ ***
+
+15. 可靠的信箱通信规则是:若发送信件时信箱已满,则发送进程被置成等信箱状态,直到信箱不满时才被释放。若取信件时信箱中无信,则接收进程被置成 $\underline{\qquad}$ 状态,直到有信件时才被释放。
+
+
+ 答案:
+
+ 等信件
+
+
+
+ ***
+
+16. UNIX 系统规定用户使用文件的权限是读、$\underline{\qquad}$ 和 $\underline{\qquad}$ 三种。
+
+
+ 答案:
+
+ 写、执行
+
+
+
+ ***
+
+17. 死锁的形成,除了与资源的 $\underline{\qquad}$ 有关外,也与并发进程的 $\underline{\qquad}$ 有关。
+
+
+ 答案:
+
+ 分配策略(或管理方法)、执行速度(或调度策略)
+
+
+
+ ***
+
+18. 对于移动臂磁盘,磁头在移动臂的带动下,移动到指定柱面的时间称 $\underline{\qquad}$ 时间,而指定扇区旋转到磁头位置的时间称 $\underline{\qquad}$ 时间。
+
+
+ 答案:
+
+ 寻找、延迟
+
+
+
+ ***
+
+19. 操作系统中,进程调度通常有先来先服务、$\underline{\qquad}$、$\underline{\qquad}$ 和分级调度算法等调度算法。
+
+
+ 答案:
+
+ 优先数调度算法、时间片轮转调度算法
+
+
+
+ ***
+
+20. 主存储器与外围设备之间的 $\underline{\qquad}$ 操作称为输入输出操作。
+
+
+ 答案:
+
+ 信息传送
+
+
+
+ ***
+
+### 三、判断题
+
+21. 所谓最近最少使用( )
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+22. 优先级是进程调度的重要依据,优先数大的进程首先被调度运行。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+23. 存储保护的目的是限制内存的分配。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+24. 优先数是进程调度的重要依据,一旦确定不能改变。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+25. 操作系统的所有程序都必须常驻内存。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+26. 同一文件系统中不允许文件同名,否则会引起混乱。( )
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+27. 在页式虚拟存储系统中,页面长度是根据程序长度动态性分配的。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+28. 不可抢占式动态优先数法一定会引起进程长时间得不到运行。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+29. 所有进程都挂起时,系统陷入死锁。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+30. 在请求页式存储管理中,页面淘汰所花费的时间不属于系统开销。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+31. 用户程序有时也可以在核心态下运行。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+32. 当一个进程从等待态变成就绪态,则一定有一个进程从就绪态变成运行态。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+### 四、名词解释题
+
+33. 管程:
+
+
+ 答案:
+
+ 管程是一种高级同步机制。一个管程定义一个数据结构和能为并发进程在其上执行的一组操作,这组操作能使进程同步和改变管程中的数据。
+
+
+
+ ***
+
+34. 存储设备:
+
+
+ 答案:
+
+ 它们是指计算机用来存储信息的设备,如磁盘(硬盘和软盘)、磁带等。
+
+
+
+ ***
+
+35. 中断响应:
+
+
+ 答案:
+
+ 发生中断时,CPU 暂停执行当前的程序,转去处理中断这个由硬件对中断请求做出反应的过程,称为中断响应。
+
+
+
+ ***
+
+36. 当前目录:
+
+
+ 答案:
+
+ 为节省文件检索的时间,每个用户可以指定一个目录作为当前工作目录,以后访问文件时,就从这个目录开始向下顺序检索,这个目录就称作“当前目录”。
+
+
+
+ ***
+
+37. 路径:
+
+
+ 答案:
+
+ 在树形目录结构中,从根目录出发经由所需子目录到达指定文件的通路。
+
+
+
+ ***
+
+38. 响应时间:
+
+
+ 答案:
+
+ 是分时系统的一个技术指标,指从用户输入命令到系统对命令开始执行和显示所需要的时间。
+
+
+
+ ***
+
+### 五、简答题
+
+39. 虚拟存储器的基本特征是什么?虚拟存储器给用户主要受哪两方面的限制?
+
+
+ 答案:
+
+ 虚拟存储器的基本特征是:①虚拟扩充,即不是物理上而是逻辑上扩充了内存容量;②部分装入,即每个作业不是全部一次性地装入内存,而是只装入一部分;③离散分配,即不必占用连续的内存空间,而是“见缝插针”;多次对换,即所需的全部程序和数据要分成多次调入内存;虚拟存储器的容量主要受到指令中表示地址的字长和外存的容量的限制。
+
+
+
+ ***
+
+40. 什么是虚拟存储器,它有什么特点?
+
+
+ 答案:
+
+ 虚拟存储器是一种存储管理技术,用以完成用小的内存实现大的虚空间中程序的运行工作。它是由操作系统提供的一个假想的特大存储器。但是虚拟存储器的容量并不是无限的,它由计算机的地址结构长度所确定,另外虚存中的扩大是以牺牲 CPU 工作时间以及内、外存交换时间为代价的。
+
+
+
+ ***
+
+41. 主存空间信息保护有哪些措施?
+
+
+ 答案:
+
+ ①程序自己不存取该区的信息,允许它既可读,又可写;②共享区域中的信息只可读,不可修改;③非共享区域或非自己的主存区域中的信息既不可读,也不可写。
+
+
+
+ ***
+
+42. 处理机调度分为哪三级?各自的主要任务是什么?
+
+
+ 答案:
+
+ 作业调度:从一批后备作业中选择一个或几个作业,给它们分配资源,建立进程,挂入就绪队列。执行完后,回收资源。
+
+ 进程调度:从就绪进程队列中根据某个策略选取一个进程,使之占用 CPU。
+
+ 交换调度:按照给定的原则和策略,将外存交换区中的进程调入内存,把内存中的非执行进程交换到外存交换区。
+
+
+
+ ***
+
+43. 系统调用的执行过程分为哪几步?
+
+
+ 答案:
+
+ 系统调用的执行过程分成以下几步:(1)设置系统调用号和参数;(2)系统调用命令的一般性处理;(3)系统调用命令处理程序完成具体处理。
+
+
+
+ ***
+
+44. 一个具有分时兼批处理功能的操作系统应怎样调度和管理作业。
+
+
+ 答案:
+
+ 1)优先接纳终端作业,仅当终端作业数小于系统可以允许同时工作的作业数时,可以调度批处理作业。
+
+ 2)允许终端作业和批处理作业混合同时执行。
+
+ 3)把终端作业的就绪进程排成一个就绪队列,把批处理作业的就绪进程排入另外的就绪队列中。
+
+ 4)让终端作业进程响应时间优先,以保证其按“时间片轮转”法运行。没有终端作业时按响应算法选批处理作业就绪进程运行。
+
+
+
+ ***
+
+### 六、综合题
+
+45. 假定某计算机系统有 R1 设备 3 台、R2 设备 4 台,它们被 P1、P2、P3 和 P4 这 4 个进程所共享,且已知这 4 个进程均以下面所示的顺序使用现有设备:
+
+ →申请 R1→申请 R2→申请 R1→释放 R1→释放 R2→释放 R1→
+
+ 1)系统运行过程中是否有产生死锁的可能?为什么?
+
+ 2)如果有可能产生死锁,请列举一种情况,并画出表示该死锁状态的进程-资源图。
+
+
+ 答案:
+
+ 1)系统运行过程中有可能产生死锁。根据题意,系统中只有 3 台 R1 设备,它们受被 4 个进程共享,且每个进程对 R1 设备的最大需求为 2,由于 R1 设备数量不足,而且它又是一个互斥、不可剥夺的资源,而系统又没采取任何措施破坏死锁产生的剩余两个必要条件,请求与保持条件和环路等待条件,因此,在系统运行过程中可能会发生死锁。
+
+ 2)P1、P2、P3 进程各得到一个 R1 设备时,它们可继续运行,并均可顺利地申请到一个 R2 设备;当第一次申请 R1 设备时,因为系统已无空闲的 R1 设备,故它们全部阻塞,并进入循环等待的死锁状态。这种死锁状态下的进程-资源图如下所示。
+
+ 
+
+
+
+ ***
+
+46. 设有 P1、P2、P3,三个进程共享某一资源 F,P1 对 F 只读不写,P2 对 F 只写不读,P3 对 F 先读后写。当一个进程写 F 时,其他进程对 F 不能进行读写,但多个进程同时读 F 是允许的。使用 PV 操作正确实现 P1、P2、P3 三个进程的同步互斥。要求:并发性从大到小对上述 3 种办法进行排序。
+
+
+ 答案:
+
+ :::tip
+ 原参考答案未给出排序内容,仅给出 PV 实现。
+ :::
+
+ 本题实质是“一个读者-写者问题”。P1 是一个读者,P2 是个写者,为了使 F 的并发度较高,将 P3 先看成读者,当其完成读操作后,再将其看成写者。算法中需要用到如下的变量定义:
+
+ ```c
+ int readcount=0;
+
+ semaphore rmutex=1;
+
+ semaphore mutex=1;
+ ```
+
+ 响应进程可描述为:P1()
+
+ ```c
+ while (1)
+
+ P(rmutex);
+
+ if(readcount==0)P(mutex);
+
+ readcount++
+
+ V(rmutex);
+
+ READF P(rmutex):
+
+ readcount--;
+
+ if(readcount==0)V(mutex);
+
+ V(rmutex):
+
+ }
+
+ ```
+
+ P2():
+
+ ```c
+ while(1){
+
+ P(mutex):
+
+ WRITE F
+
+ V(mutex):
+
+ }
+
+ ```
+
+ P3(){
+
+ ```c
+ while(1){
+
+ P(rmutex)
+
+ if(readcount==0)
+
+ P(mutex);
+
+ readcount++;
+
+ V(rmutex):
+
+ READ FP(rmutex);
+
+ readcount--;
+
+ if(readcount==0)V(mutex):
+
+ V(rmutex);
+
+ P(mutex);
+
+ WRITE F
+
+ V(mutex);
+
+ }
+
+ }
+ ```
+
+
+
+ ***
+
+47. 在 UNIX 操作系统中,给文件分配外存空间采用的是混合索引分配方式,如图所示,UNIX 系统中的某个文件的索引节点指出了为该文件分配的外存的物理块的寻找方法。在该索引节点中,有 10 个直接块(每个直接块都直接指向一个数据块),有一个一级间接块,一个二级间接块以及一个三级间接块,间接块指向的是一个索引块,每个索引块和数据块的大小均为 $4KB$,而 UNIX 系统中地址所占空间为 $4B$(指针大小为 $4B$)。假设以下问题都建立在该索引节点已经在内存中的前提下。
+
+ 1)文件的大小为多大时可以只用到索引节点的直接块?
+
+ 2)该索引节点能访问到的地址空间大小总共为多大?要求小数点后保留 2 位。
+
+ 3)若要读取一个文件的第 $10000B$ 的内容,需要访问磁盘多少次?
+
+ 4)若要读取一个文件的第 $10MB$ 的内容,需要访问磁盘多少次?
+
+
+ 答案:
+
+ 本题考查的是对索引分配方式的理解,只需明白索引分配方式组织外存分配的原理即可。计算其实并不难,其中要牢牢抓住的一点是:索引块其实也是物理块,也需要存储在外存上。
+
+ 1)对于只用到索引节点的直接块,这个文件应该能全部在 10 个直接块指向的数据块中放下,而数据块的大小为 $4KB$,所以该文件大小应该 $<4KBx10=40KB$,即文件的大小小于或,等于 $40KB$ 时,可以只用到索引节点的直接块。
+
+ 2)只需要算出索引节点指向的所有数据块的块数,再乘以数据块的大小即可。直接块指向的数据块数 = 10 块。一级间接块指向的索引块里的指针数 = $4KB/4B=1024$ 个,所以一级间接块指向的数据块数为 1024 块。二级间接块指向的索引块里的指针数 = $4KB/4B=1024$ 个,指向的索引块里再拥有 $4KB/4B=1024$ 个指针数。所以二级间接块指向的数据块数 = $(4KB/4B)^2=1024^3$ 块。三级间接块指向的数据块数 = $(4KB/4B)^3=1024^3$ 块。所以,该索引节点能访问到的地址空间大小为
+
+ $$
+ \left(10 + 1 \times \frac{4KB}{4B} + 1 \times \left(\frac{4KB}{4B}\right)^2 + 1 \times \left(\frac{4KB}{4B}\right)^3\right) \times 4KB = 4100GB = 4.00TB
+ $$
+
+ 3)因为 $10000B/4KB=2.44$,所以第 $10000B$ 的内容存放在第 3 个直接块中,所以若要读取一个文件的第 $10000B$ 的内容,需要访问磁盘 1 次。
+
+ 4)因为 $10MB$ 的内容需要数据块数 = $10MB/4KB=2.5K$ 块。直接块和一级间接块指向的数据块数 = $10+(4KB/4B)=1034$ 块 $<2.5K$ 块。直接块和一级间接块以及二级间接块的数据块数,$=10+(4KB/4B)+(4KB/4B)^2>1M$ 块 $>2.5K$ 块。所以第 $10MB$ 的数据应该在二级间接块下属的某个数据块中,所以若要读取一个文件的第 $10MB$ 的内容,需要访问磁盘 3 次。
+
+
+
+
+***
+
+## 2021-2022学年下学期期末试卷(B)(含答案)
+
+### 一、选择题
+
+1. 采用 SPOOLing 技术将磁盘的一部分作为公共缓冲区以代替打印机,用户对打印机的操作实际上是对磁盘的存储操作,用以代替打印机的部分是( )。
+
+ A. 独占设备
+
+ B. 共享设备
+
+ C. 虚拟设备
+
+ D. 一般物理设备
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+2. 操作系统的 I/O 子系统通常由 4 个层次组成,每一层明确定义了与邻近层次的接口,其合理的层次组织排列顺序是( )。
+
+ A. 用户级 I/O 软件、设备无关软件、设备驱动程序、中断处理程序
+
+ B. 用户级 I/O 软件、设备无关软件、中断处理程序、设备驱动程序
+
+ C. 用户级 I/O 软件、设备驱动程序、设备无关软件、中断处理程序
+
+ D. 用户级 I/O 软件、中断处理程序、设备无关软件、设备驱动程序
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+3. 作业在执行中发生缺页中断,经操作系统处理后应让其执行( )指令。
+
+ A. 被中断的前一条
+
+ B. 被中断的那一条
+
+ C. 被中断的后一条
+
+ D. 启动时的第一条
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+4. 假定某页式管理系统中,主存为 $128\ \text{KB}$,分成 32 块,块号为 0,1,2,3,……,31;某作业有 5 块,其页号为 0,1,2,3,4,被分别装入主存的 3,8,4,6,9 块中。有一逻辑地址为 [3,70]。试求出相应的物理地址(其中方括号中的第一个元素为页号,第二个元素为页内地址,按十进制计算)( )。
+
+ A. 14646
+
+ B. 24646
+
+ C. 24576
+
+ D. 34576
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 在一个操作系统中对内存采用页式存储管理方法,则所划分的页面大小( )。
+
+ A. 要依据内存大小而定
+
+ B. 必须相同
+
+ C. 要依据 CPU 的地址结构而定
+
+ D. 要依据内存和外存而定
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+6. 在下列选项中,( )不属于操作系统提供给用户的可使用资源。
+
+ A. 中断机制
+
+ B. 处理机
+
+ C. 存储器
+
+ D. I/O 设备
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+7. 假设 5 个进程 P0、P1、P2、P3、P4 共享 3 类资源 R1、R2、R3。这些资源总数分别为 18、6、22。$T_0$ 时刻的资源分配情况(见表),此时存在的一个安全序列是( )。
+
+ 
+
+ A. P0, P2, P4, P1, P3
+
+ B. P1, P0, P3, P4, P2
+
+ C. P2, P1, P0, P3, P4
+
+ D. P3, P4, P2, P1, P0
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+8. 文件的顺序存取是( )。
+
+ A. 按终端号依次存取
+
+ B. 按文件的逻辑号逐一存取
+
+ C. 按物理块号依次存取
+
+ D. 按文件逻辑记录大小逐存取
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+9. 如果文件采用直接存取方法,且文件大小不固定,则应采用( )物理结构。
+
+ A. 直接
+
+ B. 索引
+
+ C. 随机
+
+ D. 顺序
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+10. 可以被多个进程在任意时刻共享的代码必须是( )。
+
+ A. 顺序代码
+
+ B. 机器语言代码
+
+ C. 不能自身修改的代码
+
+ D. 无转移指令代码
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+11. 有 5 个批处理任务 A、B、C、D、E 几乎同时到达一计算中心。它们预计运行的时间分别是 $10\ \text{min}$,$6\ \text{min}$,$2\ \text{min}$、$4\ \text{min}$ 和 $8\ \text{min}$。其优先级(由外部设定)分别为 3,5,2,1 和 4,这里 5 为最高优先级。下列各种调度算法中,其平均进程周转时间为 $14\ \text{min}$ 的是( )。
+
+ A. 时间片轮转调度算法
+
+ B. 优先级调度算法
+
+ C. 先来先服务调度算法
+
+ D. 最短作业优先调度算法
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+12. 某计算机系统中有 8 台打印机,有 K 个进程竞争使用,每个进程最多需要 3 台打印机,该系统可能会发生死锁的 K 的最小值是( )。
+
+ A. 2
+
+ B. 3
+
+ C. 4
+
+ D. 5
+
+
+ 答案:
+
+ C
+
+
+
+***
+
+### 二、填空题
+
+13. 在设备管理中,对磁带机、输入机及打印机等独占设备总是采用 $\underline{\qquad}$ 策略进行分配。
+
+
+ 答案:
+
+ 静态分配
+
+
+
+ ***
+
+14. 同一进程中的各线程 $\underline{\qquad}$ 进程所占用的资源。
+
+
+ 答案:
+
+ 共享
+
+
+
+ ***
+
+15. MS-DOS 启动的方式有两种:$\underline{\qquad}$ 和 $\underline{\qquad}$。
+
+
+ 答案:
+
+ 冷启动、热启动
+
+
+
+ ***
+
+16. 操作系统能保证所有的进程 $\underline{\qquad}$,则称系统处于“安全状态”,不会产生 $\underline{\qquad}$。
+
+
+ 答案:
+
+ 在有限时间内得到所需全部资源、死锁
+
+
+
+ ***
+
+17. 计算机系统中引导程序的作用是 $\underline{\qquad}$ 和 $\underline{\qquad}$。
+
+
+ 答案:
+
+ 进行系统初始化工作、把 OS 的核心程序装入主存
+
+
+
+ ***
+
+18. 通道把通道程序执行情况记录在 $\underline{\qquad}$ 中;通道完成一次输入输出操作后,以 $\underline{\qquad}$ 方式请求中央处理器进行干预。
+
+
+ 答案:
+
+ 通道状态字(或 CSW)、中断(或 I/O 中断)
+
+
+
+ ***
+
+19. 引起死锁的四个必要条件是 $\underline{\qquad}$、保持和等待、$\underline{\qquad}$、$\underline{\qquad}$。
+
+
+ 答案:
+
+ 互斥使用、非剥夺性、循环等待
+
+
+
+ ***
+
+20. 对于移动臂磁盘,磁头在移动臂的带动下,移动到指定柱面的时间称 $\underline{\qquad}$ 时间,而指定扇区旋转到磁头位置的时间称 $\underline{\qquad}$ 时间。
+
+
+ 答案:
+
+ 寻找、延迟
+
+
+
+***
+
+### 三、判断题
+
+21. 文件系统的主要目的是存储系统文档。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+22. 引入缓冲的主要目的是提高 I/O 设备的利用率。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+23. 进程申请 CPU 得不到满足时,其状态变为等待态。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+24. 存储保护的功能是限制内存存取。( )
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+25. 由于现代操作系统提供了程序共享的功能,所以要求被共享的程序必须是可再入程序。( )
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+26. 一旦出现死锁,所有进程都不能运行。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+27. 在文件系统中,打开文件是指创建一个文件控制块。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+28. 在页式虚拟存储系统中,页面长度是根据程序长度动态地分配的。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+29. 系统处于不安全状态不一定是死锁状态。( )
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+30. 不可抢占式动态优先数法一定会引起进程长时间得不到运行。( )
+
+
+ 答案:
+
+ 错
+
+
+
+ ***
+
+31. 清内存指令只能在管态下执行。( )
+
+
+ 答案:
+
+ 对
+
+
+
+ ***
+
+32. 如果信号量 S 的当前值为 -5,则表示系统中共有 5 个等待进程。( )
+
+
+ 答案:
+
+ 错
+
+
+
+***
+
+### 四、名词解释题
+
+33. 原语:
+
+
+ 答案:
+
+ 指操作系统中实现一些具有特定功能的程序段,这些程序段的执行过程是不可分割的,即其执行过程不允许被中断。
+
+
+
+ ***
+
+34. 断点:
+
+
+ 答案:
+
+ 发生中断时,被打断程序的暂停点称为断点。
+
+
+
+ ***
+
+35. 虚拟设备:
+
+
+ 答案:
+
+ 它是利用共享设备上的一部分空间来模拟独占设备的一种 I/O 技术。
+
+
+
+ ***
+
+36. 物理地址:
+
+
+ 答案:
+
+ 内存中各存储单元的地址由统一的基地址顺序编址,这种地址称为物理地址。
+
+
+
+ ***
+
+37. 当前目录:
+
+
+ 答案:
+
+ 为节省文件检索的时间,每个用户可以指定一个目录作为当前工作目录,以后访问文件时,就从这个目录开始向下顺序检索。这个目录就称作当前目录。
+
+
+
+ ***
+
+38. 死锁防止:
+
+
+ 答案:
+
+ 要求进程申请资源时遵循某种协议,从而打破产生死锁的四个必要条件中的一个或几个,保证系统不会进入死锁状态。
+
+
+
+***
+
+### 五、简答题
+
+39. 试简述页式存储管理的优缺点。
+
+
+ 答案:
+
+ 优点:有效地解决了碎片问题;缺点:程序的最后一页会有浪费空间的现象并且不能应用在分段编写的、非连续存放的大型程序中。
+
+
+
+ ***
+
+40. 虚拟存储器的基本特征是什么?虚拟存储器的容量主要受到哪两方面的限制?
+
+
+ 答案:
+
+ 虚拟存储器的基本特征是:① 虚拟扩充,即不是物理上而是逻辑上扩充了内存容量;② 部分装入,即每个作业不是全部一次性地装入内存,而是只装入一部分;③ 离散分配,即不必占用连续的内存空间,而是“见缝插针”;多次对换,即所需的全部程序和数据要分成多次调入内存;虚拟存储器的容量主要受到指令中表示地址的字长和外存的容量的限制.
+
+
+
+ ***
+
+41. 系统调用的执行过程分可分为哪几步?
+
+
+ 答案:
+
+ 系统调用的执行过程分成以下几步:(1)设置系统调用号和参数;(2)系统调用命令的一般性处理;(3)系统调用命令处理程序做具体处理。
+
+
+
+ ***
+
+42. 一个具有分时兼批处理功能的操作系统应怎样调度和管理作业。
+
+
+ 答案:
+
+ 1)优先接纳终端作业,仅当终端作业数小于系统可以允许同时工作的作业数时,可以调度批处理作业,2)允许终端作业和批处理作业混合同时执行.3)把终端作业的就绪进程排成一个就绪队列,把批处理作业的就绪进程排入另外的就绪队列中.4)有终端作业进程就绪时,优先让其按“时间片轮转”法先运行.没有终端作业时再按确定算法选批处理作业就绪进程运行
+
+
+
+ ***
+
+43. 试述分区管理方案的优缺点。
+
+
+ 答案:
+
+ 优点:算法较简单,容易实现,内存开销少,存储保护措施简单.缺点:内存使用不充分,存在较严重的碎片问题,
+
+
+
+ ***
+
+44. 主存空间信息保护有哪些措施?
+
+
+ 答案:
+
+ ① 程序自己主存区域的信息,允许它既可读,又可写;② 共享区域中的信息只可读,不可修改;③ 非共享区域或非自己的主存区域中的信息既不可读,也不可写。
+
+
+
+***
+
+### 六、综合题
+
+45. 当前磁盘读写位于柱面号 20,此时有多个磁盘请求以下列柱面号顺序送到磁盘驱动器:10、22、2、40、6、38。在寻道时,移动一个柱面需要 $6\ \text{ms}$,按照先来先服务算法和电梯算法(方向从 0 到 40)计算所需的总寻道时间。
+
+
+ 答案:
+
+ 1)先来先服务算法:寻道的次序为 20、10、22、2、40、6、38。总的寻道时间为 $(10+12+20+38+34+32)\times6\ \text{ms}=876\ \text{ms}$.
+
+ 2)电梯算法(方向从 0 到 40):寻道的次序为 20、22、38、40、10、6、2。总的寻道时间为 $(2+16+2+30+4+4)\times6\ \text{ms}=348\ \text{ms}$.
+
+
+
+ ***
+
+46. 某计算机主存按字节编址,逻辑地址和物理地址都是 32 位,页表项大小为 4 字节。请回答下列问题。
+
+ 1)若使用一级页表的分页存储管理方式,逻辑地址结构为:
+
+ 
+
+ 2)若使用二级页表的分页存储管理方式,逻辑地址结构为:
+
+ 
+
+ 设逻辑地址为 LA. 请分别给出其对应的页目录号和页表索引的表达式。
+
+ 3)采用 1)中的分页存储管理方式,一个代码段起始逻辑地址为 00008000H,其长度为 $8\ \text{KB}$,被装载到从物理地址 00900000H 开始的连续主存空间中。页表从主存 0020 0000H 开始的物理地址处连续存放,如图所示(地址大小自下向上递增)。请计算出该代码段对应的两个页表项的物理地址、这两个页表项中的页框号以及代码页面 2 的起始物理地址。
+
+ 
+
+
+ 答案:
+
+ 1)因为页内偏移量是 12 位,按字节编址,所以页大小为 $2^{12}\ \text{B}=4\ \text{KB}$,页表项数为 $2^{32}/4K=2^{20}$,又页表项大小为 4 字节,因此一级页表最大为 $2^{20}\times4\ \text{B}=4\ \text{MB}$。
+
+ 2)页目录号可表示为 `(((unsigned int)(LA)) >> 22) & 0x3FF`。页表索引可表示为 `(((unsigned int)(LA)) >> 12) & 0x3FF`。`&0x3FF` 操作的作用是取后 10 位,页目录号可以不用,因为其右移 22 位后,前面已都为零。页目录号也可以写成 `((unsigned int)(LA)) >> 22`;但页表索引不可,如果两个表达式没有对 LA 进行类型转换,也是可以的。
+
+ 3)代码页面 1 的逻辑地址为 0000 8000H,写成二进制位 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 00 前 20 位为页号(对应十六进制的前 5 位,页框号也是如此),即表明其位于第 8 个页处,对应页表中的第 8 个页表项,所以第 8 个页表项的物理地址=页表起始地址+8×页表项的字节数=0 0 2 0 0 0 0 0H+8×4=0020 0020H。由此可得图所示的答案。
+
+ 即两个页表项的物理地址分别为 0020 0020H 和 0020 0024H。
+
+ 这两个页表项中的页框号分别为 00900H 和 00901H.
+
+ 
+
+ 代码页面 2 的起始物理地址为 0090 1000H。
+
+
+
+ ***
+
+47. 某系统采用页式存储管理策略,拥有逻辑空间 32 页,每页为 $2\ \text{KB}$,拥有物理空间 $1\ \text{MB}$。
+
+ 1)写出逻辑地址的格式。
+
+ 2)若不考虑访问权限等,进程的页表有多少项?每项至少有多少位?
+
+ 3)如果物理空间减少一半,页表结构应做怎样的改变?
+
+
+ 答案:
+
+ 1)该系统拥有逻辑空间 32 页,故逻辑地址中页号必须用 5 位来描述,而每页为 $2\ \text{KB}$,因此页内位移必须用 11 位来描述。这样,可得到逻辑地址格式如图所示。
+
+ 
+
+ 2)每个进程最多有 32 个页面,因此进程的页表项最多有 32 项;若不考虑访问权限等,则页表项中需要给出页所对应的物理块号。$1\ \text{MB}$ 的物理空间可分成 $2^9$ 个内存块,故每个页表项至少有 9 位。
+
+ 3)若物理空间减少一半,则页表中页表项数保持不变,但每项的长度减少 1 位。
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2022-2023\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2022-2023\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
index 1d11132..736d982 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2022-2023\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/2022-2023\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253.md"
@@ -206,12 +206,7 @@ title: 2022-2023学年上学期期末
(3) 若采用时钟(CLOCK)置换算法(第二次机会算法),该逻辑地址对应的物理地址是多少?要求给出计算过程(设搜索下一页的指针沿顺时针方向移动,且当前指向 2 号页框,示意图如下)。
- 页框示意图:
-
- - 2 号页框:2 号页
- - 4 号页框:1 号页
- - 7 号页框:0 号页
- - 9 号页框:3 号页
+ 
***
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/README.MD" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/README.MD"
index 3fb4308..7700c01 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/README.MD"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/README.MD"
@@ -3,6 +3,123 @@ title: 操作系统
course_code: SE2216
---
+## 2007-2008学年下学期
+
+### 试卷
+
+- [2007-2008学年下学期期中试卷](./2007-2008学年下学期期中)
+- [2007-2008学年下学期期末试卷](./2007-2008学年下学期期末)
+
+## 2008-2009学年下学期
+
+### 试卷
+
+- [2008-2009学年下学期期中试卷](./2008-2009学年下学期期中)
+- [2008-2009学年下学期期末试卷](./2008-2009学年下学期期末)
+
+## 2009-2010学年下学期
+
+### 试卷
+
+- [2009-2010学年下学期期末试卷](./2009-2010学年下学期期末)
+
+## 2010-2011学年下学期
+
+### 试卷
+
+- [2010-2011学年下学期期中试卷](./2010-2011学年下学期期中)
+
+## 2011-2012学年下学期
+
+### 试卷
+
+- [2011-2012学年下学期期中试卷](./2011-2012学年下学期期中)
+- [2011-2012学年下学期期末试卷](./2011-2012学年下学期期末)
+
+## 2012-2013学年下学期
+
+### 试卷
+
+- [2012-2013学年下学期期中试卷](./2012-2013学年下学期期中)
+- [2012-2013学年下学期期末试卷](./2012-2013学年下学期期末)
+
+## 2013-2014学年上学期
+
+### 试卷
+
+- [2013-2014学年上学期期中试卷](./2013-2014学年上学期期中)
+
+## 2013-2014学年下学期
+
+### 试卷
+
+- [2013-2014学年下学期期中试卷](./2013-2014学年下学期期中)
+- [2013-2014学年下学期期末试卷](./2013-2014学年下学期期末)
+- [2013-2014学年下学期月考试卷](./2013-2014学年下学期月考)
+
+## 2014-2015学年下学期
+
+### 试卷
+
+- [2014-2015学年下学期期中试卷](./2014-2015学年下学期期中)
+- [2014-2015学年下学期月考试卷](./2014-2015学年下学期月考)
+
+## 2015-2016学年上学期
+
+### 试卷
+
+- [2015-2016学年上学期期中试卷](./2015-2016学年上学期期中)
+- [2015-2016学年上学期期末试卷](./2015-2016学年上学期期末)
+
+## 2015-2016学年下学期
+
+### 试卷
+
+- [2015-2016学年下学期月考试卷](./2015-2016学年下学期月考)
+
+## 2016-2017学年上学期
+
+### 试卷
+
+- [2016-2017学年上学期期中试卷](./2016-2017学年上学期期中)
+- [2016-2017学年上学期月考试卷](./2016-2017学年上学期月考)
+- [2016-2017学年上学期期末试卷](./2016-2017学年上学期期末)
+
+## 2017-2018学年上学期
+
+### 试卷
+
+- [2017-2018学年上学期期中试卷](./2017-2018学年上学期期中)
+- [2017-2018学年上学期月考试卷](./2017-2018学年上学期月考)
+- [2017-2018学年上学期期末试卷](./2017-2018学年上学期期末)
+
+## 2018-2019学年上学期
+
+### 试卷
+
+- [2018-2019学年上学期期中试卷](./2018-2019学年上学期期中)
+- [2018-2019学年上学期月考试卷](./2018-2019学年上学期月考)
+- [2018-2019学年上学期期末试卷](./2018-2019学年上学期期末)
+
+## 2019-2020学年上学期
+
+### 试卷
+
+- [2019-2020学年上学期期中试卷](./2019-2020学年上学期期中)
+- [2019-2020学年上学期期末试卷](./2019-2020学年上学期期末)
+
+## 2020-2021学年上学期
+
+### 试卷
+
+- [2020-2021学年上学期期中试卷](./2020-2021学年上学期期中)
+
+## 2021-2022学年下学期
+
+### 试卷
+
+- [2021-2022学年下学期期末试卷](./2021-2022学年下学期期末)
+
## 2022-2023学年上学期
### 试卷
@@ -14,10 +131,6 @@ course_code: SE2216
- 很严格的老师
- 实验报告记得认真写
-#### 教学资源
-
-- [实践作业报告](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/操作系统/实践作业报告)
-
## 推荐教材与参考资料
-- [操作系统资料](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/操作系统/参考资料)
+- [推荐教材与参考资料](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE2216/推荐教材与参考资料)
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2542\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2542\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\345\233\276.png"
new file mode 100644
index 0000000..f6349e6
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2542\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2544\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2544\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png"
new file mode 100644
index 0000000..93b7ea7
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2544\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2546\351\242\230_TLB\345\234\260\345\235\200\350\275\254\346\215\242\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2546\351\242\230_TLB\345\234\260\345\235\200\350\275\254\346\215\242\345\233\276.png"
new file mode 100644
index 0000000..4222b1b
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2007-2008\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2546\351\242\230_TLB\345\234\260\345\235\200\350\275\254\346\215\242\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\350\256\241\347\256\227\351\242\230_\347\254\2541\351\242\230.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\350\256\241\347\256\227\351\242\230_\347\254\2541\351\242\230.png"
new file mode 100644
index 0000000..c6fda29
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\350\256\241\347\256\227\351\242\230_\347\254\2541\351\242\230.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\350\256\241\347\256\227\351\242\230_\347\254\2541\351\242\230.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\350\256\241\347\256\227\351\242\230_\347\254\2541\351\242\230.png"
new file mode 100644
index 0000000..c6fda29
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2008-2009\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\350\256\241\347\256\227\351\242\230_\347\254\2541\351\242\230.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2009-2010\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_b_\347\255\224\346\241\210.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2009-2010\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_b_\347\255\224\346\241\210.png"
new file mode 100644
index 0000000..e9842db
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2009-2010\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_b_\347\255\224\346\241\210.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2545\351\242\230_\345\215\225\350\275\246\351\201\223\346\241\245\345\234\272\346\231\257\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2545\351\242\230_\345\215\225\350\275\246\351\201\223\346\241\245\345\234\272\346\231\257\345\233\276.png"
new file mode 100644
index 0000000..47242e5
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2545\351\242\230_\345\215\225\350\275\246\351\201\223\346\241\245\345\234\272\346\231\257\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2546\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2546\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png"
new file mode 100644
index 0000000..4856e21
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\347\254\2546\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\350\256\241\347\256\227\351\227\256\347\255\224\351\242\230_\347\254\2544\351\242\230_\347\255\224\346\241\210.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\350\256\241\347\256\227\351\227\256\347\255\224\351\242\230_\347\254\2544\351\242\230_\347\255\224\346\241\210.png"
new file mode 100644
index 0000000..090428a
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2011-2012\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\350\256\241\347\256\227\351\227\256\347\255\224\351\242\230_\347\254\2544\351\242\230_\347\255\224\346\241\210.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2012-2013\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_i-node\347\273\223\346\236\204\345\233\276_\345\216\237\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2012-2013\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_i-node\347\273\223\346\236\204\345\233\276_\345\216\237\345\233\276.png"
new file mode 100644
index 0000000..4025af3
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2012-2013\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_i-node\347\273\223\346\236\204\345\233\276_\345\216\237\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png"
new file mode 100644
index 0000000..9740195
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_2014.3_\347\273\274\345\220\210\345\210\206\346\236\220\351\242\230_\347\254\2543\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_2014.3_\347\273\274\345\220\210\345\210\206\346\236\220\351\242\230_\347\254\2543\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png"
new file mode 100644
index 0000000..dd6fb6a
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_2014.3_\347\273\274\345\220\210\345\210\206\346\236\220\351\242\230_\347\254\2543\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_\350\247\243\347\255\224\351\242\230_\347\254\2543\351\242\230_i-node\347\273\223\346\236\204\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_\350\247\243\347\255\224\351\242\230_\347\254\2543\351\242\230_i-node\347\273\223\346\236\204\345\233\276.png"
new file mode 100644
index 0000000..fb915f6
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_\350\247\243\347\255\224\351\242\230_\347\254\2543\351\242\230_i-node\347\273\223\346\236\204\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_\347\255\211\345\276\205\345\233\276_\347\255\224\346\241\210.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_\347\255\211\345\276\205\345\233\276_\347\255\224\346\241\210.png"
new file mode 100644
index 0000000..33d9252
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_\347\255\211\345\276\205\345\233\276_\347\255\224\346\241\210.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png"
new file mode 100644
index 0000000..208b6a2
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_IO\350\277\207\347\250\213\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_IO\350\277\207\347\250\213\345\233\276.png"
new file mode 100644
index 0000000..2d428c0
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2013-2014\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_IO\350\277\207\347\250\213\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_2015.3_\347\273\274\345\220\210\351\242\230_\347\254\2545\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276_\347\255\224\346\241\210.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_2015.3_\347\273\274\345\220\210\351\242\230_\347\254\2545\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276_\347\255\224\346\241\210.png"
new file mode 100644
index 0000000..65afa1f
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_2015.3_\347\273\274\345\220\210\351\242\230_\347\254\2545\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276_\347\255\224\346\241\210.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_2015.5_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_a_\351\241\265\351\235\242\347\275\256\346\215\242\350\277\207\347\250\213.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_2015.5_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_a_\351\241\265\351\235\242\347\275\256\346\215\242\350\277\207\347\250\213.png"
new file mode 100644
index 0000000..6991af8
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2014-2015\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\210\350\200\203_2015.5_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_a_\351\241\265\351\235\242\347\275\256\346\215\242\350\277\207\347\250\213.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2541\351\242\230_CPU\344\270\216IO\345\271\266\350\241\214\350\277\207\347\250\213\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2541\351\242\230_CPU\344\270\216IO\345\271\266\350\241\214\350\277\207\347\250\213\345\233\276.png"
new file mode 100644
index 0000000..8774563
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2541\351\242\230_CPU\344\270\216IO\345\271\266\350\241\214\350\277\207\347\250\213\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2545\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2545\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png"
new file mode 100644
index 0000000..591b7c3
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2545\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\347\237\251\351\230\265.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\347\237\251\351\230\265.png"
new file mode 100644
index 0000000..5753f98
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\347\237\251\351\230\265.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\347\256\200\347\255\224\351\242\230_\347\254\2542\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\347\256\200\347\255\224\351\242\230_\347\254\2542\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.jpg"
new file mode 100644
index 0000000..dd67f05
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\347\256\200\347\255\224\351\242\230_\347\254\2542\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\351\227\256\347\255\224\351\242\230_\347\254\2541\351\242\230_\346\241\245\346\242\201\347\244\272\346\204\217\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\351\227\256\347\255\224\351\242\230_\347\254\2541\351\242\230_\346\241\245\346\242\201\347\244\272\346\204\217\345\233\276.png"
new file mode 100644
index 0000000..c23e60e
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\351\227\256\347\255\224\351\242\230_\347\254\2541\351\242\230_\346\241\245\346\242\201\347\244\272\346\204\217\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\351\227\256\347\255\224\351\242\230_\347\254\2543\351\242\230_\351\241\265\351\235\242\347\275\256\346\215\242\350\277\207\347\250\213.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\351\227\256\347\255\224\351\242\230_\347\254\2543\351\242\230_\351\241\265\351\235\242\347\275\256\346\215\242\350\277\207\347\250\213.png"
new file mode 100644
index 0000000..da42280
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2016-2017\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\351\227\256\347\255\224\351\242\230_\347\254\2543\351\242\230_\351\241\265\351\235\242\347\275\256\346\215\242\350\277\207\347\250\213.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\344\270\215\345\256\232\351\241\271\351\200\211\346\213\251\351\242\230_\347\254\2544\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\344\270\215\345\256\232\351\241\271\351\200\211\346\213\251\351\242\230_\347\254\2544\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\345\233\276.png"
new file mode 100644
index 0000000..04bdbbe
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\344\270\215\345\256\232\351\241\271\351\200\211\346\213\251\351\242\230_\347\254\2544\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\345\210\206\351\241\265\347\241\254\344\273\266\347\273\223\346\236\204\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\345\210\206\351\241\265\347\241\254\344\273\266\347\273\223\346\236\204\345\233\276.png"
new file mode 100644
index 0000000..e44f7dd
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\345\210\206\351\241\265\347\241\254\344\273\266\347\273\223\346\236\204\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\256\200\347\255\224\351\242\230_\347\254\2541\351\242\230_\345\244\232\347\272\247\345\217\215\351\246\210\351\230\237\345\210\227\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\256\200\347\255\224\351\242\230_\347\254\2541\351\242\230_\345\244\232\347\272\247\345\217\215\351\246\210\351\230\237\345\210\227\345\233\276.png"
new file mode 100644
index 0000000..b5a0802
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\256\200\347\255\224\351\242\230_\347\254\2541\351\242\230_\345\244\232\347\272\247\345\217\215\351\246\210\351\230\237\345\210\227\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_\344\272\222\346\226\245\345\205\263\347\263\273\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_\344\272\222\346\226\245\345\205\263\347\263\273\345\233\276.png"
new file mode 100644
index 0000000..a62667d
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_\344\272\222\346\226\245\345\205\263\347\263\273\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_\345\220\214\346\255\245\345\205\263\347\263\273\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_\345\220\214\346\255\245\345\205\263\347\263\273\345\233\276.png"
new file mode 100644
index 0000000..6f77dbb
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_\345\220\214\346\255\245\345\205\263\347\263\273\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\273\274\345\220\210\351\242\230_\347\254\2541\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\273\274\345\220\210\351\242\230_\347\254\2541\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png"
new file mode 100644
index 0000000..a1832fb
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\273\274\345\220\210\351\242\230_\347\254\2541\351\242\230_\350\277\233\347\250\213\347\212\266\346\200\201\350\275\254\346\215\242\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_A_\351\227\256\347\255\224\351\242\230_\347\254\2542\351\242\230_\350\260\203\345\272\246\347\244\272\346\204\217\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_A_\351\227\256\347\255\224\351\242\230_\347\254\2542\351\242\230_\350\260\203\345\272\246\347\244\272\346\204\217\345\233\276.png"
new file mode 100644
index 0000000..528ceb0
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2017-2018\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_A_\351\227\256\347\255\224\351\242\230_\347\254\2542\351\242\230_\350\260\203\345\272\246\347\244\272\346\204\217\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\346\226\207\344\273\266\345\222\214IO_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\347\243\201\347\233\230\346\211\207\345\214\272\347\244\272\346\204\217\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\346\226\207\344\273\266\345\222\214IO_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\347\243\201\347\233\230\346\211\207\345\214\272\347\244\272\346\204\217\345\233\276.png"
new file mode 100644
index 0000000..344f8c1
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\346\226\207\344\273\266\345\222\214IO_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\347\243\201\347\233\230\346\211\207\345\214\272\347\244\272\346\204\217\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\346\226\207\344\273\266\345\222\214IO_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\347\243\201\347\233\230\346\227\213\350\275\254\350\277\207\347\250\213\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\346\226\207\344\273\266\345\222\214IO_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\347\243\201\347\233\230\346\227\213\350\275\254\350\277\207\347\250\213\345\233\276.png"
new file mode 100644
index 0000000..ac75a6b
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\346\226\207\344\273\266\345\222\214IO_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\347\243\201\347\233\230\346\227\213\350\275\254\350\277\207\347\250\213\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\346\226\207\344\273\266\345\222\214IO_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\345\210\206\351\241\265\347\241\254\344\273\266\347\273\223\346\236\204\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\346\226\207\344\273\266\345\222\214IO_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\345\210\206\351\241\265\347\241\254\344\273\266\347\273\223\346\236\204\345\233\276.png"
new file mode 100644
index 0000000..e91c46c
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\346\226\207\344\273\266\345\222\214IO_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\345\210\206\351\241\265\347\241\254\344\273\266\347\273\223\346\236\204\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2541\351\242\230_CPU\344\270\216IO\345\271\266\350\241\214\350\277\207\347\250\213\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2541\351\242\230_CPU\344\270\216IO\345\271\266\350\241\214\350\277\207\347\250\213\345\233\276.png"
new file mode 100644
index 0000000..264406b
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2541\351\242\230_CPU\344\270\216IO\345\271\266\350\241\214\350\277\207\347\250\213\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\347\250\213\345\272\217\345\271\266\345\217\221\346\211\247\350\241\214\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\347\250\213\345\272\217\345\271\266\345\217\221\346\211\247\350\241\214\345\233\276.png"
new file mode 100644
index 0000000..0507d19
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2542\351\242\230_\347\250\213\345\272\217\345\271\266\345\217\221\346\211\247\350\241\214\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\350\277\233\347\250\213\344\272\224\347\212\266\346\200\201\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\350\277\233\347\250\213\344\272\224\347\212\266\346\200\201\345\233\276.png"
new file mode 100644
index 0000000..57b7e6b
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\350\277\233\347\250\213\344\272\224\347\212\266\346\200\201\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2544\351\242\230_\344\270\212\344\270\213\346\226\207\345\210\207\346\215\242\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2544\351\242\230_\344\270\212\344\270\213\346\226\207\345\210\207\346\215\242\345\233\276.png"
new file mode 100644
index 0000000..529f349
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\210\350\200\203_\347\273\274\345\220\210\351\242\230_\347\254\2544\351\242\230_\344\270\212\344\270\213\346\226\207\345\210\207\346\215\242\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\344\275\277\347\224\250\350\241\250.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\344\275\277\347\224\250\350\241\250.jpg"
new file mode 100644
index 0000000..bb828a1
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\347\273\274\345\220\210\351\242\230_\347\254\2543\351\242\230_\350\265\204\346\272\220\344\275\277\347\224\250\350\241\250.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\276\250\346\236\220\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_\345\271\266\345\217\221\344\270\216\345\271\266\350\241\214\345\217\202\350\200\203\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\276\250\346\236\220\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_\345\271\266\345\217\221\344\270\216\345\271\266\350\241\214\345\217\202\350\200\203\345\233\276.png"
new file mode 100644
index 0000000..7673d0b
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2018-2019\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\276\250\346\236\220\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230_\345\271\266\345\217\221\344\270\216\345\271\266\350\241\214\345\217\202\350\200\203\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\273\274\345\220\210\351\242\230_\347\254\25445\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\345\233\276_\347\255\224\346\241\210.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\273\274\345\220\210\351\242\230_\347\254\25445\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\345\233\276_\347\255\224\346\241\210.png"
new file mode 100644
index 0000000..309e25e
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_A_\347\273\274\345\220\210\351\242\230_\347\254\25445\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\345\233\276_\347\255\224\346\241\210.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\344\270\200\347\272\247\351\241\265\350\241\250\345\234\260\345\235\200\347\273\223\346\236\204.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\344\270\200\347\272\247\351\241\265\350\241\250\345\234\260\345\235\200\347\273\223\346\236\204.png"
new file mode 100644
index 0000000..b1bb788
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\344\270\200\347\272\247\351\241\265\350\241\250\345\234\260\345\235\200\347\273\223\346\236\204.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\344\272\214\347\272\247\351\241\265\350\241\250\345\234\260\345\235\200\347\273\223\346\236\204.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\344\272\214\347\272\247\351\241\265\350\241\250\345\234\260\345\235\200\347\273\223\346\236\204.png"
new file mode 100644
index 0000000..3e85106
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\344\272\214\347\272\247\351\241\265\350\241\250\345\234\260\345\235\200\347\273\223\346\236\204.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\347\255\224\346\241\210\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\347\255\224\346\241\210\345\233\276.png"
new file mode 100644
index 0000000..17cde11
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\347\255\224\346\241\210\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\351\241\265\350\241\250\344\270\216\344\273\243\347\240\201\351\241\265\351\235\242\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\351\241\265\350\241\250\344\270\216\344\273\243\347\240\201\351\241\265\351\235\242\345\233\276.png"
new file mode 100644
index 0000000..7dbc3e8
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25446\351\242\230_\351\241\265\350\241\250\344\270\216\344\273\243\347\240\201\351\241\265\351\235\242\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25447\351\242\230_\351\200\273\350\276\221\345\234\260\345\235\200\346\240\274\345\274\217\347\255\224\346\241\210\345\233\276.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25447\351\242\230_\351\200\273\350\276\221\345\234\260\345\235\200\346\240\274\345\274\217\347\255\224\346\241\210\345\233\276.png"
new file mode 100644
index 0000000..750e053
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\347\273\274\345\220\210\351\242\230_\347\254\25447\351\242\230_\351\200\273\350\276\221\345\234\260\345\235\200\346\240\274\345\274\217\347\255\224\346\241\210\345\233\276.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\351\200\211\346\213\251\351\242\230_\347\254\2547\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\351\200\211\346\213\251\351\242\230_\347\254\2547\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png"
new file mode 100644
index 0000000..3e86769
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2021-2022\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\346\234\253_B_\351\200\211\346\213\251\351\242\230_\347\254\2547\351\242\230_\350\265\204\346\272\220\345\210\206\351\205\215\350\241\250.png" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2022-2023\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\350\256\241\347\256\227\351\242\230_\347\254\2542\351\242\230_\351\241\265\346\241\206\347\244\272\346\204\217\345\233\276.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2022-2023\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\350\256\241\347\256\227\351\242\230_\347\254\2542\351\242\230_\351\241\265\346\241\206\347\244\272\346\204\217\345\233\276.jpg"
new file mode 100644
index 0000000..c6976b1
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237/images/2022-2023\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\346\234\253_\350\256\241\347\256\227\351\242\230_\347\254\2542\351\242\230_\351\241\265\346\241\206\347\244\272\346\204\217\345\233\276.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237\345\256\236\350\267\265/README.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237\345\256\236\350\267\265/README.md"
new file mode 100644
index 0000000..b62cd65
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\223\215\344\275\234\347\263\273\347\273\237\345\256\236\350\267\265/README.md"
@@ -0,0 +1,19 @@
+---
+title: 操作系统实践
+course_code: SE2213
+---
+
+## 2022-2023学年上学期
+
+### 郭建
+
+- 很严格的老师
+- 实验报告记得认真写
+
+#### 教学资源
+
+- [实践作业报告](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE2213/2022-2023学年上学期/郭建/实践作业报告)
+
+## 推荐教材与参考资料
+
+- [推荐教材与参考资料](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE2213/推荐教材与参考资料)
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..f2752d4
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,341 @@
+---
+title: 2024-2025学年上学期期中
+---
+
+## 2024-2025学年上学期期中试卷(含答案)
+
+### 一、填空题(20 分,每空 2 分)
+
+1. $(-126.125)_{10}=(\underline{\qquad})_2=(\underline{\qquad})_{16}=(\underline{\qquad})_{BCD}$。
+
+2. $(-56)_{10}$ 用 8 位二进制表示的原码是 $\underline{\qquad}$,补码是 $\underline{\qquad}$。
+
+3. 非门可用与非门代替,与非门 $\underline{\qquad}$(能,不能)用非门代替。
+
+4. 数字电路中三极管工作在截止或 $\underline{\qquad}$ 状态。
+
+5. OC 门称为集电极开路门,多个 OC 门输出端并联到一起可实现 $\underline{\qquad}$ 功能。
+
+6. 74LS00 是 $\underline{\qquad}$ 类型的门电路,CC4069 是 $\underline{\qquad}$ 类型的门电路。(填 TTL 或 CMOS)
+
+
+答案:
+
+1. $(1111\ 1110.0010)_2$;$(FE.2)_{16}$;$(1\ 0001\ 0010\ 0110.0001\ 0010\ 0101)_{BCD}$
+2. 原码:$10111000$;补码:$11001000$
+3. 能;不能
+4. 饱和
+5. 线与
+6. TTL;CMOS
+
+常见错误:二进制和十六进制转换时漏写符号位;BCD 码容易写错;原码转补码取反时符号位不变;OC 门常被误填为“与门”或“与非门”。
+
+
+
+***
+
+### 二、选择题(16 分,每题 2 分)
+
+1. 欲对 80 个图书馆电脑以二进制编码表示,最少需要二进制的位数是( )。
+
+ A. 5
+ B. 6
+ C. 7
+ D. 10
+
+
+ 答案:
+
+ C
+
+
+
+ ***
+
+2. 数字电路中除具有高电平、低电平两种状态外,还具有第三态即( )。
+
+ A. 高阻态
+ B. 低阻态
+ C. 1 态
+ D. 混合态
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+3. 与最小项 $ABCD$ 逻辑相邻的最小项有( )个。
+
+ A. 4
+ B. 5
+ C. 6
+ D. 7
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+4. 对于图 1 所示波形,所代表的逻辑关系为( )。
+
+ 
+
+ A. 同或关系
+ B. 异或关系
+ C. 与关系
+ D. 与或关系
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+5. 图 2 中输出 $F=A'$ 的电路是( )。
+
+ 
+
+
+ 答案:
+
+ D
+
+
+
+ ***
+
+6. 如右图(图 3)所示的 CMOS 电路的功能是( )。
+
+ 
+
+ A. $A+B'$
+ B. $AB'$
+ C. $A'+B$
+ D. $A'B$
+
+
+ 答案:
+
+ A
+
+
+
+ ***
+
+7. 图 4 为某数据选择器构成的函数发生器,其输出逻辑 $Y$ 等于( )。
+
+ 
+
+ A. $Y=A+B$
+ B. $Y=B$
+ C. $Y=AB$
+ D. $Y=A$
+
+
+ 答案:
+
+ B
+
+
+
+ ***
+
+8. 逻辑函数 $F_1=\sum m(2,4,5,6)$ 同 $F_2=A\overline{B}+B\overline{C}$ 之间关系为( )。
+
+ A. 相等
+ B. 取反
+ C. 对偶
+ D. 不确定
+
+
+ 答案:
+
+ A
+
+
+
+***
+
+### 三、计算与简答题(24 分,每题 8 分)
+
+1. 写出下列函数的对偶函数,并化简。
+
+ $$
+ F=((AB)'(CB')'(DA'B')')'
+ $$
+
+
+ 答案:
+
+ 对偶函数为
+
+ $$
+ \begin{aligned}
+ F^*
+ &= \left((A+B)' + (C+B')' + (D+A'+B')'\right)' \\
+ &= (A+B)(C+\overline{B})(D+\overline{A}+\overline{B}).
+ \end{aligned}
+ $$
+
+ 化简得
+
+ $$
+ \begin{aligned}
+ F^*
+ &= ACD+A\overline{B}C+\overline{A}BD+A\overline{B}+BCD+\overline{A}BC \\
+ &= ACD+A\overline{B}+BCD+\overline{A}BC \\
+ &= A\overline{B}+BCD+\overline{A}BC.
+ \end{aligned}
+ $$
+
+
+
+ ***
+
+2. 用卡诺图将下列具有约束项的函数化为最简“与或”式。
+
+ $$
+ F(A,B,C,D)=\sum m(0,2,3,5,7,8,10,11)+\sum d(14,15)
+ $$
+
+
+ 答案:
+
+ 卡诺图化简参考:
+
+ 
+
+ $$
+ F=\overline{B}\overline{D}+CD+\overline{A}BD
+ $$
+
+
+
+ ***
+
+3. 逻辑函数 $F_1$、$F_2$ 的逻辑图如图 5 所示,试证明 $F_1=F_2$。
+
+ 
+
+
+ 答案:
+
+ 由图可得:
+
+ $$
+ F_1=((AB)'(CD)'E')'=AB+CD+E=F_2
+ $$
+
+
+
+***
+
+### 四、分析与设计题(40 分)
+
+1. (20 分)分析图 6 所示电路,写出 $F$ 的逻辑函数式,并列真值表。其中 74LS151 的外部引脚图和功能表如图 7 所示;2-4 译码器功能类似于图 9 中 3-8 译码器功能。
+
+ 
+
+
+ 答案:
+
+ 图 6 电路分析时需注意:2-4 译码器输出端有圆圈,输出有效时为 0。
+
+ $$
+ \begin{aligned}
+ D_0&=(A'B')', & D_1&=(A'B)', & D_2&=(AB')', & D_3&=(AB)',\\
+ D_4&=(C'B')', & D_5&=(C'B)', & D_6&=(CB')', & D_7&=(CB)'.
+ \end{aligned}
+ $$
+
+ 由 74LS151 功能表可得
+
+ $$
+ \begin{aligned}
+ F
+ &=(A'B'C')D_0+(A'B'C)D_1+(A'BC')D_2+(AB'C')D_4\\
+ &\quad +(AB'C)D_5+(ABC')D_6+(ABC)D_7\\
+ &=A'B'C+A'BC'+A'BC+AB'C+ABC'.
+ \end{aligned}
+ $$
+
+ 真值表为:
+
+ | $A$ | $B$ | $C$ | $F$ |
+ | --- | --- | --- | --- |
+ | 0 | 0 | 0 | 0 |
+ | 0 | 0 | 1 | 1 |
+ | 0 | 1 | 0 | 1 |
+ | 0 | 1 | 1 | 1 |
+ | 1 | 0 | 0 | 0 |
+ | 1 | 0 | 1 | 1 |
+ | 1 | 1 | 0 | 1 |
+ | 1 | 1 | 1 | 0 |
+
+ $$
+ F=A'B'C+A'BC'+A'BC+AB'C+ABC'
+ $$
+
+ 常见错误:没有读懂图,导致真值表和逻辑表达式写错。
+
+
+
+ ***
+
+2. (20 分)某水仓装有大小两台水泵排水,如图 8 所示。试设计一个水泵启动、停止逻辑控制电路。具体要求是:当水位在 H 以上时,大小水泵 $M_L$ 和 $M_S$ 同时开动;水位在 H、M 之间时,只开大泵 $M_L$;水位在 M、L 之间时,只开小泵 $M_S$;水位在 L 以下时,停止排水。
+
+ 要求:
+
+ 1. 用基本逻辑门电路实现。
+ 2. 用 74LS138 和与非门电路实现。已知 74LS138 的功能表和管脚图如图 9 所示。
+
+ 
+
+
+ 答案:
+
+ 设 $H,M,L$ 为 1 表示水位在对应传感器以上,为 0 表示水位在对应传感器以下;$M_L,M_S$ 表示大小水泵,1 表示水泵开,0 表示水泵关。
+
+ 真值表为:
+
+ | $H$ | $M$ | $L$ | $M_L$ | $M_S$ |
+ | --- | --- | --- | --- | --- |
+ | 0 | 0 | 0 | 0 | 0 |
+ | 0 | 0 | 1 | 0 | 1 |
+ | 0 | 1 | 0 | x | x |
+ | 0 | 1 | 1 | 1 | 0 |
+ | 1 | 0 | 0 | x | x |
+ | 1 | 0 | 1 | x | x |
+ | 1 | 1 | 0 | x | x |
+ | 1 | 1 | 1 | 1 | 1 |
+
+ 基本门电路实现的卡诺图:
+
+ 
+
+ 由卡诺图得:
+
+ $$
+ M_L=M,\qquad M_S=H+M'L.
+ $$
+
+ 用 74LS138 和与非门实现:
+
+ 
+
+ $$
+ M_L=m_3+m_7=(Y_3Y_7)',\qquad M_S=m_1+m_7=(Y_1Y_7)'
+ $$
+
+
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/README.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/README.md"
index 1b0276c..8eb95ed 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/README.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/README.md"
@@ -3,10 +3,8 @@ title: 数字逻辑
course_code: SE1203
---
+## 2024-2025学年上学期
+### 试卷
-## 真题卷
-
-[2024-2025学年上学期期中](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/数字逻辑/2024-2025学年上学期期中.pdf)
-
-[2024-2025学年上学期期中总结_课件](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/数字逻辑/2024-2025学年上学期期中总结_课件.pdf)
+- [2024-2025学年上学期期中试卷](./2024-2025学年上学期期中)
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2541\351\242\230.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2541\351\242\230.jpg"
new file mode 100644
index 0000000..8896d2a
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2541\351\242\230.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2542\351\242\230.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2542\351\242\230.jpg"
new file mode 100644
index 0000000..709717b
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2542\351\242\230.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2542\351\242\230_\347\255\224\346\241\210_1.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2542\351\242\230_\347\255\224\346\241\210_1.jpg"
new file mode 100644
index 0000000..3f28221
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2542\351\242\230_\347\255\224\346\241\210_1.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2542\351\242\230_\347\255\224\346\241\210_2.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2542\351\242\230_\347\255\224\346\241\210_2.jpg"
new file mode 100644
index 0000000..9e426b8
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\345\210\206\346\236\220\344\270\216\350\256\276\350\256\241\351\242\230_\347\254\2542\351\242\230_\347\255\224\346\241\210_2.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\344\270\216\347\256\200\347\255\224\351\242\230_\347\254\2542\351\242\230_\347\255\224\346\241\210.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\344\270\216\347\256\200\347\255\224\351\242\230_\347\254\2542\351\242\230_\347\255\224\346\241\210.jpg"
new file mode 100644
index 0000000..aa71e88
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\344\270\216\347\256\200\347\255\224\351\242\230_\347\254\2542\351\242\230_\347\255\224\346\241\210.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\344\270\216\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\344\270\216\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230.jpg"
new file mode 100644
index 0000000..3ed9e62
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\350\256\241\347\256\227\344\270\216\347\256\200\347\255\224\351\242\230_\347\254\2543\351\242\230.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2544\351\242\230.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2544\351\242\230.jpg"
new file mode 100644
index 0000000..fd6a792
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2544\351\242\230.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2545\351\242\230.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2545\351\242\230.jpg"
new file mode 100644
index 0000000..48632f1
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2545\351\242\230.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2546\351\242\230.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2546\351\242\230.jpg"
new file mode 100644
index 0000000..363d542
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2546\351\242\230.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2547\351\242\230.jpg" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2547\351\242\230.jpg"
new file mode 100644
index 0000000..69ddcd2
Binary files /dev/null and "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\345\255\227\351\200\273\350\276\221/images/2024-2025\345\255\246\345\271\264\344\270\212\345\255\246\346\234\237\346\234\237\344\270\255_\351\200\211\346\213\251\351\242\230_\347\254\2547\351\242\230.jpg" differ
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\217\212\345\205\266\345\272\224\347\224\250/README.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\217\212\345\205\266\345\272\224\347\224\250/README.md"
index 210bc2d..08460e9 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\217\212\345\205\266\345\272\224\347\224\250/README.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\217\212\345\205\266\345\272\224\347\224\250/README.md"
@@ -11,4 +11,4 @@ course_code: SE2220
#### 教学资源
-- [部分 PPT](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE2220/slides)
+- [Slides(部分)](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE2220/2023-2024学年下学期/姚俊杰/Slides(部分))
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\247\221\345\255\246/README.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\247\221\345\255\246/README.md"
index 66ca78f..59a020b 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\247\221\345\255\246/README.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\247\221\345\255\246/README.md"
@@ -5,7 +5,7 @@ course_code: SE3435
## 2024-2025学年下学期
-### Jeff
+### Jeffrey W Sanders
- 老师人很好, 讲的也还可以
- 平时每两周有一个课后辅导, 时间段自选, 但是必须去, 要不然没有平时分, 讲的内容大概是他觉得你作业哪里没做好啊啥的会问你的思路, 会给你纠正, 然后问你有没有没弄懂的地方
@@ -14,5 +14,5 @@ course_code: SE3435
#### 教学资源
-- [课件](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/数据科学/2024-2025学年下学期/Jeff/课件)
-- [作业(正确性不保证)](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/数据科学/2024-2025学年下学期/Jeff/作业)
+- [Slides](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE3435/2024-2025学年下学期/Jeffrey%20W%20Sanders/Slides)
+- [Homework(正确性不保证)](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE3435/2024-2025学年下学期/Jeffrey%20W%20Sanders/Homework(正确性不保证))
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
new file mode 100644
index 0000000..f7b5ec7
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237\346\234\237\344\270\255.md"
@@ -0,0 +1,486 @@
+---
+title: 2024-2025学年下学期期中
+---
+
+## 2024-2025学年下学期期中试卷(A)——杜育根
+
+### 一、单选题(共 20 题,20 分)
+
+1. 在计算机存储器内表示时,物理地址和逻辑地址相同并且是连续的,称之为( )。(1.0)
+
+ A. 逻辑结构
+
+ B. 顺序存储结构
+
+ C. 链表存储结构
+
+ D. 以上都不对
+
+ ***
+
+2. 数据结构中,在逻辑上可以把数据结构分成( )。(1.0)
+
+ A. 动态结构和静态结构
+
+ B. 紧凑结构和非紧凑结构
+
+ C. 线性结构和非线性结构
+
+ D. 内部结构和外部结构
+
+ ***
+
+3. 一个正确的算法应该具有 5 个特性,除输入、输出特性外,另外 3 个特性是( )。(1.0)
+
+ A. 确定性、可行性、有穷性
+
+ B. 易读性、确定性、有效性
+
+ C. 有穷性、稳定性、确定性
+
+ D. 可行性、易读性、有穷性
+
+ ***
+
+4. 以下关于数据的逻辑结构的叙述中正确的是( )。(1.0)
+
+ A. 数据的逻辑结构是数据间关系的描述
+
+ B. 数据的逻辑结构反映了数据在计算机中的存储方式
+
+ C. 数据的逻辑结构分为顺序结构和链式结构
+
+ D. 数据的逻辑结构分为静态结构和动态结构
+
+ ***
+
+5. 以下数据结构中不属于线性数据结构的是( )。(1.0)
+
+ A. 队列
+
+ B. 线性表
+
+ C. 二叉树
+
+ D. 栈
+
+ ***
+
+6. 数据的存储结构是指( )。(1.0)
+
+ A. 数据所占的存储空间量
+
+ B. 数据的逻辑结构在计算机中的表示
+
+ C. 数据在计算机中的顺序存储方式
+
+ D. 存储在外存中的数据
+
+ ***
+
+7. 在 $n$ 个结点的顺序表中,算法的时间复杂度是 $O(1)$ 的操作是( )。(1.0)
+
+ A. 访问第 $i$ 个结点($1\le i\le n$)和求第 $i$ 个结点的直接前驱($2\le i\le n$)
+
+ B. 在第 $i$ 个结点后插入一个新结点($1\le i\le n$)
+
+ C. 删除第 $i$ 个结点($1\le i\le n$)
+
+ D. 将 $n$ 个结点从小到大排序
+
+ ***
+
+8. 向一个有 127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为( )。(1.0)
+
+ A. 8
+
+ B. 63.5
+
+ C. 63
+
+ D. 7
+
+ ***
+
+9. 若让元素 1, 2, 3, 4, 5 依次进栈,则出栈次序不可能出现在( )种情况。(1.0)
+
+ A. 5, 4, 3, 2, 1
+
+ B. 2, 1, 5, 4, 3
+
+ C. 4, 3, 1, 2, 5
+
+ D. 2, 3, 5, 4, 1
+
+ ***
+
+10. 设有一个递归算法如下:
+
+ ```c
+ int fact(int n) { // n 大于等于 0
+ if (n <= 0) return 1;
+ else return n * fact(n - 1);
+ }
+ ```
+
+ 则计算 `fact(n)` 需要调用该函数的次数为( )。(1.0)
+
+ A. $n+1$
+
+ B. $n-1$
+
+ C. $n$
+
+ D. $n+2$
+
+ ***
+
+11. 设栈 $S$ 和队列 $Q$ 的初始状态为空,元素 $e1$、$e2$、$e3$、$e4$、$e5$ 和 $e6$ 依次进入栈 $S$,一个元素出栈后即进入 $Q$,若 6 个元素出队的序列是 $e2$、$e4$、$e3$、$e6$、$e5$ 和 $e1$,则栈 $S$ 的容量至少应该是( )。(1.0)
+
+ A. 2
+
+ B. 3
+
+ C. 4
+
+ D. 6
+
+ ***
+
+12. 下述几种排序方法中,要求内存最大的是( )。(1.0)
+
+ A. 希尔排序
+
+ B. 快速排序
+
+ C. 归并排序
+
+ D. 堆排序
+
+ ***
+
+13. 下述几种排序方法中,( )是稳定的排序方法。(1.0)
+
+ A. 希尔排序
+
+ B. 快速排序
+
+ C. 归并排序
+
+ D. 堆排序
+
+ ***
+
+14. 在寻找 $n$ 个元素中第 $k$ 小元素问题中,如快速排序算法思想,运用分治算法对 $n$ 个元素进行划分,如何选择划分基准?下面( )答案解释最合理。(1.0)
+
+ A. 随机选择一个元素作为划分基准
+
+ B. 取子序列的第一个元素作为划分基准
+
+ C. 用中位数的中位数方法寻找划分基准
+
+ D. 以上皆可行,但不同方法,算法复杂度上界可能不同
+
+ ***
+
+15. 使用分治法求解不需要满足的条件是( )。(1.0)
+
+ A. 子问题必须是一样的
+
+ B. 子问题不能够重复
+
+ C. 子问题的解可以合并
+
+ D. 原问题和子问题使用相同的方法解
+
+ ***
+
+16. ( )是贪心算法的基本要素。(1.0)
+
+ A. 重叠子问题
+
+ B. 构造最优解
+
+ C. 贪心选择性质
+
+ D. 定义最优解
+
+ ***
+
+17. 有一批集装箱要装上一艘载重量为 $C$ 的轮船,其中集装箱 $i$ 的重量为 $W_i$。要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为( )。(1.0)
+
+ A. $O(n)$
+
+ B. $O(\log_2 n)$
+
+ C. $O(n^3)$
+
+ D. $O(n\log_2 n)$
+
+ ***
+
+18. 一棵哈夫曼树共有 215 个结点,对其进行哈夫曼编码,共能得到( )个不同的码字。(1.0)
+
+ A. 107
+
+ B. 108
+
+ C. 214
+
+ D. 215
+
+ ***
+
+19. 一个问题可用动态规划算法或贪心算法求解的关键特征是问题的( )。(1.0)
+
+ A. 贪心选择性质
+
+ B. 重叠子问题
+
+ C. 最优子结构性质
+
+ D. 定义最优解
+
+ ***
+
+20. 回溯法在问题的解空间树中,按( )策略,从根结点出发搜索解空间树。(1.0)
+
+ A. 广度优先
+
+ B. 活结点优先
+
+ C. 扩展结点优先
+
+ D. 深度优先
+
+***
+
+### 二、多选题(共 5 题,10 分)
+
+21. 数据结构是指互相之间存在着一种或多种关系的数据元素的集合,基本的数据结构通常是( )。(2.0)
+
+ A. 集合结构
+
+ B. 线性结构
+
+ C. 树型结构
+
+ D. 图形结构
+
+ ***
+
+22. 算法的基本结构有( )。(2.0)
+
+ A. 顺序结构
+
+ B. 分支结构
+
+ C. 循环结构
+
+ D. 跳跃结构
+
+ ***
+
+23. 递归方法一般用来解决哪些类型的问题?( )(2.0)
+
+ A. 数据的定义是按递归定义的
+
+ B. 问题解法按递归算法实现
+
+ C. 数据的结构形式是按递归定义的
+
+ D. 问题的复杂程度超过一般算法能够解决的
+
+ ***
+
+24. 用链表表示线性表的优点是( )。(2.0)
+
+ A. 便于插入和删除操作
+
+ B. 数据元素的物理顺序与逻辑顺序相同
+
+ C. 花费的存储空间较顺序存储少
+
+ D. 便于随机存取
+
+ ***
+
+25. 算法的实现方式有( )。(2.0)
+
+ A. 子程序
+
+ B. 函数
+
+ C. 模块
+
+ D. 过程
+
+***
+
+### 三、判断题(共 10 题,10 分)
+
+26. 数据项是数据的最小单位。( )(1.0)
+
+ ***
+
+27. 设置数据结构的基本操作的最重要准则是,实现应用程序与存储结构的独立。( )(1.0)
+
+ ***
+
+28. 数据的逻辑结构与数据元素本身的内容和形式无关。( )(1.0)
+
+ ***
+
+29. 数据的逻辑结构是指数据的各数据项之间的逻辑关系。( )(1.0)
+
+ ***
+
+30. 一个算法的语句频度之和为 $T(n)=1024n+4n\log n$,则算法的时间复杂度为 $O(n\log n)$。( )(1.0)
+
+ ***
+
+31. 顺序存储结构要求连续的存储区域,在存储管理上不够灵活,因此不常用。( )(1.0)
+
+ ***
+
+32. 抽象数据类型与计算机内部表示和实现无关。( )(1.0)
+
+ ***
+
+33. 根据算法的时间复杂性,人们常常把算法分成两类:多项式阶算法和指数阶算法。当 $n$ 很大时,可以证明有关系
+ $$
+ O(1) 1
+ y = 0;
+ while (x >= (y + 1) * (y + 1))
+ y++;
+ ```
+
+***
+
+### 五、填空题(共 3 题,27 分)
+
+38. 设计一个顺序存储结构解决约瑟夫问题,有 $n$ 个人($n>0$),编号 $1,2,\ldots,n$,报到 $m$ 的人出圈。要求按出圈顺序输出人员编号。设计的算法是:用 `count` 来计数,`s` 记录报数人编号,当 `count` 数到 $m$ 时,对应报数人出圈,顺序表当前长度 `length` 值减 1,即从表中删除对应元素,后面前移。请填写空缺的语句。(12.0)
+
+ ```cpp
+ void Josephus(int a[], int n, int m)
+ {
+ int s = 0;
+ for (int length = n; length >= 2; length--)
+ {
+ for (int count = 0; count < m - 1; count++)
+ s = __________1__________;
+ cout << __________2__________ << endl;
+ for (int i = s + 1; i < length; i++)
+ __________3__________;
+ }
+ cout << __________4__________;
+ }
+ ```
+
+ ***
+
+39. 下面程序用递归算法实现一个整数按逆序存到一个字符数组里。如 123 存放成 `"321"` 字符数组。(6.0)
+
+ ```c
+ #include
+
+ void convert(char *s, int n)
+ {
+ int i;
+ if (i = n / 10) convert(__________1__________, i);
+ *s = __________2__________;
+ }
+
+ int main()
+ {
+ int number;
+ char str[10] = "";
+ scanf("%d", &number);
+ convert(str, number);
+ puts(str);
+ }
+ ```
+
+ ***
+
+40. 已知二叉树的结构体在 C++ 语言中被定义为:
+
+ ```cpp
+ struct ListNode {
+ ListNode* left;
+ ListNode* right;
+ int val;
+ ListNode(int v) : val(v), left(NULL), right(NULL) {}
+ };
+ ```
+
+ 填写以下函数,该函数完成二叉树的非递归的中序遍历。其中,`stack s` 为标准模板库中的栈。(9.0)
+
+ ```cpp
+ int visit(ListNode* node) {
+ stack s;
+ s.push(node);
+ while (__________1__________) {
+ while (NULL != s.top()) {
+ s.push(__________2__________);
+ }
+ ListNode* p = s.top();
+ s.pop();
+ if (!s.empty()) {
+ p = s.top();
+ s.pop();
+ cout << p->val;
+ s.push(__________3__________);
+ }
+ }
+ return 0;
+ }
+ ```
+
+***
+
+### 六、编程题(2 题,13 分)
+
+41. 【代码】给定一个二叉树,统计二叉树的叶结点个数。对于没有左儿子或者右儿子的节点,`left` 或者 `right` 为空指针。(5.0)
+
+ ***
+
+42. 【代码】设线性表 $L=(a_1,a_2,a_3,\ldots,a_{n-2},a_{n-1},a_n)$。采用带头结点的单链表保存,链表中的节点定义如下:
+
+ ```c
+ typedef struct node {
+ int data;
+ struct node *next;
+ } NODE;
+ ```
+
+ 请设计一个空间复杂度为 $O(1)$ 且时间上尽可能高效的算法,重新排列 $L$ 中的各结点,得到线性表 $L'=(a_1,a_n,a_2,a_{n-1},a_3,a_{n-2},\ldots)$。
+
+ 要求:
+
+ (1) 给出算法的基本设计思想。根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。(6.0)
+
+ (3) 说明你所设计的算法的时间复杂度。(2.0)
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/README.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/README.md"
index aeddcad..34aa149 100644
--- "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/README.md"
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/README.md"
@@ -3,6 +3,13 @@ title: 数据结构与算法
course_code: SE1209
---
+## 2021-2022学年下学期
+
+### 杜育根
+
+#### 教学资源
+
+- [Slides](https://github.com/BetterECNU/SharedResources/tree/main/SE/SE1209/2021-2022学年下学期/杜育根/Slides)
## 2022-2023学年下学期
@@ -25,14 +32,10 @@ course_code: SE1209
### 试卷
-- [2024-2025学年下学期期中试卷](https://drive.vanillaaaa.org/SharedCourses/软件工程学院/数据结构与算法/2024-2025学年下学期_期中_A_杜育根.pdf)
+- [2024-2025学年下学期期中试卷](./2024-2025学年下学期期中)
## 2025-2026学年下学期
### 试卷
- [2025-2026学年下学期期中试卷](./2025-2026学年下学期期中)
-
-## 推荐教材与参考资料
-
-[2022春课件更新-杜育根](https://drive.vanillaaaa.org/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%AD%A6%E9%99%A2/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95-2022-%E6%9D%9C%E8%82%B2%E6%A0%B9)
diff --git "a/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225\345\256\236\350\267\265/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237/\346\235\234\350\202\262\346\240\271/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237VOJ\347\255\224\346\241\210.md" "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225\345\256\236\350\267\265/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237/\346\235\234\350\202\262\346\240\271/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237VOJ\347\255\224\346\241\210.md"
new file mode 100644
index 0000000..5e7c785
--- /dev/null
+++ "b/docs/undergraduate/\350\275\257\344\273\266\345\267\245\347\250\213\345\255\246\351\231\242/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225\345\256\236\350\267\265/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237/\346\235\234\350\202\262\346\240\271/2024-2025\345\255\246\345\271\264\344\270\213\345\255\246\346\234\237VOJ\347\255\224\346\241\210.md"
@@ -0,0 +1,5856 @@
+---
+title: 2024-2025学年下学期VOJ答案
+---
+
+## [Week 1](https://voj.mobi/contest/333) 20250221
+
+### A 两个整数a,b之和
+
+```cpp
+// 这题用C,CPP会超时
+// https://blog.csdn.net/OOFFrankDura/article/details/79093578
+
+#include
+
+using namespace std;
+
+int main(void) {
+ int n;
+ cin >> n;
+
+ int a, b;
+ for (int i = 0; i < n; i++) {
+ cin >> a >> b;
+ cout << a + b << endl;
+ }
+}
+```
+
+### B 斐波那契数列
+
+```cpp
+#include
+
+using namespace std;
+
+int num(int n);
+
+int main(void) {
+ int n;
+ cin >> n;
+ cout << num(n);
+}
+
+int num(int n) {
+ if (n == 1) {
+ return 1;
+ }
+ if (n == 2) {
+ return 1;
+ }
+
+ int mod = 1000000007;
+ int a = 1, b = 1, c;
+ for (int i = 3; i <= n; i++) {
+ c = (a + b) % mod;
+ a = b;
+ b = c;
+ } // 防超时
+
+ return c;
+}
+```
+
+### C 矩阵旋转
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int n, m;
+ cin >> n >> m;
+
+ int v[n][m];
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ cin >> v[i][j];
+ }
+ }
+
+ for (int i = 0; i < m; i++) {
+ for (int j = n - 1; j >= 0; j--) {
+ if (j == n - 1) {
+ cout << v[j][i];
+ continue;
+ }
+ cout << " " << v[j][i];
+ }
+ cout << endl;
+ }
+}
+```
+
+### D 最大子阵
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int m, n;
+ cin >> m >> n;
+
+ vector> v(m, vector(n));
+ for (int i = 0; i < m; i++) {
+ for (int j = 0; j < n; j++) {
+ cin >> v[i][j];
+ }
+ }
+
+ for (int i = 0; i < m; i++) {
+ for (int j = 1; j < n; j++) {
+ v[i][j] += v[i][j - 1];
+ }
+ }
+
+ long long b[m];
+ long long ans = INT_MIN;
+ for (int i = 0; i < n; i++) {
+ for (int j = i; j < n; j++) {
+ for (int k = 0; k < m; k++) {
+ if (j == 0) {
+ b[k] = v[k][0];
+ } else if (i != 0) {
+ b[k] = v[k][j] - v[k][i - 1];
+ } else if (i == 0){
+ b[k] = v[k][j];
+ }
+ }
+
+ vector dp(m, b[0]);
+ long long mmax = dp[0];
+ for (int k = 1; k < m; k++) {
+ dp[k] = max(dp[k - 1] + b[k], b[k]);
+ mmax = max(mmax, dp[k]);
+ }
+
+ ans = max(mmax, ans);
+ }
+ }
+
+ cout << ans << endl;
+}
+```
+
+### E 四平方和
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int n;
+ cin >> n;
+ for (int a = 0; a * a <= n; a++) { // 没什么好说的,暴力枚举
+ for (int b = a; b * b <= n - a * a; b++) {
+ for (int c = b; c * c <= n - a * a - b * b; c++) {
+ double d = sqrt(n - a * a - b * b - c * c);
+ if (!(d - (int)d)) {
+ cout << a << " " << b << " " << c << " " << (int)d << " " << endl;
+ return 0;
+ }
+ }
+ }
+ }
+}
+```
+
+### F A*B问题
+
+```cpp
+#include
+
+using namespace std;
+
+vector multi(vector A, vector B) {
+ vector C(A.size() + B.size(), 0);
+ for (int i = 0; i < A.size(); i++) {
+ for (int j = 0; j < B.size(); j++) {
+ C[i + j] += A[i] * B[j];
+ }
+ }
+
+ int t = 0;
+ for (int i = 0; i < C.size(); i++) {
+ t += C[i];
+ C[i] = t % 10;
+ t /= 10;
+ }
+
+ while (C.size() > 1 && C.back() == 0) {
+ C.pop_back();
+ }
+
+ return C;
+}
+
+int main(void) {
+ string a, b;
+ cin >> a >> b;
+
+ vector A, B;
+ for (int i = a.size() - 1; i >= 0; i--) {
+ A.push_back(a[i] - '0');
+ }
+ for (int i = b.size() - 1; i >= 0; i--) {
+ B.push_back(b[i] - '0');
+ }
+
+ vector C = multi(A, B);
+
+ for (int i = C.size() - 1; i >= 0; i--) {
+ cout << C[i];
+ }
+ cout << endl;
+}
+```
+
+### G 得到整数 X
+
+```cpp
+// 二进制枚举?
+// 实际上也是动态规划
+#include
+
+using namespace std;
+
+int main(void) {
+ int n, x;
+ cin >> n >> x;
+ vector v(n);
+
+ for (int i = 0; i < n; i++) {
+ cin >> v[i];
+ }
+
+ vector dp(x + 1, 0);
+ dp[0] = 1;
+ for (int i = 0; i < n; i++) {
+ for (int j = x; j >= v[i]; j--) {
+ dp[j] += dp[j - v[i]];
+ }
+ }
+
+ cout << dp[x];
+}
+```
+
+---
+
+## [Week 2](https://voj.mobi/contest/335) 20250228
+
+### A 打印锯齿矩阵(STL)
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int n, m;
+ cin >> n >> m;
+ vector> v(n);
+ for (int i = 0; i < m; i++) {
+ int a, b;
+ cin >> a >> b;
+ v[a - 1].push_back(b);
+ }
+
+ for (int i = 0; i < n; i++) {
+ if (v[i].size() == 0) {
+ cout << " " << endl;
+ continue;
+ }
+
+ for (int j = 0; j < v[i].size(); j++) {
+ cout << v[i][j] << " ";
+ }
+ cout << endl;
+ }
+}
+```
+
+### C 计算集合的并集(STL)
+
+```cpp
+#include
+
+using namespace std;
+
+bool search(vector v, int target) {
+ for (int i = 0; i < v.size(); i++) {
+ if (v[i] == target) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+int main(void) {
+ int n, m;
+ cin >> n >> m;
+ vector v1(n);
+ vector v2(m);
+
+ for (int i = 0; i < n; i++) {
+ cin >> v1[i];
+ }
+ for (int i = 0; i < m; i++) {
+ cin >> v2[i];
+ }
+
+ for (int i = 0; i < m; i++) {
+ if (search(v1, v2[i])) {
+ continue;
+ } else {
+ v1.push_back(v2[i]);
+ }
+ }
+
+ sort(v1.begin(), v1.end());
+ for (int i = 0; i < v1.size(); i++) {
+ cout << v1[i] << " ";
+ }
+ cout << endl;
+}
+```
+
+### D 小明学英语(STL)
+
+```cpp
+#include
+
+using namespace std;
+
+bool search(vector v, string target) {
+ for (int i = 0; i < v.size(); i++) {
+ if (v[i] == target) {
+ return true;
+ }
+ }
+ return false;
+}
+
+int main(void) {
+ int n;
+ cin >> n;
+ vector v1;
+
+ for (int i = 0; i < n; i++) {
+ int status;
+ cin >> status;
+ if (status == 0) {
+ string name;
+ cin >> name;
+ transform(name.begin(), name.end(), name.begin(), ::tolower); // 转为小写
+ v1.push_back(name);
+ } else {
+ string name;
+ cin >> name;
+ transform(name.begin(), name.end(), name.begin(), ::tolower);
+ if (search(v1, name)) {
+ cout << "Yes" << endl;
+ } else {
+ cout << "No" << endl;
+ }
+ }
+ }
+}
+```
+
+### J islands 打炉石传说(二进制枚举)
+
+```cpp
+#include
+
+using namespace std;
+
+struct Card {
+ int cost;
+ bool d;
+ int w;
+};
+
+int main(void) {
+ int n;
+ cin >> n;
+
+ Card cards[n];
+ for (int i = 0; i < n; i++) {
+ cin >> cards[i].cost >> cards[i].d >> cards[i].w;
+ }
+
+ vector dp(11, 0); // i点法力值时的最大攻击力
+ for (int i = 0; i < n; i++) {
+ if (!cards[i].d) {
+ for (int j = 10; j >= cards[i].cost; j--) {
+ dp[j] = max(dp[j], dp[j - cards[i].cost] + cards[i].w);
+ }
+ }
+ }
+
+ for (int i = 0; i < n; i++) {
+ if (cards[i].d) {
+ for (int j = 10; j >= cards[i].cost; j--) {
+ dp[j] = max(dp[j], dp[j - cards[i].cost] + cards[i].w);
+ }
+ }
+ }
+
+ int max = INT_MIN;
+ for (int i = 0; i < 11; i++) {
+ if (dp[i] > max) {
+ max = dp[i];
+ }
+ }
+
+ cout << max << endl;
+}
+```
+
+### Q 算法提高 选择排序
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int n;
+ cin >> n;
+ vector v(n);
+ for (int i = 0; i < n; i++) {
+ cin >> v[i];
+ }
+
+ bool sorted = false;
+ int index = 0;
+ while (!sorted) {
+ int a = v[index];
+ int minNum = INT_MAX;
+ int minIndex;
+ for (int i = index; i < n; i++) {
+ if (v[i] < minNum) {
+ minNum = v[i];
+ minIndex = i;
+ }
+ }
+ if (minNum == a) {
+ cout << "swap(a[" << index << "], a[" << index << "]):";
+ for (int i = 0; i < n; i++) {
+ cout << v[i] << " ";
+ }
+ cout << endl;
+ index++;
+ } else {
+ swap(v[index], v[minIndex]);
+ cout << "swap(a[" << index << "], a[" << minIndex << "]):";
+ for (int i = 0; i < n; i++) {
+ cout << v[i] << " ";
+ }
+ cout << endl;
+ index++;
+ }
+ if (index == n) {
+ sorted = true;
+ }
+ }
+}
+```
+
+### R 得到整数 X
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int n, m;
+ cin >> n >> m;
+ vector v(n);
+ for (int i = 0; i < n; i++) {
+ cin >> v[i];
+ }
+
+ vector dp(m + 1, 0);
+ dp[0] = 1;
+ for (int i = 0; i < n; i++) {
+ for (int j = m; j >= v[i]; j--) {
+ dp[j] += dp[j - v[i]];
+ }
+ }
+
+ cout << dp[m] << endl;
+}
+```
+
+---
+
+## [Week 3](https://voj.mobi/contest/338) 20250308
+
+### A 汉诺塔
+
+```cpp
+#include
+using namespace std;
+
+long long moveCount(int n) {
+ if (n == 1) {
+ return 1;
+ }
+ return 1 + 2 * moveCount(n - 1);
+}
+
+long long strengthCost(int n) {
+ if (n == 1) {
+ return 1;
+ }
+ return n + 2 * strengthCost(n - 1);
+}
+
+int main() {
+ int n;
+ cin >> n;
+ cout << moveCount(n) << " " << strengthCost(n);
+ return 0;
+}
+```
+
+### B 踏青
+
+```cpp
+#include
+using namespace std;
+
+int px[4] = {-1, 1, 0, 0};
+int py[4] = {0, 0, -1, 1};
+char map[100][100];
+int vst[100][100] = { 0 };
+int n, m;
+
+void grass(int x, int y) {
+ vst[x][y] = 1;
+ for (int i = 0; i < 4; i++) {
+ int nx = x + px[i];
+ int ny = y + py[i];
+
+ if (nx >= 0 && nx < n && ny >= 0 && ny < m && vst[nx][ny] == 0 && map[nx][ny] == '#') {
+ grass(nx, ny);
+ }
+ }
+}
+
+int main() {
+ cin >> n >> m;
+ int count = 0;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ cin >> map[i][j];
+ }
+ }
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (map[i][j] == '#' && vst[i][j] == 0) {
+ grass(i, j);
+ count++;
+ }
+ }
+ }
+ cout << count;
+ return 0;
+}
+```
+
+### C 金字塔数独
+
+```cpp
+#include
+using namespace std;
+
+const int N = 9;
+int grid[N][N];
+int scores[N][N] = {
+ {6, 6, 6, 6, 6, 6, 6, 6, 6},
+ {6, 7, 7, 7, 7, 7, 7, 7, 6},
+ {6, 7, 8, 8, 8, 8, 8, 7, 6},
+ {6, 7, 8, 9, 9, 9, 8, 7, 6},
+ {6, 7, 8, 9, 10, 9, 8, 7, 6},
+ {6, 7, 8, 9, 9, 9, 8, 7, 6},
+ {6, 7, 8, 8, 8, 8, 8, 7, 6},
+ {6, 7, 7, 7, 7, 7, 7, 7, 6},
+ {6, 6, 6, 6, 6, 6, 6, 6, 6}
+};
+int maxScore = -1;
+
+bool isValid(int x, int y, int num) {
+ for (int i = 0; i < N; i++) {
+ if (grid[i][y] == num || grid[x][i] == num) {
+ return false;
+ }
+ }
+
+ int rowStart = 3 * (x / 3);
+ int colStart = 3 * (y / 3);
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 3; j++) {
+ if (grid[rowStart + i][colStart + j] == num) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+void solve(int x, int y, int totalScore) {
+ if (x == N) {
+ maxScore = max(maxScore, totalScore);
+ return;
+ }
+
+ int nx = y == N - 1 ? x + 1 : x;
+ int ny = y == N - 1 ? 0 : y + 1;
+ if (grid[x][y] == 0) {
+ for (int i = 1; i < 10; i++) {
+ if (!isValid(x, y, i)) {
+ continue;
+ }
+ grid[x][y] = i;
+ solve(nx, ny, totalScore + i * scores[x][y]);
+ }
+ grid[x][y] = 0;
+ }
+ else {
+ solve(nx, ny, totalScore + grid[x][y] * scores[x][y]);
+ }
+}
+
+int main() {
+ for (int i = 0; i < N; i++) {
+ for (int j = 0; j < N; j++) {
+ cin >> grid[i][j];
+ }
+ }
+ solve(0, 0, 0);
+ if (maxScore == 0) {
+ cout << -1 << endl;
+ }
+ else {
+ cout << maxScore << endl;
+ }
+ return 0;
+}
+
+```
+
+### D 水果店(STL)
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int n;
+ cin >> n;
+ map> m;
+ for (int i = 0; i < n; i++) {
+ string origin;
+ string fruit;
+ int sales;
+ cin >> fruit >> origin >> sales;
+ m[origin][fruit] += sales;
+ }
+
+ for (auto& p1 : m) {
+ cout << p1.first << endl;
+ for (auto& p2 : p1.second) {
+ cout << " |----" << p2.first << '(' << p2.second << ')' << endl;
+ }
+ }
+}
+```
+
+### E 小明面试(STL)
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int n;
+ cin >> n;
+ unordered_map m;
+ for (int i = 0; i < n; i++) {
+ int a;
+ cin >> a;
+ if (m.find(a) != m.end()) {
+ m[a]++;
+ } else {
+ m.insert({a, 1});
+ }
+ }
+
+ int imax = INT_MIN;
+ for (auto& [key, value] : m) { // 注意迭代器
+ imax = max(value, imax);
+ }
+
+ int mmax = INT_MIN;
+ for (auto& [key, value] : m) {
+ if (value == imax) {
+ mmax = max(mmax, key);
+ }
+ }
+ cout << mmax << ' ' << imax << endl;
+}
+```
+
+### F 网页跳转
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int n;
+ cin >> n;
+ stack backStack, forwardStack;
+ string current = "Ignore";
+ for (int i = 0; i < n; i++) {
+ string action;
+ cin >> action;
+ if (action == "VISIT") {
+ string url;
+ cin >> url;
+ cout << url << endl;
+ if (current != "Ignore") {
+ backStack.push(current);
+ }
+ current = url;
+ while (!forwardStack.empty()) {
+ forwardStack.pop();
+ }
+ } else if (action == "BACK") {
+ if (backStack.empty()) {
+ cout << "Ignore" << endl;
+ } else {
+ forwardStack.push(current);
+ current = backStack.top();
+ backStack.pop();
+ cout << current << endl;
+
+ }
+ } else if (action == "FORWARD") {
+ if (forwardStack.empty()) {
+ cout << "Ignore" << endl;
+ } else {
+ backStack.push(current);
+ current = forwardStack.top();
+ forwardStack.pop();
+ cout << current << endl;
+ }
+ }
+ }
+}
+```
+
+### G 幼儿园买玩具(二进制枚举)
+
+```cpp
+#include
+using namespace std;
+
+int main() {
+ int n, m, k;
+ int result = 0;
+ int list[101][16];
+ cin >> n >> m >> k;
+
+ for (int i = 0; i < n; i++) {
+ cin >> list[i][0];
+ for (int j = 1; j <= list[i][0]; j++) {
+ cin >> list[i][j];
+ }
+ }
+
+ for (int i = 0; i < (1 << k); i++) {
+ int flag[16] = {0};
+ int count = 0;
+ int num = 0;
+ for (int j = 0; j < k; j++) {
+ if (i & (1 << j)) {
+ num++;
+ flag[j + 1] = 1;
+ }
+ }
+ for (int x = 0; x < n; x++) {
+ bool a = true;
+ for (int y = 1; y <= list[x][0]; y++) {
+ if (flag[list[x][y]] == 0) {
+ a = false;
+ }
+ }
+ if (a)
+ count++;
+ }
+ if (count > result && num <= m) {
+ result = count;
+ }
+ }
+
+ cout << result;
+ return 0;
+}
+```
+
+### H 约瑟夫环问题(循环链表)
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int n, m;
+ cin >> n >> m;
+ list l;
+ for (int i = 1; i <= n; i++) {
+ l.push_back(i);
+ }
+
+ auto it = l.begin();
+ while (l.size() > 1) {
+ for (int i = 1; i < m; i++) {
+ it++;
+ if (it == l.end()) {
+ it = l.begin();
+ }
+ }
+
+ cout << *it << " ";
+ it = l.erase(it);
+ if (it == l.end()) {
+ it = l.begin();
+ }
+ }
+ cout << *l.begin() << endl;
+}
+```
+
+### I n个最小和(STL)
+
+```cpp
+#include
+
+using namespace std;
+
+struct Node {
+ int sum, i, j;
+ bool operator>(const Node &other) const {
+ return sum > other.sum;
+ }
+};
+
+vector kSmallestSums(vector &A, vector &B, int n) {
+ sort(A.begin(), A.end());
+ sort(B.begin(), B.end());
+
+ priority_queue, greater> minHeap;
+ set> visited;
+
+ minHeap.push({A[0] + B[0], 0, 0});
+ visited.insert({0, 0});
+
+ vector result;
+
+ while (n--) {
+ Node cur = minHeap.top();
+ minHeap.pop();
+ result.push_back(cur.sum);
+
+ int i = cur.i, j = cur.j;
+
+ if (i + 1 < A.size() && !visited.count({i + 1, j})) {
+ minHeap.push({A[i + 1] + B[j], i + 1, j});
+ visited.insert({i + 1, j});
+ }
+
+ if (j + 1 < B.size() && !visited.count({i, j + 1})) {
+ minHeap.push({A[i] + B[j + 1], i, j + 1});
+ visited.insert({i, j + 1});
+ }
+ }
+
+ return result;
+}
+
+int main() {
+ int n;
+ cin >> n;
+ vector A(n), B(n);
+
+ for (int i = 0; i < n; i++) cin >> A[i];
+ for (int i = 0; i < n; i++) cin >> B[i];
+
+ vector result = kSmallestSums(A, B, n);
+
+ for (int i = 0; i < result.size(); i++) {
+ if (i > 0) cout << " ";
+ cout << result[i];
+ }
+ cout << endl;
+
+ return 0;
+}
+```
+
+### J 字符串的冒泡排序
+
+```cpp
+#include
+using namespace std;
+
+vector bubbleSortTransform(string sh, const string &ch) {
+ int n = sh.size();
+ vector steps;
+
+ unordered_map countSh, countCh;
+ for (char c : sh) {
+ countSh[c]++;
+ }
+ for (char c : ch) {
+ countCh[c]++;
+ }
+ if (countSh != countCh) {
+ return {-1};
+ }
+
+ for (int i = 0; i < n; i++) {
+ if (sh[i] == ch[i]) {
+ continue;
+ }
+
+ int pos = i;
+ while (sh[pos] != ch[i]) pos++;
+
+ for (int j = pos; j > i; j--) {
+ swap(sh[j], sh[j - 1]);
+ steps.push_back(j);
+ }
+ }
+
+ steps.insert(steps.begin(), steps.size());
+ return steps;
+}
+
+int main() {
+ int n;
+ string sh, ch;
+ cin >> n >> sh >> ch;
+
+ vector result = bubbleSortTransform(sh, ch);
+
+ if (result[0] == -1) {
+ cout << -1 << endl;
+ } else {
+ for (int i = 0; i < result.size(); i++) {
+ if (i > 0) cout << " ";
+ cout << result[i];
+ }
+ cout << endl;
+ }
+ return 0;
+}
+```
+
+### K 插入排序
+
+```cpp
+#include
+#define MAXN 8010
+using namespace std;
+
+struct node {
+ int val;
+ int num;
+ bool operator>(const node b) const {
+ if (this->val != b.val) return this->val > b.val;
+ return this->num > b.num;
+ }
+ bool operator<(const node b) const {
+ if (this->val != b.val) return this->val < b.val;
+ return this->num < b.num;
+ }
+};
+
+node a[MAXN];
+int n, q, type, x, v;
+int order[MAXN];
+
+void get_order() {
+ for (int i = 1; i <= n; i++) {
+ order[a[i].num] = i;
+ }
+}
+
+void update(int x, int v) {
+ a[order[x]].val = v;
+ for (int i = order[x]; i < n; i++) {
+ if (a[i] > a[i + 1]) {
+ swap(a[i], a[i + 1]);
+ }
+ }
+ for (int i = order[x]; i > 1; i--) {
+ if (a[i] < a[i - 1]) {
+ swap(a[i], a[i - 1]);
+ }
+ }
+ get_order();
+}
+
+int main() {
+ freopen("sort.in", "r", stdin);
+ freopen("sort.out", "w", stdout);
+ scanf("%d%d", &n, &q);
+ for (int i = 1; i <= n; i++) {
+ scanf("%d", &a[i].val);
+ a[i].num = i;
+ }
+ sort(a + 1, a + n + 1);
+ get_order();
+ while (q--) {
+ scanf("%d", &type);
+ if (type == 1) {
+ scanf("%d%d", &x, &v);
+ update(x, v);
+ } else {
+ scanf("%d", &x);
+ printf("%d\n", order[x]);
+ }
+ }
+ return 0;
+}
+```
+
+---
+
+## [Week 4](https://voj.mobi/contest/345) 20250314
+
+### A 一维坐标的移动
+
+```cpp
+#include
+
+using namespace std;
+
+int minSteps(int n, int start, int end) {
+ if (start == end)
+ return 0;
+
+ vector visited(n + 1, false);
+ queue> q;
+ q.push({start, 0});
+
+ while (!q.empty()) {
+ int pos = q.front().first;
+ int steps = q.front().second;
+ q.pop();
+
+ if (pos == end) return steps;
+
+ if (pos + 1 <= n && !visited[pos + 1]) {
+ q.push({pos + 1, steps + 1});
+ visited[pos + 1] = true;
+ }
+ if (pos - 1 >= 0 && !visited[pos - 1]) {
+ q.push({pos - 1, steps + 1});
+ visited[pos - 1] = true;
+ }
+ if (pos * 2 <= n && !visited[pos * 2]) {
+ q.push({pos * 2, steps + 1});
+ visited[pos * 2] = true;
+ }
+ }
+
+ return -1;
+}
+
+int main() {
+ int n, start, end;
+ cin >> n >> start >> end;
+
+ int result = minSteps(n, start, end);
+ cout << result << endl;
+
+ return 0;
+}
+```
+
+### B 多机调度问题
+
+```cpp
+#include
+
+using namespace std;
+
+int main() {
+ int n, m;
+ vector taxt;
+ cin >> n >> m;
+ vector dp(m);
+
+ for (int i = 0; i < n; i++) {
+ int tmp;
+ cin >> tmp;
+ taxt.push_back(tmp);
+ }
+ sort(taxt.begin(), taxt.end(), greater());
+ if (n <= m) {
+ cout << taxt[n - 1];
+ return 0;
+ }
+ else {
+ for (int j = 0; j < m; j++) {
+ dp[j] = taxt[j];
+ }
+ for (int j = m; j < n; j++) {
+ sort(dp.begin(), dp.end());
+ dp[0] += taxt[j];
+ }
+ }
+
+ sort(dp.begin(), dp.end(), greater());
+ cout << dp[0];
+ return 0;
+}
+```
+
+### C 迷瘴
+
+```cpp
+#include
+#include
+using namespace std;
+
+int main() {
+ int v, n, i;
+ double w, sum = 0, p = 0, an[105] = {0};
+ scanf("%d%d%lf", &n, &v, &w);
+ for (i = 0; i < n; i++) {
+ scanf("%lf", &an[i]);
+ }
+ sort(an, an + n);
+ for (i = 0; i < n; i++) {
+ sum += an[i];
+ if (sum / (i + 1) <= w) {
+ p = sum / (i + 1);
+ } else {
+ break;
+ }
+ }
+ if (i == 0)
+ printf("0 0.00\n");
+ else
+ printf("%d %.2f\n", i * v, p / 100);
+ return 0;
+}
+```
+
+### D 活动安排
+
+```cpp
+#include
+
+using namespace std;
+
+struct Program {
+ int start;
+ int end;
+};
+
+bool cmp(Program a, Program b) {
+ return a.end < b.end;
+}
+
+int main() {
+ int n;
+ cin >> n;
+ vector programs(n);
+
+ for (int i = 0; i < n; i++) {
+ cin >> programs[i].start >> programs[i].end;
+ }
+ sort(programs.begin(), programs.end(), cmp);
+
+ int count = 1;
+ int tmp = programs[0].end;
+ for (int i = 1; i < n; i++) {
+ if (programs[i].start >= tmp) {
+ tmp = programs[i].end;
+ count++;
+ }
+ }
+
+ cout << count;
+ return 0;
+}
+```
+
+### E 逆序对
+
+```cpp
+#include
+using namespace std;
+
+int nums[100000];
+long long reverseCount = 0;
+
+void merge(int sta, int mid, int end) {
+ int tmp[100000];
+ int i = sta;
+ int j = mid + 1;
+ int k = sta;
+
+ while (i <= mid && j <= end) {
+ if (nums[i] > nums[j]) {
+ reverseCount += mid + 1 - i;
+ tmp[k++] = nums[j++];
+ }
+ else {
+ tmp[k++] = nums[i++];
+ }
+ }
+ while (i <= mid) {
+ tmp[k++] = nums[i++];
+ }
+ while (j <= end) {
+ tmp[k++] = nums[j++];
+ }
+
+ for (int i = sta; i <= end; i++) {
+ nums[i] = tmp[i];
+ }
+}
+
+void mergeSort(int sta, int end) {
+ if (sta < end) {
+ int mid = sta + (end - sta) / 2;
+ mergeSort(sta, mid);
+ mergeSort(mid + 1, end);
+ merge(sta, mid, end);
+ }
+}
+
+int main() {
+ int n, k;
+ cin >> n >> k;
+ for (int i = 0; i < n; i++) {
+ cin >> nums[i];
+ }
+
+ mergeSort(0, n - 1);
+ cout << max((long long)0, reverseCount - k);
+ return 0;
+}
+```
+
+### G Intervals
+
+```cpp
+#include
+#include
+#include
+using namespace std;
+
+struct Interval {
+ int start;
+ int end;
+};
+
+bool cmp(Interval a, Interval b) {
+ return a.start < b.start;
+}
+
+int main() {
+ int n;
+ int count = 0;
+ cin >> n;
+ vector intervals(n);
+ vector result;
+
+ for (int i = 0; i < n; i++) {
+ cin >> intervals[i].start >> intervals[i].end;
+ }
+ sort(intervals.begin(), intervals.end(), cmp);
+
+ result.push_back(intervals[0]);
+ for (int i = 1; i < n; i++) {
+ if (intervals[i].start <= result[count].end) {
+ result[count].end = max(intervals[i].end, result[count].end);
+ }
+ else {
+ result.push_back(intervals[i]);
+ count++;
+ }
+ }
+
+ for (int i = 0; i <= count; i++) {
+ cout << result[i].start << " " << result[i].end << endl;
+ }
+ return 0;
+}
+```
+
+### H 逃跑
+
+```cpp
+#include
+#include
+#include
+#include
+using namespace std;
+
+const int N = 110;
+int dx[] = { 0, 0, 1, -1, 0 };
+int dy[] = { 1, -1, 0, 0, 0 };
+int pretime = -1;
+int n, m, k, d;
+bitset vis[N];
+bitset sold[N];
+bitset go[N][N];
+
+struct Role {
+ int x;
+ int y;
+ int time;
+ int d;
+};
+
+struct Soldier {
+ char c;
+ int t;
+ int v;
+ int x;
+ int y;
+}soldiers[N];
+
+struct Bullet {
+ int x;
+ int y;
+ int v;
+ char c;
+};
+
+queue roles;
+vector bullets;
+
+bool isValid(int x, int y) {
+ return x >= 0 && x <= n && y >= 0 && y <= m;
+}
+
+void bulletUpdate(Bullet& bullet) {
+ switch (bullet.c) {
+ case 'N':
+ bullet.x -= bullet.v;
+ break;
+ case 'W':
+ bullet.y -= bullet.v;
+ break;
+ case 'E':
+ bullet.y += bullet.v;
+ break;
+ case 'S':
+ bullet.x += bullet.v;
+ break;
+ }
+}
+
+void update(int time) {
+ if (pretime == time) {
+ return;
+ }
+ else {
+ pretime = time;
+ for (Bullet& bullet : bullets) {
+ if (!isValid(bullet.x, bullet.y)) {
+ continue;
+ }
+ vis[bullet.x][bullet.y] = 0;
+ bulletUpdate(bullet);
+ if (!isValid(bullet.x, bullet.y)) {
+ continue;
+ }
+ vis[bullet.x][bullet.y] = 1;
+ }
+ for (int i = 1; i <= k; i++)
+ {
+ if (time % soldiers[i].t == 0) {
+ bullets.push_back({ soldiers[i].x, soldiers[i].y, soldiers[i].v, soldiers[i].c });
+ vis[soldiers[i].x][soldiers[i].y] = 1;
+ }
+ }
+ }
+}
+
+void bfs(int x, int y, int time, int d) {
+ bool flag = false;
+ roles.push({ x, y, time, d });
+ go[x][y] = true;
+
+ while (roles.size()) {
+ Role role = roles.front();
+ roles.pop();
+
+ if (role.d < m + n - role.x - role.y) {
+ continue;
+ }
+ if (go[n][m][role.time] == 1) {
+ cout << roles.back().time;
+ flag = true;
+ return;
+ }
+ for (int i = 0; i < 5; i++) {
+ int tx = role.x + dx[i];
+ int ty = role.y + dy[i];
+ update(role.time + 1);
+ if ((!isValid(tx, ty)) || vis[tx][ty] == 1 || go[tx][ty][role.time] || sold[tx][ty] == 1) {
+ continue;
+ }
+ if (!vis[tx][ty]) {
+ go[tx][ty][role.time] = 1;
+ }
+ roles.push({ tx, ty, role.time + 1, role.d - 1 });
+ }
+ }
+
+ if (!flag) {
+ cout << "Bad luck!";
+ }
+}
+
+void solve() {
+ cin >> n >> m >> k >> d;
+ for (int i = 1; i <= k; i++) {
+ char c;
+ int t, v, x, y;
+ cin >> c >> t >> v >> x >> y;
+ soldiers[i] = { c, t, v, x, y };
+ sold[x][y] = 1;
+ }
+ for (int i = 1; i <= k; i++) {
+ bullets.push_back({ soldiers[i].x, soldiers[i].y, soldiers[i].v, soldiers[i].c });
+ vis[soldiers[i].x][soldiers[i].y] = 1;
+ }
+
+ bfs(0, 0, 0, d);
+}
+
+int main() {
+ int q = 1;
+ for (int i = 0; i < q; i++) {
+ solve();
+ }
+ return 0;
+}
+```
+
+### I 小明回家
+
+```cpp
+#include
+#include
+#include
+using namespace std;
+
+struct Point {
+ int x;
+ int y;
+ int step;
+};
+
+char map[2000][2000];
+int px[4] = {-1, 1, 0, 0};
+int py[4] = {0, 0, -1, 1};
+int n, m;
+
+int stepCount(Point start, Point end) {
+ int vst[2000][2000] = { 0 };
+ queue points;
+ points.push(start);
+ vst[start.x][start.y] = 1;
+
+ while (!points.empty()) {
+ Point tmp = points.front();
+ int x = tmp.x;
+ int y = tmp.y;
+ int step = tmp.step;
+ points.pop();
+
+ if (x == end.x && y == end.y) {
+ return step;
+ }
+
+ for (int i = 0; i < 4; i++) {
+ int nx = x + px[i];
+ int ny = y + py[i];
+
+ if (nx >= 0 && nx < n && ny >= 0 && ny < m && vst[nx][ny] == 0 && map[nx][ny] != '#') {
+ Point next;
+ next.x = nx;
+ next.y = ny;
+ next.step = step + 1;
+ points.push(next);
+ vst[nx][ny] = 1;
+ }
+ }
+ }
+
+ return -1;
+}
+
+int main() {
+ Point start, key, end;
+ vector keys;
+ int keyCount = 0;
+ int minStep = -1;
+ cin >> n >> m;
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ cin >> map[i][j];
+ if (map[i][j] == 'S') {
+ start.x = i;
+ start.y = j;
+ start.step = 0;
+ }
+ if (map[i][j] == 'P') {
+ key.x = i;
+ key.y = j;
+ keyCount++;
+ keys.push_back(key);
+ }
+ if (map[i][j] == 'T') {
+ end.x = i;
+ end.y = j;
+ }
+ }
+ }
+
+ for (int i = 0; i < keyCount; i++) {
+ if (stepCount(start, keys[i]) == -1)
+ continue;
+ keys[i].step = stepCount(start, keys[i]);
+ if (stepCount(keys[i], end) == -1)
+ continue;
+ minStep = minStep == -1 ? stepCount(keys[i], end) : min(stepCount(keys[i], end), minStep);
+ }
+ cout << minStep;
+ return 0;
+}
+```
+
+---
+
+## [Week 5](https://voj.mobi/contest/349) 20250321
+
+### A 一元三次方程求解
+
+```cpp
+#include
+#include
+using namespace std;
+
+double A, B, C, D;
+
+double f(double x) {
+ return A*x*x*x + B*x*x + C*x + D;
+}
+
+int main() {
+ cin >> A >> B >> C >> D;
+ for (int i = -10000; i <= 10000; i++) {
+ if (f((i - 0.5) / 100) * f((i + 0.5) / 100) < 0 || f((i - 0.5) / 100) == 0)
+ printf("%.2lf ", i / 100.0);
+ }
+ return 0;
+}
+```
+
+### B 循环比赛日程表
+
+```cpp
+#include
+#include
+#include
+using namespace std;
+
+int main() {
+ int M;
+ cin >> M;
+ int N = 1 << M;
+ vector> table(N, vector(N, 0));
+
+ table[0][0] = 1;
+ int half = 1;
+
+ for (int k = 0; k < M; k++) {
+ for (int i = 0; i < (1 << k); i++) {
+ for (int j = 0; j < (1 << k); j++) {
+ table[i][j + half] = table[i][j] + half;
+ table[i + half][j] = table[i][j] + half;
+ table[i + half][j + half] = table[i][j];
+ }
+ }
+ half *= 2;
+ }
+
+ for (int i = 0; i < N; i++) {
+ for (int j = 0; j < N; j++) {
+ cout << setw(3) << table[i][j];
+ }
+ cout << endl;
+ }
+
+ return 0;
+}
+```
+
+### C Entropy
+
+```cpp
+#include
+using namespace std;
+
+int main()
+{
+ int freq_arr[27];
+ string s;
+ while (cin >> s && s != "END")
+ {
+ int total = 0;
+ int sum = 0;
+ priority_queue, greater > q;
+ memset(freq_arr, 0, sizeof(freq_arr));
+ int n = s.size();
+ for (int i = 0; i < n; i++)
+ {
+ if (s[i] == '_')
+ {
+ freq_arr[26]++;
+ }
+ else
+ {
+ freq_arr[s[i] - 'A']++;
+ }
+ }
+ for (int i = 0; i < 27; i++)
+ {
+ if (freq_arr[i])
+ {
+ q.push(freq_arr[i]);
+ }
+ }
+ if (q.size() == 1)
+ {
+ total = q.top();
+ printf("%d %d %.1lf\n", n * 8, n * 1, (double)8/1);
+ }
+ else
+ {
+ while (q.size() > 1)
+ {
+ sum = 0;
+ sum += q.top();
+ q.pop();
+ sum += q.top();
+ q.pop();
+ q.push(sum);
+ total += sum;
+ }
+ printf("%d %d %.1lf\n", n * 8, total, (double)n * 8 / total);
+ }
+ }
+
+ return 0;
+}
+```
+
+### D 小明的购物袋1
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int V;
+ int n;
+ cin >> V >> n;
+
+ vector v(n);
+ for (int i = 0; i < n; i++) {
+ cin >> v[i];
+ }
+
+ vector> dp(n + 1, vector(V + 1, 0));
+ for (int i = 1; i < n + 1; i++) {
+ for (int j = 0; j <= V; j++) {
+ if (v[i - 1] <= j) {
+ dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i - 1]] + v[i - 1]);
+ } else {
+ dp[i][j] = dp[i - 1][j];
+ }
+ }
+ }
+ cout << V - dp[n][V] << endl;
+}
+```
+
+### E 小明的购物袋2
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int V, n;
+ cin >> V >> n;
+ vector> v(n);
+ for (int i = 0; i < n; i++) {
+ cin >> v[i].first >> v[i].second;
+ }
+
+ vector> dp(n + 1, vector(V + 1, 0));
+
+ for (int i = 1; i < n + 1; i++) {
+ for (int j = 0; j < V + 1; j++) {
+ if (j < v[i - 1].first) {
+ dp[i][j] = dp[i - 1][j];
+ } else {
+ dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i - 1].first] + v[i - 1].second);
+ }
+ }
+ }
+
+ cout << dp[n][V] << endl;
+}
+```
+
+### F 小明的购物袋3
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int V, n;
+ cin >> n >> V;
+ vector> v(n);
+ for (int i = 0; i < n; i++) {
+ cin >> v[i].first >> v[i].second;
+ }
+
+ vector dp(V + 1, 0);
+
+ for (int i = 0; i < n; i++) {
+ for (int j = v[i].first; j <= V; j++) {
+ dp[j] = max(dp[j], dp[j - v[i].first] + v[i].second);
+ }
+ }
+
+ cout << dp[V] << endl;
+}
+```
+
+---
+
+## [Week 6](https://voj.mobi/contest/359) 20250328
+
+### A 小明跳木桩
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ int n;
+ cin >> n;
+ vector h(n);
+ for (int i = 0; i < n; i++) {
+ cin >> h[i];
+ }
+
+ vector dp(n, 1);
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < i; j++) {
+ if (h[j] >= h[i]) {
+ dp[i] = max(dp[i], dp[j] + 1);
+ }
+ }
+ }
+
+ int mmax = INT_MIN;
+ for (int i = 0; i < n; i++) {
+ mmax = max(mmax, dp[i]);
+ }
+
+ cout << mmax << endl;
+}
+```
+
+### B 删除最少的元素
+
+```cpp
+#include
+using namespace std;
+
+int main(){
+ int n;
+ cin >> n;
+ int dp1[1009];
+ int dp2[1009];
+ int a[1009];
+ int ans = 0;
+
+ for(int i = 0; i < n; i++){
+ cin >> a[i];
+ }
+
+ for(int i = 0; i < n; i++){
+ dp1[i] = 1;
+ dp2[i] = 1;
+ }
+
+ for(int i = 1; i < n; i++){
+ for(int j = 0; j < i; j++){
+ if(a[i] <= a[j]){
+ dp1[i] = max(dp1[i], dp1[j] + 1);
+ }
+ }
+ }
+
+ for(int i = n - 2; i >= 0; i--){
+ for(int j = n - 1; j > i; j--){
+ if(a[i] <= a[j]){
+ dp2[i] = max(dp2[i], dp2[j] + 1);
+ }
+ }
+ }
+
+ for(int i = 0; i < n; i++){
+ ans = max(ans, dp1[i] + dp2[i] - 1);
+ }
+
+ cout << n - ans;
+
+ return 0;
+}
+```
+
+### C 最长公共子序列
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ string a, b;
+ cin >> a >> b;
+ vector> dp(a.length() + 1, vector(b.length() + 1, 0));
+
+ for (int i = 1; i <= a.size(); i++) {
+ for (int j = 1; j <= b.size(); j++) {
+ if (a[i - 1] == b[j - 1]) {
+ dp[i][j] = dp[i - 1][j - 1] + 1;
+ } else {
+ dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
+ }
+ }
+ }
+
+
+ int mmax = INT_MIN;
+ for (int i = 0; i < a.size() + 1; i++) {
+ for (int j = 0; j < b.size() + 1; j++) {
+ mmax = max(mmax, dp[i][j]);
+ }
+ }
+
+ cout << mmax << endl;
+}
+```
+
+### D 回文串
+
+```cpp
+#include
+
+using namespace std;
+
+int main(void) {
+ string s;
+ cin >> s;
+ string s2 = s;
+ reverse(s2.begin(), s2.end());
+
+ vector> dp(s.size() + 1, vector(s.size() + 1));
+ for (int i = 1; i <= s.size(); i++) {
+ for (int j = 1; j <= s.size(); j++) {
+ if (s[i - 1] == s2[j - 1]) {
+ dp[i][j] = dp[i - 1][j - 1] + 1;
+ } else {
+ dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
+ }
+ }
+ }
+
+ // l = len - lcs
+ cout << s.length() - dp[s.size()][s.size()] << endl;
+}
+```
+
+### E 灌溉机器人
+
+```cpp
+#include
+using namespace std;
+#define max_Heap(x) priority_queue, less>
+#define min_Heap(x) priority_queue, greater>
+typedef long long ll;
+typedef unsigned long long ull;
+typedef pair PII;
+typedef pair PLL;
+const double PI = acos(-1);
+
+int n, m;
+char field[106][16];
+vector s[106];
+int dp[106][106][106];
+
+int main()
+{
+ ios::sync_with_stdio(0);
+ cin.tie(0);
+ cout.tie(0);
+
+ unordered_map mp;
+
+ cin >> n >> m;
+ for (int i = 1; i <= n; i++)
+ {
+ for (int j = 0; j < m; j++)
+ {
+ cin >> field[i][j];
+ }
+ }
+
+ for (int i = 1; i <= n; i++)
+ {
+ for (int j = 0; j < (1 << m); j++)
+ {
+ bool ok = 1;
+ for (int k = 0; k < m; k++)
+ {
+ if (((j >> k) & 1) && (field[i][k] == 'H'))
+ {
+ ok = 0;
+ break;
+ }
+ }
+ if ((j & (j << 1)) || (j & (j << 2)) || (j & (j >> 1)) || (j & (j >> 2)))
+ {
+ ok = 0;
+ }
+ if (ok)
+ s[i].push_back(j);
+ }
+ }
+
+ for (int i = 0; i < (1 << m); i++)
+ {
+ int cnt = 0;
+ for (int j = 0; j < m; j++)
+ {
+ if ((i >> j) & 1)
+ cnt++;
+ }
+ mp[i] = cnt;
+ }
+
+ for (int i = 0; i < s[1].size(); i++)
+ {
+ dp[1][i][0] = mp[s[1][i]];
+ }
+
+ s[0].push_back(0);
+
+ for (int i = 1; i <= n; i++)
+ {
+ for (int num3 = 0; num3 < s[i].size(); num3++)
+ {
+ int s3 = s[i][num3];
+ for (int num2 = 0; num2 < s[i - 1].size(); num2++)
+ {
+ int s2 = s[i - 1][num2];
+ for (int num1 = 0; num1 < s[i - 2].size(); num1++)
+ {
+ int s1 = s[i - 2][num1];
+ if (!(s1 & s2) && !(s1 & s3) && !(s2 & s3))
+ dp[i][num3][num2] = max(dp[i][num3][num2], dp[i - 1][num2][num1] + mp[s3]);
+ }
+ }
+ }
+ }
+
+ int ans = 0;
+ for (int i = 0; i < s[n].size(); i++)
+ {
+ for (int j = 0; j < s[n - 1].size(); j++)
+ {
+ ans = max(ans, dp[n][i][j]);
+ }
+ }
+ cout << ans;
+
+ return 0;
+}
+```
+
+### F 小明的积木
+
+```cpp
+#include
+using namespace std;
+#define max_Heap(x) priority_queue, less>
+#define min_Heap(x) priority_queue, greater>
+typedef long long ll;
+typedef unsigned long long ull;
+typedef pair PII;
+typedef pair PLL;
+const double PI = acos(-1);
+
+int main()
+{
+ ios::sync_with_stdio(0);
+ cin.tie(0);
+ cout.tie(0);
+
+ int capacity, n;
+ cin >> capacity >> n;
+ int dp[(1 << n)];
+ memset(dp, 0x3f, sizeof(dp));
+ vector s(n);
+ vector w(n);
+ for (int i = 0; i < n; i++)
+ {
+ cin >> s[i] >> w[i];
+ }
+ for (int i = 0; i < (1 << n); i++)
+ {
+ int max_s = 0;
+ int sum_w = 0;
+ for (int j = 0; j < n; j++)
+ {
+ if ((i >> j) & 1)
+ {
+ max_s = max(max_s, s[j]);
+ sum_w += w[j];
+ }
+ }
+ if (sum_w <= capacity)
+ {
+ dp[i] = max_s;
+ }
+ else
+ {
+ for (int j = ((i - 1) & i); j > 0; j = ((j - 1) & i))
+ {
+ dp[i] = min(dp[i], dp[j] + dp[j ^ i]);
+ }
+ }
+ }
+ cout << dp[(1 << n) - 1];
+
+ return 0;
+}
+```
+
+### G 消除字符串
+
+```cpp
+#include
+using namespace std;
+
+string str;
+
+bool isReverse(int i) {
+ string str1;
+ string str2;
+
+ for (int j = 0; j < 16; j++) {
+ if ((i >> j) & 1) {
+ str1 += str[j];
+ }
+ }
+ str2 = str1;
+ reverse(str1.begin(), str1.end());
+
+ return str1 == str2;
+}
+
+int main() {
+ cin >> str;
+ int length = str.size();
+ vector dp(1 << length, 0);
+
+ for (int i = 1; i < (1 << length); i++) {
+ dp[i] = isReverse(i) ? 1 : 16;
+ for (int j = i; j; j = (j - 1) & i) {
+ dp[i] = min(dp[i], dp[j] + dp[j ^ i]);
+ }
+ }
+ cout << dp[(1 << length) - 1];
+ return 0;
+}
+```
+
+---
+
+## [Week 8](https://voj.mobi/contest/361) 20250411
+
+### A 二叉树中的最低公共祖先
+
+```cpp
+#include
+
+using namespace std;
+struct Node {
+ int val;
+ Node* lchild;
+ Node* rchild;
+ Node(int val) : val(val), lchild(NULL), rchild(NULL) {}
+};
+
+vector inorder;
+vector preorder;
+map record;
+
+Node* createTree(vector preorder, vector inorder, int preL, int preR, int inL, int inR) {
+ if (preL > preR) {
+ return NULL;
+ }
+
+ Node* root = new Node(preorder[preL]);
+ record[preorder[preL]] = root;
+ int k = inL;
+ while (inorder[k] != preorder[preL]) {
+ k++;
+ }
+ int numLeft = k - inL;
+
+ root->lchild = createTree(preorder, inorder, preL + 1, preL + numLeft, inL, k - 1);
+ root->rchild = createTree(preorder, inorder, preL + numLeft + 1, preR, k + 1, inR);
+ return root;
+}
+
+Node* LCA(Node* root, Node* first, Node* second) {
+ if (root == NULL || root == first || root == second) {
+ return root;
+ }
+
+ Node* left = LCA(root->lchild, first, second);
+ Node* right = LCA(root->rchild, first, second);
+ if (left && right) return root;
+ else if (left) return left;
+ else return right;
+}
+
+int main() {
+ int M, N;
+ cin >> M >> N;
+ for (int i = 0; i < N; i++) {
+ int order;
+ cin >> order;
+ inorder.push_back(order);
+ }
+ for (int i = 0; i < N; i++) {
+ int order;
+ cin >> order;
+ preorder.push_back(order);
+ }
+
+ Node* root = createTree(preorder, inorder, 0, N - 1, 0, N - 1);
+ while (M--) {
+ int u, v;
+ cin >> u >> v;
+ if (record.count(u) && record.count(v)) {
+ Node* lca = LCA(root, record[u], record[v]);
+ if (lca->val == u) {
+ cout << u << " is an ancestor of " << v << "." << endl;
+ }
+ else if (lca->val == v) {
+ cout << v << " is an ancestor of " << u << "." << endl;
+ }
+ else {
+ cout << "LCA of " << u << " and " << v << " is " << lca->val << "." << endl;
+ }
+ }
+ else if (record.count(u)) {
+ cout << "ERROR: " << v << " is not found." << endl;
+ }
+ else if (record.count(v)) {
+ cout << "ERROR: " << u << " is not found." << endl;
+ }
+ else {
+ cout << "ERROR: " << u << " and " << v << " are not found." << endl;
+ }
+ }
+ return 0;
+}
+```
+
+### B FBI 树
+
+```cpp
+#include
+
+using namespace std;
+
+struct Node {
+ char val;
+ Node* lchild;
+ Node* rchild;
+ Node(char val) : val(val), lchild(NULL), rchild(NULL) {}
+};
+
+char classify(string str) {
+ bool contain1 = false;
+ bool contain0 = false;
+
+ for (int i = 0; i < str.size(); i++) {
+ if (str[i] == '0') {
+ contain0 = true;
+ }
+ else {
+ contain1 = true;
+ }
+ }
+ if (contain0 && contain1) {
+ return 'F';
+ }
+ else if (contain0){
+ return 'B';
+ }
+ else {
+ return 'I';
+ }
+}
+
+Node* creatTree(string str) {
+ char val = classify(str);
+ int len = str.size();
+
+ if (len == 0) {
+ return NULL;
+ }
+
+ Node* node = new Node(val);
+ if (len >= 2) {
+ node->lchild = creatTree(str.substr(0, len / 2));
+ node->rchild = creatTree(str.substr(len / 2, len / 2));
+ }
+ return node;
+}
+
+void postorder(Node* node) {
+ if (node) {
+ postorder(node->lchild);
+ postorder(node->rchild);
+ cout << node->val;
+ }
+}
+
+int main() {
+ int N;
+ string str;
+ cin >> N >> str;
+
+ Node* root = creatTree(str);
+ postorder(root);
+
+ return 0;
+}
+```
+
+### C 食物链
+
+```cpp
+#include
+
+using namespace std;
+
+class FoodUnion {
+private:
+ int parent[50000];
+ int relation[50000];
+ int fakeCount;
+ int total;
+
+public:
+ FoodUnion(int n) {
+ for (int i = 1; i <= n; ++i) {
+ parent[i] = i;
+ relation[i] = 0;
+ }
+ fakeCount = 0;
+ total = n;
+ }
+
+ int find(int x) {
+ if (x != parent[x]) {
+ int root = find(parent[x]);
+ relation[x] += relation[parent[x]];
+ parent[x] = root;
+ }
+ return parent[x];
+ }
+
+ void unite(int x, int y, int relType) {
+ relType--;
+ if (x > total || y > total) {
+ fakeCount++;
+ return;
+ }
+ if (relType == 1 && x == y) {
+ fakeCount++;
+ return;
+ }
+
+ int rootX = find(x);
+ int rootY = find(y);
+
+ if (rootX == rootY) {
+ int delta = ((relation[x] - relation[y]) % 3 + 3) % 3;
+ if (delta != relType) {
+ fakeCount++;
+ }
+ } else {
+ parent[rootX] = rootY;
+ relation[rootX] = relation[y] - relation[x] + relType;
+ }
+ }
+
+ int getFakeCount() const {
+ return fakeCount;
+ }
+};
+
+int main() {
+ int n, k;
+ cin >> n >> k;
+ FoodUnion uf(n);
+
+ for (int i = 0; i < k; ++i) {
+ int type, a, b;
+ cin >> type >> a >> b;
+ uf.unite(a, b, type);
+ }
+
+ cout << uf.getFakeCount() << endl;
+ return 0;
+}
+```
+
+### D 求二叉树高度
+
+```cpp
+#include
+#include
+#include
+#include
+#include
+using namespace std;
+
+struct TreeNode {
+ int val;
+ TreeNode *lchild;
+ TreeNode *rchild;
+ TreeNode(int x) : val(x), lchild(NULL), rchild(NULL) {}
+ };
+
+class Solution {
+public:
+ int maxDepth(TreeNode* p) {
+ int lh,rh,hi;
+ lh = rh = hi = 0;
+ if(p != nullptr){
+ if(p ->lchild == NULL) lh = 0 ; else lh= maxDepth(p->lchild);
+ if(p->rchild == NULL) rh= 0 ; else rh= maxDepth(p->rchild);
+ if (lh > rh) hi = lh + 1; else hi = rh + 1;
+ }
+ else hi = 0;
+ return hi;
+ }
+};
+
+void trimLeftTrailingSpaces(string &input) {
+ input.erase(input.begin(), find_if(input.begin(), input.end(), [](int ch) {
+ return !isspace(ch);
+ }));
+}
+
+void trimRightTrailingSpaces(string &input) {
+ input.erase(find_if(input.rbegin(), input.rend(), [](int ch) {
+ return !isspace(ch);
+ }).base(), input.end());
+}
+
+TreeNode* stringToTreeNode(string input) {
+ trimLeftTrailingSpaces(input);
+ trimRightTrailingSpaces(input);
+ input = input.substr(1, input.length() - 2);
+ if (!input.size()) {
+ return nullptr;
+ }
+
+ string item;
+ stringstream ss;
+ ss.str(input);
+
+ getline(ss, item, ',');
+ TreeNode* root = new TreeNode(stoi(item));
+ queue nodeQueue;
+ nodeQueue.push(root);
+
+ while (true) {
+ TreeNode* node = nodeQueue.front();
+ nodeQueue.pop();
+
+ if (!getline(ss, item, ',')) {
+ break;
+ }
+
+ trimLeftTrailingSpaces(item);
+ if (item != "null") {
+ int leftNumber = stoi(item);
+ node->lchild = new TreeNode(leftNumber);
+ nodeQueue.push(node->lchild);
+ }
+
+ if (!getline(ss, item, ',')) {
+ break;
+ }
+
+ trimLeftTrailingSpaces(item);
+ if (item != "null") {
+ int rightNumber = stoi(item);
+ node->rchild = new TreeNode(rightNumber);
+ nodeQueue.push(node->rchild);
+ }
+ }
+ return root;
+}
+
+int main() {
+ string line;
+ getline(cin, line);
+ TreeNode* root = stringToTreeNode(line);
+ int ret = Solution().maxDepth(root);
+ string out = to_string(ret);
+ cout << out << endl;
+ return 0;
+}
+```
+
+### E 新二叉树
+
+```cpp
+#include
+
+using namespace std;
+
+struct TreeNode {
+ char val;
+ TreeNode *left;
+ TreeNode *right;
+ TreeNode(char val) : val(val), left(nullptr), right(nullptr) {}
+};
+
+TreeNode *traversal(TreeNode *node, char val) {
+ if (node == nullptr) {
+ return nullptr;
+ }
+ if (node->val == val) {
+ return node;
+ }
+
+ TreeNode *p = traversal(node->left, val);
+ if (p == nullptr) {
+ return traversal(node->right, val);
+ }
+ return p;
+}
+
+void traversal2(TreeNode *node) {
+ if (node == nullptr) {
+ return;
+ }
+ cout << node->val;
+ traversal2(node->left);
+ traversal2(node->right);
+}
+
+int main(void) {
+ int n;
+ cin >> n;
+
+ TreeNode *root = nullptr;
+ TreeNode *p = root;
+ for (int i = 0; i < n; i++) {
+ char a, b, c;
+ cin >> a >> b >> c;
+ if (i == 0) {
+ root = new TreeNode(a);
+ }
+ p = traversal(root, a);
+ if (b != '*') {
+ p->left = new TreeNode(b);
+ }
+ if (c != '*') {
+ p->right = new TreeNode(c);
+ }
+ }
+ traversal2(root);
+ cout << endl;
+}
+```
+
+### F 二叉树遍历
+
+```cpp
+#include
+
+using namespace std;
+
+struct TreeNode {
+ int val;
+ TreeNode *left;
+ TreeNode *right;
+ TreeNode(int val) : val(val), left(nullptr), right(nullptr) {}
+};
+
+TreeNode* traversal(vector& pre, vector& middle) {
+ if (pre.size() == 0) {
+ return nullptr;
+ }
+ int rootVal = pre[0];
+ TreeNode *root = new TreeNode(rootVal);
+
+ if (pre.size() == 1) {
+ return root;
+ }
+
+ int index = -1;
+ for (int i = 0; i < middle.size(); i++) {
+ if (middle[i] == rootVal) {
+ index = i;
+ break;
+ }
+ }
+
+ vector leftMiddle(middle.begin(), middle.begin() + index);
+ vector rightMiddle(middle.begin() + index + 1, middle.end());
+
+ vector leftPre(pre.begin() + 1, pre.begin() + leftMiddle.size() + 1);
+ vector rightPre(pre.begin() + leftMiddle.size() + 1, pre.end());
+
+ root->left = traversal(leftPre, leftMiddle);
+ root->right = traversal(rightPre, rightMiddle);
+
+ return root;
+}
+
+void traversal2(TreeNode *root) {
+ if (root == nullptr) {
+ return;
+ }
+
+ traversal2(root->left);
+ traversal2(root->right);
+ cout << root->val << ' ';
+}
+
+int main(void) {
+ int n;
+ cin >> n;
+ vector pre(n);
+ vector middle(n);
+
+ for (int i = 0; i < n; i++) {
+ cin >> pre[i];
+ }
+
+ for (int i = 0; i < n ; i++) {
+ cin >> middle[i];
+ }
+
+ TreeNode *root = traversal(pre, middle);
+
+ traversal2(root);
+ cout << endl;
+}
+```
+
+### G 朋友
+
+```cpp
+#include
+
+using namespace std;
+
+class UnionFind {
+private:
+ int father[5000];
+ int height[5000];
+
+public:
+ UnionFind(int n) {
+ for (int i = 1; i <= n; i++) {
+ father[i] = i;
+ height[i] = 1;
+ }
+ }
+
+ int get(int x) {
+ if (x == father[x]) {
+ return x;
+ }
+ return father[x] = get(father[x]);
+ }
+
+ void merge(int x, int y) {
+ x = get(x);
+ y = get(y);
+
+ if (x == y) {
+ return;
+ }
+ else {
+ if (height[x] == height[y]) {
+ height[x]++;
+ father[y] = x;
+ }
+ else if (height[x] > height[y]) {
+ father[y] = x;
+ }
+ else {
+ father[x] = y;
+ }
+ }
+ }
+};
+
+int main() {
+ int n, m, p;
+ cin >> n >> m >> p;
+ UnionFind friends(n);
+
+ for (int i = 0; i < m; i++) {
+ int x, y;
+ cin >> x >> y;
+ friends.merge(x, y);
+ }
+ for (int i = 0; i < p; i++) {
+ int x, y;
+ cin >> x >> y;
+ if (friends.get(x) == friends.get(y)) {
+ cout << "Yes" << endl;
+ }
+ else {
+ cout << "No" << endl;
+ }
+ }
+
+ return 0;
+}
+```
+
+### H 网络交友
+
+```cpp
+#include
+
+using namespace std;
+
+class DisjointSet {
+private:
+ unordered_map parent;
+ unordered_map size;
+ unordered_map depth;
+
+public:
+ void insert(const string& person) {
+ if (parent.count(person)) return;
+ parent[person] = person;
+ size[person] = 1;
+ depth[person] = 1;
+ }
+
+ string find(const string& person) {
+ if (parent[person] != person) {
+ parent[person] = find(parent[person]);
+ }
+ return parent[person];
+ }
+
+ void unite(const string& a, const string& b) {
+ string rootA = find(a);
+ string rootB = find(b);
+
+ if (rootA == rootB) return;
+
+ if (depth[rootA] < depth[rootB]) {
+ parent[rootA] = rootB;
+ size[rootB] += size[rootA];
+ } else {
+ parent[rootB] = rootA;
+ size[rootA] += size[rootB];
+ if (depth[rootA] == depth[rootB]) {
+ depth[rootA]++;
+ }
+ }
+ }
+
+ int getSize(const string& person) {
+ return size[find(person)];
+ }
+};
+
+int main() {
+ int relationCount;
+ cin >> relationCount;
+
+ DisjointSet network;
+
+ while (relationCount--) {
+ string person1, person2;
+ cin >> person1 >> person2;
+ network.insert(person1);
+ network.insert(person2);
+ network.unite(person1, person2);
+ cout << network.getSize(person1) << endl;
+ }
+
+ return 0;
+}
+```
+
+---
+
+## [Week 9](https://voj.mobi/contest/372/)
+
+### A 找出所有谎言
+
+```cpp
+#include
+using namespace std;
+
+const int MAXN = 50010;
+int parent[MAXN], rel[MAXN];
+
+int findf(int x) {
+ if (parent[x] != x) {
+ int p = parent[x];
+ parent[x] = findf(p);
+ rel[x] = (rel[x] + rel[p]) % 3;
+ }
+ return parent[x];
+}
+
+int main() {
+ ios::sync_with_stdio(false);
+ cin.tie(NULL);
+
+ int n, k;
+ cin >> n >> k;
+ for (int i = 1; i <= n; i++) {
+ parent[i] = i;
+ rel[i] = 0;
+ }
+ int ans = 0;
+ while (k--) {
+ int d, x, y;
+ cin >> d >> x >> y;
+ if (x < 1 || x > n || y < 1 || y > n || (d == 2 && x == y)) {
+ ans++;
+ continue;
+ }
+ int fx = findf(x), fy = findf(y);
+ if (fx == fy) {
+ if (d == 1) {
+ if ((rel[x] - rel[y] + 3) % 3 != 0) ans++;
+ } else {
+ if ((rel[x] - rel[y] + 3) % 3 != 1) ans++;
+ }
+ } else {
+ if (d == 1) {
+ parent[fx] = fy;
+ rel[fx] = (rel[y] - rel[x] + 3) % 3;
+ } else {
+ parent[fx] = fy;
+ rel[fx] = (rel[y] + 1 - rel[x] + 3) % 3;
+ }
+ }
+ }
+ cout << ans << endl;
+ return 0;
+}
+```
+
+### B 接龙
+
+```cpp
+#include
+#include
+#include
+using namespace std;
+
+const int MAXN = 30001;
+
+int parent[MAXN];
+int distance_[MAXN];
+int size_[MAXN];
+
+void init() {
+ for (int i = 1; i <= 30000; ++i) {
+ parent[i] = i;
+ distance_[i] = 0;
+ size_[i] = 1;
+ }
+}
+
+int find(int x) {
+ if (parent[x] != x) {
+ int old_parent = parent[x];
+ find(old_parent);
+ distance_[x] += distance_[old_parent];
+ parent[x] = parent[old_parent];
+ }
+ return parent[x];
+}
+
+void merge(int i, int j) {
+ int x = find(i);
+ int y = find(j);
+ if (x != y) {
+ parent[x] = y;
+ distance_[x] = size_[y];
+ size_[y] += size_[x];
+ }
+}
+
+int main() {
+ init();
+ int T;
+ scanf("%d", &T);
+ char op;
+ int a, b;
+ while (T--) {
+ scanf(" %c %d %d", &op, &a, &b);
+ if (op == 'M') {
+ merge(a, b);
+ } else {
+ int x_root = find(a);
+ int y_root = find(b);
+ if (x_root != y_root) {
+ printf("-1\n");
+ } else {
+ int diff = abs(distance_[a] - distance_[b]);
+ printf("%d\n", diff - 1);
+ }
+ }
+ }
+ return 0;
+}
+```
+
+### C 在二叉树上移动
+
+```cpp
+#include
+
+using namespace std;
+
+string handle(string &s) {
+ string result;
+ int i = 0;
+ while (i < s.size()) {
+ if (i == 0) {
+ result.push_back(s[i]);
+ i++;
+ continue;
+ }
+ if (s[i] == 'U') {
+ if (result.back() == 'L' || result.back() == 'R') {
+ result.pop_back();
+ i++;
+ continue;
+ }
+ }
+
+ result.push_back(s[i]);
+ i++;
+ }
+
+ return result;
+}
+
+int main(void) {
+ ios::sync_with_stdio(false);
+ cin.tie(0);
+ unsigned long long N, X;
+ cin >> N >> X;
+ string s;
+ cin >> s;
+ s = handle(s);
+ for (char c : s) {
+ if (c == 'U'){
+ X /= 2;
+ } else if (c == 'L') {
+ X *= 2;
+ } else {
+ X = X * 2 + 1;
+ }
+ }
+ cout << X << endl;
+}
+```
+
+### D 二叉搜索树
+
+```cpp
+#include
+using namespace std;
+
+struct Node {
+ int value;
+ Node* left;
+ Node* right;
+ Node(int v) : value(v), left(nullptr), right(nullptr) {}
+};
+
+Node* createBST(const string& sequence) {
+ if (sequence.empty()) return nullptr;
+
+ Node* root = new Node(sequence[0] - '0');
+
+ for (int i = 1; i < sequence.size(); ++i) {
+ int num = sequence[i] - '0';
+ Node* current = root;
+ Node* previous = nullptr;
+
+ while (current != nullptr) {
+ previous = current;
+ if (num < current->value)
+ current = current->left;
+ else
+ current = current->right;
+ }
+
+ Node* newNode = new Node(num);
+ if (num < previous->value)
+ previous->left = newNode;
+ else
+ previous->right = newNode;
+ }
+
+ return root;
+}
+
+bool areIdentical(Node* a, Node* b) {
+ if (!a && !b) return true;
+ if (!a || !b) return false;
+
+ return (a->value == b->value) &&
+ areIdentical(a->left, b->left) &&
+ areIdentical(a->right, b->right);
+}
+
+int main() {
+ int m;
+ string baseSequence;
+ cin >> m >> baseSequence;
+
+ Node* referenceTree = createBST(baseSequence);
+
+ while (m--) {
+ string testSequence;
+ cin >> testSequence;
+
+ Node* testTree = createBST(testSequence);
+ cout << (areIdentical(referenceTree, testTree) ? "YES" : "NO") << endl;
+ }
+
+ return 0;
+}
+```
+
+### E The order of a Tree
+
+```cpp
+#include
+#include
+using namespace std;
+
+const int N = 100010;
+
+int value[N], leftChild[N], rightChild[N], preorderResult[N];
+int nodeCount, totalNodes;
+
+void insertNode(int rootIndex, int val) {
+ if (val <= value[rootIndex]) {
+ if (leftChild[rootIndex])
+ insertNode(leftChild[rootIndex], val);
+ else
+ leftChild[rootIndex] = totalNodes;
+ } else {
+ if (rightChild[rootIndex])
+ insertNode(rightChild[rootIndex], val);
+ else
+ rightChild[rootIndex] = totalNodes;
+ }
+}
+
+void preorderTraversal(int index) {
+ preorderResult[nodeCount++] = value[index];
+ if (leftChild[index]) preorderTraversal(leftChild[index]);
+ if (rightChild[index]) preorderTraversal(rightChild[index]);
+}
+
+int main() {
+ int n;
+ while (cin >> n) {
+ memset(leftChild, 0, sizeof leftChild);
+ memset(rightChild, 0, sizeof rightChild);
+ int rootIndex = -1, x;
+ totalNodes = 0;
+
+ for (int i = 0; i < n; ++i) {
+ cin >> x;
+ if (rootIndex == -1) {
+ value[++rootIndex] = x;
+ } else {
+ value[++totalNodes] = x;
+ insertNode(rootIndex, x);
+ }
+ }
+
+ nodeCount = 0;
+ preorderTraversal(rootIndex);
+
+ cout << preorderResult[0];
+ for (int i = 1; i < nodeCount; ++i)
+ cout << " " << preorderResult[i];
+ cout << endl;
+ }
+
+ return 0;
+}
+```
+
+### F 二叉树
+
+```cpp
+#include
+
+using namespace std;
+
+struct TreeNode {
+ int val;
+ TreeNode *left;
+ TreeNode *right;
+ TreeNode(int val) : val(val), left(nullptr), right(nullptr) {}
+};
+
+TreeNode *traversal(vector& in, vector& pre, int inLeft, int inRight, int preLeft, int preRight) {
+ if (inLeft >= inRight) {
+ return nullptr;
+ }
+ int rootVal = pre[preLeft];
+ TreeNode *root = new TreeNode(rootVal);
+ if (inRight - inLeft == 1) {
+ return root;
+ }
+ int i = 0;
+ for (i = inLeft; i < inRight; i++) {
+ if (in[i] == rootVal) {
+ break;
+ }
+ }
+
+ root->left = traversal(in, pre, inLeft, i, preLeft + 1, preLeft + i - inLeft);
+ root->right = traversal(in, pre, i + 1, inRight, preLeft + i - inLeft + 1, preRight);
+ return root;
+}
+
+vector v;
+
+void traversal2(TreeNode *node) {
+ if (node == nullptr) {
+ return;
+ }
+ traversal2(node->left);
+ traversal2(node->right);
+ v.push_back(node->val);
+}
+
+int main(void) {
+ ios::sync_with_stdio(false);
+ cin.tie(0);
+
+ int n;
+ while (cin >> n) {
+ v.clear();
+ vector pre(n);
+ for (int i = 0; i < n; i++) {
+ cin >> pre[i];
+ }
+ vector in(n);
+ for (int i = 0; i < n; i++) {
+ cin >> in[i];
+ }
+
+ TreeNode *root = traversal(in, pre, 0, in.size(), 0, pre.size());
+ traversal2(root);
+ for (int i = 0; i < n - 1; i++) {
+ cout << v[i] << " ";
+ }
+
+ cout << v[n - 1] << endl;
+ }
+}
+```
+
+### G 线索二叉树的中序遍历
+
+```cpp
+#include
+#include
+#include
+#include
+#include
+using namespace std;
+
+struct TreeNode {
+ int val;
+ TreeNode *lchild;
+ TreeNode *rchild;
+ int ltag;
+ int rtag;
+ TreeNode(int x) : val(x),ltag(0),rtag(0), lchild(NULL), rchild(NULL) {}
+ };
+
+
+class Solution {
+public:
+ void inorderthread(TreeNode * thr) {
+ TreeNode * p = thr;
+ while (p) {
+ while(p->ltag == 0 && p->lchild) p = p->lchild;
+ cout << p->val << endl;
+ while (p->rtag == 1 && p->rchild) {
+ p = p->rchild;
+ cout << p->val << endl;
+ }
+ p = p->rchild;
+ }
+ }
+};
+
+
+
+
+void trimLeftTrailingSpaces(string &input) {
+ input.erase(input.begin(), find_if(input.begin(), input.end(), [](int ch) {
+ return !isspace(ch);
+ }));
+}
+
+void trimRightTrailingSpaces(string &input) {
+ input.erase(find_if(input.rbegin(), input.rend(), [](int ch) {
+ return !isspace(ch);
+ }).base(), input.end());
+}
+
+
+void inThread(TreeNode *p, TreeNode *&pre){
+ if(p){
+ inThread(p->lchild, pre); //线索化左子树
+ if(p->lchild == NULL){
+ p->lchild = pre;
+ p->ltag = 1;
+ }
+ if(pre != NULL && pre->rchild == NULL){
+ pre->rchild = p;
+ pre->rtag = 1;
+ }
+ pre = p;
+ inThread(p->rchild, pre);
+ }
+}
+
+void createThreadTree(TreeNode * root){
+ TreeNode * pre = NULL;
+ if(root){
+ inThread(root, pre);
+ }
+}
+
+
+TreeNode* stringToTreeNode(string input) {
+ trimLeftTrailingSpaces(input);
+ trimRightTrailingSpaces(input);
+ input = input.substr(1, input.length() - 2);
+ if (!input.size()) {
+ return nullptr;
+ }
+
+ string item;
+ stringstream ss;
+ ss.str(input);
+
+ getline(ss, item, ',');
+ TreeNode* root = new TreeNode(stoi(item));
+ queue nodeQueue;
+ nodeQueue.push(root);
+
+ while (true) {
+ TreeNode* node = nodeQueue.front();
+ nodeQueue.pop();
+
+ if (!getline(ss, item, ',')) {
+ break;
+ }
+
+ trimLeftTrailingSpaces(item);
+ if (item != "null") {
+ int leftNumber = stoi(item);
+ node->lchild = new TreeNode(leftNumber);
+ nodeQueue.push(node->lchild);
+ }
+
+ if (!getline(ss, item, ',')) {
+ break;
+ }
+
+ trimLeftTrailingSpaces(item);
+ if (item != "null") {
+ int rightNumber = stoi(item);
+ node->rchild = new TreeNode(rightNumber);
+ nodeQueue.push(node->rchild);
+ }
+ }
+ return root;
+}
+
+int main() {
+ string line;
+ getline(cin, line);
+ TreeNode* root = stringToTreeNode(line);
+ createThreadTree(root);
+ Solution().inorderthread(root);
+ //TravIn_Thread_BT(root);
+ return 0;
+}
+```
+
+---
+
+## [Week 10 课上](https://voj.mobi/contest/373/)
+
+### A Trees on the level
+
+```cpp
+#include
+#include
+#include
+#include
+#include
+using namespace std;
+#define maxn 300
+
+struct node {
+ int val;
+ bool haveVal;
+ int l,r;
+} tree[300];
+int root,len;
+bool ok;
+
+bool read_input() {
+ string s;
+ ok = true;
+ root = 0,len=1,tree[0].l=-1,tree[0].r=-1,tree[0].haveVal=false;
+ for (;;) {
+ if (!(cin>>s))return false;
+ if (s=="()")return true;
+ int v,now=root;
+ sscanf(&s[1], "%d", &v);
+ int i=s.find(',')+1;
+ while (s[i] != ')') {
+ if (s[i] == 'L') {
+ if (tree[now].l == -1) {
+ tree[now].l = len++;
+ tree[tree[now].l].l=-1,tree[tree[now].l].r=-1,tree[tree[now].l].haveVal=false;
+ }
+ now = tree[now].l;
+ }
+ else{
+ if (tree[now].r == -1){
+ tree[now].r = len++;
+ tree[tree[now].r].l=-1,tree[tree[now].r].r=-1,tree[tree[now].r].haveVal=false;
+ }
+ now = tree[now].r;
+ }
+ i++;
+ }
+ if (tree[now].haveVal) {
+ ok = false;
+ }
+ tree[now].val = v;
+ tree[now].haveVal = true;
+ }
+}
+
+int main() {
+ while (read_input()) {
+ if (!ok) {
+ cout << "not complete" << endl;
+ continue;
+ }
+ string s="";
+ queue q;
+ q.push(root);
+ int now;
+ while (q.size()) {
+ now = q.front(); q.pop();
+ if (!tree[now].haveVal) {
+ s= "not complete";
+ break;
+ }
+ else {
+ if (s == "")
+ s += to_string(tree[now].val);
+ else
+ s += " "+to_string(tree[now].val);
+ }
+ if(tree[now].l!=-1)q.push(tree[now].l);
+ if(tree[now].r!=-1)q.push(tree[now].r);
+ }
+ cout << s << endl;
+ }
+ return 0;
+}
+```
+
+### C Shaolin
+
+```cpp
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include