首页 > 其他分享 >04_实验四_时间片轮转

04_实验四_时间片轮转

时间:2023-12-07 23:35:42浏览次数:27  
标签:优先级 轮转 04 中断 调度 队列 实验 线程 就绪

线程调度

实验目的

  • 调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。
  • 为EOS添加时间片轮转调度,了解其它常用的调度算法。

预备知识

基于优先级的抢先式调度

EOS使用双向链表存储同一个优先级的队列,用数组存放32个这种双向链表,并用下标表示不同优先级大小,同时设置一个32位就绪位图表示索引为n的队列中是否有线程

对于不同优先级的线程,优先级越大越优先被调度,同一优先级中的线程则采用FCFS的方式“先来先服务”。

调度程序执行的时机和流程

线程调度运用到了中断,要了解调度的流程首先要了解中断处理的流程。

EOS中有中断处理函数Interrupt,中断时首先调用InterEnter保存中断时CPU现场到KernelContext中,随后调用KiDispatchInterrupt派遣中断至中断处理服务程序,完成调用IntExit退出中断,恢复现场

调度时首先正常执行中断处理流程,在IntExit中调用PspSelectNextThread函数,决定要恢复的CPU现场,即选择一个线程获得CPU,这个函数就是调度程序

中断不仅可以由外部设备产生,也可以由线程主动调用48号软中断产生,这样就实现了线程调度

调度程序的流程可以由伪代码表示如下

PspSelectNextThread
if 被中断线程State == Running then:
	if 存在更高优先级线程 then:
		被中断线程State = Ready
		return 最高优先级就绪队首线程
	else
		return 被中断线程
else
	return 最高优先级就绪队首线程

时间片轮转调度

当线程调度执行时,把CPU分配给队首线程,待线程的时间片用完后,会重新为它分配一个时间片,并将它移动到就绪队列的末尾,从而让新的队首线程开始执行。

实验步骤

为EOS添加时间片轮转调度

给出实现方法的简要描述、源代码、测试及结果等

简要描述及源代码

image-20231206093506391

参考流程图5-11编写即可

// 被中断的线程处于运行态且不为空
if (NULL != PspCurrentThread && Running == PspCurrentThread->State) {
	// 减少时间片
	PspCurrentThread->RemainderTicks--;
	if(PspCurrentThread->RemainderTicks == 0) {
		// 如果时间片为0重置时间片
		PspCurrentThread->RemainderTicks=TICKS_OF_TIME_SLICE;
		// 存在和被中断线程优先级相同的就绪线程
		if(BIT_TEST(PspReadyBitmap, PspCurrentThread->Priority)) {
			// 将被中断线程转入就绪状态,并插入队尾
			PspReadyThread(PspCurrentThread);
		}
	}
}

思考与练习

  1. 结合线程调度执行的时机,说明在 ThreadFunction 函数中,为什么可以使用“关中断”和“开中断”的方法来保护控制台这种临界资源。一般情况下,应该使用互斥信号量(MUTEX)来保护临界资源,但是在ThreadFunction函数中却不能使用互斥信号量,而只能使用“关中断”和“开中断”的方法,结合线程调度的对象说明这样做的原因。

关中断后CPU就不会响应任何由外部设备发出的硬中断,包括定时计数器中断和键盘中断等,也就不会发生线程调度了,从而保证各个线程可以互斥访问控制台。

函数中绝对不能使用互斥信号量来保护临界资源,如果使用了,则那些由于访问临界区而被阻塞的线程,就会被放入互斥信号量的等待队列,就不会在响应优先级的就绪队列中了,而时间片调度算法时对就绪队列的线程进行轮转调度,而不是对这些被阻塞的线程,使用“关中断”和“开中断”不会改变线程状态。

  1. 时间片轮转调度发现被中断线程的时间片用完后,而且在就绪队列中没有与被中断线程优先级相同的就绪线程时,为什么不需要将被中断线程转入“就绪”状态?如果此时将被中断线程转入了“就绪”状态又会怎么样?

在就绪队列中没有与被中断线程优先级相同的就绪线程时,由于不能使其他优先队列的线程等待时间过程,所以不需要将被中断线程转入“就绪”状态,以此来减少线程等待时间。如果将中断线程转入“就绪”状态,则只有当该线程执行完毕后,其他队列的线程才能有机会进入就绪队列。

  1. EOS内核时间片大小取60ms(和Windows操作系统完全相同),在线程比较多时,就可以观察出线程轮流执行的情况(因为此时一次轮转需要60ms,10个线程轮流执行一次需要60×10=600ms,所以EOS的控制台上可以清楚地观察到线程轮流执行的情况)。但是在Windows、Linux等操作系统启动后,正常情况下都有上百个线程在并发执行,为什么觉察不到它们被轮流执行,并且每个程序都运行的很顺利呢?

因为时间片选取合适,线程轮流执行,体现了其虚拟性。

标签:优先级,轮转,04,中断,调度,队列,实验,线程,就绪
From: https://www.cnblogs.com/binbinzhidao/p/17884250.html

相关文章

  • 03_实验三_进程同步
    实验三进程同步实验目的使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。调试跟踪EOS信号量的工作过程,理解进程同步的原理。修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理预备知识信号量机制问题:1.在双标志......
  • VMware17 ubuntu18.04.5安装好后无法访问win11共享文件夹的问题
    1在关闭虚拟机的情况下,点击虚拟机设置,CD/DVD设置使用ISO镜像文件,并设置好镜像路径。2启动虚拟机,此时重新安装VMwaretools按钮变成有效状态,点击该按钮,如果虚拟机进入系统后,该按钮会变成无效状态。3等待虚拟机自动下载VMwaretools,下载后在桌面可以看到VMwaretoolsDVD光盘,......
  • 08_实验七_拓展实验二
    拓展实验2:在物理机上运行EOS操作系统任务一:改进EOS内核引导过程,实现裸机从无文件系统的平坦软盘镜像引导内核代码调整将EOS内核引导过程调整为U盘引导后,就不再需要对内核进行FAT文件系统相关内容的初始化,将其注释掉,否则会因为初始化失败而无法进入到内核。需要将文件......
  • 07_实验七_拓展实验一
    拓展实验1本拓展实验的任务和目标是为了更好的理解和认识EOS操作系统的内核程序。EOS的内核程序的代码在codecode平台已经给出。参考上面之前已经完成的6个基础实验的调试过程可以更好的理解内核程序的代码。然后调试一个应用程序的执行过程,详细了解了EOS操作系统的所有重要模......
  • 06_实验六_读文件和写文件
    读文件和写文件实验目的了解在EOS应用程序中读文件和写文件的基本方法。通过为FAT12文件系统添加写文件功能,加深对FAT12文件系统和磁盘存储器管理原理的理解。文件系统驱动程序的作用用户对文件的读写请求转换为对磁盘扇区的读写请求,并负责对磁盘扇区进行管理。实验内容......
  • 09_实验八_拓展实验三
    拓展实验三:线程调度算法改进实验目的实现多级反馈队列调度算法实验步骤实现时间片轮转调度算法。修改时间片的大小TICKS_OF_TIME_SLICE为100,方便观察执行后的效果。在控制台命令“rr”的处理函数中,将Sleep时间更改为200*1000,这样可以有充足的时间查看优先级降......
  • 实验四 Web服务器2
    实验四Web服务器2基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用LinuxSocket实现:1.Web服务器的客户端服务器,提交程序运行截图2.实现GET即可,请求,响应要符合HTTP协议规范3.服务器部署到华为云服务器,浏览器用本机的4.把服务器部署到试验箱。(加分项)web_server.c1#include......
  • 实验四 Web服务器2
    server.c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#definePORT8080#defineBUFFER_SIZE1024intmain(){   int......
  • 实验四 Web服务器1
    Web服务器1-socket编程实验内容基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用LinuxSocket实现:time服务器的客户端服务器,提交程序运行截图echo服务器的客户端服务器,提交程序运行截图,服务器把客户端传进来的内容加入“服务器进程pid你的学号姓名echo:”返回给客户端服务器......
  • [AGC040D] Balance Beam
    [AGC040D]BalanceBeam颇有难度的一道题。首先思考我们的手上有什么武器可以使用。发现如果石板的排列确定下来,那么合法的B一定是形如\([0,x)\)的一段区间。我们只需令\(x\)最大即可。同时,显然可以认为终点一定在整点上。题目中很为难我们的一点是位置并不是离散的,所以......