山东大学计算机学院操作系统实验报告
操作系统实验实验报告
![操作系统实验实验报告](https://img.taocdn.com/s3/m/5cabbd06302b3169a45177232f60ddccda38e686.png)
操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。
本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。
实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。
三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。
在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。
通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。
2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。
通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。
在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。
(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。
通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。
2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。
在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。
(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。
《操作系统》实验报告
![《操作系统》实验报告](https://img.taocdn.com/s3/m/9651e14ba31614791711cc7931b765ce05087a98.png)
《操作系统》实验报告一、实验目的操作系统是计算机系统中最为关键的组成部分之一,本次实验的主要目的是深入理解操作系统的基本原理和功能,通过实际操作和观察,熟悉操作系统的核心概念,包括进程管理、内存管理、文件系统和设备管理等,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、进程管理实验进程是操作系统中最基本的执行单元。
在这个实验中,我们使用C++编写程序来创建和管理进程。
通过观察进程的创建、执行和结束过程,理解进程的状态转换和资源分配。
首先,我们编写了一个简单的程序,创建了多个子进程,并通过进程标识符(PID)来跟踪它们的运行状态。
然后,使用等待函数来等待子进程的结束,并获取其返回值。
在实验过程中,我们发现进程的创建和销毁需要消耗一定的系统资源,而且进程之间的同步和通信需要谨慎处理,以避免出现死锁和竞争条件等问题。
2、内存管理实验内存管理是操作系统的核心功能之一,它直接影响系统的性能和稳定性。
在这个实验中,我们研究了动态内存分配和释放的机制。
使用 C++中的 new 和 delete 操作符来分配和释放内存。
通过观察内存使用情况和内存泄漏检测工具,了解了内存分配的效率和可能出现的内存泄漏问题。
同时,我们还探讨了内存分页和分段的概念,以及虚拟内存的工作原理。
通过模拟内存访问过程,理解了页表的作用和地址转换的过程。
3、文件系统实验文件系统是操作系统用于管理文件和目录的机制。
在这个实验中,我们对文件的创建、读写和删除进行了操作。
使用 C++的文件流操作来实现对文件的读写。
通过创建不同类型的文件(文本文件和二进制文件),并对其进行读写操作,熟悉了文件的打开模式和读写方式。
此外,还研究了文件的权限设置和目录的管理,了解了如何保护文件的安全性和组织文件的结构。
4、设备管理实验设备管理是操作系统与外部设备进行交互的桥梁。
山东大学操作系统实验报告4进程同步实验
![山东大学操作系统实验报告4进程同步实验](https://img.taocdn.com/s3/m/4c3a79745a8102d276a22fa6.png)
山东大学操作系统实验报告4进程同步实验计算机科学与技术学院实验报告实验题目:实验四、进程同步实验学号:日期:20120409 班级:计基地12 姓名:实验目的:加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案。
了解 Linux 系统中 IPC 进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。
实验内容:抽烟者问题。
假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。
抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。
一个抽烟者有烟草,一个有纸,另一个有胶水。
系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。
得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。
这一过程重复进行。
请用以上介绍的 IPC 同步机制编程,实现该问题要求的功能。
硬件环境:处理器:Intel® Core™i3-2350M CPU @ 2.30GHz ×4图形:Intel® Sandybridge Mobile x86/MMX/SSE2内存:4G操作系统:32位磁盘:20.1 GB软件环境:ubuntu13.04实验步骤:(1)新建定义了producer和consumer共用的IPC函数原型和变量的ipc.h文件。
(2)新建ipc.c文件,编写producer和consumer 共用的IPC的具体相应函数。
(3)新建Producer文件,首先定义producer的一些行为,利用系统调用,建立共享内存区域,设定其长度并获取共享内存的首地址。
然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。
当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。
山东大学操作系统实验报告3进程调度算法实验
![山东大学操作系统实验报告3进程调度算法实验](https://img.taocdn.com/s3/m/94aa1191f46527d3250ce02e.png)
计算机科学与技术学院实验报告
3) 输入make命令编译连接生成可执行的
psched程序$gmake
gcc -g -c experime nt3.c
gcc psched.o -o psched
4)
执行psched程序
分析:
根据以上示例程序和独立实验程序中观察和记录的信息,说明它们反映出操作系统教材中讲解的哪些进程调度调度策略和功能?在真实的操作系统中它是怎样实现教材中讲解的进程调度效果的。
先进先出算法
算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便一直执行下去,直到该进程完成或阻塞时,才释放处理机。
最高优先权(FPF)优先调度算法
该算法总是把处理机分配给就绪队列中具有最高优先权的进程。
常用以下两种方法来确定进程的优先权:
轮转法
前几种算法主要用于批处理系统中,不能作为分时系统中的主调度算法,在分时系统中,都采用时间片轮转法。
体会:
1. 实验中定义的函数一定要考虑好函数的参数问题,这样才不会出现一些不必要的错误;
2. 对于一些要忽略的信号要忽略掉,免得影响后面的响应过程。
《操作系统》课内实验报告
![《操作系统》课内实验报告](https://img.taocdn.com/s3/m/c378cddfbdeb19e8b8f67c1cfad6195f302be859.png)
《操作系统》课内实验报告一、实验目的本次《操作系统》课内实验的主要目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握常见操作系统命令的使用,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在计算机实验室进行,使用的操作系统为 Windows 10 和Linux(Ubuntu 发行版)。
实验所使用的计算机配置为:Intel Core i5 处理器,8GB 内存,500GB 硬盘。
三、实验内容1、进程管理在 Windows 系统中,通过任务管理器观察进程的状态、优先级、CPU 使用率等信息,并进行进程的结束和优先级调整操作。
在 Linux 系统中,使用命令行工具(如 ps、kill 等)实现相同的功能。
2、内存管理使用 Windows 系统的性能监视器和资源监视器,查看内存的使用情况,包括物理内存、虚拟内存的占用和分配情况。
在 Linux 系统中,通过命令(如 free、vmstat 等)获取类似的内存信息,并分析内存的使用效率。
3、文件系统管理在 Windows 系统中,对文件和文件夹进行创建、复制、移动、删除等操作,了解文件的属性设置和权限管理。
在 Linux 系统中,使用命令(如 mkdir、cp、mv、rm 等)完成相同的任务,并熟悉文件的所有者、所属组和权限设置。
4、设备管理在 Windows 系统中,查看设备管理器中的硬件设备信息,安装和卸载设备驱动程序。
在 Linux 系统中,使用命令(如 lspci、lsusb 等)查看硬件设备,并通过安装内核模块来支持特定设备。
四、实验步骤1、进程管理实验(1)打开 Windows 系统的任务管理器,切换到“进程”选项卡,可以看到当前系统中正在运行的进程列表。
(2)选择一个进程,右键点击可以查看其属性,包括进程 ID、CPU 使用率、内存使用情况等。
(3)通过“结束任务”按钮可以结束指定的进程,但要注意不要随意结束系统关键进程,以免导致系统不稳定。
计算机操作系统实训报告范文
![计算机操作系统实训报告范文](https://img.taocdn.com/s3/m/67288faf534de518964bcf84b9d528ea80c72f11.png)
计算机操作系统实训报告范文英文版Computer Operating System Practical Training Report SampleIntroductionIn this report, I will discuss the practical training I underwent in the computer operating system course. The training involved hands-on experience with various operating systems, including Windows, Linux, and MacOS. I will provide an overview of the tasks I completed during the training, as well as the skills I acquired.Tasks CompletedDuring the practical training, I completed a series of tasks aimed at familiarizing myself with the different operating systems. These tasks included installing and configuring the operating systems, managing user accounts, setting up network connections, and troubleshooting common issues. I also learned how to use command line interfaces and perform system maintenance tasks.Skills AcquiredThrough the practical training, I acquired a range of skills that will be valuable in my future career as a computer scientist. I learned how to navigate and customize different operating systems, troubleshoot software and hardware issues, and optimize system performance. I also gained experience working with virtual machines and remote access tools, which will be useful in a variety of professional settings.ConclusionOverall, the practical training in the computer operating system course was a valuable learning experience. I gained a deeper understanding of how operating systems work and developed practical skills that will benefit me in my future career. I lookforward to applying what I have learned in future projects and continuing to expand my knowledge in this field.英文版计算机操作系统实训报告范文介绍在这份报告中,我将讨论我在计算机操作系统课程中接受的实训。
山东大学操作系统实验报告4进程同步实验
![山东大学操作系统实验报告4进程同步实验](https://img.taocdn.com/s3/m/4820becf58fafab069dc02da.png)
山东大学操作系统实验报告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的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。
(完整)山东大学操作系统实验一实验报告
![(完整)山东大学操作系统实验一实验报告](https://img.taocdn.com/s3/m/383e4216d5bbfd0a785673cb.png)
(完整)山东大学操作系统实验一实验报告
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)山东大学操作系统实验一实验报告)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)山东大学操作系统实验一实验报告的全部内容。
操作系统课程设计实验报告
结论分析与体会:
通过这次实验,我熟悉了操作系统实验的环境,进一步了解了Nachos的构成,对我以后顺利熟练的完成操作系统实验有很大的帮助!。
山东大学计算机学院操作系统实验报告
![山东大学计算机学院操作系统实验报告](https://img.taocdn.com/s3/m/01e0646b4b73f242336c5fe5.png)
操作系统课程设计报告学院:计算机科学与技术学院专业:计算机科学与技术班级:20**级*班姓名:***学号:20**********目录一实验平台 (4)二Project1建立线程系统 (4)Task1.1实现KThread.join() (4)1.要求 (4)2.分析 (4)3.方案 (4)4.实现代码 (5)Task1.2利用中断提供原子性,直接实现条件变量 (6)1.要求 (6)2.分析 (6)3.方案 (7)4.实现代码 (7)Task1.3实现waitUntil (9)1.要求 (9)2.分析 (9)3.方案 (10)4.实现代码 (10)Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen (12)1.要求 (12)2.分析 (12)3.方案 (13)4.实现代码 (13)Task1.5完成PriorityScheduler实现优先级调度 (16)1.要求 (16)2.分析 (16)3.方案 (17)4.实现代码 (17)Task1.6 (20)1.要求 (20)2.分析 (21)3.方案 (22)4.实现代码 (22)三Project2多道程序设计 (31)Task2.1 (31)1.要求 (31)2.分析 (31)3.方案 (32)4.实现代码 (35)Task2.2 (40)1.要求 (40)2.分析 (40)3.方案 (41)4.实现代码 (42)Task2.3 (48)1.要求 (48)2.分析 (49)3.方案 (49)4.实现代码 (50)Task2.4 (53)1.要求 (53)2.分析 (53)3.方案 (54)4.实现代码 (54)一实验平台开发语言:Java开发工具:Eclipse Luna操作系统:Ubuntu14.04二P roject1建立线程系统Task1.1实现KThread.join()1.要求实现Implement KThread.join()函数。
《操作系统》课程实验报告
![《操作系统》课程实验报告](https://img.taocdn.com/s3/m/f92ae5a7c9d376eeaeaad1f34693daef5ef71328.png)
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。
同时,实现进程的正常终止和异常终止,并分析其对系统的影响。
2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。
通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。
(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。
(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。
(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。
2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。
(2)创建多个进程,模拟对共享资源的并发访问。
(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。
(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
山东大学操作系统实验5进程互斥实验
![山东大学操作系统实验5进程互斥实验](https://img.taocdn.com/s3/m/c1dbed21ed630b1c59eeb538.png)
sem_id
*
输入参数:
* sem_key
信号灯数组的键值
* sem_val
信号灯数组中信号灯的个数
* sem_flag
信号等数组的存取权限
*/
int set_sem(key_t sem_key,int sem_val,int sem_flg) {
int sem_id;
Sem_uns sem_arg;
pput_key[0]=105;
buff_key[1]=106;
pput_key[1]=107;
prod_key = 201;
pmtx_key = 202;
cons_key = 301;
cmtx_key = 302;
shm_flg=IPC_CREAT|0644;
sem_flg = IPC_CREAT | 0644;
#define BUFSZ 256
int get_ipc_id(char *proc_file,key_t key);
char *set_shm(key_t shm_key,int shm_num,int shm_flag);
int set_msq(key_t msq_key,int msq_flag);
exit(EXIT_FAILURE);
}
if((shm_buf = (char *)shmat(shm_id,0,0)) < (char *)0) {
perror("get shareMemory error");
exit(EXIT_FAILURE);
}
for(i=0; i<shm_num; i++)
3、分析清楚实验要求,便开始用编程语言进行编程,将分析的思路用编程语言实现。
山大操作系统实验-1教程文件
![山大操作系统实验-1教程文件](https://img.taocdn.com/s3/m/8bade20ebe1e650e52ea99fb.png)
操作系统原理实验报告——实验一
张咪软件工程四班
一、实验目的
加深对于进程并发执行概念的理解。实践并发进/线程的创建和控制方法。观察和体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux系统中进/线程创建与控制有关的系统调用的编程和调试技术。
signal(SIGINT,(sighandler_t)sigcat);
int count=0;
while(count<5){
if((pid1=fork())==0){
pause();
printf("%d This is child1 running\n",getpid());
status1=execve(args1[0],args1,NULL);
printf("%d Father: Child2 finnished\n",getpid());
count++;
if(kill(pid1,SIGINT)>=0){
waitpid(pid1,&status1,0);
printf("%d Father: Child1 finished.\n",getpid());
八、代码
#include"pro.h"
int main(int argc,char *argv[])
{
int i;
int pid1,pid2;
int status1,status2;
char *args1[]={"/bin/ls","-a",NULL};
计算机操作系统实验课实验报告
![计算机操作系统实验课实验报告](https://img.taocdn.com/s3/m/a6f167dfed3a87c24028915f804d2b160a4e8607.png)
计算机操作系统实验课实验报告一、实验目的本次计算机操作系统实验课的主要目的是通过实际操作和观察,深入理解计算机操作系统的基本原理和功能,提高对操作系统的实际运用能力和问题解决能力。
二、实验环境本次实验使用的计算机配置为:处理器_____,内存_____,操作系统为_____。
实验所使用的软件工具包括_____。
三、实验内容及步骤(一)进程管理实验1、编写程序创建多个进程,并观察进程的执行顺序和资源分配情况。
首先,使用编程语言(如 C 或 Java)编写代码,创建多个进程。
然后,通过操作系统提供的工具(如任务管理器)观察进程的创建、执行和结束过程。
记录不同进程的执行时间、CPU 使用率和内存占用情况。
2、实现进程间的通信机制,如管道、消息队列等。
分别编写使用管道和消息队列进行进程间通信的程序。
在程序中发送和接收数据,并观察通信的效果和数据的完整性。
(二)内存管理实验1、模拟内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
编写程序实现上述三种内存分配算法。
输入不同的内存请求序列,观察每种算法下内存的分配情况和碎片产生情况。
2、研究虚拟内存的工作原理,并进行相关实验。
通过操作系统的设置,调整虚拟内存的大小。
运行大型程序,观察虚拟内存的使用情况和系统性能的变化。
(三)文件系统实验1、实现文件的创建、读写和删除操作。
使用编程语言创建文件,并向文件中写入数据。
读取文件中的内容,并进行验证。
删除文件,观察文件系统的变化。
2、研究文件系统的目录结构和文件权限管理。
观察文件系统的目录层次结构,了解目录的组织方式。
设置文件的权限,如只读、读写、执行等,观察不同权限对文件操作的影响。
四、实验结果与分析(一)进程管理实验结果与分析1、在创建多个进程的实验中,发现进程的执行顺序并非完全按照创建的顺序,而是由操作系统的调度算法决定。
某些进程可能会因为等待资源而暂时被挂起,而其他进程则会得到执行机会。
2、通过进程间通信实验,发现管道通信方式简单直接,但只能用于具有亲缘关系的进程之间;消息队列则更加灵活,可以在不同的进程之间传递消息,但需要更多的编程和管理工作。
山东大学操作系统试验报告
![山东大学操作系统试验报告](https://img.taocdn.com/s3/m/f70ec08ce53a580216fcfe25.png)
计算机科学与技术学院操作系统实验报告学院:专业:班级:姓名:学号:日期:Email:目录实验一进程控制实验 (4)1.1实验目的 (4)1.2实验题目 (4)1.3实验步骤 (4)1.4结论分析与体会 (5)1.5附录:本实验全部程序源代码及注释 (5)1.5.1Pctl.c (5)1.5.2pctl.h (9)1.5.3makefile (10)实验三进程调度算法实验 (10)3.1实验目的 (10)3.2实验题目 (11)3.3实验步骤 (11)3.4结论分析与体会 (12)3.5附录:本实验全部程序源代码及注释 (12)3.5.1Psched.c (12)3.5.2Psched.h (14)3.5.3Makefile (16)实验四进程同步实验 (16)4.1实验目的 (16)4.2实验题目 (16)4.3实验步骤 (17)4.4结论分析与体会 (24)4.5附录:本实验全部程序源代码及注释 (24)4.5.1Ipc.c (24)4.5.2Ipc.h (32)4.5.3Consumer (35)4.5.4Producer (41)4.5.5makefile (50)实验七内存页面置换算法实验 (51)7.1实验目的 (51)7.2实验题目 (51)7.3实验步骤 (52)7.4附录:本实验全部程序源代码及注释 (55)7.4.1Vmrp.h (55) (57)7.5.3makefile (73)实验八磁盘移臂调度算法实验 (74)7.2实验目的 (74)8.2实验题目 (74)8.3实验步骤 (75)8.4附录:本实验全部程序源代码及注释 (76)8.4.1Dask.h (76) (78)8.4.3Makefile (94)实验一进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。
实践并发进程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
山东大学操作系统实验七实验报告
![山东大学操作系统实验七实验报告](https://img.taocdn.com/s3/m/a86e3cb9856a561252d36f9f.png)
计算机科学与技术学院实验报告
8 }
在文件../test/第5行上的语句Exec是一条Nachos的系统功能调用,它的功能为装入并执行以其参数为名的可执行文件,即创建一个新的用户进程。
假设我们先执行../test/ 程序,则../test/ 会在它还没有执行结束时又装入并执行另外一个程序,并与它同时驻留内存.
pageTable[i].physicalPage=usermap-->Find();避免从头开始物理存储覆盖了前一个用户程序的内存内容
利用Nachos在../userprog/ 中文件定义的Bitmap类。
利用bitmap记录和申请内存物理帧,使不同的程序装入到不同的物理空间中去,下面是对新的内存分配存储算法,改进了对多个用户程序的同时进驻内存的支持
这是对BitMap的代码修改,每次分配的时候要找到bitmap中的空闲页进行分配,而不能从0页开始分配在AddressSpace类中声明bitmap对象
static BitMap *mbitmap=new BitMap(NumPhysPages);
运行./nachos –x ../test/
结论分析与体会:
nachos无法运行多个用户程序的原因在于物理页的分配,那么改变物理页的分配,使多个程序的物理页不会相互覆盖,每个程序都能分配到对应的独立的物理页,那么不就可以同时执行多个用户程序了吗。
物理页的分配算法在BitMap类中有实现,使用一个数组作为物理页的数据结构。
在给用户程序分配物理页时,不再使用与逻辑页相同的数值,而是使用Find()方法查找下一个可用的物理页。
山大操作系统实验 1
![山大操作系统实验 1](https://img.taocdn.com/s3/m/38e0590ab84ae45c3a358c58.png)
山大操作系统实验1 -CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN操作系统原理实验报告——实验一张咪软件工程四班一、实验目的加深对于进程并发执行概念的理解。
实践并发进/线程的创建和控制方法。
观察和体验进程的动态特性。
进一步理解进程生命期期间创建、变换、撤销状态变换的过程。
掌握进程控制的方法,了解父子进程间的控制和协作关系。
练习Linux系统中进/线程创建与控制有关的系统调用的编程和调试技术。
二、实验要求编写一个多进程并发执行程序。
父进程每隔3秒重复建立两个子进程,首先创建的让其执行ls命令,之后创建执行让其执行ps命令,并控制ps命令总在ls 命令之前执行。
三、实验软硬件环境实验环境均为Linux操作系统,开发工具为gcc和g++。
四、实验思路调用fock()创建子进程。
创建键盘中断信号后,使用pause()可以暂停子进程执行,继续创建新的子进程。
子进程并发执行子进程可以首先通过键盘中断信号唤醒子进程。
通过exec()调用族装入一个新的执行程序。
在建立子进程2并且唤醒子进程1后子进程sleep(seconds = 5)。
这样就可以先执行ps后执行ls。
最后就是父进程的结束,程序结束。
五、实验模型六、调试排错1、首先遇到的问题是,对linux的操作不熟悉,不太明白makefile怎么使用,直接用了gcc2、在创建多个子进程上遇到了问题,在fock()后又直接跟了一个fork(),这样创建的子进程是子进程的子进程,而不是父进程创建的第二个子进程。
所以应该在else语句块后面,也就是主进程执行段继续创建。
一般情况下,fork()按如下规则编程:main(){ pid_t pid;pid=fork();if(pid<0){n",getpid());}}}}}return (EXIT_SUCCESS);}#include<sys/>#include<>#include<>#include<>#include<>#include<>typedef void(*sighandler_t)(int);void sigcat(){printf("Process continue\n");}。
山东大学操作系统实验6死锁问题实验
![山东大学操作系统实验6死锁问题实验](https://img.taocdn.com/s3/m/6b27f142767f5acfa1c7cd3b.png)
sem_init(&mutex3,0,1);
sem_init(&mutex4,0,1);
t=malloc(6*sizeof(pthread_t));
printf("现在开始火车行驶问题模拟\n");
printf("---------------------------------------\n");
Rw:
#include<stdlib.h>
#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
void* read(void* tid);
void* write(void* tid);
//使用经典读写互斥解决这一问题,即当从甲地往乙地有一辆火车时,
(5)火车单行道调度试验是通过将火车单行道两端所有权表示为两种资源,一个城市想要开火车到对方城市需要同时获得单行道两端(两种资源)所有权,类似哲学家就餐问题使用条件变量表示资源是否可用。可以将哲学家问题潜移默化修改哲学家个数成2就是火车单行道问题解决方案。任意时刻只有一个进程获得管程所有权,解决了死锁问题。
举个例子,当有多个进程需要打印文件时,如果系统分配打印机的策略是最短文件优先,那么长文件的打印任务将由于短文件的源源不断到来而被无限期推迟,导致最终的饥饿甚至饿死。
而产生死锁的原因可归结为如下两点:
(1)竞争资源。当系统中供多个进程共享的资源如打印机、公用队列等,其数目不足以满足进程的需要时,会引起诸进程的竞争而产生死锁。
sleep(rate);
山东大学操作系统实验六实验报告
![山东大学操作系统实验六实验报告](https://img.taocdn.com/s3/m/0e7ce08384868762caaed514.png)
计算机科学与技术学院实验报告实验题目: Nachos User Programs and System学号: 201100300038 Calls日期:2013-11-27 班级: 11级03 姓名:陶旭涛Email: 1595242630@实验目的:实验并熟悉Nachos中的用户程序,你需要实现Nachos系统调用的代码。
其目的是理解如何将用户进程启动通过系统调用与操作系统内核如何将用户进程交互硬件环境:Mem:3.9GDisk:15.5 GB软件环境:System:ubuntu12.04LST i386gcc: (Ubuntu 4.6.3-1ubuntu5) 4.6.3nachos system实验步骤:1: ../test 中现有 5 个 C 语言用户源程序,可以通过 make 命令一次性编译连接生成它们的可执行文件和其在该目录中的符号链接2:进入../userprog 目录,使用 make 命令生成带有基本内存管理功能的 Nachos 内核。
现在我们就可以使用新的内核执行用户程序了。
例如,为了执行../test 目录中的 halt.noff 程序,可以输入命令:$./nachos –x ../test/halt.noff$./nachos –d ../test/halt.noff3:为了能够了解 Nachos 中多用户程序驻留内存的情况,可以在 AssSpace类中增加以下打印成员函数 Print:4:最小的用户程序 halt.c 会占用 10 页的内存空间。
如果你想验证系统能否分配更多的内存页,可以在用户程序中说明一些较大的数组。
例如,修改 halt.c,在其中说明一个静态数组 a:#include "syscall.h"static int a[40];intmain(){Halt();/* not reached */}再次执行../test 目录中的 make,并再次进入../userprog 目录,使用 make 命令生成带有输出用户程序页分配信息的 Nachos 内核。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东大学计算机学院操作系统实验报告操作系统课程设计报告学院:计算机科学与技术学院专业:计算机科学与技术班级:20**级*班姓名:***学号:20********** 目录一实验平台 (5)二Project1建立线程系统 (5)Task1.1实现KThread.join() (5)1.要求 (5)2.分析 (5)3.方案 (5)4.实现代码 (6)Task1.2利用中断提供原子性,直接实现条件变量 (7)1.要求 (7)2.分析 (7)3.方案 (8)4.实现代码 (8)Task1.3实现waitUntil (10)1.要求 (10)2.分析 (10)3.方案 (11)4.实现代码 (11)Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen (13)1.要求 (13)2.分析 (14)3.方案 (14)4.实现代码 (14)Task1.5完成PriorityScheduler实现优先级调度 (17)1.要求 (17)2.分析 (17)3.方案 (18)4.实现代码 (18)Task1.6 (22)1.要求 (22)2.分析 (22)3.方案 (23)4.实现代码 (23)三Project2多道程序设计 (33)Task2.1 (33)1.要求 (33)2.分析 (33)3.方案 (34)4.实现代码 (37)Task2.2 (42)1.要求 (42)2.分析 (42)3.方案 (42)4.实现代码 (44)Task2.3 (51)1.要求 (51)2.分析 (51)3.方案 (51)4.实现代码 (53)Task2.4 (55)1.要求 (55)2.分析 (55)3.方案 (56)4.实现代码 (56)一实验平台开发语言:Java开发工具:Eclipse Luna操作系统:Ubuntu14.04二P roject1建立线程系统Task1.1实现KThread.join()1.要求实现Implement KThread.join()函数。
注意:其它的线程不必调用join 函数,但是如果它被调用的话,也只能被调用一次。
对join函数第二次调用的执行结果是不被定义的(即使第二次调用的线程与第一次调用的线程不同)。
2.分析Join函数的作用即为等待某线程运行完毕. 当前线程(唯一一个正在运行的线程) A调用另一个线程(处于就绪状态) B的join函数时(A 和B 在Nachos中均为KThread类型对象), A被挂起, 直到B运行结束后, join函数返回, A才能继续运行。
3.方案原KThread的join()中的Lib.assertTrue(this != currentThread)已经实现线程只能调用一次join()方法,根据要求,在调用join()方法时,让当前运行线程休眠,并将当前运行的线程加入到一个阻塞队列中。
在线程结束时,finish()函数循环唤醒所有被阻塞的线程。
4.实现代码public void join(){Lib.debug(dbgThread, "Joining to thread: " + toString());Lib.assertTrue(this != currentThread);boolean intStatus = Machine.interrupt().disable();if (status != statusFinished){waitForJoin.waitForAccess(currentThread);KThread.sleep();}}public static void finish(){Lib.debug(dbgThread, "Finishing thread: " + currentThread.toString());Machine.interrupt().disable();Machine.autoGrader().finishingCurrentThread();Lib.assertTrue(toBeDestroyed == null);toBeDestroyed = currentThread;currentThread.status = statusFinished;KThread waitThread;while ((waitThread = currentThread.waitForJoin.nextThread()) != null){waitThread.ready();}sleep();}Task1.2利用中断提供原子性,直接实现条件变量1.要求通过利用中断有效和无效所提供的原子性实现条件变量。
我们已经提供类似的例子用例实现信号量。
你要按此提供类似的条件变量的实现,不能直接利用信号量来实现(你可以使用lock,虽然它间接地调用了信号量)。
在你完成时要提供条件变量的两种实现方法。
你的第二种条件变量实现要放在nachos.threads.Condition2中。
2.分析threads.Lock类提供了锁以保证互斥. 在临界代码区的两端执行Lock.acquire() 和Lock.release() 即可保证同时只有一个线程访问临界代码区. 条件变量建立在锁之上, 由threads.Condition实现, 它是用来保证同步的工具. 每一个条件变量拥有一个锁变量(该锁变量亦可被执行acquire和release操作, 多个条件变量可共享同一个锁变量). 当处于临界区内的拥有某锁L的当前线程对与锁L联系的条件变量执行sleep操作时, 该线程失去锁L 并被挂起. 下一个等待锁L的线程获得锁L (这个过程由调度程序完成) 并进入临界区. 当拥有锁L的临界区内的当前线程对与锁L联系的条件变量执行wake 操作时(通常调用wake之后紧接着就是Lock.release), 等待在该条件变量上的之多一个被挂起的线程(由调用sleep引起) 被重新唤醒并设置为就绪状态. 若执行wakeall操作, 则等待在该条件变量上的所有被挂起的线程都被唤醒.3.方案condition.sleep 采用waiter.P() 实现休眠(waitor是一个信号量) 并将waitor放入信号量队列, 在我们的实现中改成用KThread.sleep()实现休眠并将当前线程放入线程队列, 并在sleep函数开始/结尾处屏蔽/允许中断以保证原子性。
condition.wake中从等待信号量队列中取出信号量并对其进行V操作实现唤醒, 在我们的实现中改成从线程队列中取出线程用KThread.ready() 实现唤醒(同样要在wake函数开始/结尾处屏蔽/允许中断)。
wakeall函数的实现依赖于wake(). 只需不断地wake 直到队列为空为止.4.实现代码private ThreadQueue waitQueue =ThreadedKernel.scheduler.newThreadQueue(false);private boolean hasWaiter = false;public void sleep(){Lib.assertTrue(conditionLock.isHeldByCurrentThread());boolean intStatus = Machine.interrupt().disable();waitQueue.waitForAccess(KThread.currentThread());hasWaiter = true;conditionLock.release();KThread.sleep();conditionLock.acquire();Machine.interrupt().restore(intStatus);}public void wake(){Lib.assertTrue(conditionLock.isHeldByCurrentThread());boolean intStatus = Machine.interrupt().disable();KThread thread = waitQueue.nextThread();if (thread != null)thread.ready();elsehasWaiter=false;Machine.interrupt().restore(intStatus);}public void wakeAll(){Lib.assertTrue(conditionLock.isHeldByCurrentThread());while (hasWaiter)wake();}Task1.3实现waitUntil1.要求通过实现waitUntil(int x)方法来完成Alarm类。
2.分析一个线程通过调用waitUntil函数来挂起它自己,直到now+x后才被唤醒。
在实时操作中,对线程是非常有用的,例如实现光标每秒的闪烁。
这里并不要求线程被唤醒后马上执行它,只是在它等待了指定时间后将它。
放入等待队列中。
不要通过产生任何附加的线程来实现waitUntil函数,你仅需要修改waitUntil 函数和时间中断处理程序。
waitUntil函数并不仅限于一个线程使用,在任意时间,任意多的线程可以调用它来阻塞自己。
3.方案于Alarm类有关的是machine.Timer类. 它在大约每500个时钟滴答使调用回调函数(由Timer.setInterruptHandler函数设置). 因此, Alarm类的构造函数中首先要设置该回调函数Alarm.timerInterrupt().为了实现waitUntil, 需要在Alarm类中实现一个内部类Waiter, 保存等待的线程及其唤醒时间.在调用waitUntil(x) 函数时, 首先得到关于该线程的信息: (线程: 当前线程, 唤醒时间: 当前时间+x), 然后构造新的Waiter对象, 并调用sleep操作使当前线程挂起. 在时钟回调函数中(大约每500个时钟间隔调用一次) 则依次检查队列中的每个对象。
如果唤醒时间大于当前时间, 则将该对象移出队列并执行wake操作将相应线程唤醒。
4.实现代码class Waiter{Waiter(long wakeTime,KThread thread){this.wakeTime=wakeTime;this.thread=thread;private long wakeTime;private KThread thread;}public void waitUntil(long x){boolean intStatus = Machine.interrupt().disable();long wakeTime = Machine.timer().getTime() + x;Waiter waiter = new Waiter(wakeTime,KThread.currentThread());waitlist.add(waiter);System.out.println(KThread.currentThread().getName() +"线程休眠,时间为:"+Machine.timer().getTime()+",应该在"+wakeTime+"醒来.");KThread.sleep();Machine.interrupt().restore(intStatus);}public void timerInterrupt(){Waiter waiter;for(int i=0;i<waitlist.size();i++)waiter=waitlist.remove();if(waiter.wakeTime<= Machine.timer().getTime()){System.out.println("唤醒线程:"+waiter.thread.getName()+",时间为:"+Machine.timer().getTime());waiter.thread.ready();//线程进入就绪状态}elsewaitlist.add(waiter);}KThread.currentThread().yield();}private LinkedList<Waiter> waitlist;Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen1.要求使用条件变量来实现一个字长信息的发送和接收同步。