精华内容
下载资源
问答
  • Nachos 4.1 lab1 线程机制实验报告 目录 内容一:总体概述 3 内容二:任务完成情况 3 任务完成列表(Y/N) 3 具体Exercise的完成情况 3 内容三:遇到的困难以及解决方法 4 内容四:收获及感想 5 内容五:对课程的...

    Nachos 4.1 lab1 线程机制实验报告

    目录
    内容一:总体概述 3
    内容二:任务完成情况 3
    任务完成列表(Y/N) 3
    具体Exercise的完成情况 3
    内容三:遇到的困难以及解决方法 4
    内容四:收获及感想 5
    内容五:对课程的意见和建议 5
    内容六:参考文献 5

    内容一:总体概述
    线程是操作系统CPU调度最基本的单位,每个线程都有自己唯一的线程编号TID,记录线程信息的数据结构为TCB。在线程创建时,也需要为线程分配内存空间。线程也有创建后的初始就绪态,占用CPU的运行态和退出后的销毁态。
    在nachos中有一个核心的内核级线程main,是操作系统内核初始化时第一个建立的线程,可以利用它来fork创建其余线程。也可以直接new Thread线程构造函数建立新的线程。但nachos中没有实现父子线程的继承关系。

    内容二:任务完成情况
    任务完成列表(Y/N)
    Exercise 1 调研(Y)
    Exercise 2 源代码阅读(Y)
    Exercise 3 扩展线程的数据结构(Y)
    Exercise 4 增加全局线程管理机制(Y)

    具体Exercise的完成情况
    第一部分
    Exercise1 基础知识
    Linux中进程控制块(PCB)叫做task_struct,主要包含标识符pid:用于唯一标识进程,区别于其他进程,同时还有进程组标识;状态state:任务状态,退出代码,中断信号等;实时优先级:用于计算实时进程调度时的weight值;程序计数器:程序中即将被执行的下一条指令的地址;内存指针:存放进程内存管理信息,包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针;上下文环境:进程执行时处理器的寄存器中的数据;I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程打开的文件列表;记录信息:可能包括处理器时间总和,使用的时钟总和,定时器终止时间,记账号等。
    Linux的进程状态可分为运行态,可中断和不可中断态,暂停态,终止态,僵尸状态,挂起状态等。
    在nachos系统,PCB在thread.h中实现。包括stackTop:当前栈指针;machineState未在CPU上所有寄存器的状态;fork等函数头的定义;私有属性:stack栈底指针,status进程的状态,name进程名。
    主要区别在于linux中PCB包含的信息更多,nachos中仅包含了必须的信息,并且nachos中没有限制线程的总数量。Nachos的线程机制没有实现父子线程的继承关系,只有核心线程fork产生其余线程。

    Exercise2 源码阅读
    Mian.cc文件:Kernel类,记录内核信息,包括当前占用cpu的线程和线程就绪队列;Copy函数,复制文件内容,如果打开失败则返回;Print函数将name文件的内容输出,利用一个设定长度的buffer多次获取数据并输出;main函数,进行变量的初始化,解析argc和argv中的命令,判断要执行的指令,调用不同的函数。并建立内核状态。
    threadtest.cc文件:线程测试方法,在nachos4.1并将此功能并入了main.cc文件中。
    thread.h文件
    主要对于线程的定义。内存栈空间的大小8*1024,线程状态(创建、运行、就绪、阻塞),在Thread类中定义线程的数据结构,包括栈指针,未在CPU上的所有寄存器的状态,线程主要函数的预定义;stack线程栈底指针,线程名,用户寄存器的状态等。
    thread.cc文件
    线程fork、begin、finish、yield和sleep功能的实现。
    Thread构造函数:传入线程名并初始化线程;~Thread析构函数:删除线程,assert断言表示判断布尔表达式,判断当前线程是否在运行,只有不在运行状态中的线程才能被删除;
    fork函数:func参数为新线程运行的函数,函数首先复制内核线程的中断帧和进程队列,其次开辟线程内存空间,关闭中断状态准备运行当前线程最后恢复中断状态。
    Checkoverflow函数:检查线程的内存空间是否溢出
    Begin函数:将可运行的线程开始运行, 并允许中断
    Finish函数:将正在运行中的线程睡眠
    Yield函数:线程放弃cpu,并运行下一个线程
    Sleep函数:线程由于某种原因进入阻塞状态等待一个事件的发生,当这些条件得到满足,该线程又可以恢复就绪状态
    Stackallocate函数:为新线程申请栈空间,并设置好准备运行线程的条件。

    Exercise 3、Exercise 4 增加线程数据结构并实现全局线程管理机制
    合并完成Exercise 3和Exercise 4,首先在thread.h中添加userid和threadid两个private的int型变量作为用户ID和线程ID,并添加两个获取对应ID的public函数。
    为限制线程总数,设置一个全局的数组int ThreadIDs[MAXThreads];MAXThreads代表最大线程数,本次设为128。数组初始值均为0,每建立一个线程则将对应的位置赋为1,除主线程main(mainID为1000)外,每个线程的ID即数组中对应的下标。
    对于用户ID,创建的新线程直接利用unistd.h头文件中带有的getuid函数获取当前系统的userid,测试中为1000。
    对于线程ID,修改Thread线程构造函数,添加线程ID分配功能AllocateThreadID:实现的原理是每次利用一个for循环从线程数组中寻找为0位置的下标赋给新线程并设为1然后返回,如果没有找到,说明线程已分配满(对线程数量的限制)返回-1。在Thread构造函数中,ThreadID会接受分配函数的返回值,如果发现值为-1即线程数量已满,则输出“Reached MaxThreadsNum!!”,再利用ASSERT断言限制后续代码的运行,即停止新线程的创建。
    当线程退出时,在~Thread析构函数中,将线程数组中线程ID下标所对应的值重新设为0。
    在这里插入图片描述
    在main.cc主函数文件中,添加对-t命令的解析,即最大线程数量的测试,结果如图。
    在这里插入图片描述

    简单TS功能的实现,直接利用scheduler.cc中的print功能输出readyList就绪队列,并加上正在执行的currentthread。
    /home/stillings/Downloads/nachos
    在这里插入图片描述
    内容三:遇到的困难以及解决方法
    困难1
    不知道nachos是怎么编译的,没有理解Ubuntu与nachos之间的关系。
    解决方法:
    查阅了nachos中文文档和互联网上的相关资料,理解了nachos是运行在软件模拟的虚拟机上的操作系统,可以直接在build.linux中利用make直接编译完成nachos系统并通过./nachos+对应命令执行相应的功能。
    困难2
    一开始拿到代码时,无法理解每个代码文件的作用和文件内各个函数之间的关系,同时不同文件之间,数据和函数的调用经常出错。
    解决方法:
    先在WINDOWS操作系统的编译器中阅读代码,理清代码文件之间的关系,再在ubuntu中编写代码并调试运行。

    内容四:收获及感想
    对大型软件的设计和实现有了更深的体会,学会了C++面向对象的思想巧用构造函数和析构函数实现类的建立和销毁。不同代码文件之间函数的调用,对操作系统线程机制和线程队列以及cpu调度都有了更深的理解。
    内容五:对课程的意见和建议
    课程Nachos实习与XV6源码阅读可以分开安排,没必要同一周内完成。
    内容六:参考文献
    Nachos中文文档

    展开全文
  • 实验报告 20 19~20 20学年第 1学期 学 院 信息学院 班 级 计算机科学与技术18(3) 姓 名 申屠志刚 学 号 2018329621200 ...

    浙江理工大学

    Java程序设计》

     实验报告

     20 19~20 20学年第 1学期     

     

    信息学院

     

    计算机科学与技术183

     

    申屠志刚

     

    2018329621200

    任课教师

    任祝

    13 周二 345节)

       计算机科学与技术专业

    20 19 11

    《Java程序设计》实 验 报 告(四)

    实验名称: Java多线程机制

    实验地点10-306

    所使用的工具软件及环境:

    JDK1.7或1.8与Eclipse

     

     

    一、实验目的:

    熟悉Java的JFrame,多线程机制。

    二、实验内容:

    内容:设计和编写一个带界面时钟程序,应用多线程实现时钟的走动。

    要求:本实验旨在通过实验,培养学生将JAVA 线程的相关知识点(包括JFrame,多线程)有机结合并加以综合应用。需:

    (1)建议是简单的数字时钟即可,例如。表盘式时钟相对复杂,不做强制要求。

    (2)贴出代码

     

    (3)贴出运行结果

     

    三、要求:

    (1)说明原理

    JAVA Swing

    多线程

    (2)源代码

    import java.awt.*;
    
    import java.awt.event.*;
    
    import java.text.SimpleDateFormat;
    
    import java.util.Date;
    
    
    
    import javax.swing.*;
    
    
    
    public class ClockFrame extends JFrame{
    
       
    
        JLabel lbClock=null;//创建一个标签
    
        public ClockFrame(){
    
            lbClock=new JLabel(getDate());
    
            //实例化lbClock标签,其title为动态调用getDate方法
    
            lbClock.setFont(new Font("黑体",Font.BOLD,50));
    
            lbClock.setForeground(Color.red);
    
            //设置标签字体以及标签中字的颜色
    
            this.add(lbClock);
    
            //将标签添加到窗体中
    
            this.addMouseListener(new MouseAdapter(){
    
                public void mouseClicked(MouseEvent e){
    
                    if(e.getClickCount()==2){
    
                       System.exit(0);
    
                    }
    
                }
    
            });
    
            //注册监听器,监听鼠标事件,mouseAdapter中的方法都已经封装,直接实现功能即可
    
            this.setUndecorated(true);
    
            //窗体无边框
    
            this.pack();
    
            //窗口大小自适应
    
            this.setLocationRelativeTo(null);
    
            //窗体居中
    
            this.setVisible(true);
    
            //窗体可见;
    
           
    
            //创建并启动线程,使时间不断地显示在屏幕上
    
            new Thread(new Runnable(){
    
                //在创建Thread对象时直接使用一个匿名的Run那边了对象实现线程中的方法。
    
                public void run() {
    
                    while(true){
    
                       //无限循环休眠1000ms
    
                       try{
    
                           Thread.sleep(1000);
    
                       }catch(InterruptedException e){
    
                           //扑捉发生在线程中的异常,当一个正在执行的线程被中断时就会出现这个异常,添加catch后当程序被双击停止时不会出现错误
    
                           e.printStackTrace();
    
                       }
    
                       lbClock.setText(getDate());
    
                      
    
                    }
    
                }
    
               
    
            }).start();//启动Thread方法,这个Thread方法也是匿名的。
    
        }
    
    
    
        private String getDate() {
    
            //这个方法属于java中常见的获取当前时间并格式化输出的例子
    
            SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    
            //确定时间的格式
    
            return df.format(new Date());
    
            //new Date取当前系统时间,使用创建的格式实例格式化返回去到的时间。
    
        }
    
    
    
        public static void main(String[] args) {
    
            // TODO Auto-generated method stub
    
            new ClockFrame();
    
    
    
        }
    
    
    
    }

     

    (3)结果截图

     

    四、实验收获与体会:

    学会JAVA Swing编程

    使用WindowsBuilder工具

    掌握JAVA 多线程编程技术

     

       

     

     

     

    展开全文
  • 成绩 面向对象原理与Java实践课程实验报告 实验5多线程 姓 名 _ _ _ 班 级 _ 学 号 _ 实验地点 _ 实验时间 _ 指导教师 _ _ _ 一实验目的 了解线程调度机制 理解线程同步机制 掌握线程设计方法 二实验要求 掌握线程...
  • Java并发编程技术官笔记 由于篇幅原因,我只能在文章...对Java里的线程-点点认识 线程间的共享和协作 面试题 CPU核心数和线程数的关系 澄清并行和并发 2,线程的并发工具类 Fork-Join CountDownLatch CyclicB

    Java并发编程技术官笔记

    由于篇幅原因,我只能在文章中展示部分的章节内容和核心截图,如果你需要完整的pdf版本,可以在文末免费领取

    首先给大家分享学习的思维导图,学习是需要逻辑完整的,这样才可以更高效的学习:

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    下面是笔记的总目录:

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    1,线程基础、线程之间的共享和协作

    • 基础概念
    • 认识Java里的线程
    • 对Java里的线程再多-点点认识
    • 线程间的共享和协作
    • 面试题

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    CPU核心数和线程数的关系

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    澄清并行和并发

    2,线程的并发工具类

    • Fork-Join
    • CountDownLatch
    • CyclicBarrier
    • CountDownLatch和CylicBarrier辨析
    • Semaphore
    • Exchange
    • Callable. Future和FutureTask

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    3,原子操作CAS

    • 什么是原子操作?如何实现原子操作?
    • CAS实现原子操作的三大问题
    • Jdk中相关原子操作类的使用

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    4,显式锁和AQS

    • 显式锁
    • 了解LockSupport
    • CLH队列锁
    • AbstractQueuedSynchronizer
    • 回头看Lock的实现

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    5,并发容器

    • 为什么要使用ConcurrentHashMap
    • ConcurrentHashMap
    • ConcurrentSkipList系列
    • ConcurrentinkedQueue
    • 写时复制容器
    • 阻塞队列BlockingQueue

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    6,线程池

    • 为什么要用线程池?
    • ThreadPoolExecutor的类关系
    • 线程池的创建各个参数含义
    • 扩展线程池
    • 线程池的工作机制
    • 提交任务.
    • 关闭线程池
    • 合理地配置线程池
    • 预定义线程池
    • CompletionService

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    7,并发安全

    • 什么是线程安全性
    • 死锁
    • 其他安全问题
    • 并发下的性能
    • 线程安全的单例模式

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    8,实战项目

    • 并发任务执行框架
    • 性能优化实战

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    9,JMM和底层实现原理

    • JMM基础计算机原理
    • 物理内存模型带来的问题
    • 伪共享
    • Java内存模型( JMM)
    • Java内存模型带来的问题
    • happens- before
    • volatile详解
    • fnal的内存语义
    • 锁的内存语义
    • synchronized的实现原理
    • 了解各种锁

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    10,Java8新增的并发,扩充知识点- Disruptor

    • 原子操作CAS
    • StampLock
    • CompleteableFuture

    大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

    最后如何让自己一步步成为技术专家

    说句实话,如果一个打工人不想提升自己,那便没有工作的意义,毕竟大家也没有到养老的年龄。

    当你的技术在一步步贴近阿里p7水平的时候,毫无疑问你的薪资肯定会涨,同时你能学到更多更深的技术,交结到更厉害的大牛。

    推荐一份Java架构之路必备的学习笔记,内容相当全面!!!

    成年人的世界没有容易二字,前段时间刷抖音看到一个程序员连着加班两星期到半夜2点的视频。在这个行业若想要拿高薪除了提高硬实力别无他法。

    你知道吗?现在有的应届生实习薪资都已经赶超开发5年的程序员了,实习薪资26K,30K,你没有紧迫感吗?做了这么多年还不如一个应届生,真的非常尴尬!

    进了这个行业就不要把没时间学习当借口,这个行业就是要不断学习,不然就只能被裁员。所以,抓紧时间投资自己,多学点技术,眼前困难,往后轻松!

    要领取这些精心整理出来的资料的话,请记得

    薪资都已经赶超开发5年的程序员了,实习薪资26K,30K,你没有紧迫感吗?做了这么多年还不如一个应届生,真的非常尴尬!

    进了这个行业就不要把没时间学习当借口,这个行业就是要不断学习,不然就只能被裁员。所以,抓紧时间投资自己,多学点技术,眼前困难,往后轻松!

    要领取这些精心整理出来的资料的话,请记得

    ————【关注】+【转发】+【点赞】支持我!创作不易!点击这里前往我的腾讯文档免费下载

    展开全文
  • 信 息 工 程 学 院实验报告的内容与格式按任课教师的要求书写 实验报告的内容与格式按任课教师的要求书写 Java语言程序设计实验报告 学院: 班级: 姓名: 学号: 成绩: 实习目标 掌握 Java 多线程的概念和实现 掌握使用...
  • 线程机制实习报告_Nachos Lab1

    千次阅读 2014-06-08 15:59:56
     本次Lab针对的内容是实现线程机制最基本的数据结构——进程控制块(PCB)。当一个进程创建时必然会生成一个相应的进程控制块,记录一些该线程特征,如进程的标示符、状态、相应的程序和数据地址、资源清单等(当然...


    内容一:总体概述

             本次Lab针对的内容是实现线程机制最基本的数据结构——进程控制块(PCB)。当一个进程创建时必然会生成一个相应的进程控制块,记录一些该线程特征,如进程的标示符、状态、相应的程序和数据地址、资源清单等(当然,Nachos简化了进程控制块的内容)。实验的主要内容是修改和扩充PCB,主要难点在于发现修改PCB影响到的文件并进行修改。

             另一个存在的困难就是对C++语言的语法不熟悉,需要补一些语法课。

     

    【用简洁的语言描述本次lab的主要内容;阐述本次lab中涉及到的重要的概念,技术,原理等,以及其他你认为的最重要的知识点。这一部分主要是看大家对lab的总体的理解。

             要求:简洁,不需要面面俱到,把重要的知识点阐述清楚即可。】

    内容二:任务完成情况

    任务完成列表(Y/N

     

    Exercise1

    Exercise2

    Exercise3

    Exercise4

    完成情况

    Y

    Y

    Y

    Y

     

    具体Exercise的完成情况

             Exercise1

             调研Linux或Windows中进程控制块(PCB)的基本实现方式,理解与Nachos的异同。

     

             我选择了开源的Linux作为调研内容。在Linux中的每一个进程由一个task_struct数据结构来描述。task_struct就是通常所说的进程控制块(PCB)。task_struct容纳了一个进程的所有信息,是对系统进程进行控制的唯一手段,也是最有效的手段。task_struct存放在/include/linux/sched.h中。

             我的调研选择了Linux-3.5.4版本阅读。并参考了网上的一些博客。Linux系统的PCB包括了很多参数,主要的参数有:

    1)        进程状态

    进程状态是进程调度和交换的依据。Linux下进程设置了5种状态。分别是运行态、可中断态、不可中断态、僵尸状态、暂停态。

    2)        进程调度信息

    调度程序利用这些信息决定下一个应该运行的进程。这部分信息包括进程的类别(普通进程还是实时进程)、进程的优先级等。

    3)        标识符

    每个进程都有很多标识符来标识它,标识符有进程标识符、用户标识符、组标识符、备份用户标识符、文件系统用户标识符等。标识符可以用于控制进程对系统中文件和设备的访问。

    4)        进程通信相关信息

    Linux支持多种不同形式的通信机制。它支持典型的Unix通信机制:信号、管道,也支持System V通信机制:共享内存、信号量和消息队列。

    5)        进程链接信息

    Linux中进程有继承关系。除了初始化进程init,其他进程都有一个父进程。每个进程可以通过fork()或clone()系统调用来创建子进程,除了进程标识符等必要的信息外,子进程的task_struct结构中的绝大部分信息都是从父进程中拷贝过来的。系统记录这种父/子、兄/弟关系,使进程间的协作更加方便。task_struct中有许多指针,通过这些指针,系统中所有的task_struct结构就构成了一颗进程树。

    6)        时间和定时器信息

    内核需要记录进程在其生存期内使用CPU的时间以便用于统计、计费等有关操作。进程耗费CPU的时间由两部分组成:一是在用户态下耗费的时间,一是在系统态下耗费的时间。这类信息还包括进程剩余的时间片和定时器信息等,以控制相应事件的触发。

    7)        文件系统信息

    进程可以打开或关闭文件,文件属于系统资源,Linux内核要对进程使用文件的情况进行记录。

    8)        虚拟内存信息

    除了内核线程,每个进程都拥有自己的地址空间,用mm_struct来描述。

    9)        页面管理信息

    当物理内存不足时,Linux内存管理子系统需要把内存中部分页面交换到外存,其交换是以页为单位的。这部分结构记录了交换所用到的信息、

    10)    对称多处理器信息

    与多处理器相关的几个域。

    11)    处理器上下文信息

    当进程暂时停止运行时,处理机的状态必须保存在进程的task_struct。当进程被调度重新运行时再从中恢复这些环境,也就是恢复这些寄存器和堆栈的值。

    12)    其他

    记录一些其他的必要信息。

     

    Nachos相对与Linux系统的线程部分来讲,要简单许多。它的PCB仅有几个必须的变量,并且定义了一些最基本的对线程操作的函数。Nachos线程的总数目没有限制,线程的调度比较简单,而且没有实现线程的父子关系等。很多地方需要我们进行完善。

     

             Exercise2

    仔细阅读下列源代码,理解Nachos现有的线程机制。

    code/threads/main.cc和code/threads/threadtest.cc

    code/threads/thread.h和code/threads/thread.cc

        

             main.cc

             main.cc是整个操作系统kernel启动的入口,通过它可以直接调用操作系统的方法。通过程序中的main函数,配以不同的参数,可以调用Nachos操作系统不同部分的各个方法。Execise4中添加TS操作就要从整个函数入手。

             threadtest.cc

             这是一个简单的线程实验的测试用例。用于指导我们如何对线程的修改进行测试的。其中比较重要的变量有:

             testnum:测试号,对应相应的测试函数。

             SimpleThread():一个5次循环的程序,每次循环中都让出CPU,让其他就绪的线程执行。

             ThreadTest1():一个测试方法,创建两个线程,让他们都执行SimpleThread()方法,使这两个线程可以交替执行。

             ThreadTest():可以看做一个总控程序,根据main函数传过来testnum参数值来执行不同的测试程序。例如,当testnum==1时,就执行ThreadTest1()。

             Thread.h

             定义了管理Thread的数据结构,即Nachos中线程的上下文环境,都被定义在Thread.h中。主要包括当前线程栈顶指针、所有寄存器的状态、栈低、线程状态、名字。当前栈指针和机器状态的定义必须按指定位置,因为Nachos在线程切换时,会按照预先指定的顺序操作线程上下文内存和寄存器。

             在Thread类中还声明了一些基本的方法,如Fork()、Yield()、Sleep()等等,由于这些方法的作用根据名字已经显而易见了,在此不再赘述。

             ThreadStatus:线程的状态,有刚创建状态、运行状态、就绪状态和阻塞状态这四个状态。

             Thread.cc

             Thread.cc中主要是管理Thread的一些事务。主要包括了四个主要的方法。Fork()、Finish()、Yield()、Sleep()。在Thread.h中对它们进行了声明,在Thread.cc中则负责具体的实现。注意到,这里实现的方法大多是都是原子操作,在方法的一开始保存中断层次关闭中断,并在最后恢复原状态。

             Thread():构造函数,初始化一个新的Thread。

             Fork(VoidFunctionPtr func,int arg):func,新线程运行的函数;arg,func函数的参数。它的实现包括一下几步:分配一个堆栈、初始化堆栈、将线程放入就绪队列。

             Finish():并不是直接收回线程的数据结构和堆栈,因为我们仍在这个堆栈上运行这个线程。做法是将threadToBeDestroyed的值设为当前线程,使得Scheduler的Run()可以调用销毁程序,当我们这个程序退出上下文时,将其销毁。

             Yield():调用scheduler找到就绪队列中的下一个线程,并让其执行。以达到放弃CPU的效果。

     

             Exercise3

    增加“用户ID、线程ID”两个数据成员,并在Nachos现有的线程管理机制中增加对这两个数据成员的维护机制。

            

             增加用户ID:

             设计思路:

    现有的Nachos代码不支持多用户,我获取当前Linux系统的用户ID作为Nachos的用户ID。

             对代码进行的修改:(截图见增加线程ID实验)

             在thread.h文件的thread类声明中添加私有的int型成员变量userID、添加公有的成员方法getUserID()用于获取当前的userID。

             在thread.cc文件的开始位置,引入头文件“unistd.h”。它是C和C++中提供的对POSIX操作系统的访问功能的头文件,这样,我们就可以在Nachos中直接获取当前Linux的用户ID了。此后在Thread的构造函数中添加语句userID=getuid(),即可获取当前Linux系统的用户ID。在thread.cc文件中还实现了getUserID()方法,这个方法很简单,return一个userID即可。

             增加线程ID:

             设计思路:

    声明一个全局的数组,定义这个数据有128个元素。每个元素的取值为0或1。0表示该数组下标没有作为线程的ID分配出去,1表示以分配。每次创建一个新线程的时候从1开始遍历此数组,得到的第一个值为0元素的数组下标作为线程的ID分配给将要创建的线程。如果遍历一遍数组发现没有可用的ID了,则不创建该线程,并输出提示。另外,由于系统的全局变量都声明和定义在system.h或system.cc中,我们也将该数组定义在这里。

     

             对代码进行的修改:

             在system.h中,声明可以创建线程数的最大值MaxThread为128、并声明一个threadIDs[]数组用于记录分配和未分配的线程ID数值。


             在system.cc的Initialize()中,定义threadIDs[MaxThread]数组,并将其值都初始化为0。


    在thread.h文件的thread类声明中添加int型的私有成员变量threadID、添加公有的成员方法getThreadID()用于获取当前的threadID。


             在thread.cc文件中,定义allocatedThreadID()方法。该方法每次从1开始遍历threadIDs数组,发现的第一个值为零的元素下标作为线程的ID。如果没有可分配的ID,则返回-1。同时,在thread构造函数的一开始,用flag接收一个allocatedThreadID()返回的线程ID。如果为-1,则输出提示,停止创建过程。否则继续创建该线程。并在析构函数中将完成的线程ID的对应的数组值重新赋为0。 






    实验结果截图:

    测试代码截图如下:


             SimpleThread()也进行了相应的修改:


    执行结果如下图:

            

             Exercise4

             在Nachos中增加对线程数量的限制,使得Nachos中最多能够同时存在128个线程;

    仿照Linux中PS命令,增加一个功能TS(Threads Status),能够显示当前系统中所有线程的信息和状态。

     

    使Nachos最多能同时存在128个线程:

    设计思路:

     根据上一个实验。为每个线程分配了一个ID。最大值仍设为128。如果线程数超过128则返回ID为-1。因此在创建新线程时进行一次判断,如果返回的ID为-1,则停止创建即可。

    对代码进行的修改:

             在Exercise3的基础上,修改thread.cc文件。关键在ASSERT(flag!=-1)。


             修改ThreadTest.cc中的ThreadLimit()循环创建128个线程,如果超过则判断。


             修改ThreadTest.cc中的ThreadTest()。使之得到调用ThreadLimit()的接口:


    实验结果截图:

    命令行输入“./nachos –q 2”观察实验结果。


    增加TS功能:

    设计思路:

    当前的Nachos操作系统中只有READY队列,所以要输出系统中所有的线程,只需要输出READY队列,即可,需要注意的是,总是有一个线程处于正在执行的状态。所以输出中要把这个线程也加上。

    通过阅读代码和查资料了解到,readyList是定义在scheduler.cc中的,但是它是一个私有类型的变量,所以要添加一个公有的get方法获得它。

    同时了解到list.cc中有一个Mapcar(func)的方法。可以对List中的每个元素调用func方法。

     

    对代码进行的修改:

    在main.cc中,添加相应方法,使得系统能识别TS命令,在其中将testnum设为3。


    在threadtest.cc中。将testnum==3,跳转到ThreadTest2()方法中。(比较简单不再截图)

    ThreadTest2()中创建了3个线程,每个线程都执行ReadyListPrint()方法。


    ReadyListPrint()的主要作用是打印出该线程正在执行时的状态,包括打印出当前线程和readyList中的线程。


    这里用到了关中断,以防过程中被其他线程中断。

    Mapcar会对队列中的每个item对象执行MyThreadPrint()方法。

    在thread.cc中添加MyThreadPrint()的定义,首先将item强制类型转换为Thread类型。之后打印其相关内容。


    同时,由于Status是一个枚举类型,要输出其字符串型的内容有些困难,通过添加一个字符串类型的数组,才将枚举的变量以字符串类型输出。

    在thread.h中,定义了该字符串数组。


    实验结果截图:


    可以看到,一共有三个线程,一个线程处在RUNNING状态,另外两个线程则处于READY状态。


             【对于阅读代码类的exercise,请对其中你认为重要的部分(比如某文件,或某个类、或某个变量、或某个函数……)做出说明。

             对于要编程实现的exercise,请对你增加或修改的内容作出说明。如果增加或修改了某个类,请写出这个类写在那个文件中,它的功能是什么,你自己添加或修改的成员变量以及成员函数有哪些,它们的功能是什么;特别的,对于复杂的函数,请说明你的实现方法。不需要贴具体的实现代码。

             要求:表述清楚即可, 可采用图表来辅助说明,不需要贴代码】

    内容三:遇到的困难以及解决方法

    困难1

    对C++语言不熟悉。

    对C++的很多语法掌握的不好,大概的能看懂,读代码理解还可以,自己写就不太轻松了,很多地方都是对比着Nachos现有的代码的实现方法,比葫芦画瓢写的,所有造成运行的时候有很多Bug,调起来很非脑筋。整个实验的思路还是比较简单的,只是编程实现起来有些困难,需要不停的百度Bug的解决方法。

    最显著的困难出现在C++的指针部分,虽然仍是可以理解代码的意思,但是遇到指针还是会很困惑。另一方面就是对C++ 的工程不是很熟悉。

    解决这个问题我基本上考的是参考Nachos代码的写法,或者百度。特别难理解的知识点就翻翻书来看。基本上经过一次实习对C++的语法已经熟悉了不少。

    困难2

    刚开始对Nachos Threads的各个类的功能不太熟悉,哪一个变量或方法应该添加到哪个部分,有些疑惑。

    通过仔细的研读代码,这方面的困难已经基本解决了。

     

    【描述你在实习过程中遇到的困难,是与实习直接相关的技术方面的难题。突出说明你是如何攻克这些难关的。

    要求:只需写一下有较深体会的困难。如果觉得整个过程都比较简单的话此部分可不用写。】

    内容四:收获及感想

    相信通过操作系统课的实习,我写C++代码的能力会有显著的提升,以前都是写Java的web,对C++忘的差不多了,通过这次的实验,可以捡回来不少。

    另一个就是对线程的了解更加的透彻,虽然还仅仅只是对线程中PCB的一部分内容的实验。相信可以通过以后的实验,对操作系统的各种机制有更深入的了解。

     

             【自己的收获,任何关于实习的感想,可以是技术方面的或非技术方面的,可随意发挥。

    要求:内容不限,体裁不限,字数不限,多多益善,有感而发。】

    内容五:对课程的意见和建议

    目前来讲,我觉得一切还都挺好的,老师讲的很不错,进度也可以,没有什么建议。

     

             【请写下你认为课程需要改进的地方,任何方面,比如进度安排、难易程度、课堂讲解、考核方式、题目设置……甚至如果你认为源代码哪里写得不好也欢迎提出。

             各位同学反馈的信息对课程建设会有极大帮助。】

    内容六:参考文献

    [1]       鸡蛋壳. 看雪论坛 http://bbs.pediy.com/showthread.php?t=15794

    [2]      佚名 Nachos中文教程

    http://wenku.baidu.com/link?url=1rGnypg8Hq6-43gAvuIYPWyVlPLZ0S_XNEXQJ-2ShqPPg3n2bqWvQgRYC8PdVXLmr66e9GpC2nCSbE1ofkgcT6aASWqVklMWUaBuZNSmXDy

     

    【我们希望大家不要使用复制粘贴来拼凑你的报告。详细地列出你在完成lab的过程中引用的书籍,网站,讲义,包括你咨询过的大牛们。

             要求:诚实,格式尽量按照论文的要求,请参考“论文参考文献格式.doc”】


    展开全文
  • Nachos实习——Lab1线程机制实习报告 文章目录Nachos实习——Lab1线程机制实习报告内容一:总体概述内容二:任务完成情况内容三:具体完成Exercise情况Exercise 1 调研1、Linux进程控制块(PCB)2、Linux进程控制块...
  • 《面向对象与多线程综合实验报告 1 实验目的 运用Java语言,以迭代方式逐步编程实现一个小型数据挖掘系统。由此了解软件开发的一般过程,深入理解面向对象语言的基本概念和基本原理,理解和掌握继承与多态、异常...
  • 课程设计任务书 实验题目 实验一进程与线程Linux 进程与线程通讯 实验目的 深刻理解线程与进程的概念掌握进程与线程在组成成分上的差别以及 与其相适应的通讯方式和应用目标 实验内容 以 Linux 系统进程和线程机制为...
  • 1.编写一个应用程序实现下述功能:当单击“开始”按钮时随机产生一个两位整数不断在文本框上显示(每隔300毫秒显示一次),当单击“停止”按钮时,停止显示并将当前产生的数显示在一个标签(JLabel)中,如下图所示...
  • 线程调度实验报告_Nachos Lab2

    千次阅读 2014-06-08 16:40:09
     本次Lab针对的内容了解线程的调度机制,每个时刻每个CPU上只能有一个线程运行,为了提高系统的吞吐量和工作效率,必须合理的安排每个线程上CPU的顺序和时间。在实用中,多数为几种调度策略结合使用的。包括是否...
  • 1、C语言多线程需要使用头文件pthread.h2、使用pthread_t来创建线程id,使用pthread_create创建线程。线程创建完会进行执行。、 pthread_create函数有四个参数,第一个参数是指向线程标识符的指针,也就是指向线程id...
  • 同步机制实验报告_Nachos Lab3

    千次阅读 2014-06-08 16:50:14
    为了解决信号量机制带来的程序编写困难、效率低等不足,出现了管程机制,这是一种高级的同步机制。管程类似于面向对象中的类,进程只能通过调用管程中的过程来间接的访问管程中的数据结构。同时,管程的进入是互斥的...
  • 3.掌握多线程的同步机制实验内容 根据要求,编写应用程序。要求如下: 1.模拟银行账户,两个以上的用户同时进行存、取操作。 2.银行有一个账户,有两个用户分别向同一个账户存3000元,每次存1000,存三次。 3....
  • 多线程实现“生产者-消费者问题”(代码+实验报告) #include #include #include #include using namespace std;typedef int semaphore; /* 信号量是一种特殊的整型变量 */ const int SIZ
  • java多线程机制: <br />例子 1 public class Example1 { static Lefthand left;static Righthand right; public static void main(String args[]) { left=new Lefthand();...
  • 实 验 报 告 2013/2014 学年 第一学期 课程名称 软件技术系列课程 Android 基础 实验名称 Android 广播线程服务与多媒体开发 实验时间 2013 年 12 月 9 日 指导单位 计算机学院诚迈科技南京公司 指导教师 学生姓名 ...
  • 1、使用多线程制作一计时器,要求实现文本框输入一个时间(分),计时结束后提示。 2、系统通过点击按钮可实现启动计时、暂停、结束计时、复位等功能。 三、实验步骤 借助windowBulider制作窗体界面,使用两个...
  • java 多线程异常处理

    2013-08-06 19:44:06
    实验报告 java 多线程异常处理的相关实验步骤及其总结
  • 并行计算与多核多线程技术   课程报告       专业 软件工程     班级 计133-2     学号 XXXXXXXXX     姓名 XX    成绩 ____________________      
  • JAVA实验报告

    2018-07-19 19:40:08
    九次JAVA实验报告,内容涉及记事本读取保存、生产者与消费者多线程机制、计算器、通信机制等,包括代码供参考。
  • 本题要求主线程退出时,在main方法中所启动的线程t1也要自动结束。 public class Main { public static void main(String[] args) { Thread t1=new Thread(new PrintTask()); t1.setDaemon(true); t1.start...
  • 操作系统实验报告实验一.doc计算机操作系统实验报告一、 实验一 “生产者-消费者”问题二、 实验目的通过对“生产者-消费者”问题编程实现,了解线程创建、同步信号量、互斥信号量、临界区的创建和使用。了解线程...
  • Java 语言程序设计 C 实验报告 集合框架及泛型机制 学 生 姓 名 专 业 班 级 指 导 教 师 成 绩 计算机与信息工程学院 年 月 日 . . 一实验目的 学习课程相关章节知识通过上机练习掌握以下知识 1掌握 List 接口下 ...
  • java2 实用教程(第三版) 实验指导 上机实验8 多线程 汉字打字练习 旋转的行星 双线程接力
  • 网络编程 服务器 并发 多线程
  • 工作中经常涉及到加速程序的... 线程:在一个进程内部(一个任务),要同时干件事,就需要同时运行个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。 这里要注意的是每个进程至少要干一个任务,每
  • 实 验 报 告 ( 2016 / 2017 学年 第 二 学期) ...Windows环境下多线程程序设计| 实验时间 2017 年 5 月 9 日 指导单位 计算机学院软件工程系

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,124
精华内容 3,649
热门标签
关键字:

多线程机制实验报告