[山东大学操作系统课程设计]实验2

0.写在前面

其实昨天就把这篇写完了,可是遇到了一些突发事件,暂时还没想好自己的出路在哪,争取这两天把课程设计的实验全都写完吧。。。。。我知道大家现在都很难过,生活上,学业上,事业上。。。。但是还是希望大家能一起加油度过这段日子

1.关于实验的说明

首先这个实验的最基本要求,就是修改一下nachos的线程调度策略,让其变为具有优先级的县城调度。换言之,就是加上优先级属性,然后在调度(对于这个实验来说,调度可以具体化一些,就是线程从就绪态转化为运行态,然后进入队列或者cpu的过程中)。

因为实验本身不太难(落实到代码上,只需要改动两三个地方就可以了,加起来不到10行代码),而且其实我也不会c,源码的解释在这篇可能不是很地道和详细,但我还是尽力去完成这些东西,还是那句话,如有不足,还望指出,感激不尽

2.关于一些模块以及函数的解析

线程相关函数的分析

//构造函数Thread::Thread(const char* threadName,int threadPriority=0)//系够函数
Thread::~Thread()//创建新的线程
void 
Thread::Fork(VoidFunctionPtr func, _int arg)//检查线程是否超出内存
void
Thread::CheckOverflow()//结束线程(转化为结束态)
void
Thread::Finish ()//转化为就绪态
void
Thread::Yield ()//转化为阻塞态
void
Thread::Sleep ()//为线程分配空间
void
Thread::StackAllocate (VoidFunctionPtr func, _int arg)//不知道干啥的,应该没啥用
void
Thread::SaveUserState()void
Thread::RestoreUserState()

至于schedule下面只需要知道这一个函数就可以了,这个函数使用来切换线程的

void
Scheduler::ReadyToRun (Thread *thread)
{DEBUG('t', "Putting thread %s on ready list.\n", thread->getName());thread->setStatus(READY);// readyList->Append((void *)thread);readyList->SortedInsert((void *)thread,thread->getPriority());
}

3.关于实验需要做什么

好的吧,那么我们直接开始解析内容了。

首先实现说明,我们需要修改的模块只有两个,schedule系列(用来管理调度),thread(用来管理线程实体本身)就可以将正常的非抢夺式线程调度,转化为一个优先级调度。最后在threadTest下面fork几个新的线程。

而具体的实现思路其实就两点,剩下的都是nachos本身完成了实现:

1. 线程本身,需要注明优先级

2. 而优先级调度的实现,在这里我们是通过在运行态转化为就绪态,也就是进入就绪队列的时候,实现这样一个”按优先级顺序插入“,而不是直接插入尾部。

好吧,我知道这样解释其实挺苍白的,所以我们在这里直接解释一下如何进行操作

首先是对于线程本身这个类:

3.0:准备工作

需要将如下几个文件从/threads中复制过来

3.1:对于thread.cc和thread.h的修改

对于头文件来说,我们需要做的是优先级,在这里用一个整数来进行表示

然后,增加一个获取优先级的方法,让整个系统封装严密一些

在然后,修改thread的构造方法声明,添加优先级参数:

这样,在h文件中得到的一个类,(改动的部分已经在下面了)

class Thread {public:Thread(const char* debugName , int priority=0);		// initialize a Thread int getPriority(){ return priority;} //返回优先级的方法private:int priority;

然后是更改一下thread.cc文件中,关于构造方法的具体实现

(注意构造方法中,优先级属性请设置为默认参数,因为有些本实验涉及不到的东西会遇到一些问题,因此需要保留原本的构造方法的有效性)

3.2:对于scheduler.cc以及scheduler.h的修改

优先级的实现,在thread上已经完成了,这个不用多说

接下来是如何根据优先级实现调用,其实实现原理就是从”先进先出“的尾部插入,到”优先级插入“,而这个函数,nachos已经帮我们实现了

直接修改其中的readytorun函数即可

void
Scheduler::ReadyToRun (Thread *thread)
{DEBUG('t', "Putting thread %s on ready list.\n", thread->getName());thread->setStatus(READY);// readyList->Append((void *)thread); 将这个修改为别的readyList->SortedInsert((void *)thread,thread->getPriority());
}

 3.3:threadtest.cc文件

这个文件主要是用来进程的改动而已,在函数中新增几个两个线程即可

//----------------------------------------------------------------------
// ThreadTest
// 	Set up a ping-pong between two threads, by forking a thread 
//	to call SimpleThread, and then calling SimpleThread ourselves.
//----------------------------------------------------------------------void
ThreadTest()
{DEBUG('t', "Entering SimpleTest");Thread *t1 = new Thread("forked thread1");Thread *t2 = new Thread("forked thread2");Thread *t3 = new Thread("forked thread3");t1->Fork(SimpleThread, 1);  //第二个参数是序号t2->Fork(SimpleThread, 2);t3->Fork(SimpleThread, 3);SimpleThread(0);
}

最后按照我们实验1的方式,使用make指令编译出可执行文件即可执行了。

4.实验内容(正文报告)

1. 分析说明原有的Nachos调度流程

原有的nachos调度流程,虽然已经实现了”优先级属性”在listElement中,但是本质上在插入的时候,对每个线程封装的优先级均为“0”,也就是先进显出的调度策略。

2. 设计并且实现具有静态优先级的非抢占式线程调度策略。

修改内容:

(1)首先引入需要的模块

需要将如下几个文件从/threads中复制过来

(2)然后对应模块进行修改

对于头文件来说,我们需要做的是优先级,在这里用一个整数来进行表示

然后,增加一个获取优先级的方法,让整个系统封装严密一些

在然后,修改thread的构造方法声明,添加优先级参数:

这样,在h文件中得到的一个类,(改动的部分已经在下面了)

class Thread {public:Thread(const char* debugName , int priority=0);		// initialize a Thread int getPriority(){ return priority;} //返回优先级的方法private:int priority;

然后是更改一下thread.cc文件中,关于构造方法的具体实现

优先级的实现,在thread上已经完成了

接下来是如何根据优先级实现调用,其实实现原理就是从”先进先出“的尾部插入,到”优先级插入“,而这个函数,nachos已经实现了

直接修改其中的readytorun函数即可

void
Scheduler::ReadyToRun (Thread *thread)
{DEBUG('t', "Putting thread %s on ready list.\n", thread->getName());thread->setStatus(READY);// readyList->Append((void *)thread); 将这个修改为别的readyList->SortedInsert((void *)thread,thread->getPriority());
}

这个文件主要是用来进程的改动而已,在函数中新增几个两个线程即可

//----------------------------------------------------------------------
// ThreadTest
// 	Set up a ping-pong between two threads, by forking a thread 
//	to call SimpleThread, and then calling SimpleThread ourselves.
//----------------------------------------------------------------------void
ThreadTest()
{DEBUG('t', "Entering SimpleTest");Thread *t1 = new Thread("forked thread1");Thread *t2 = new Thread("forked thread2");Thread *t3 = new Thread("forked thread3");t1->Fork(SimpleThread, 1);  //第二个参数是序号t2->Fork(SimpleThread, 2);t3->Fork(SimpleThread, 3);SimpleThread(0);
}

最后按照我们实验1的方式,使用make指令编译出可执行文件,并且运行这个可执行文件,得到结果如下

3. 上下文切换次数变化

首先节选一部分,指令nachos -t d指令打印出来的信息

经过对比发现,和simpleThread的条目数目对不上。

实际上这个结果的原因是由于上下文的频繁切换,因为simpleThread中的执行逻辑是简单的线程放弃cpu以及切换,也可能是频繁的上下文切换导致了错误。

通过如下的修改方式可以实现一定程度的缓解,通过缓冲区统一打印,减少一定程度上的上下文切换频率。

void
SimpleThread(_int which)       //
{int num;
int p=0
char buffer[100];for (num = 0; num < 5; num++) {   //减少上下文切换次数差不多就是在这里p+=snprintf(buffer+printCount,........)//累加到缓冲区中}printf('%s',buffer)currentThread->Yield()
}

4. 优先级调度老化的实现

线程调度老化指的是随着时间的推移,线程优先级降低或者失去掉去机会的情况。

对于nachos来说,增加老化机制的方法可以为在线程切换并且转化为就绪态,在插入就绪队列之前,可以适当对优先级进行自减操作。

首先需要对thread进行进一步的修改,增加setPriority来修改线程的优先级

然后在Yield方法中,在线程对象重新被放入readyList之前,将其优先级属性降低即可。

这样即可实现老化机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7根分区扩容之一

Centos默认根分区50G&#xff0c;很快接近100%&#xff0c;如果你的系统使用了全部磁盘&#xff0c;文件系统是xfs&#xff0c;根分区和/home都是逻辑卷&#xff0c;那么在没有额外的磁盘增加情况下&#xff0c;可以从/home卷中切分一部分空间增加到根分区空间。 1.由于xfs格式…

视频合并方法:掌握视频批量嵌套合并技巧,成为剪辑高手

在视频剪辑的过程中&#xff0c;我们经常需要将多个视频片段合并在一起。传统的视频合并方法往往需要大量的时间和精力&#xff0c;通过掌握批量嵌套合并技巧&#xff0c;可以更高效地完成这项任务&#xff0c;成为剪辑高手。本文讲解一种简单易学的视频合并方法&#xff0c;轻…

对于Web标准以及W3C的理解、对viewport的理解、xhtml和html有什么区别?

1、对于Web标准以及W3C的理解 Web标准 Web标准简单来说可以分为结构、表现、行为。 其中结构是由HTML各种标签组成&#xff0c;简单来说就是body里面写入标签是为了页面的结构。 表现指的是CSS层叠样式表&#xff0c;通过CSS可以让我们的页面结构标签更具美感。 行为指的是…

关于 ls -s 输出文件大小的单位问题的讨论

自己看书正好看到这里&#xff0c;正纳闷呢&#xff0c;上网查了下&#xff0c;发现不是我自己在为这个问题感到困惑。 有个大哥提出一个问题&#xff1a; 问题标题&#xff1a; ls -s的单位到底是什么&#xff1f; man ls -s, --size print the alloca…

[读论文][跑代码]BK-SDM: A Lightweight, Fast, and Cheap Version of Stable Diffusion

github: GitHub - Nota-NetsPresso/BK-SDM: A Compressed Stable Diffusion for Efficient Text-to-Image Generation [ICCV23 Demo] [ICML23 Workshop] ICML 2023 Workshop on ES-FoMo 简化方式 蒸馏方式&#xff08;训练Task蒸馏outKD-FeatKD&#xff09; 训练数据集 评测指标…

美丽的时钟

案例绘制一个时钟 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>美丽的时钟</title><script language"javascript">window.onloadfunction(){var clockdocument.getElementById("clock"…

Unity 使用Horizontal Layout Group和Toggle制作多个水平开关按钮实现自动排列和单个点击放大后的自动排列。

Unity的布局组件Horizontal Layout Group是很好用的&#xff0c;当然也包括其它布局组件也一样好用。 比如要实现多按钮开关自动水平排列&#xff0c;那么就可以使用它了。 首先我们为按钮创建个父物体&#xff08;我这里使用了Scroll View中的Content作为父物体&#xff09;…

weblogic任意文件上传漏洞(CVE-2018-2894)

任务一&#xff1a; 复现环境中的漏洞 任务二&#xff1a; 上传webshell或者反弹shell&#xff0c;并执行whoami。 任务一&#xff1a; 1.环境搭建&#xff0c;发现需要密码&#xff0c;所以我们去日志里面查看管理员密码。 2.了解一下这个平台&#xff0c;然后进行一些基本配…

基于Python Flask 的全流程全栈项目自己的实战心得

我基于Python Flask框架开发全流程全栈项目的实战经验和心得。我将介绍整个项目的架构设计、前后端交互、数据库管理以及部署等方面&#xff0c;并提供具体的代码示例。通过这个实例项目&#xff0c;你将学习到如何使用Flask构建一个完整的Web应用&#xff0c;并了解一些常见的…

实现优雅的自增枚举类:Python中的枚举与自增技巧

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 枚举类型在编程中扮演着重要的角色&#xff0c;它们为变量赋予了更加清晰的含义。然而&#xff0c;在Python中&#xff0c;实现自增的枚举类并非直接而简单的任务。本文将深入讨论如何通过不同的方式优雅地实现自…

Zigbee—基于Z-STACK组网

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;チノカテ—ヨルシカ 0:46━━━━━━️&#x1f49f;──────── 4:08 &#x1f504; ◀️ ⏸ ▶️ ☰ &a…

每天五分钟计算机视觉:经典的卷积神经网络之VGG-16模型

VGG-16 Vgg16是牛津大学VGG组提出来的,相比于AlexNet来说,AlexNet的一个改进是采用连续的几个4*3的卷积核来代替AlexNet中的较大的卷积核(11*11,5*5)。前面我们也说过了使用小卷积核是优于大的卷积核的,因为多层非线性层可以增加网络深度来保证学习到更加复杂的模式,而且代…

TTM Squeeze挤牌指标选股公式,通过波动率和动量判断能量释放

TTM Squeeze&#xff08;挤牌&#xff09;是由约翰卡特(John Carter)发明的波动率和动量指标&#xff0c;在其著作《驾驭交易》中进行了介绍。当价格在窄幅区间震荡盘整为下一次大幅上涨或下跌积蓄能量时&#xff0c;就可以用挤牌指标来识别。Squeeze的意思是“挤压”&#xff…

速通MySql

一、简介 1、什么是数据库 数据仓库&#xff0c;用来存储数据。访问必须用SQL语句来访问 2、数据库的类型 1、关系型数据库&#xff1a;Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等 可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询&#…

模糊C均值(Fuzzy C-means,FCM)聚类的python程序代码的逐行解释,看完你也会写!!

文章目录 前言一、本文的原始代码二、代码的逐行详细解释总结 前言 接上一篇博客&#xff0c;详细解释FCM聚类的程序代码&#xff01;&#xff01; 一、本文的原始代码 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets import skfuzzy as…

Open3D 最小二乘拟合二维直线(直接求解法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 平面直线的表达式为: y = k x + b

【软件推荐】卸载360软件geek;护眼软件flux;

卸载360软件geek f.lux: software to make your life better (justgetflux.com) 卸载完扫描残留 护眼软件 hf.lux: software to make your life better (justgetflux.com)https://justgetflux.com/https://justgetflux.com/

【Java8系列06】Java8数据计算

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

应用于智慧工地的AI边缘计算盒子+AI算法软硬一体化方案

智慧工地解决方案&#xff0c;围绕施工工地最常见的工人工服识别、安全帽佩戴识别、人脸识别、安全周界检测、打电话/吸烟、摔倒检测、明火检测、渣土车、土堆裸露识别等一系列子场景专门推出的通用解决方案&#xff0c;着眼工地安全施工、规范人员进出、保护设备安全等刚性需求…

vscode插件问题

1 Vscode code颜色变化 最外层标签颜色变成白色 其他标签有颜色&#xff0c;css代码颜色有些变成白色 是安装的另一个插件vue影响的&#xff0c;卸载就能恢复正常的颜色 2 配置Vue项目的代码片段 css 样式代码片段 配置css.json上后偶尔能用偶尔不能用&#xff0c;Vscode 右下…