Nachos同步机制实习报告

合集下载

线程调度实习报告

线程调度实习报告

线程调度实习报告姓名李炜学号1100012810日期2014年3月6日目录内容一:总体概述 (3)内容二:任务完成情况 (3)任务完成列表(Y/N) (3)具体Exercise的完成情况 (3)内容三:遇到的困难以及解决方法 (7)内容四:收获及感想 (7)内容五:对课程的意见和建议 (7)内容六:参考文献 (8)内容一:总体概述这次的实习任务主要是通过对Nachos线程的调度机制来加深对线程调度的理解,因为Nachos本身是没有很复杂的调度机制的,所以这次实习中需要首先向Nachos添加带有优先级的线程调度算法,之后添加使用时间片调度,来使得线程的调度相对公平。

内容二:任务完成情况任务完成列表(Y/N)具体Exercise的完成情况第一部分Exercise1首先来看windows的线程调度,windows的调度单位就是线程,它采用的时基于动态优先级的、抢占式调度,结合时间配额调整,总是运行最高优先级线程。

就绪线程会按优先级进入相应队列,系统总是选择优先级最高的就绪线程让其运行,同一优先级的各线程按时间片轮转进行调度,多处理机系统中允许多个线程并行运行。

从这一点来看,有些像多级反馈队列调度的方法。

线程调度的触发事件有四种:一个线程进入就绪状态,如一个刚创建的新线程或一个刚刚结束等待状态的线程一个线程由于时间配额用完、从运行状态转入结束状态或等待状态一个线程由于调用系统服务而改变优先级或被Windows 系统本身改变其优先级一个正在运行的线程改变了它的亲合处理机集合Windows使用32个线程优先级,分成三类,实时优先级,可变优先级,系统线程(IDLE)。

一个线程用完了自己的时间配额时,如果没有其它相同优先级线程,Windows将重新给该线程分配一个新的时间配额,并继续运行。

当线程被抢占时,它被放回相应优先级的就绪队列的队首处于实时优先级的线程在被抢占时,时间配额被重置为一个完整的时间配额处于动态优先级的线程在被抢占时,时间配额不变,重新得到处理机后将运行直到剩余的时间配额用完如果刚用完时间配额的线程优先级降低了,Windows 将寻找一个优先级高于刚用完时间配额线程的新设置值的就绪线程如果刚用完时间配额的线程的优先级没有降低,并且有其他优先级相同的就绪线程,Windows 将选择相同优先级的就绪队列中的下一个线程进入运行状态,刚用完时间配额的线程被排到就绪队列的队尾(即分配一个新的时间配额并把线程状态从运行状态改为就绪状态)配额并继续运行下面来看linux的线程调度策略,linux将进程分为下面两类实时进程对调度延迟的要求最高,要求立即响应并执行调度策略:FIFO、Round Robin普通进程普通进程调度策略使用CFS,CFS是现在被内核采纳的调度器。

操作系统线程同步机制实验报告

操作系统线程同步机制实验报告

操作系统线程同步机制实验报告一、实验目的本实验旨在通过对操作系统线程同步机制的实验,深入了解操作系统中线程的运行和同步原理,掌握线程同步机制的使用方法以及安全性问题。

二、实验背景在操作系统中,线程是实现多任务并发执行的基本单位。

为了确保线程的安全性,避免出现竞态条件等问题,需要采取合适的线程同步机制。

三、实验内容1.实现基本的线程同步操作通过使用互斥锁和条件变量,实现以下线程同步问题:(1)生产者/消费者问题:生产者线程生产一定数量的产品,消费者线程从缓冲区中取出产品并消费。

(2)读者/写者问题:多个读者线程可以同时读取共享资源,但是写者线程获取写权限后,其他线程无法读取或写入。

2.实验操作步骤(1)设计和实现多线程程序,包括生产者线程、消费者线程、读者线程和写者线程。

(2)使用互斥锁和条件变量对共享资源进行同步操作,保证线程的安全性。

(3)编译并运行程序,观察线程的执行顺序和结果是否符合预期。

四、实验结果与分析1.生产者/消费者问题通过设计合适的缓冲区和互斥锁,保证生产者线程和消费者线程的安全访问。

实验结果表明,生产者线程可以正确地生产产品,并将产品存储到缓冲区中。

消费者线程可以从缓冲区中取出产品并消费。

2.读者/写者问题通过使用互斥锁和条件变量,实现多个读者线程可以同时读取共享资源,但是写者线程获取写权限后,其他线程无法读取或写入。

实验结果表明,读者线程可以同时读取共享资源,而写者线程获取写权限后,其他线程无法读取或写入。

五、实验总结本实验通过对操作系统线程同步机制的实验,深入了解了操作系统中线程的运行和同步原理,掌握了线程同步机制的使用方法以及安全性问题。

实验结果表明,在设计合适的缓冲区和使用适当的同步机制的情况下,可以有效地保证线程的安全性和正确的并发执行。

六、实验心得通过本次实验,我深刻理解了线程同步机制在操作系统中的重要性。

线程同步机制可以保证多个线程正确地访问共享资源,避免竞态条件等问题的出现。

Nachos平台操作系统上机实践指南

Nachos平台操作系统上机实践指南

目录第一章试验环境介绍 (4)1.1 引言 (4)1.2 Nachos平台的功能特点简介 (4)1.2.1 什么是Nachos (4)1.2.2 Nachos的特点功能介绍 (4)1.3 Nachos平台的搭建与配置 (5)1.3.1 Nachos试验环境文件列表 (5)1.3.2 Nachos试验环境搭建步骤 (6)1.3.3 Nachos的功能模块组成结构 (22)1.3.4 Nachos的编译运行开发环境 (22)第二章Nachos平台技术实现说明 (24)2.1 Nachos的机器模拟机制概述 (24)2.1.1 Sysdep模块实现机制分析 (24)2.1.2 中断处理模块实现机制分析 (27)2.1.3 时钟中断模块实现机制分析 (28)2.1.4 终端设备模块实现机制分析 (29)2.1.5 磁盘设备模块实现机制分析 (29)2.1.6 系统运行情况统计 (30)2.2 Nachos中的进程/线程管理 (30)2.2.1 相关知识点回顾 (30)2.2.2 功能概述 (30)2.2.3 具体模块实现介绍 (31)2.3 Nachos中的文件系统管理 (33)2.3.1 相关知识点回顾 (33)2.3.2 功能概述 (34)2.3.3 具体模块实现介绍 (34)2.4 Nachos中的存储系统管理 (36)2.4.1 相关知识点回顾 (36)2.4.2 功能概述 (36)2.4.3 具体模块实现介绍 (37)2.5 Nachos中的网络系统管理 (37)2.5.1 相关知识点回顾 (37)2.5.2 现有功能分析 (37)2.5.3 具体模块实现介绍 (38)。

山东大学操作系统nachos课程设计报告

山东大学操作系统nachos课程设计报告
2.1 Project1:建立线程系统............................................................................3 2.1.1 Task 1.1 实现 KThread.join()......................................................3 2.1.2 Task 1.2 实现条件变量...................................................................5 2.1.3 Task 1.3 完成 Alarm 类...................................................................6 2.1.4 Task 1.4 条件变量实现同步消息...................................................8 2.1.5 Task 1.5 实现优先级调度.............................................................11 2.1.6 Task 1.6 条件变量解决过河问题.................................................13
2.题目分析与实现方案
分析:条件变量使我们可以睡眠等待某种条件出现,是利用线程间共享的全 局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条 件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争, 条件变量的使用总是和一个互斥锁结合在一起。
方案:threads.Lock 类提供了锁以保证互斥。在临界代码区的两端执行 Lock.acquire() 和 Lock.release() 即可保证同时只有一个线程访问临界代码 区。条件变量建立在锁之上, 由 threads.Condition 实现,用来保证同步。每一 个条件变量拥有一个锁变量。

同步自动化实习报告

同步自动化实习报告

实习报告实习单位:XX有限公司实习岗位:自动化工程师实习时间:2021年6月1日至2021年8月31日一、实习背景及目的随着科技的不断发展,自动化技术在各个领域的应用越来越广泛,同步自动化技术作为一种先进的自动化控制技术,在提高生产效率、降低成本、提升产品质量等方面具有重要意义。

为了更好地将所学知识与实际工作相结合,提高自己的实践能力和综合素质,我选择了XX有限公司的自动化工程师岗位进行为期三个月的实习。

二、实习内容及收获1. 实习内容(1)了解公司产品及生产流程:在实习期间,我深入了解了公司的主营业务、产品特点、生产流程及自动化设备的使用情况。

(2)参与设备维护与维修:我积极参与了自动化设备的日常维护和维修工作,掌握了设备故障的排查和解决方法。

(3)参与项目改造:我参与了公司一条生产线的同步自动化改造项目,负责部分硬件选型、编程和调试工作。

(4)学习相关软件:我学习了自动化设备所需的软件,如CAD、PLC编程软件、变频器调速系统等,提高了自己的软件操作能力。

2. 实习收获(1)专业知识:通过实习,我对同步自动化技术有了更深入的了解,掌握了同步电机的工作原理、控制系统的设计方法等。

(2)实践能力:在实习过程中,我参与了多个实际项目的操作,提高了自己的动手能力和解决问题的能力。

(3)团队协作:我学会了与同事沟通、协作,共同完成项目任务,培养了团队精神。

(4)职业素养:实习期间,我严格遵守公司规章制度,按时完成工作任务,培养了良好的职业素养。

三、实习总结通过为期三个月的实习,我深刻体会到了同步自动化技术在实际生产中的应用价值,同时也锻炼了自己的实践能力和综合素质。

在今后的工作中,我将继续努力学习专业知识,提高自己的技能水平,将所学知识与实际工作相结合,为公司的发展贡献自己的力量。

四、建议和反馈(1)加强实习生培训:希望公司能够对实习生进行更加系统的培训,让我们更快地熟悉工作内容和业务流程。

(2)增加实践机会:公司可以适量增加实习生的实践机会,让我们更好地将所学知识应用于实际工作中。

北大操作系统高级课程-陈向群作业-系统调用实习报告

北大操作系统高级课程-陈向群作业-系统调用实习报告

系统调用实习报告目录内容一:总体概述 (3)内容二:任务完成情况 (3)任务完成列表(Y/N) (3)具体Exercise的完成情况 (3)内容三:遇到的困难以及解决方法 (6)内容四:收获及感想 (6)内容五:对课程的意见和建议 (7)内容六:参考文献 (7)内容一:总体概述通过这次实习,更加深入地了解了Nachos 系统调用的实现。

巩固了原理课上学习的关于Linux 系统调用的实现细节。

这次试验也主要是系统调用的相关实现涉及了syscall.h,,start.s 的原理部分和相关调用部分的再实现。

内容二:任务完成情况任务完成列表(Y/N)Exercise1 Exercise2 Exercise3 Exercise4 Exercise5 完成情况Y Y Y Y Y具体Exercise的完成情况一、理解Nachos系统调用Exercise 1 源代码阅读阅读与系统调用相关的源代码,理解系统调用的实现原理。

code/userprog/syscall.h解答:该文件是nachos 系统调用的头文件,里面声明了一些nachos 的内核操作,可以被用户程序通过syscall 调用,在用户程序和内核文件中都需包含本文件,其中包含了Halt,Exit,Exec,Join,Create,Open,Read,Write,Close,Fork,Yield 调用方法的声明。

code/userprog/解答:Exception.h 和 是专门用来检测和处理异常信息的类,原始的nachos给出了syscall 异常的处理方式,并通过ExceptionHandler对各种异常进行处理。

code/test/start.s解答:start.s 文件中用汇编语言协助用户程序在nachos 中运行,以避免使用完整的c 库,我们定义了用户程序所需要的东西以便进行系统调用。

二、文件系统相关的系统调用Exercise 2系统调用实现类比Halt的实现,完成与文件系统相关的系统调用:Create, Open,Close,Write,Read。

进程的同步实验报告

进程的同步实验报告

进程的同步实验报告进程的同步实验报告引言:进程同步是操作系统中一个重要的概念,它涉及到多个进程之间的协调和合作。

在本次实验中,我们将通过一个简单的实例来探讨进程同步的概念和实现方式。

实验目的:通过实验,我们的目标是理解进程同步的概念,学习常见的同步机制,并通过编程实现一个简单的同步问题。

实验环境:本次实验使用了C语言作为编程语言,并在Linux操作系统上进行。

实验过程:我们的实验场景是一个餐厅,有一个厨师和多个服务员。

厨师负责烹饪菜品,服务员负责上菜给客人。

我们需要实现的是,服务员只有在厨师烹饪好一道菜之后才能上菜,否则需要等待。

首先,我们使用互斥锁来实现进程间的同步。

互斥锁是一种常见的同步机制,它可以确保在同一时间只有一个进程可以访问共享资源。

在我们的实验中,厨师和服务员都需要访问菜品资源,因此我们为菜品资源添加了一个互斥锁。

接下来,我们使用条件变量来实现进程间的等待和唤醒操作。

条件变量是一种同步机制,它可以让进程在某个条件满足时等待,直到被唤醒。

在我们的实验中,服务员需要等待厨师烹饪好菜品之后才能上菜,因此我们创建了一个条件变量,并在服务员的代码中使用了等待和唤醒操作。

实验结果:经过实验,我们成功地实现了进程间的同步。

在我们的实验场景中,厨师会不断地烹饪菜品,并在烹饪完成后通知服务员上菜。

服务员会等待厨师的通知,然后上菜给客人。

通过互斥锁和条件变量的使用,我们保证了服务员只会在厨师烹饪完成后才会上菜,避免了资源竞争和错误的上菜行为。

讨论与总结:通过本次实验,我们深入理解了进程同步的概念和实现方式。

互斥锁和条件变量是常见的同步机制,它们可以有效地解决进程间的竞争和协调问题。

在实际的操作系统中,进程同步是一个非常重要的概念,它保证了多个进程之间的正确执行和合作。

然而,进程同步也可能引发一些问题。

例如,如果互斥锁的使用不当,可能会导致死锁的发生。

死锁是一种进程无法继续执行的状态,它会导致系统的停滞。

同步机构实习报告

同步机构实习报告

同步机构实习报告一、实习题目模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。

二、程序说明程序调度采用随机算法,进程类型包括生产者和消费者两类,每次随机选到进程进行运行,若是生产者则执行PA指令序列,若是消费者则执行PB指令序列。

指令序列中若遇到P操作,则进行信号量判断,若符合规则便继续执行,否则将当前进程进入等待队列;若遇到V操作,进行判断,若有空闲信号则从等待队列中抽出一符合条件进程加入就绪队列。

三、源程序#include "stdafx.h"#include "stdlib.h"#include "iostream.h"//-----------------------------------------------#define semaphere int#define buffernum 3//----------------------------------------------typedef struct tagPCB //进程控制块PBC{int num; //进程号char name; //进程名int process_type; //进程类型:生产者或消费者struct tagPCB *next; //下个进程int demand_time; //需求时间int used_time; //已用时间char status; //进程状态int PC; //断点}PCB;//--------------------------------------------------PCB *head_r, *r_p; //就绪链首指针,活动指针PCB *head_w, *w_p; //就绪链首指针,活动指针int process_num; //进程数char buffer[3]; //缓冲池char sourses[255] = {'1','2','3','4','5','6','7','8','9','0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};//生产原char memory[20]; //模拟进程内存int sourses_pointer=-1;int in_p=0,out_p=0;semaphere s1=buffernum, s2=0, mutex=1; //信号量//----------------------------------------------------int i,j,k; //自由变量//----------------------------------------------------函数声明int creat_process();int init_link(PCB**,PCB**);int enter_link(PCB*,PCB*);PCB *exit_link(PCB*);int random_choose_process();int execute_process(PCB *);//----------------------------------------------------int produce(PCB *);int P(PCB *);int mutex_p(PCB *);int put(PCB *);int mutex_v(PCB *);int V(PCB *);int get(PCB *);int consume(PCB *);int nix(PCB *p);//-------------------------- 指令队列-----------------------------------------------//int (*PA[6])(PCB *) = {produce,P,mutex_p,put,mutex_v,V};int (*PB[6])(PCB *) = {P,mutex_p,get,mutex_v,V,consume};//以上为包含PV操作的指令序列,执行此队列顺利完成生产消费调度任务//int (*PA[6])(PCB *) = {produce,mutex_p,nix,mutex_v,nix};//int (*PB[6])(PCB *) = {nix,mutex_p,get,mutex_v,nix,consume};//以上为不包含PV操作的指令序列,若执行此指令序列,将会出现调度错误//--------------------------------------------------主程序---------------------------//int main(int argc, char* argv[]){init_link(&head_r, &r_p);init_link(&head_w, &w_p);cout<<"进程数:";cin>>process_num;for (i=0;i<process_num;i++){creat_process();}while (head_r->next != head_r){random_choose_process();}printf("Hello GHouan!\n");return 0;}/*****************************************************************************/ int creat_process(){PCB *temp;temp = (PCB *)malloc(sizeof(PCB));temp->num = i;cout<<"进程名:";cin>>temp->name;cout<<"进程类型(生产者0/消费者1):";cin>>temp->process_type;cout<<"需要运行时间:";cin>>temp->demand_time;temp->used_time = 0;temp->status = 'R';temp->PC = 0;enter_link(head_r,temp);return 0;}int init_link(PCB **head,PCB **p){(*head) = (PCB *)malloc(sizeof(PCB));(*head)->demand_time = 0; //无意义(*head)->used_time = 32768; //无意义(*head)->status = 'N'; //无意义(*head)->next = (*head);(*head)->PC = -1; //无意义(*p) = (*head);return 0;}int enter_link(PCB *head,PCB *temp){temp->next = head->next;head->next = temp;return 0;}PCB *exit_link(PCB *p){PCB *q;q = p;while (p != q->next){q = q->next;}q->next = p->next;return p;}//--------------------------------------------int random_choose_process(){int x;x = rand() % process_num; //产生随机数r_p = head_r; //活动指针返回链首for (j=0;j<x;j++){r_p = r_p->next;}if (r_p == head_r){r_p = r_p->next;}execute_process(r_p);return 0;}int execute_process(PCB *p){switch (p->process_type){case 0:{PA[p->PC](p);return 0;}case 1:{PB[p->PC](p);return 0;}default: return -1;}}//-------------原操作--------------------------//int produce(PCB *p){sourses_pointer++;memory[p->num] = sourses[sourses_pointer];cout<<"生产者"<<p->name<<"生产一产品,产品名为"<<memory[p->num]<<endl;(p->PC)++;return 0;}int consume(PCB *p){cout<<"消费者"<<p->name<<"消费一产品,产品名为"<<memory[p->num]<<endl;(p->used_time)++;if (p->demand_time == p->used_time){p->status = 'c';exit_link(p);}else{(p->PC) = 0;}return 0;}int P(PCB *p){switch (p->process_type){case 0:{s1--;if (s1 < 0){p->status = 'w';enter_link(head_w,exit_link(p));//退出就绪队列进入等待队列}(p->PC)++;return 0;}case 1:{s2--;if (s2 < 0){p->status ='w';enter_link(head_w,exit_link(p));//退出就绪队列进入等待队列}(p->PC)++;return 0;}default: return -1;}}int V(PCB *p){switch (p->process_type){case 0:{s2++;if (s2 <= 0){w_p = head_w;while(1 != w_p->process_type){w_p = w_p->next;}w_p->status = 'r';enter_link(head_r,exit_link(w_p));//从等待队列选出一个加入就绪队列}(p->used_time)++;if (p->demand_time == p->used_time){p->status = 'c';exit_link(p);}else{(p->PC) = 0;}return 0;}case 1:{s1++;if (s1 <= 0){w_p = head_w;while(0 != w_p->process_type){w_p = w_p->next;}w_p->status = 'r';enter_link(head_r,exit_link(w_p));//从等待队列选出一个加入就绪队列}(p->PC)++;return 0;}default: return -1;}}int mutex_p(PCB *p){if (0 == mutex){return 0;}else{mutex = 0;(p->PC)++;return 0;}}int mutex_v(PCB *p){mutex = 1;(p->PC)++;return 0;}int put(PCB *p){buffer[in_p] = memory[p->num];in_p = (in_p + 1) % 10;cout<<"生产者"<<p->name<<"把产品"<<memory[p->num]<<"放入缓冲区"<<endl;(p->PC)++;return 0;}int get(PCB *p){memory[p->num] = buffer[out_p];out_p = (out_p +1) % 10;cout<<"消费者"<<p->name<<"从缓冲区取走产品"<<memory[p->num]<<endl;(p->PC)++;return 0;}int nix(PCB *p){(p->PC)++;return 0;}四、运行参数及结果输入:进程数:3进程名:a进程类型(0生产者/1消费者):0需要运行时间:7进程名:b进程类型(0生产者/1消费者):1 需要运行时间:4进程名:c进程类型(0生产者/1消费者):1 需要运行时间:2输出:生产者a生产一产品,产品名为1 生产者a把产品1放入缓冲区生产者a生产一产品,产品名为2 消费者c从缓冲区取走产品1消费者c消费一产品,产品名为1 生产者a把产品2放入缓冲区生产者a生产一产品,产品名为3 消费者c从缓冲区取走产品2消费者c消费一产品,产品名为2 生产者a把产品3放入缓冲区生产者a生产一产品,产品名为4 消费者b从缓冲区取走产品3消费者b消费一产品,产品名为3 生产者a把产品4放入缓冲区生产者a生产一产品,产品名为5 消费者b从缓冲区取走产品4生产者a把产品5放入缓冲区消费者b消费一产品,产品名为4 消费者b从缓冲区取走产品5生产者a生产一产品,产品名为6 消费者b消费一产品,产品名为5 生产者a把产品6放入缓冲区生产者a生产一产品,产品名为7 消费者b从缓冲区取走产品6消费者b消费一产品,产品名为6 生产者a把产品7放入缓冲区Hello GHouan!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

同步机制实习报告善良的大姐姐2015.3.30精品文档目录一:总体概述 (3)二:任务完成情况 (3)任务完成列表(Y/N) (3)具体Exercise的完成情况 (3)三:遇到的困难以及解决方法 (12)四:收获及感想 (12)内容五:参考文献 (13).精品文档一:总体概述Lab3首先要求阅读Nachos系统提供的同步机制代码,即Semaphore的实现。

其次要求修改底层源代码,达到“扩展同步机制,实现同步互斥实例”的目标。

具体来说,即要求在Semaphore 的基础上,实现Lock锁和Mesa管程的Condition(条件变量)。

此外,还要利用编写的同步机制,来实现互斥实例,进而证明同步机制编写的正确性。

二:任务完成情况任务完成列表(Y/N)具体Exercise的完成情况Exercise1:调研任务:调研Linux中实现的同步机制调研情况:Linux的同步机制包括好几层。

第一层:原子操作。

以x86体系结构为例,定义在linuxX.X/include/asm-i386/atomic.h文件中。

文件内定义了原子类型atomic_t,其仅有一个字段counter,用于保存32位数据。

其中原子操作函数atomic_inc完成自加原子操作。

第二层:自旋锁。

以x86体系结构为例,定义在linuxX.X/include/asm-i386/spinlock.h文件中。

其中__raw_spin_lock 完成自旋锁的加锁功能。

自旋锁达到的效果为,在等待锁的线程会不断地申请锁,直到获得锁或是时间片用尽从而离开CPU。

第三层:信号量以x86体系结构为例,定义在linuxX.X/include/asm-i386/semaphore.h文件中。

信号量的申请操作使用down函数,释放操作使用up函数。

即通常所说的PV操作。

区别于自旋锁,当一个进程在等待一个锁时,会让出CPU进入休眠状态,直到其他进程释放锁后,将该进程放入可运行队列。

.精品文档Exercise2:源代码阅读任务阅读下列源代码,理解Nachos现有的同步机制。

code/threads/synch.h和code/threads/code/threads/synchlist.h和code/threads/阅读情况(h)文件中有三个类:Semaphore, Lock, Condition。

其中Semaphore是已经编写完成的。

主要功能是:通过一个名字和一个初始值可以初始化一个Semaphore。

P函数的作用是:判断当前线程能否进入临界区,如果可以(即初始值≠0),则进入,且初始值减一;如果不能(即初始值=0),则将当前线程放入Semaphore的等待队列中,线程进入休眠状态。

V函数的作用是:如果Semaphore的等待队列不为空,将等待队列的队头线程取出来,将其状态标识为ReadyToRun,并且初始值加1。

另外两个类是本次作业需要完成的,会在之后说明。

(h)文件中包括一个Synchlist类,实现了一个互斥访问的队列。

具体来说,类中有一个Append函数,用于将元素加入队列;有一个Remove函数,用于将队头元素移出队列。

而互斥访问的实现方式为:用Lock锁将Append函数体和Remove函数体保护起来。

保证了二者至多只有一个可以被被CPU运行,直到函数体结束。

(即线程切换的中断不会造成线程交替运行)这两个函数模拟了monitor(管程)的函数体互斥性,因此在之后的作业中会用到。

Exercise3:实现锁和条件变量任务可以使用sleep和wakeup两个原语操作(注意屏蔽系统中断),也可以使用Semaphore作为唯一同步原语(不必自己编写开关中断的代码)。

完成情况1.Lock简述:使用Semaphore作为同步原语,定义的时候创建一个初始值为1的Semaphore。

对应的,Acquire 函数就是执行Semaphore的P函数,Release函数就是执行Semaphore的V函数。

验证正确性:采用基于优先级抢占式调度,一个线程递归生成优先级更高的线程。

如果没有Lock,那么当前线程就会被抢占,那么运行结果会是这样:.精品文档出连输接before fork再接连输出after fork出来的线程才fork但若在线程一开始加上了互斥锁,那么只有当当前线程运行结束后,它能获得锁,才能运行,运行结果如下:一个线程输before 出了after fork和另之后,fork一个线程才能输出Condition.精品文档:实现同步互斥实例Exercise4任务中的信号量、锁和条件变量,采用两种方式实现同步和互斥机制应用(其中使基于Nachos写“读者-。

具体可选择“生产者-消费者问题”、用条件变量实现同步互斥机制为必选题目)等。

(也可选择其他经典的同步互斥问题)、“哲学家就餐问题”、“睡眠理发师问题”者问题”完成情况-消费者”问题基于Nachos信号量实现“生产者1.(基于时间片轮转调度,时间片长度随机。

为了使得中断有可能在任何地方发生,在所)有临界区中的代码语句后面都调用了interrupt->onetick修改情况:精品文档测试结果截图:生产者放入队列的元素发生时间片中断,切换线程两个消费者交替消费元素消费者”问题Nachos的条件变量实现“生产者-2.基于(基于时间片轮转调度,时间片长度随机。

为了使得中断有可能在任何地方发生,在所)有临界区中的代码语句后面都调用了.精品文档测试结果截图:两个消费者交替消费,并且不需要和生产者同步。

.精品文档测试情况详细分析:消费者2试图加锁进入管程,但由于管程互斥锁此时在消费者1手中,因此消费者2继续等待Challenge1:实现barrier任务可以使用Nachos 提供的同步互斥机制(如条件变量)来实现barrier,使得当且仅当若干个线程同时到达某一点时方可继续执行。

.精品文档次10个Barrier类的函数测试结果截图用使未Barrier:Barrier 使用同步(三个线程均之后才进入输出iinterrupt下一个,表示时间片到了切)换线程。

不同步read/write lock:实现Challenge2任务。

使得若干线程可以同时locklock(synch.hNachos提供的和),实现read/write 基于只有一个线程可以向该共享数据区写但是在某一特定的时刻,读取某共享数据区内的数据,入数据。

完成情况(基于时间片轮转调度,时间片长度随机。

为了使得中断有可能在任何地方发生,在.精品文档测试结果截图:。

读以可同时读者之间可finishstart和(以认为是临界区)写者在临界区里时,即使发生,也无interrupt了(线程切换)法让读者进入。

即读者和写者不能同时访问临界区.精品文档三:遇到的困难以及解决方法困难1:我在完成lab2线程调度实验中,在readyToRun函数中对当前线程执行了yield操作,导致lab3中V函数的原子性被破坏。

(V函数会调用readyToRun 函数)解决方式:将线程Yield的过程单独封装成一个函数,readyToRun函数仅仅负责将当前线程放入可执行队列当中。

对于新建的一个线程(可能可以抢占当前线程),先调用该函数,判断是否抢占。

如果抢占,则让当前线程yield;否则,调用readyToRun函数。

困难2:思考如何实现condition的wait函数,曾一度觉得synchlist中会造成死锁解决方式:详细了解了管程机制之后,发现只要在wait函数中,先对传入的Lock参数执行释放(Release)操作,当前线程再进入休眠状态,问题就可以解决了。

困难3:在写“生产者-消费者”问题的测试函数时,从队列中读出来的值总是等于最后一个加入队列的值(比如加入队列1,2,3,4,读出来会是4,4,4,4)解决方式:由于传入的是(void *),是一个指针。

因此我直接传入了for循环中的i的地址,这就导致了i的值虽然在变化,但i的地址是不变的,所以读出来总会等于最后一个加入队列的值。

之后专门创建了一个buffer数组,使得不同的值对应不同的地址,问题就解决了。

困难4:一开始是用lock的acquire和release实现condition,但测试函数结果和预期的不相符解决方式:经过研究,我发现,造成错误的原因,是lock的release函数,会使得value值增加。

这就意味着,即使等待信号的队列为空,signal函数也会释放一个资源。

这样之后,若还有wait 函数调用,就不会被阻塞,而是直接通过。

这不符合管程中wait和signal的语义(我查了上学期操作系统的课件,课件上说,若是等待队列为空,则signal函数为空操作)。

于是我将Lock换成了队列,当队列不为空的时候才让signal和broadcast函数起作用。

四:收获及感想这次的lab消耗了比预期多的时间,主要问题在于condition的实现。

需要仔细了解了管程机制之后,才知道如何编写。

详情可参看【困难4】。

此外,测试函数也需要开动脑筋,.精品文档不仅需要写出来,而且还要通过合适位置的输出,来判断程序是否按照自己预期的样子运行。

这个过程同样需要对同步机制有较好理解,才能理清楚。

做了这次lab,觉得自己对于同步机制又多了一层了解,而且代码和报告均是自己独立完成,没有参考网上前人的报告,觉得挺高兴的!内容五:参考文献[1]陈向群同步机制操作系统课件2014版[2]linux同步机制网络博客[3]小组成员:王丰condition的实现方式讨论.。

相关文档
最新文档