没有合适的资源?快使用搜索试试~ 我知道了~
lab5-19335074-黄玟瑜1
需积分: 0 7 下载量 95 浏览量
2022-08-04
16:37:08
上传
评论 1
收藏 3.85MB PDF 举报
温馨提示
试读
32页
本 科 生 实 验 报 告实验课程中山大学 2021 学年春季操作系统课程实验名称内核线程专业名称计算机科学与技术(超算)学生姓名黄玟瑜学生学号任课教师陈鹏飞实
资源详情
资源评论
资源推荐
本 科 生 实 验 报 告
实验课程 中山大学 2021 学年春季操作系统课程
实验名称 内核线程
专业名称 计算机科学与技术(超算)
学生姓名 黄玟瑜
学生学号 19335074
任课教师 陈鹏飞
实验地点
实验成绩
二〇二一年四月二十四日
目录
1 Assignment 1: printf 的实现 1
1.1 简单复现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 printf 的改进 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2.1 %p 的显示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.2 %o 和%u 的显示 . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.3 输出对齐 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Assignment 2: 线程的实现 9
2.1 添加 PCB 的优先级属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 运行结果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3 Assignment 3: 线程调度切换的秘密 14
3.1 线程函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2 第一个过程的说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3 第二个过程的说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4 Assignment 4: 调度算法的实现 24
4.1 最短作业优先 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.2 运行结果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5 总结 30
Assignment 1: printf 的实现
学习可变参数机制,然后实现 printf,你可以在材料中的 printf 上进行改进,或者
从头开始实现自己的 printf 函数。结果截图并说说你是怎么做的。
简单复现
在本次实验的目录 lab5 下创建工作目录 1,按照实验指导所述方法,执行 make
&& make run,结果如下:
看到屏幕上成功打印了常规字符、实现了换行、% 的显示以及%c、%s、%d、%x 的
输出。
printf 的改进
考虑到本次实验实现换行、% 的显示以及%c、%s、%d、%x 的输出的方法是较为
高效的,且通过缓冲区避免了字符串超过函数调用占大小的问题,最重要的是本人水平
有限,想不出明显优于上述方法的算法,因此在此处想到增加其他 printf 的功能。
下面将在教程的 printf 上增加以下功能。
1
• 对齐输出,包括左对齐、右对齐
• %p 输出地址符
• %o 无符号以八进制表示的整数
• %u 十进制无符号整数
%p 的显示
在 32 位的操作系统中,地址的长度是 32 位的,一般情况下以十六进制显示,因
此预期的结果应该是输出“0x********”(* 为 0∼ F 的数字,最多不超过 8 个)
1 ···
2 case 'p':{
3 itos(number , va_arg(ap, uint32), 16);
4
5 counter += printf_add_to_buffer (buffer , '0', idx, BUF_LEN);
6 counter += printf_add_to_buffer (buffer , 'x', idx, BUF_LEN);
7
8 for (int j = 0; number[j]; ++j)
9 {
10 counter += printf_add_to_buffer(buffer , number [j], idx, BUF_LEN);
11 }
12 }
13 ···
14 break ;
使用 ap 和 va_arg 来引用可变参数,将传入的地址的值转化为字符串并存储在字
符串 numbers 中,先输出十六进制标识符“0x”,再将十六进制的地址的值输出。
%o 和%u 的显示
在实现%d、%x 的显示之后发现%o 和%u 的显示并不难实现,最主要的进制的改
变以及将参数视为有符号数还是无符号数的问题,%d 是将数值看作是有符号数,因此
需要将小于 0 的数取反,并在输出之前加上‘-’,而%o、%u、%x 将数值看作无符号数
来处理,只是输出时进制不同,分别为八进制、十进制和十六进制。
实现方法如下:
1 uint32 mod = 0;
2 ···
3 case 'o':
4 if(mod == 0) mod = 8;
5 case 'u':
6 case 'd':
7 if(mod == 0) mod = 10;
8 case 'x':
9 if(mod == 0) mod = 16;
10 int temp = va_arg(ap, int );
11
12 if (temp < 0 && fmt[i] == 'd')
2
13 {
14 counter += printf_add_to_buffer(buffer , '-', idx, BUF_LEN);
15
16 temp = -temp;
17 }
18
19 itos(number , temp, mod);
20
21 for (int j = 0; number[j]; ++j)
22 {
23 counter += printf_add_to_buffer(buffer , number [j], idx, BUF_LEN);
24 }
25 break ;
26 ···
用 mod 来标识进制,先将变量 mod 初始化为 0,在各个 case 中判断 mod 是否为
0,若 mod 为 0 则将其根据进入该 case 的进制赋值,保证了最终 mod 的值是最先执行
的 case 对应的进制,将传入的地址的值以 mod 所表示的进制转化为字符串并存储在字
符串 numbers 中,再将字符串输出。
到此实现了%p、%o 和%u 的显示,下面进行验证,补充修改测试语句:
1 include "asm_utils.h"
2 #include "interrupt .h"
3 #include "stdio .h"
4
5 // 屏 幕 IO 处 理 器
6 STDIO stdio;
7
8 // 中 断 管 理 器
9 InterruptManager interruptManager;
10
11 extern "C" void setup_kernel ()
12 {
13 // 中 断 处 理 部 件
14 interruptManager. initialize();
15
16 // 屏 幕 IO 处 理 部 件
17 stdio. initialize ();
18
19 interruptManager. enableTimeInterrupt();
20 interruptManager. setTimeInterrupt((void *) asm_time_interrupt_handler);
21 //asm_enable_interrupt ();
22
23 printf("print percentage: %%\n"
24 "print char \"N\": %c\n"
25 "print string \"Hello World!\": %s\n"
26 "print decimal: \" -1234\": %d\n"
27 "print hexadecimal \"0 x7abcdef0 \": %x\n"
28 "print address \"& stdio \": %p\n"
29 "print octal \"O4567 \": %o\n"
30 "print unsigned decimal \" -1\": %u\n",
31 'N', "Hello World!", -1234, 0x7abcdef0 , &stdio, 04567 , -1);
32 //uint a = 1 / 0;
33 asm_halt ();
34 }
3
剩余31页未读,继续阅读
文润观书
- 粉丝: 26
- 资源: 317
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0