首页 > 其他分享 >CSIE3310操作系统线程包问题

CSIE3310操作系统线程包问题

时间:2024-03-21 13:11:26浏览次数:17  
标签:CSIE3310 void 任务 线程 螺纹 执行 操作系统 函数

机器问题1-线程包CSIE3310-操作系统:100TA时间截止日期前10:00-12:00,中船重工R428号楼目录1摘要12环境设置23第1部分(60分)23.1功能说明。2.3.2样本输出。3.4第2部分(40分)44.1功能说明。4.4.2提醒。4.4.3样本输出。5.5运行公共测试用例56提交和分级56.1源代码。5.6.2解压缩后的文件夹结构。6.6.3分级政策。6.7附录61摘要在这个MP中,您将尝试在setjmp和longjmp的帮助下实现一个用户级线程包。这个线程在不再需要CPU时间时显式地屈服。当一个线程屈服或退出时,下一个线程应该运行。线程可以将其他任务分配给其他线程,包括它自己。中有两个部分在第一部分中,您需要实现以下功能:?线程添加运行队列?螺纹屈服?调度?时间表?线程退出?螺纹开始螺纹在第二部分中,您需要实现以下功能:?线程分配任务已经为您实现了以下功能:?线程创建每个线程都应该由一个结构线程表示,该结构线程至少包含一个指向线程的函数和void类型的指针作为函数参数。线程的功能将void作为执行时的参数。结构应该包括一个指向其堆栈的指针和一些jmp-buf以在调用线程yield时存储它的当前状态。只使用setjmp和longjmp就足够了以保存和恢复线程的上下文。2环境设置1.从NTUCOOL下载MP1.zip,解压缩并输入。$zip MP1.zip$cd mp12.从Docker Hub中提取Docker镜像。$docker pull ntuos/mp13.使用docker run在容器中启动进程,并为容器进程分配TTY。$docker run-it-v$(pwd)/xv6:/home ntuos/mp14.执行xv6$make qemu5.您将使用xv6/user文件夹中提供的threads.h和threads.c的骨架。确保你是熟悉系统编程中所教授的堆栈帧和堆栈指针的概念。它也是建议检查给出的附录。3第1部分(60分)3.1功能描述1.struct threadthread create(void(f)(void),voidarg):此函数创建一个新线程并将堆栈中的空间分配给线程。注意,如果您想为线程,堆栈指针的地址应该可以被8整除,这一点很重要。函数返回初始化的结构。如果您想使用自己的模板来创建线程,请确保它有效对于所提供的测试用例。2.void thread add runqueue(struct threadt):此函数将初始化的struct thread添加到运行队列。要实现调度功能,您需要维护一个循环链表结构线程的。您应该通过维护结构中的下一个和上一个字段来实现这一点总是分别指向下一个要执行的线程和先前执行的线程的线程。您还应该维护静态变量struct thread当前线程指向当前执行的线程。注意:请在运行队列的末尾插入新线程,即,新插入的线程应该是当前线程->先前线程。3.void thread yield(void):此函数通过将当前线程的上下文保存到使用setjmp的结构线程中的jmp-buf。xv6中的setjmp是提供给您的,因此您只需要将#include“user/setjmp.h”添加到代码中。保存上下文后,应该调用schedule()以确定下一个要运行的线程,然后调用dispatch()来执行新线程。如果螺纹稍后恢复,线程yield()应该返回到函数中的调用位置。4.void dispatch(void):这个函数执行一个由schedule()决定的线程。万一螺纹以前从未运行过,您可能需要进行一些初始化,例如将堆栈指针sp移动到线程的已分配堆栈。堆栈指针sp可以使用setjmp和longjmp。请查看setjmp.h以了解sp在jmp-buf中的存储位置。如果螺纹之前执行,使用longjmp恢复上下文就足够了。如果线程的函数只是返回,则需要从运行队列中删除线程,并且必须调度下一个线程。这个最简单的方法是调用线程exit()。5.void schedule(void):这个函数将决定下一个运行哪个线程。这其实很琐碎,因为你将只运行循环链接线程列表中的下一个线程。您可以简单地更改当前线程到当前线程的下一个字段。6.void thread exit(void):此函数从运行队列中删除调用线程,释放其堆栈和结构线程,使用运行队列中的下一个要执行的线程更新当前线程并调用dispatch()。此外,考虑一下当最后一个线程退出时会发生什么(应该返回到主函数通过某种方式)。7.void thread start threading(void):此函数将在一段时间后由主函数调用线程被添加到运行队列中。只有当所有线程都已退出时,它才应该返回。3.2样本输出mp1-part1-0的输出应如下所示。$mp1-第1-0部分mp1-第1-0部分螺纹1:100线程2:0螺纹3:10000线程1:101螺纹2:1螺纹3:1001线程1:102螺纹2:2螺纹3:1002线程1:103螺纹2:3螺纹3:10003线程1:104螺纹2:4螺纹3:10004螺纹1:105螺纹2:5螺纹1:106螺纹2:6线程1:107螺纹2:7线程1:108螺纹2:8螺纹1:109螺纹2:9退出4第2部分(40分)在这一部分中,您需要实现一个额外的函数线程分配任务。此功能启用每个线程管理多个任务,最近分配的任务首先执行。注意,创建任务时,子线程不应从其父线程继承任务。4.1功能描述1.void thread assign task(struct threadt,void(f)(void),voidarg):此函数为线程t分配任务。第二个参数f是指向任务函数的指针,而第三个参数arg表示f的自变量。如果t有未完成的任务,则表示最近分配的任务将在稍后恢复t时首先执行。原始线程函数的执行必须等待直到所有任务完成。请注意,此函数只分配任务,不触发任何上下文转换为了完成此部分,您需要修改以下功能:1.void thread yield(void):因为这个函数也可以在任务函数中调用,所以应该保存根据线程是否正在执行任务函数,在不同的jmpbuf中的上下文。具体来说,如果在线程函数中调用此函数,则可以像第1部分中那样保存上下文。如果在任务函数中调用此函数,则应将上下文保存在另一个jmp-buf中以防止避免丢弃线程函数的上下文。2.void dispatch(void):如果分配了任务,则此函数应执行最近分配的任务作用如果此函数以前从未运行过,则可能需要进行一些初始化。如果此功能之前执行,使用longjmp恢复上下文就足够了。如果此任务只是返回,线程应该执行下一个任务函数。该过程遵循与相同的方法上一个任务函数。当然,在线程执行其线程函数。随意进行更多修改,例如在结构线程中添加属性,设计新结构用于封装与任务相关的逻辑等。唯一的要求是所有定义的函数都应按照如上所述。4.2提醒1.在线程创建中创建新线程时,确保新线程最初没有分配任务。2.线程分配任务中的参数struct thread*t必须存在,尚未退出。3.任务按“最后到先得”(LCFS)顺序执行。也就是说,如果线程从任务返回如果函数中有未完成的任务,则下一步将执行最近分配的任务。4.虽然我们鼓励您在结构线程中添加属性,但不允许修改现有属性允许。5.任务函数可以调用线程创建、线程添加运行队列、线程产量、线程退出,或者线程分配任务。6.线程创建分配给每个线程的内存空间足以在中执行任务函数所有测试用例。7.在所有测试用例中,一个线程在任何时刻最多可能有20个未完成的任务。8.如果您打算在threads.h、threads.c或测试文件中使用全局变量,建议添加static关键字以防止出现意外情况。4.3样本输出mp1-part2-0的输出应如下所示。$mp1-第2-0部分mp1-第2-0部分螺纹1:100任务2:101线程2:0线程1:101

标签:CSIE3310,void,任务,线程,螺纹,执行,操作系统,函数
From: https://www.cnblogs.com/kantong/p/18087155

相关文章

  • 初识 Linux 操作系统_实验案例一
    实验案例一:安装Ubuntu操作系统1、实验环境    BDQN公司部分员工使用的Windows操作系统的笔记本式计算机频繁遭受到病毒.木马的威胁,公司要求管理员小王近期将这些员工的系统更换为Ubuntu操作系统。在进行前期准备工作时,需要公司现有的系统管理员尽快掌握Ubuntu操作......
  • C# 多线程锁
    C#多线程锁分类lock(Monitor):lock是C#中的关键字,它实际上是Monitor类的一个简化版本的语法糖。使用方式:lock(obj){//代码块},其中obj是一个对象引用,所有线程都试图获取该对象的互斥锁。功能:确保同一时间只有一个线程可以进入受保护的代码块。应用场景:适用......
  • SPPSVC.EXE(Software Protection Platform Service)是Windows操作系统中的一个进程,起源
    ‪C:\Windows\System32\sppsvc.exeSPPSVC.EXE(SoftwareProtectionPlatformService)是Windows操作系统中的一个进程,起源于微软公司为了保护其软件版权而开发的软件保护服务。这个服务主要负责验证Windows的许可证信息、管理软件激活状态以及执行与软件许可证相关的任务。SPPSVC.E......
  • 多线程:乐观锁
     悲观锁:一上来就加锁,没有安全感。每次只能一个线程进入访问完毕后,再解锁。线程安全,性能较差!乐观锁:一开始不上锁,认为是没有问题的,大家一起跑,等要出现线程安全问题的时候才开始控制。线程安全,性能较好。为什么出现线程安全问题?100个线程每个加100次应该加10000次才对;因为......
  • Java并发编程:第四章 线程池(Executor框架)
    文章目录一、为什么需要线程池1、线程的创建2、线程销毁二、优点1、降低资源消耗2、提高响速度3、线程管理三、架构说明四、Executors工具类1、介绍2、Executors工具类常用的方法(1)newFixedThreadPool(intnThreads):(2)newCachedThreadPool()(3)newSingleThreadExecutor()......
  • Java-Java基础学习(3)-多线程(1)
    Java-Java基础学习(4)-多线程(1)3.多线程在Java中,多线程主要的实现方式有四种:继承Thread类、实现Runnable接口、实现Callable接口经过FutureTask包装器来建立Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。3.1.四种创建方式Threadclass==>......
  • Linux操作系统小记
    1.finalshell使用Linux终端打开-输入ifconfig-查看ip地址finalshell-----SSH链接----输入信息2.Linux常用命令ls-a/      根目录隐藏文件ls-l/       竖着显示ls-lh/      竖着显示,并且包含大小pwd        ......
  • C++ 静态变量的初始化线程安全问题
    1.静态变量的初始化线程安全问题C++的局部static变量,是预先在静态存储区分配了内存,然后在第一次执行到这里的时候进行初始化。C++11规定了局部static变量的线程安全,实现上应该是类似std::call_once的实现,我估计基本上就是基于cas的spin-lock,这里当然可以根据编译器不同有不同......
  • 操作系统综合题之“用记录型信号量机制的wait和signal操作来解决了由北向南和由南向北
    1.问题:一条哦东西走向河流上,有一根南北走向的独木桥,要想过河只能通过这根独木桥。只要人们朝着相同的方向过独木桥,同一时刻允许有多个人可以通过。如果在相反的方向上同时有两个人过独木桥则会发生死锁。如果一个人想过河,他必须看当前独木桥的通信情况,若当前的通行方向与他的过河......
  • 操作系统综合题之“用记录型信号量机制的wait和signal操作来保证文件的正确打印,并写出
    1.问题:有两个进程pA和pB合作解决文件打印的问题:pA将文件记录从磁盘读入住库存的缓冲区,每次执行一次读一个记录;pB将缓冲区的内容打印出来,每次执行一次打印一个记录。缓冲区的大小等于一个记录大小请用记录型信号量机制的wait(S)和signal(S)操作来保证文件的正确打印,并写出同步代码2.......