Skip to content

Commit b1999ba

Browse files
Update lab3.md
1 parent 97bc238 commit b1999ba

File tree

1 file changed

+54
-17
lines changed

1 file changed

+54
-17
lines changed

docs/lab/lab3.md

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
负责助教:[唐傑伟](mailto:[email protected])
44

5-
在本实验中,我们将完善 Lab2 中实现的进程概念,在系统中运行简单的用户态进程。
5+
在本实验中,我们将完善 Lab2 中实现的进程概念,在系统中运行简单的用户态进程,同时实现用户态程序向内核态转换从而实现系统调用的功能。此外,用户态程序需要能够被均匀调度
66

77
## 1. 更新
88

@@ -42,17 +42,7 @@ git merge lab2-dev
4242

4343
高地址的页表基地址寄存器为`ttbr1`,低地址的页表基地址寄存器为`ttbr0`。这两个寄存器都只能在内核模式下访问,他们保存相应页表的**物理地址**。在我们的实验中,默认使用4KB页大小的4级页表,你可以参考ARM Manual,了解此类页表的具体结构,对于实验中出现的简单情况,也可以参考上课时的讲解。页表中的大多数特性我们的实验并没有用到,但了解详细情况有助于你后续扩展功能。
4444

45-
## 4. 系统调用
46-
47-
**系统调用**(system call),指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者进程间通信。
48-
49-
用户程序运行在受限的上下文下,如需访问系统资源,需要通过系统调用陷入内核态,由内核处理请求。系统调用类似于一种特殊的异常,用户程序执行系统调用指令(svc)后,陷入内核态,内核在`trap_global_handler`中识别出类型,然后执行相应操作。
50-
51-
我们的实验采用通用的系统调用约定:x8寄存器存放请求的系统调用id,x0-5寄存器存放系统调用的六个参数。系统调用返回时,设置x0寄存器为系统调用的返回值。
52-
53-
## 5. 任务
54-
55-
> [!info]
45+
> [!important]
5646
> **任务1**
5747
>
5848
> 完成页表配置的相关代码。我们在`Proc`中添加了`pgdir`项,存储进程的用户态内存空间的相关信息。`pgdir`是定义在`pt.h`中的结构体,`pgdir.pt`指向进程的用户页表。如果进程是纯内核态进程,则`pgdir.pt`可以为空。该结构体在后续实验中还会加入内容,我们这里暂时不用关心。
@@ -61,17 +51,43 @@ git merge lab2-dev
6151
> * 你需要完成`pt.c`中的`free_pgdir`函数。该函数释放给定的`pgdir`。请注意只要释放页表本身所占的空间,不要释放页表所引用的物理页。(页表所引用的物理页目前由测试代码直接管理。在后续实验中,我们会逐渐完成相关的代码,本次实验只要求大家完成页表本身的操作。)
6252
> * 你可能需要在`proc.c``init_proc`中加入`init_pgdir`,在`exit`中加入`free_pgdir`
6353
64-
> [!info]
54+
55+
## 4. 系统调用
56+
57+
**系统调用**(system call),指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者进程间通信。
58+
59+
用户程序运行在受限的上下文下,如需访问系统资源,需要通过系统调用陷入内核态,由内核处理请求。系统调用类似于一种特殊的异常,用户程序执行系统调用指令(svc)后,陷入内核态,内核在`trap_global_handler`中识别出类型,然后执行相应操作。
60+
61+
我们的实验采用通用的系统调用约定:x8寄存器存放请求的系统调用id,x0-5寄存器存放系统调用的六个参数。系统调用返回时,设置x0寄存器为系统调用的返回值。
62+
63+
> [!important]
6564
> **任务2**
6665
>
6766
> 完成系统调用的相关代码。我们在`trap.c`中已经提供了在系统调用时调用`syscall_entry`的代码,你需要完成`syscall.c`中的`syscall_entry`函数。该函数传入UserContext作为参数,请从中提取出相应的寄存器,查询`syscall_table`,执行指定的系统调用,并将系统调用的返回值保存到指定的寄存器。
6867
69-
> [!info]
68+
> [!important]
7069
> **任务3**
7170
>
7271
> 修改你的UserContext。你需要保证UserContext中有spsr、elr、sp(`sp_el0`)寄存器,并结合你的UserContext 添加 `test/user_proc.c` 中的 TODO 部分。
7372
74-
> [!info]
73+
74+
## 5. 使用kill方法结束进程
75+
76+
在内核代码中,`kill`系统调用主要在以下场景使用:
77+
78+
1. **系统调用处理**:用户程序通过`kill()`系统调用请求终止指定进程
79+
2. **异常恢复**:当进程执行中发生严重错误(如访问非法内存、除零错误)时,内核通过kill终止异常进程
80+
3. **资源限制**:进程超出资源限制(如CPU时间限制、内存使用上限)时,内核自动调用kill终止进程
81+
4. **信号处理**:接收到终止信号(如SIGKILL、SIGTERM)时,在信号处理函数中调用kill终止进程
82+
5. **调试支持**:内核调试器或ptrace机制需要终止被调试进程时使用kill
83+
6. **进程组操作**:终止整个进程组时,遍历进程树对每个成员进程调用kill
84+
7. **系统清理**:系统关机或重启时,内核按特定顺序调用kill终止所有用户进程
85+
86+
kill机制通过设置进程的`killed`标记实现延迟终止:标记设置后,进程在下次返回用户态时检查标记并调用`exit()`退出,避免了在内核态直接终止可能导致的资源管理问题。
87+
88+
在本lab中,我们先实现kill函数。
89+
90+
> [!important]
7591
> **任务4**
7692
>
7793
> 完成结束进程相关的代码。结束进程的逻辑参考了xv6和Linux的设计。我们在`proc.c`中添加了一个函数`kill`。调用kill会设置指定进程的killed标记,并唤醒进程,阻止进程睡眠。进程在返回用户态时会检查killed标记,若有则调用exit退出。
@@ -80,7 +96,27 @@ git merge lab2-dev
8096
> * 修改你的`sched`代码,使其能够保证,如果当前进程带有killed标记,且new state不为zombie,则调度器直接返回,不做任何操作。(为什么?)
8197
> *`aarch64/trap.c``trap_global_handler`函数的末尾加上检查,如果当前进程有killed标记且即将返回到用户态,则调用`exit(-1)`
8298
83-
> [!info]
99+
## 6. 调度算法
100+
101+
### 调度的意义
102+
103+
进程调度是操作系统中的核心功能,其主要意义包括:
104+
105+
1. **提高CPU利用率**:通过合理分配CPU时间,确保CPU始终处于忙碌状态,避免浪费计算资源
106+
2. **提高系统吞吐量**:合理调度可以使更多进程在单位时间内完成,提高系统的整体处理能力
107+
3. **减少响应时间**:对于交互式应用,通过适当调度可以减少用户等待时间,提升用户体验
108+
4. **提供公平性**:确保所有进程都能获得合理的CPU时间,避免某些进程长时间占用CPU
109+
5. **支持多任务并发**:允许多个进程看似同时运行,实现多任务处理
110+
111+
### 常见调度算法
112+
113+
操作系统中常见的调度算法包括:
114+
115+
1. **先来先服务 (First Come First Served, FCFS)**:按照进程到达的顺序进行调度,简单但可能导致短进程等待长进程
116+
2. **时间片轮转 (Round Robin, RR)**:每个进程获得固定时间片,时间片用完后切换到下一个进程,实现公平调度
117+
3. **完全公平调度 (Completely Fair Scheduler, CFS)**:Linux内核使用的现代调度算法,通过虚拟运行时间(VRUNTIME)实现公平性。每个进程获得与其权重成比例的CPU时间,使用红黑树维护进程队列,选择VRUNTIME最小的进程运行。CFS通过动态调整时间片确保所有进程都能获得公平的CPU份额,同时考虑进程优先级和nice值。
118+
119+
> [!important]
84120
> **任务5**
85121
>
86122
> 改进你的调度器。Lab2的内核进程调度是非抢占式的,Lab3要求大家进行抢占式的调度,你可能需要在调度器中加入时钟中断相关的代码,并注意**调度的公平性问题**。另请注意:我们现在在时钟中断的基础上封装了一层CPU定时器的抽象,**请使用CPU定时器**
@@ -98,9 +134,10 @@ git merge lab2-dev
98134
**截止时间**:<mark style="color:red;">**11月7日23:59**</mark>。
99135

100136
> [!danger]
137+
>
101138
> **逾期提交将扣除部分分数**
102139
>
103-
> 计算方式为 $$\text{score}_{\text{final}} = \text{score} \cdot \left(1 - n \cdot 20\% \right)$$,其中 $$n$$ 为迟交天数,不满一天按一天计算)。
140+
> 计算方式为 $\text{score}_{\text{final}} = \text{score} \cdot \left(1 - n \cdot 20\% \right)$,其中 $n$ 为迟交天数,不满一天按一天计算)。
104141
105142
报告中可以包括下面内容
106143

0 commit comments

Comments
 (0)