山东大学 计算机 2011_操作系统实验报告_最终版
- 格式:doc
- 大小:254.12 KB
- 文档页数:71
《操作系统》实验报告一、实验目的操作系统是计算机系统中最为关键的组成部分之一,本次实验的主要目的是深入理解操作系统的基本原理和功能,通过实际操作和观察,熟悉操作系统的核心概念,包括进程管理、内存管理、文件系统和设备管理等,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、进程管理实验进程是操作系统中最基本的执行单元。
在这个实验中,我们使用C++编写程序来创建和管理进程。
通过观察进程的创建、执行和结束过程,理解进程的状态转换和资源分配。
首先,我们编写了一个简单的程序,创建了多个子进程,并通过进程标识符(PID)来跟踪它们的运行状态。
然后,使用等待函数来等待子进程的结束,并获取其返回值。
在实验过程中,我们发现进程的创建和销毁需要消耗一定的系统资源,而且进程之间的同步和通信需要谨慎处理,以避免出现死锁和竞争条件等问题。
2、内存管理实验内存管理是操作系统的核心功能之一,它直接影响系统的性能和稳定性。
在这个实验中,我们研究了动态内存分配和释放的机制。
使用 C++中的 new 和 delete 操作符来分配和释放内存。
通过观察内存使用情况和内存泄漏检测工具,了解了内存分配的效率和可能出现的内存泄漏问题。
同时,我们还探讨了内存分页和分段的概念,以及虚拟内存的工作原理。
通过模拟内存访问过程,理解了页表的作用和地址转换的过程。
3、文件系统实验文件系统是操作系统用于管理文件和目录的机制。
在这个实验中,我们对文件的创建、读写和删除进行了操作。
使用 C++的文件流操作来实现对文件的读写。
通过创建不同类型的文件(文本文件和二进制文件),并对其进行读写操作,熟悉了文件的打开模式和读写方式。
此外,还研究了文件的权限设置和目录的管理,了解了如何保护文件的安全性和组织文件的结构。
4、设备管理实验设备管理是操作系统与外部设备进行交互的桥梁。
计算机操作系统实验报告一、实验目的本次计算机操作系统实验的主要目的是深入了解操作系统的工作原理和功能,通过实际操作和观察,增强对操作系统概念的理解,提高解决实际问题的能力。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio 20193、编程语言:C++三、实验内容1、进程管理实验创建多个进程,并观察它们的执行顺序和资源占用情况。
使用进程控制块(PCB)来跟踪进程的状态变化,如就绪、运行、阻塞等。
2、内存管理实验模拟内存分配和回收算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察不同算法在内存利用率和分配效率方面的表现。
3、文件系统实验创建、读取、写入和删除文件,了解文件的操作流程。
研究文件的存储结构和目录管理方式。
4、线程同步与互斥实验使用互斥锁和信号量来实现线程之间的同步和互斥操作。
观察在多线程环境下资源竞争和同步的效果。
四、实验步骤1、进程管理实验步骤编写 C++程序,使用系统调用创建多个进程。
在每个进程中输出进程的标识符和当前执行时间。
通过观察控制台输出,分析进程的执行顺序和资源占用情况。
2、内存管理实验步骤实现不同的内存分配算法,并在程序中模拟内存请求和释放的过程。
记录每次内存分配和回收的结果,计算内存利用率和分配时间。
3、文件系统实验步骤使用文件操作函数创建文件,并写入一些数据。
读取文件中的数据,并将其输出到控制台。
删除文件,观察文件系统的变化。
4、线程同步与互斥实验步骤创建多个线程,共享一些公共资源。
在访问公共资源的代码段前使用互斥锁或信号量进行同步控制。
观察线程的执行结果,确保资源的正确访问和修改。
五、实验结果与分析1、进程管理实验结果与分析实验结果显示,进程的执行顺序是不确定的,取决于操作系统的调度策略和进程的优先级。
资源占用情况也因进程的不同而有所差异,一些进程可能占用较多的 CPU 时间和内存,而另一些则相对较少。
2、内存管理实验结果与分析首次适应算法在分配速度上较快,但容易产生内存碎片。
软件学院实验报告4实验题目:Nachos File System 学号: 201100300038日期:2013-10-30 班级: 11级3班姓名:陶旭涛Email:1595242630@实验目的:熟悉nachos系统的文件操作命令以及用法,了解怎样生成 Nachos 文件系统,知道怎样测试 Nachos 文件系统的基本功能,怎样检查 Nachos 文件系统中模拟硬盘中的内容。
硬件环境:Ubuntu12.04软件环境:Nachos,Mips,GDB实验步骤:按照操作命令按步执行:nachos [ d f] –f这个命令用于在任何其它文件系统命令使用之前格式化一个模拟的叫DISK 的硬盘: nachos [d f] –cp Unix 文件名 Nachos 文件名从 Unix 系统中拷贝一个文件到 Nachos 系统中:nachos [d f] –p 文件名显示 Nachos 系统中一个文件的内容(类似 Unix 系统中的 cat 命令):nachos [d f] –d 文件名删除 Nachos 系统中一个文件(类似 Unix 系统中的 rm 命令):nachos [d f] –l 列出 Nachos 系统中所有的文件名(类似 Unix 系统中的 ls 命令)结果如下:执行./nachos./nachos -f./nachos -D./nachos -cp test/small smallod DISK:查看DISK中的内容./nachos -l small./nachos -p small结论分析与体会:通过这次实验了解到nachos文件系统的基本构成和架构。
测试了nachos文件系统的基本功能检查了nachos文件系统中的模拟硬盘中的内容。
操作系统课程设计报告学院:计算机科学与技术学院专业:计算机科学与技术班级:20**级*班姓名:***学号:20**********目录一实验平台 (2)二Project1建立线程系统 (2)Task1.1实现KThread.join() (2)1.要求 (2)2.分析 (2)3.方案 (3)4.实现代码 (3)Task1.2利用中断提供原子性,直接实现条件变量 (4)1.要求 (4)2.分析 (5)3.方案 (5)4.实现代码 (5)Task1.3实现waitUntil (7)1.要求 (7)2.分析 (7)3.方案 (7)4.实现代码 (8)Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen (10)1.要求 (10)2.分析 (10)3.方案 (11)4.实现代码 (11)Task1.5完成PriorityScheduler实现优先级调度 (13)1.要求 (13)2.分析 (13)3.方案 (14)4.实现代码 (14)Task1.6 (17)1.要求 (17)2.分析 (18)3.方案 (19)4.实现代码 (19)三Project2多道程序设计 (27)Task2.1 (27)1.要求 (27)2.分析 (28)3.方案 (28)4.实现代码 (31)Task2.2 (36)1.要求 (36)2.分析 (36)3.方案 (36)4.实现代码 (38)Task2.3 (43)1.要求 (43)2.分析 (43)3.方案 (44)4.实现代码 (45)Task2.4 (47)1.要求 (47)2.分析 (48)3.方案 (48)4.实现代码 (48)一实验平台开发语言:Java开发工具:Eclipse Luna操作系统:Ubuntu14.04二P roject1建立线程系统Task1.1实现KThread.join()1.要求实现Implement KThread.join()函数。
山东大学操作系统实验报告4进程同步实验计算机科学与技术学院实验报告实验题目:实验四、进程同步实验学号:日期:20120409 班级:计基地12 姓名:实验目的加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案了 Linux 系统 IPC进程同步工具的用法,练习并发协作进程的同步与互斥操作的编与调试技术实验内容抽烟者问题假设一个系统中有三个抽烟者进程每个抽烟者不断地卷烟并抽烟抽烟者卷起并抽掉一颗烟需要有三种材料烟草纸和胶水一个抽烟者有烟草一个有纸,另一个有胶水。
系统中还有两个供应者进程,它们无限地供应所有种材料但每次仅轮流提供三种材料中的两种。
得到缺失的两种材料的抽烟者卷起并抽掉一颗烟后会发信号通知供应者让它继续提供另外的两种材料。
这过程重复进行请用以上介绍 IPC同步机制编程实现该问题要求的功能硬件环境@CPUi3-2350MIntel?Cor42.30GHz MobileIntel?Sandybridgex86/MMX/SSE24G内存3操作系统:20.1 GB磁盘:软件环境:ubuntu13.04实验步骤:(1)新建定义了producer和consumer 共用的文件。
ipc.h函数原型和变量的IPC.(2)新建ipc.c文件,编写producer和consumer共用的IPC的具体相应函数。
(3)新建Producer文件,首先定义producer的一些行为,利用系统调用建立共享内存区域,设定其长度并获取共享内存的首地址。
然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。
当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。
(4)新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。
(完整)山东大学操作系统实验一实验报告
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)山东大学操作系统实验一实验报告)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)山东大学操作系统实验一实验报告的全部内容。
操作系统课程设计实验报告
结论分析与体会:
通过这次实验,我熟悉了操作系统实验的环境,进一步了解了Nachos的构成,对我以后顺利熟练的完成操作系统实验有很大的帮助!。
山东大学操作系统实验报告HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】操作系统实验报告计算机科学与技术学院目录一、进程控制实验实验目的加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习 Linux 系统中进程创建与控制有关的系统调用的编程和调试技术。
示例实验实验内容以下实验示例程序应实现一个类似shell 子命令的功能,它可以从执行程序中启动另一个新的子进程并执行一个新的命令和其并发执行。
实验演示结果独立实验实验内容参考以上示例程序中建立并发进程的方法,编写一个父子协作进程,父进程创建一个子进程并控制它每隔 3 秒显示一次当前目录中的文件名列表。
实验步骤算法设计通过进程间的通讯,先创建一个父进程一个子进程,父进程沉睡3秒,子进程作为当前父进程再次创建一个他的子进程,当前子进程执行显示当前目录文件列表功能,执行execve()方法后死亡。
While(1)在死循环里无限进行当前操作。
即达到父进程创建一个子进程并控制它每隔3秒显示一次当前目录中的文件名列表的要求。
开发调试过程打开一终端命令行窗体,新建一个文件夹,在该文件夹中建立名为的C 语言程序;再建立以下名为的 C 语言头文件;建立项目管理文件 Makefile;输入 make 命令编译连接生成可执行的 pctl 程序;执行 pctl 程序;再次执行带有子进程指定执行命令的 pctl 程序。
思考与分析1.反映的进程的特征和功能,在真实的操作系统中是怎样实现和反映出教材中讲解的进程的生命期、进程的实体和进程状态控制的。
对于进程概念和并发概念有哪些新的理解和认识子进程是如何创建和执行新程序的答:进程是一个可并发执行的程序在某数据集上的一次运行,是程序的一次运行过程。
计算机操作系统实验报告计算机操作系统实验报告引言:计算机操作系统作为计算机系统的核心组成部分,承担着管理和控制计算机硬件资源的重要任务。
通过实验,我们可以更好地理解操作系统的工作原理和功能,掌握操作系统的基本操作和管理技巧。
本文将结合实验结果,对操作系统实验进行总结和分析。
实验一:操作系统安装与配置在这个实验中,我们学习了操作系统的安装和配置过程。
通过选择合适的操作系统版本、设置分区和文件系统等步骤,成功地安装了操作系统。
同时,我们还学习了如何进行系统配置,包括网络设置、用户管理和软件安装等。
通过这个实验,我们对操作系统的基本安装和配置有了更深入的了解。
实验二:进程管理进程是操作系统中最基本的执行单位,也是操作系统资源管理的核心。
在这个实验中,我们学习了进程的创建、调度和终止等操作。
通过编写简单的程序,我们可以观察到进程的创建和调度过程,了解进程的状态转换和资源分配。
同时,我们还学习了进程间通信的方式,如共享内存和消息传递等。
通过这个实验,我们对进程管理有了更深入的理解。
实验三:内存管理内存管理是操作系统中重要的一部分,它负责管理和分配计算机的内存资源。
在这个实验中,我们学习了内存的分配和回收算法,如连续分配和非连续分配等。
通过编写程序,我们可以观察到内存的分配和回收过程,了解内存的管理策略和算法。
同时,我们还学习了虚拟内存的概念和实现原理,通过页面置换算法实现了虚拟内存的管理。
通过这个实验,我们对内存管理有了更深入的认识。
实验四:文件系统文件系统是操作系统中用于管理和存储文件的一种机制。
在这个实验中,我们学习了文件系统的基本操作和管理技巧。
通过创建文件、目录和链接等操作,我们可以更好地理解文件系统的结构和组织方式。
同时,我们还学习了文件的读写和权限管理等操作,通过编写程序实现了对文件的操作。
通过这个实验,我们对文件系统有了更深入的了解。
实验五:设备管理设备管理是操作系统中负责管理和控制计算机设备的一种机制。
软件学院实验报告实验题目:进程调度算法实验学号:20100030xxxx日期:2012-5-2班级:五班姓名:Email:实验目的:加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux 系统中进程调度策略的使用方法。
练习进程调度算法的编程和调试技术。
硬件环境:IBM实验室计算机软件环境:eclipse gcc编译器Ubuntu-Linux操作系统Gnome桌面实验步骤:1.认真阅读试验指导书所给出的相关知识与示例程序,在此基础上分析独立试验要求,然后着手开始编写程序。
2.用eclipse新建一个c project。
3.新建source folder4.新建名为psched.c的C语言程序5.再建立以下名为psched.h的C语言头文件6.build项目,产生可运行的二进制文件。
7.对程序进行调试,排除bug。
8.进入终端,运行程序,结果如下图所示:源代码:#include"psched.h"int main(int argc,char*argv[]){int pid;//存放⼦进程号struct sched_param p1;//设置⼦进程调度策略时使⽤的数据结构struct sched_param p2;//设置⽗进程调度策略时使⽤的数据结构if((pid=fork())<0){perror("process not create");exit(EXIT_FAILURE);}else if(pid==0){signal(SIGTSTP,handler1);//注册⼀个处理ctrl+z的信号量,将优先级减⼀signal(SIGINT,handler3);//注册⼀个处理ctrl+c的信号量,什么也不做sleep(1);while(1){printf("Child PID=%d priority=%d policy is%d\n",getpid(),getpriority(PRIO_PROCESS,0),sched_getscheduler(getpid()));sleep(3);}}else{signal(SIGINT,handler2);//注册⼀个处理ctrl+c的信号量,将优先级加⼀signal(SIGTSTP,handler4);//注册⼀个处理ctrl+z的信号量,什么也不做sched_setscheduler(pid,SCHED_OTHER,&p1);sched_setscheduler(getpid(),SCHED_OTHER,&p2);setpriority(PRIO_PROCESS,pid,10);setpriority(PRIO_PROCESS,getpid(),10);sleep(1);while(1){printf("Parent PID=%d priority=%d policy is%d\n",getpid(),getpriority(PRIO_PROCESS,0),sched_getscheduler(getpid()));sleep(3);}}return EXIT_SUCCESS;}#include<stdio.h>#include<stdlib.h>#include<sched.h>#include<sys/time.h>#include<sys/resource.h>#include<unistd.h>#include<signal.h>//⼦进程处理信号SIGTSTP的⽅法,将优先级减⼀void handler1(){setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,0)-1); }//⽗进程处理信号SIGINT的⽅法,将优先级加⼀void handler2(){setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,0)+1);}void handler3(){}void handler4(){}结论分析与体会:通过编写进程调度试验,首先,我更加熟练了如何编写多进程程序,更加了解了型号量的注册和使用方法。
操作系统实验报告——实验一实验题目:Synchronization Using Semaphore 日期:2013.12班级:计算机11级2班姓名:实验目标:在这个实验中,需要使用系统提供的同步信号量来实现生产者/消费者问题。
完成这一部分后,将会了解Nachos的信号量实现以及如何用信号量来实现生产者/消费者问题,同时了解如何在Nachos中创建多线程。
实验环境:ubuntu-12.04.1-desktop-i386实验分析:要实现生产者消费者问题,要使用信号量来控制资源,在threads/ 文件中实现了信号量。
设置访问的共享缓冲区,生产者每次往缓冲区中放入数据,修改信号量,一旦缓冲区数据满了以后,生产者需要等待缓冲区不满才能再放入;而消费者每次从缓冲区中取走一个资源,如果缓冲区为空,必须进入等待,若有多个生产者/消费者同时对共享的缓冲区进行操作,除了考虑生产者/消费者之间的同步问题还需要考虑生产者之间和消费者之间的互斥问题,必须保证同一时间只有一个生产者(消费者)访问缓冲区。
综上:解决生产者/消费者的示意图为:-生产者-消费者P(empty) P(full)P(mutex) P(mutex)... ...生产消费... ...V(mutex) V(mutex)V(full) V(empty)其中,empty,full,mutex这三个信号量分别用来实现缓冲区为空,缓冲区为前满以及互斥的要求。
其中信号量的定义在thread/以及synch.h中其中p和v操作分别如下:voidSemaphore::P(){IntStatus oldLevel = interrupt->SetLevel(IntOff); // disable interruptswhile (value == 0) { // semaphore not availablequeue->Append((void *)currentThread); // so go to sleepcurrentThread->Sleep();}value--; // semaphore available,// consume its value(void) interrupt->SetLevel(oldLevel); // re-enable interrupts}//----------------------------------------------------------------------// Semaphore::V// Increment semaphore value, waking up a waiter if necessary.// As with P(), this operation must be atomic, so we need to disable// interrupts. Scheduler::ReadyToRun() assumes that threads// are disabled when it is called.//----------------------------------------------------------------------voidSemaphore::V(){Thread *thread;IntStatus oldLevel = interrupt->SetLevel(IntOff);thread = (Thread *)queue->Remove();if (thread != NULL) // make thread ready, consuming the V immediatelyscheduler->ReadyToRun(thread);value++;(void) interrupt->SetLevel(oldLevel);}本实验主要修改的文件为:prodcons++.cc实验步骤:本实验主要就是根据提示将prodcons++.cc中缺少的代码补充完整。
首先是生产者调用的producer方法,nempty->P(); // Put the code for //synchronization before ring->Put(message) here.mutex->P(); // ...ring->Put(message);mutex->V(); // Put the //code for synchronization after ring->Put(message) here.nfull->V(); //之后是消费者调用的consumer方法:nfull->P();// Put the code for synchronization before //ring->Get(message) here.mutex->P();// ...ring->Get(message);mutex->V();// Put the code for synchronization after//ring->Get(message) here.nempty->V();// ...最后就是各信号量以及生产者/消费者线程的声明:voidProdCons(){int i;DEBUG('t', "Entering ProdCons");nempty=new Semaphore("empty",BUFF_SIZE); //声明empty信号量nfull=new Semaphore("full",0); //声明full信号量mutex=new Semaphore("mutex",1);//声明互斥信号量// Put the code to construct all the semaphores here.// ....ring=new Ring(BUFF_SIZE);// Put the code to construct a ring buffer object with size//BUFF_SIZE here.// ...//*producers[N_PROD] = new Thread();// create and fork N_PROD of producer threadsfor (i=0; i < N_PROD; i++){// this statemet is to form a string to be used as the name for // produder i.sprintf(prod_names[i], "producer_%d", i);producers[i] = new Thread(prod_names[i]);//生产者线程初始化// Put the code to create and fork a new producer thread using // the name in prod_names[i] and// integer i as the argument of function "Producer"// ...producers[i]->Fork(Producer,i); //挂起生产者线程};// create and fork N_CONS of consumer threadsfor (i=0; i < N_CONS; i++){// this statemet is to form a string to be used as the name for // consumer i.sprintf(cons_names[i], "consumer_%d", i);consumers[i] = new Thread(cons_names[i]);//消费者线程初始化// Put the code to create and fork a new consumer thread using// the name in cons_names[i] and// integer i as the argument of function "Consumer"// ...consumers[i]->Fork(Consumer,i); //挂起消费者线程};}调试记录:不管设置几个生产者,几个消费者,每次的输出结果基本一致。
实验结果:最后执行完后输出得到tmp_0和tmp_1文件(由于这里消费者数量为2,所以有2个tmp文件)tmp_0:producer id --> 0; Message number --> 0;producer id --> 1; Message number --> 0;producer id --> 0; Message number --> 2;producer id --> 2; Message number --> 1;tmp_1:producer id --> 1; Message number --> 1;producer id --> 0; Message number --> 1;producer id --> 0; Message number --> 3;producer id --> 1; Message number --> 2;producer id --> 2; Message number --> 0;producer id --> 2; Message number --> 2;producer id --> 2; Message number --> 3;producer id --> 1; Message number --> 3;分析结果:对于同一个消费者,相同的生产者,生产号是递增的,说明取的时候是按照顺序的。
结论分析与体会:通过这个实验对生产者/消费者问题有了更深入的了解,之前只是一个生产者--一个消费者模式或者一个生产者--多个消费者模式,而多个生产者--多个消费者模式不仅仅需要考虑生产者/消费者之间的同步问题,同时生产者之间,消费者之间的互斥问题也同样需要考虑。