操作系统实

  • 格式:doc
  • 大小:96.00 KB
  • 文档页数:16

操作系统实验报告二重庆大学学生实验报告实验课程名称操作系统原理开课实验室DS1501学院软件学院年级2013专业班软件工程2 班学生姓名胡其友学号********开课时间2015至2016学年第一学期总成绩教师签名洪明坚软件学院制《操作系统原理》实验报告开课实验室:年月日学院软件学院年级、专业、班2013级软件工程2班姓名胡其友成绩课程名称操作系统原理实验项目名称指导教师洪明坚教师评语教师签名:洪明坚年月日1.实验目的:•随机生成3组非负整数列表,然后创建3个线程,分别用3种不同的排序算法对列表进行排序•如何生成随机数?•Step1:void srand(uint32_t seed)•seed是随机数的种子,建议用实验(一)中实现的系统调用“time_t time(time_t *loc)”•srand(time(NULL))•Step2:多次调用“uint32_t random()”获得随机数–进入图形模式,沿垂直方向把屏幕分成3个区域,每个排序线程用一个区域,动态显示排序过程,运行效果如这里所示。

•如何进入图形模式?–S tep1:调用listGraphicsModes()输出系统支持的图形模式»该函数必须在文本模式下运行,才能看到结果–S tep2:选择一个模式,调用initGraphics(int mode)进入图形模式•如何获取屏幕的分辨率?–水平:g_mib.XResolution–垂直:g_mib.YResolution•如何打点?–v oid 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•如何退出图形模式?–i nt exitGraphics();2.实验内容:•实现静态优先级调度算法•修改task.c中的函数schedule,实现静态优先级调度•在“struct tcb”中增加线程的静态优先级属性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)•把线程tid的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.实验步骤:•实现动态优先级调度算法•在“struct tcb”中,再增加两个属性•estcpu:表示线程最近使用了多少CPU时间•在函数sys_task_create中初始化estcpu=0•每次定时器中断时:g_task_running->estcpu++,除外!•每秒钟为所有线程(运行、就绪和等待)更新一次•priority:表示线程的动态优先级•priority = PRI_USER_MAX-(estcpu/4)-(nice*2)•取值范围从0(PRI_USER_MIN)到127(PRI_USER_MA •值越大优先级越高•每次调度前,先计算所有线程的priority,再调度•实现动态优先级调度算法(续)–增加一个全局属性•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中,调度之前计算,然后基于priority进行调度•效率问题–nice ,priority和nready都是整数•效率不是问题–g_load_avg 和estcpu是实数•浮点(float-point)表示:精度高,效率低!•定点(fixed-point)表示:精度低,效率高!–文件fixedptc.h中定义了定点数的类型fixedpt及其运算–如何显示fixedpt类型变量的值,比如g_load_avg?char num[20];fixedpt_str(g_load_avg, num, -2);printk("g_load_avg = %s\r\n", num);•定点数的运算–g_task_running->estcpu++g_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_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_fromint(4))) -select->nice*2;if((select->tid != 0) &&(select->state == TASK_STATE_READY)) {if(my_select->priority<select->priority) {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 -> 0x%d\r\n",(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->nice<=my_select->nice)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);。