




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统原理实验二、线程/进程及其调度重庆大学软件学院 洪明坚2014年8月实验目的 掌握线程的内部表示、调度和切换 EPOS线程的表示 线程控制块(Task Control Block,TCB) 线程的栈 EPOS线程的调度 调度算法 EPOS线程的切换EPOS线程的表示struct tcb /*hardcoded*/ uint32_t kstack; /*saved top of the kernel stack for this task*/ int32_t tid; /* task id */ int32_t state; / 状态#define TASK_STATE_BLOCKED
2、-1 / 阻塞#define TASK_STATE_READY 1 / 就绪#define TASK_STATE_ZOMBIE 2 / 僵尸 int32_t quantum; / 时间片#define DEFAULT_QUANTUM 10 int32_t exit_code; / 退出代码 struct wait_queue *wait_head; / 等待该线程退出的线程队列 struct tcb *all_next; / 所有线程的链表指针;EPOS线程的表示 思考题 如何创建EPOS线程?EPOS线程如何退出? 请自行阅读应用程序源代码(app/main.c),掌握线程的创建和退出 线程
3、函数的最后,一定要调用task_exit,不能直接return!为什么?实验内容 随机生成一个整数列表,然后创建3个线程,分别用3种不同的排序算法对列表进行排序 用函数srand及random(app/rand.c)生成随机数 进入图形模式,沿垂直方向把屏幕等分成3个区域,每个排序线程用一个区域,动态显示排序过程,运行效果如这里 参考video.c和main.c线程的栈tid用户模式栈User mode stack内核模式栈Kernel mode stack内核模式栈:线程在内核模式运行时所用的栈,用于在中断处理、系统调用等过程中保存现场(struct context)、临时变量、函数参数和返
4、回地址等等;由内核在创建线程(sys_task_create,task.c)时申请用户模式栈:线程在用户模式运行时所用的栈,用于在函数调用过程中保存临时变量、函数参数和返回地址等等;由用户自己申请,并作为参数传递给task_create(app/syscall.S)内核级线程不需要用户模式栈Low addrHigh addrLow addrHigh addrstruct tcbkstack栈的切换 用户栈到内核栈 何时切换? 中断处理或系统调用时 切换时,要用临时内核栈(tmp_stack)做过渡 为什么?因为CPU从用户模式切换到内核模式时,总是把栈顶指针(ESP)设为tmp_stack t
5、mp_stack定义在entry.S中 内核栈到用户栈 何时切换? 中断返回或系统调用结束时栈的切换:用户栈 内核栈#define hwint(irq, enable_icus) 保存现场 movl _g_task_running, %eax; cmpl $0, %eax; je 3f; movl 56(%esp), %ebx; testl $3, %ebx; jz 3f; movl %ecx, %edx; shll $2, %edx; movl %esp, %esi; movl (%eax), %esp; subl %edx, %esp; movl %esp, %edi; cld; rep
6、movsd; 3:; 中断处理中断处理是否从用户模式中来?保存现场到把现场(struct context)从临时内核栈移到当前线程的内核栈,并切换到当前线程的内核栈是否栈的切换:内核栈 用户栈 .globl _ret_from_syscall_ret_from_syscall: 3: popl %fs popl %es popl %ds popal addl $8, %esp # discard exception and errorcode iret恢复现场指令IRET依次弹出EIP, CS和EFLAGS如果将返回到用户模式,还要弹出ESP和SS以切换回线程的用户模式栈栈的切换 因此,中断处
7、理和系统调用是在当前线程的上下文中执行的! 临时内核栈(tmp_stack)只起过渡作用! 总而言之,操作系统内核总是代表着某个线程在执行指令! 内核披着线程的外衣在运行栈的切换 思考题 当线程回到用户模式下运行时,它的内核栈一定是空的。为什么?EPOS线程的调度 调度函数 void schedule() task.c 何时调度? 由全局变量“g_resched”决定 请自行阅读timer.c中的函数isr_timer寻找答案 isr_timer是系统定时器的中断处理函数 理论上,系统定时器每秒钟触发100次中断 目前只实现了轮转算法(round-robin) 请自行阅读task.c中函数sc
8、hedule的实现EPOS线程的切换 调度器选择了一个可运行的线程new后,要把CPU从当前线程切换到new运行 当前线程:g_task_running 切换函数 void swtich_to(struct tcb *new) machdep.cvoid switch_to(struct tcb *new) _asm_ _volatile_ ( pushalnt pushl $1fnt movl %0, %eaxnt movl %esp, 0(%eax)nt addl $36, %espnt : :m(g_task_running) :%eax ); g_task_running = new;
9、 _asm_ _volatile_ ( movl %0, %eaxnt movl 0(%eax), %espnt retnt 1:nt popalnt : :m(g_task_running) :%eax );EPOS线程的切换g_task_running-kstack=ESPnewtid内核模式栈Kernel mode stackkstacktid内核模式栈Kernel mode stackkstackESP=g_task_running-kstackg_task_runningEPOS线程的切换 从函数switch_to可以看出 线程切换只是切换了两个线程的内核栈,也就是说 切换了内核栈,就切换了线程!EPOS线程的切换 思考题 在创建一个新的线程时,如何构造它的现场,使得它可以用switch_to函数启动? 请自行阅读task.c中的函数sys_task_create以找到答案 特别是machdep.h中定义的宏INIT_TASK_CONTEXT实验内容 重写函数schedule,实现基于优先级的线程调度 增加系统调用”int task_set_priority(int tid, int new_priority)”,用于改变线程的优先级 tid必须大于0 该系统调用返回线程之前的优先级 测试你的调度器 注意 需
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基层公共卫生考试模拟题(含答案)
- 2025届广东省汕头市潮南实验学校校高考冲刺模拟英语试题含答案
- 钳工四级理论知识复习题(附参考答案)
- 车工高级工模拟习题(附参考答案)
- 职业技术学院2024级婴幼儿托育服务与管理专业人才培养方案
- 助产技术-娠合并症专项考核试题
- 眼镜生产过程中的品质监控手段考核试卷
- 糖品包装设计与可持续发展理念考核试卷
- 健康饮食食物中的铜与贫血的预防考核试卷
- 聚合纤维在能源储存领域的应用考核试卷
- 2025年春新北师大版数学七年级下册课件 ☆问题解决策略:特殊化
- 《茶文化历史》课件
- 《碳金融》 课件全套 彭红军 第1-10章 碳金融的起源-中国碳金融市场发展
- 仙居县永安溪绿道设计研究
- 三角堰流量计算公式
- 用电安全及防雷防静电知识考核试卷
- 《成人心肺复苏术》课件
- 低空空域资源的协调与管理策略
- 高教版2023年中职教科书《语文》(基础模块)下册教案全册
- 服务机器人的智能导航与定位考核试卷
- 3.2.1.1函数的单调性课件-高一上学期数学人教A版(2019)必修第一册
评论
0/150
提交评论