操作系统实验报告二概要

上传人:今*** 文档编号:108091077 上传时间:2019-10-22 格式:DOC 页数:9 大小:100KB
返回 下载 相关 举报
操作系统实验报告二概要_第1页
第1页 / 共9页
操作系统实验报告二概要_第2页
第2页 / 共9页
操作系统实验报告二概要_第3页
第3页 / 共9页
操作系统实验报告二概要_第4页
第4页 / 共9页
操作系统实验报告二概要_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《操作系统实验报告二概要》由会员分享,可在线阅读,更多相关《操作系统实验报告二概要(9页珍藏版)》请在金锄头文库上搜索。

1、重 庆 大 学学 生 实 验 报 告实验课程名称 操作系统原理 开课实验室 DS1501 学 院 软件学院 年级 2013 专业班 软件工程2 班 学 生 姓 名 胡其友 学 号 20131802 开 课 时 间 2015 至 2016 学年第 一 学期总 成 绩教师签名洪明坚软件学院制操作系统原理实验报告 开课实验室: 年 月 日学院软件学院年级、专业、班2013级软件工程2班姓名胡其友成绩课程名称操作系统原理实验项目名 称指导教师洪明坚教师评语教师签名:洪明坚年 月 日1实验目的: 随机生成3组非负整数列表,然后创建3个线程,分别用3种不同的排序算法对列表进行排序 如何生成随机数? Ste

2、p1:void srand(uint32_t seed) seed是随机数的种子,建议用实验(一)中实现的系统调用“time_t time(time_t *loc)” srand(time(NULL) Step2:多次调用“uint32_t random()”获得随机数 进入图形模式,沿垂直方向把屏幕分成3个区域,每个排序线程用一个区域,动态显示排序过程,运行效果如这里所示。 如何进入图形模式? Step1:调用listGraphicsModes()输出系统支持的图形模式 该函数必须在文本模式下运行,才能看到结果 Step2:选择一个模式,调用initGraphics(int mode)进入图

3、形模式 如何获取屏幕的分辨率? 水平:g_mib.XResolution 垂直:g_mib.YResolution 如何打点? void setPixel(int x, int y, COLORREF cr); (x, y)是点坐标 cr是颜色,用宏定义RGB(r,g,b)生成,其中r,g,b的取值范围都是0-255 如何从cr中取出r,g,b?用getXValue(cr),其中X=R,G,B 如何退出图形模式? int exitGraphics();2实验内容: 实现静态优先级调度算法 修改task.c中的函数schedule,实现静态优先级调度 在“struct tcb”中增加线程的静态优

4、先级属性nice 一定要加在kstack字段之后! 在函数sys_task_create中初始化nice=0 nice是整数,取值范围-NZERO, NZERO-1,值越小优先级越高 #define NZERO 20 函数schedule被调用时,CPU的中断已经被关闭 线程0(task0,它的ID=0)是一个特殊的线程,仅当没有其他可运行的线程时,才能调度task0运行! 实现静态优先级调度算法(续) 增加系统调用 int getpriority(int tid) 成功返回(nice+NZERO),失败返回-1 int setpriority(int tid, int prio) 把线程ti

5、d的nice设为(prio-NZERO) prio必须在0,2*NZERO-1 成功返回0,失败返回-1 注意 如果tid=0,表示获取/设置当前线程的nice值,而不是task0! 在调用函数“struct tcb *get_task(int tid)”获取struct tcb指针时,一定要用save_flags_cli/restore_flags保护起来 uint32_t flags; struct tcb *tsk; save_flags_cli(flags); tsk = get_task(tid); restore_flags(flags);3实验步骤: 实现动态优先级调度算法 在“

6、struct tcb”中,再增加两个属性 estcpu:表示线程最近使用了多少CPU时间 在函数sys_task_create中初始化estcpu=0 每次定时器中断时:g_task_running-estcpu+,task0除外! 每秒钟为所有线程(运行、就绪和等待)更新一次 priority:表示线程的动态优先级 priority = PRI_USER_MAX-(estcpu/4)-(nice*2) 取值范围从0(PRI_USER_MIN)到127(PRI_USER_MAX) 值越大优先级越高 每次调度前,先计算所有线程的priority,再调度 实现动态优先级调度算法(续) 增加一个全局

7、属性 g_load_avg:表示系统的平均负荷 初值为零,每秒钟更新一次 g_load_avg=(59/60) g_load_avg+(1/60) nready nready表示处于就绪状态的线程个数,task0除外! 属性计算 g_load_avg 和线程的estcpu:在定时器的中断处理函数(ISR)中计算 文件timer.c中的函数isr_timer 如何每隔一秒计算一次? (g_timer_ticks % HZ) =0,表示1秒钟已经过去 否则,还不到1秒钟 函数isr_timer被调用时,CPU的中断已经被关闭 线程的priority:在函数schedule中,调度之前计算,然后基于

8、priority进行调度 效率问题 nice ,priority和nready都是整数 效率不是问题 g_load_avg 和estcpu是实数 浮点(float-point)表示:精度高,效率低! 定点(fixed-point)表示:精度低,效率高! 文件fixedptc.h中定义了定点数的类型fixedpt及其运算 如何显示fixedpt类型变量的值,比如g_load_avg?char num20; fixedpt_str(g_load_avg, num, -2); printk(g_load_avg = %srn, num); 定点数的运算 g_task_running-estcpu+g

9、_task_running-estcpu = fixedpt_add(g_task_running-estcpu, FIXEDPT_ONE); g_load_avg = (59/60)*g_load_avg+(1/60)*nreadyfixedpt r59_60 = fixedpt_div(fixedpt_fromint(59), fixedpt_fromint(60);fixedpt r01_60 = fixedpt_div(FIXEDPT_ONE, fixedpt_fromint(60);g_load_avg = fixedpt_add(fixedpt_mul(r59_60, g_load

10、_avg), fixedpt_mul(r01_60, fixedpt_fromint(nready); priority = PRI_USER_MAX-(estcpu/4)-(nice*2)priority = PRI_USER_MAX - fixedpt_toint(fixedpt_div(estcpu, fixedpt_fromint(4) - p-nice*2; 定点数的运算4实验报告:动态优先级调度算法while(select!=NULL)select-priority=127 - fixedpt_toint(fixedpt_div(select-estcpu, fixedpt_fro

11、mint(4) - select-nice*2;if(select-tid != 0) & (select-state = TASK_STATE_READY) if(my_select-prioritypriority) my_select=select; else if(my_select-tid=0) my_select=select; select=select-next; if(my_select=g_task_running) if(my_select-state = TASK_STATE_READY) return; my_select = task0; /printk(0x%d

12、- 0x%drn, (g_task_running = NULL) ? -1 : g_task_running-tid, select-tid); g_resched = 0; switch_to(my_select);静态优先级调度算法void schedule()struct tcb *select = g_task_head;struct tcb *my_select=g_task_running;while(select!=NULL)if(select-tid != 0) & (select-state = TASK_STATE_READY)/if(my_select=NULL) my_select=select; continue;if(select-nicenice)my_select=select;if(my_select-tid=0)my_select=select;select=select-next; if(my_select=g_task_running) if(g_task_running-state = TASK_STATE_READY) return; my_select = task0; g_resched = 0; switch_to(my_select);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号