操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

这篇具有很好参考价值的文章主要介绍了操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一关 版本1.2内核的进程调度过程分析

(一)答案

1.mygdb侧调试命令:

b task1
c
c
b schedule
c
disas 0x6973
p sys_call_table[0x1b]
c
disas 0x69ae
p sys_call_table[0x1d]
c
c
c
c
c

2.第三关.txt:

操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

(二)解题思路

1.概述:0号进程和1号进程间进程调度过程

(1)从system_call函数进入相应的系统调用函数

在两个进程运行alarmpause函数时,到执行alarmpause系统调用时,都会进入到system_call函数,在下图第一处划线位置根据系统调用号,调用相应的sys_alarmsys_pause函数。
操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

(2)执行sys_alarmsys_pause系统调用函数

两个函数的共同点在于都是系统调用的函数,因此在执行这两个函数之前会进入上面说的system_call函数,在执行完上一一张图提到的划线部分的call sys_call_table指令后,也均会执行reschedule(除了第一次的system_call(alarm),但这次例外出现在题目中要求的 “第二次输出1” 之前,因此本文不做考虑(水平有限,没想明白)),reschedule会调用一次schedule函数。
而不同点在于,sys_alarm函数本身内部并没有调用schedule函数,而sys_pause函数内部调用了一次schedule函数,因此在main函数调用alarm系统调用时,alarm系统调用共执行了一次schedule,而main函数的1号进程和0号进程调用pause系统调用时,pause系统调用共执行了两次schedule

sys_alarm:
操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

sys_pause
操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

reschedule
操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

main
操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

(3)进程调度与函数调度的关系

在执行schedule函数时,会发生进程的调度,在第一关中,每一次的进程调度都会导致0号进程与1号进程间的切换,由于进程在切换时,老进程会保留当前退出内存时的状态,,比如从0号进程执行到main函数for循环中,task0函数下一行的pause函数,这时pause系统调用会进入system_call函数,通过下图划线位置的call sys_call_tablepause的系统调用号调用sys_pause函数,执行到sys_call函数的schedule时,先保存这时的0号进程的执行状态,再切换到1号进程,下次从1号进程再切换到0号进程时,保存的0号进程的状态会使得0号进程从call schedule的下一条指令(大概是这个意思,可能不准确)开始执行,随后,一次退出sys_pausesys_call_table,回到system_call函数,直至执行到call reschedule中的schedule函数,再保存0号进程的状态,重复上述操作。

操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

2.从第二次输出1的开始到第三次输出1之前,进程调度与函数调用关系示意图

操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

第二关:两个进程的 严格交替输出 (从第一次循环开始两个进程严格交替输出)

(一)答案

1.2/linux/kernel/sched.c文件中的schedule函数添加如下图圈内内容。
操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

虽然最后结果里的前几个0/1没有严格交替输出,但是评测通过。
操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

(二)思路

1.分析原schedule函数导致01不严格交替输出的原因

在上一关中的思路中提到:
alarm系统调用共执行了一次schedule,而main函数的1号进程和0号进程调用pause系统调用时,pause系统调用共执行了两次schedule
所以一次for循环中,打印一个00号进程一共要调用两次schedule函数(pause的两次),而1号进程要调用三次schedule函数(pause的两次和alarm的一次),正是这样不为1:1schedule的调用次数比(即进程调度、切换的次数,因为原schedule函数使得只要该函数被调用,就会进行进程的切换),导致了从输出第二个1开始的10100这样的输出循环中,01并非严格交替输出,且输出的0输出的1 = 3:2(这是因为1号进程调用了三次0号进程。而0号进程调用了两次1号进程)。

2.设计新schedule函数

那么只要使得1号进程中与0号进程中通过调度切换进程的次数为1:1即可解决该问题,而思路就是使得1号进程中的alarm函数在调用schedule函数的时候不进行进程的调度(切换)。
再看原schedule函数,其基本逻辑为:如果当前进程为0号进程,就让下一个进程为1号进程,如果当前进程为1号进程,就让下一个进程为0号进程。
需要将其逻辑改为:如果当前进程为0号进程,就让下一个进程为1号进程,如果当前进程为1号进程,且当前schedule函数,不是alarm函数调用的system_call中的reschedule调用schedule函数,就让下一个进程为0号进程,否则下一个进程依然为1号进程
如何判断上述思路中当前schedule函数是否为alarm函数调用的system_call中的reschedule调用的schedule函数:
schedule函数中的task[next]->counter = 15;语句之前添加printk调试信息如下:

printk("Current pid = %d", current->pid);
printk("Current alarm = %d", current->alarm);

(为什么打印current->alarm:因为在调用alarm函数中的sys_alarm中修改了alarm的值,判断current->alarm为区别alarmpause的特征参数。)
发现0号进程的current->alarm的值总为01号进程的current->alarm的值一直为正值且在增加,于是构造答案所示的schedule函数。文章来源地址https://www.toymoban.com/news/detail-501266.html

到了这里,关于操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机操作系统实验:进程调度实验

    前言 二、实验目的 三、实验要求 四、实验原理 五、实验过程 六、代码详解 总结 计算机操作系统是管理计算机硬件和软件资源的核心软件,它负责为用户提供一个友好、高效、安全的使用环境。进程调度是操作系统的一个重要功能,它决定了进程在处理器上的执行顺序和时

    2024年02月07日
    浏览(45)
  • 操作系统实验:进程同步控制

    前言 一、开发语言及实验平台或实验环境 二、实验目的 三、实验要求 四、实验原理 五、实验过程 六、代码详解 七、diy一下 总结 计算机操作系统是一门研究计算机系统的基本原理和设计方法的课程,它涉及到计算机系统的结构、功能、性能和管理等方面。操作系统实验是

    2024年02月05日
    浏览(37)
  • 操作系统-进程调度实验报告

    1.实现四种不同及进程调度算法: 先来先服务、时间片轮转调、优先级调度以及短作业优先调度算法。 2.通过实验理解有关进程控制块,进程队列等的概念。 1.运行素材中的代码,观察其执行结果是否正确?各个调度算法的功能是否完善?如果没有,则完善。 2. 按照下表

    2024年02月06日
    浏览(33)
  • 操作系统实验 进程的管道通信

    目录 一、实验目的 二、实验预备知识 三、实验内容 四、实验结果分析 一、实验目的 (1)了解Linux系统中进程通信的基本原理。 (2)了解和掌握管道通信机制。 二、实验预备知识 (1)管道的概念 :管道是一种先入先出的、单向的、大小固定的通信通道。 写进程在管道的

    2024年02月02日
    浏览(38)
  • 操作系统实验——进程管理的算法实现

    笔者在大学下属的事业单位上班,最近去帮着带下操作系统的实验课,这里随手水点参考代码,欢迎各位领导老师莅临指正 编写一个简单的进程调度器 进程控制块(PCB)的定义与管理 进程调度算法的实现 进程创建、销毁和切换 给定一批进程对比3-4种调度算法的时间(自选

    2024年02月06日
    浏览(38)
  • 操作系统实验—进程调度算法(java)

    目录 文章目录 前言 一、实验原理 二、实验步骤 1.创建PCB类 2.创建创建类 3.设计主窗口类 4.调度界面函数 5.算法类及其调度算法通用函数 6.进程调度算法函数 总结 操作系统实验1:进程调度算法,步骤3、4在一个类中,步骤5、6在一个类中。 (1)先到先服务调度算法:按照进程提

    2024年02月04日
    浏览(44)
  • 杭电操作系统实验一 --- Linux内核编译及添加系统调用(arm架构华为云)

    掌握Linux 内核的编译与安装 掌握Linux 系统调用基本概念 设计和添加linux系统调用         (1)修改或返回指定进程的优先级(nice值和prio值)(详见教材P328)提示:可能参考的内核函数:set_user_nice().         (2)改变主机名称为自定义字符串(自选题目)   1、 L

    2023年04月20日
    浏览(36)
  • 计算机操作系统实验-进程调度模拟算法

    进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以 便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法 的具体实施办法。 1.设计进程控制块 PCB 的结构,通常应包括如下信息: 进程名、进程优先数(

    2024年02月05日
    浏览(53)
  • HDU 操作系统实验二 -设计一个系统调用,返回指定进程的相关时间信息

    目录 一、实验思路 二、准备工作——Linux内核编译步骤 1.实验环境配置 2.下载内核源码 3.解压缩内核源码文件 4.清除残留的.config和.o文件 5.配置内核 6.编译内核,生成启动映像文件 7.编译模块 8.安装内核 9.配置grub引导程序 10.重启系统 三、设计系统调用,返回指定进程的相关

    2024年02月03日
    浏览(34)
  • 操作系统进程调度算法的模拟实现(c语言版本)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包