xv6/调度算法及并发程序设计
1 在proc.c的scheduler函数中,有两行:
if(setjmp(&cpus[cpu()].jmpbuf) == 0)
longjmp(&p->jmpbuf);
把它修改为:
cprintf("setjmp called in scheduler\n");
if(setjmp(&cpus[cpu()].jmpbuf) == 0){
cprintf("setjmp in scheduler returned 0; longjmp\n");
longjmp(&p->jmpbuf);
}else
cprintf("setjmp in scheduler returned 1\n");
修改后,重编译内核,在Bochs中运行编译后的内核,你将会看到有规律的六行输出在屏幕上。
要求:
- 1. 列出这有规律的六行。
- 2. 在这六行里面,每输出两行setjmp returned 才输出一行setjmp called. 试解释一下为什么
int setjmp(struct jmpbuf *jmp);
void longjmp(struct jmpbuf *jmp); 的函数解析!
# Setjmp saves its stack environment in jmp for later use by longjmp.
# It returns 0.
# Longjmp restores the environment saved by the last call of setjmp.
# It then causes execution to continue as if the call of setjmp
# had just returned 1.
# The caller of setjmp must not itself have returned in the interim.
# All accessible data have values as of the time longjmp was called.
# [Description, but not code, borrowed from Plan 9.]
这是setjmp和longjmp的函数解析。意思在于setjmp会保存当前环境,上下文。然后longjmp会回溯到最后一个setjmp所指向保存的环境。如图1所示
图1
cprintf("setjmp called in scheduler\n");
if(setjmp(&cpus[cpu()].jmpbuf) == 0){
cprintf("setjmp in scheduler returned 0; longjmp\n");
longjmp(&p->jmpbuf);
}else
cprintf("setjmp in scheduler returned 1\n");
一开始的时候没有longjmp的时候,setjmp返回的为0.
然后执行cprintf("setjmp in scheduler returned 0; longjmp\n");
接着到longjmp 于是跳回setjmp的位置。此时因为longjmp了于是setjpm返回1。
于是执行cprintf("setjmp in scheduler returned 1\n");
所以才有一次setjmp returned 才输出一行setjmp called。
- 3. 试解释一下scheduler函数和sched函数的用途。
可以从scheduler函数和sched函数的注释中看出.
对于scheduler函数
// Per-CPU process scheduler.
// Each CPU calls scheduler() after setting itself up.
// Scheduler never returns. It loops, doing:
// - choose a process to run
// - longjmp to start running that process
// - eventually that process transfers control back
// via longjmp back to the top of scheduler.
每一个CPU都有属于它自己的scheduler函数,当每一个CPU设置它本身的时候会调用scheduler函数的时候。Scheduler函数永远不会返回,它会不断的循环:(循环过程中)
1 选择一个进程,然后运行该进程。
2 使用longjmp跳到那个进程代码那,开始运行那个进程。
3 最后进程将控制权转移回来。
4 通过longjmp调到scheduler函数头。重新开始。
对于 sched函数
// Enter scheduler. Must already hold proc_table_lock
// and have changed curproc[cpu()]->state.
在进入scheduler 函数,而且会在持有 proc_table_lock
并且会改变 curproc[cpu()]的状态。
4. 阅读trap.c 第50行至第66行。Proc.c中的 yield函数、sched函数及scheduler函数,结合书本,确定xv6使用的是哪种调度算法。给出你的理由(通过分析代码证明你的观点)。
1先来先服务(FCFS)
2短作业优先(SF)
3高响应比优先
4时间片轮转(RR)
5多级队列调度算法
6多级反馈队列调度算法总共有6调度算法是XV6可能的选项。
前三种都是要安装进程的某个属性排序,比如进入时间,比如作业长短,响应比。并且选择进入时间最早,作业最短,响应比最高。
Scheduler 函数中的
for(i = 0; i < NPROC; i++){
p = &proc[i];
if(p->state != RUNNABLE)
continue;
这部分是调度算法的核心,证明了XV6是使用时间轮转(RR)。因为上面代码就是一个循环,在process数组里寻找可执行的进程。然后接下去的代码的意义才是跳到被选中的进程去进行执行。
// Switch to chosen process. It is the process's job
// to release proc_table_lock and then reacquire it
// before jumping back to us.
setupsegs(p);
curproc[cpu()] = p;
p->state = RUNNING;
if(setjmp(&cpus[cpu()].jmpbuf) == 0)
longjmp(&p->jmpbuf);
至于yield 函数 sched函数。当一个进程使用完时间片后,会中断调用yield函数来让出CPU给新的进程,yield调用sched函数,sched会切换:
void
sched(void)
{
struct proc *p = curproc[cpu()];
if(!holding(&proc_table_lock))
panic("sched");
if(cpus[cpu()].nlock != 1)
panic("sched locks");
if(setjmp(&p->jmpbuf) == 0)
longjmp(&cpus[cpu()].jmpbuf);
}
转载于:https://www.cnblogs.com/zzzPark/p/6865625.html
xv6/调度算法及并发程序设计相关推荐
- java unsafe获取指针_【实战Java高并发程序设计 1】Java中的指针:Unsafe类
是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...
- 操作系统课设之基于信号量机制的并发程序设计
前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...
- Linux并发程序课程设计报告,网络操作系统课程设计--进程机制与并发程序设计-linux下生产者与消费者的问题实现.doc...
网 络 操 作 系 统 课 程 设 计 网络操作系统课程设计 设计内容:进程机制与并发程序设计inux下生产者与消费者的问题实现进程机制与并发程序设计inux下生产者与消费者的问题实现 (1)掌握基本 ...
- 【实战Java高并发程序设计6】挑战无锁算法
我们已经比较完整得介绍了有关无锁的概念和使用方法.相对于有锁的方法,使用无锁的方式编程更加考验一个程序员的耐心和智力.但是,无锁带来的好处也是显而易见的,第一,在高并发的情况下,它比有锁的程序拥有更好 ...
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(4)――任务间通信A
基于嵌入式操作系统VxWorks的多任务并发程序设计(4) ――任务间通信 作者:宋宝华 e-mail:[email]21cnbao@21cn.com[/email] 出处:软件报 VxWorks提 ...
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(3)――任务调度
基于嵌入式操作系统VxWorks的多任务并发程序设计(3) ――任务调度 作者:宋宝华 e-mail:[email]21cnbao@21cn.com[/email] 出处:软件报 VxWorks支持 ...
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(5)――中断与任务
基于嵌入式操作系统VxWorks的多任务并发程序设计(5) ――中断与任务 作者:宋宝华 e-mail:[email]21cnbao@21cn.com[/email] 出处:软件报 中断处理是整个 ...
- 计算机操作系统(八)——并发程序设计
并发程序设计 顺序程序设计 进程的并发执行 处理器利用率计算 并发程序设计 把一个具体问题求解设计成若干个可同时执行的程序模块的方法 特性: 无关与交往的并发进程 与时间有关的错误 进程互斥与进程同步 ...
- JAVA高并发程序设计(葛一鸣著)读书笔记
本文为JAVA高并发程序设计(葛一鸣著)读书笔记.这本书对于刚刚入门的童鞋来讲可能有点深,我推荐可以先看看Java多线程编程核心技术(高洪岩著)一书. 第一章 走入并行世界 什么是同步和异步? 同步就 ...
最新文章
- u-boot移植重要问题说明
- VC的MFC中重绘函数的使用总结(整理)
- Oracle9i卸载后再次安装,设置的SID相同出现“指定的SID在本机上已经存在。请指定一个不同的SID。”...
- 笑说设计模式-小白逃课被点名
- 比特(bit)_二进制数
- vue打包后,font格式错误
- 【设计模式】学习笔记8:命令模式
- xgboost多分类原理_XGboost原理基础之梯度提升树
- python做购物车代码大全-Python实现一个简单的购物车程序
- innerHTML和outerHTML区别
- PID算法与PID自整定算法
- gp338信令_细说GP338GP328对讲机编程
- nali——linux显示IP来源的工具
- Flutter 之页面状态保持
- 基于python实现的双月模型
- 为什么发动机需要吸入大量的空气?
- 巧用键盘鼠标!打字更快—办公效率更好!
- 数据库备份MySQL
- 【C语言学习04】跳出嵌套循环
- 计算机毕业设计Java大学生学籍管理系统(源码+系统+mysql数据库+lw文档)