操作系统课程设计实验报告proj2

合集下载

操作系统实验二实验报告

操作系统实验二实验报告

操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。

通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。

二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。

三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。

2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。

3、为新进程指定可执行文件的路径、命令行参数、进程属性等。

4、编写代码来等待新进程的结束,并获取其退出代码。

(二)进程同步实验1、设计一个生产者消费者问题的模型。

2、使用信号量来实现生产者和消费者进程之间的同步。

3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。

4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。

(三)进程通信实验1、选择使用管道来实现进程之间的通信。

2、创建一个匿名管道,父进程和子进程分别读写管道的两端。

3、父进程向管道写入数据,子进程从管道读取数据并进行处理。

四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。

通过观察进程的创建和执行过程,加深了对进程概念的理解。

(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。

分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。

(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。

数据能够准确地在进程之间传递,验证了管道通信的有效性。

五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。

通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。

(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。

《操作系统》实验报告

《操作系统》实验报告

《操作系统》实验报告一、实验目的操作系统是计算机系统中最为关键的组成部分之一,本次实验的主要目的是深入理解操作系统的基本原理和功能,通过实际操作和观察,熟悉操作系统的核心概念,包括进程管理、内存管理、文件系统和设备管理等,提高对操作系统的实际应用能力和问题解决能力。

二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、进程管理实验进程是操作系统中最基本的执行单元。

在这个实验中,我们使用C++编写程序来创建和管理进程。

通过观察进程的创建、执行和结束过程,理解进程的状态转换和资源分配。

首先,我们编写了一个简单的程序,创建了多个子进程,并通过进程标识符(PID)来跟踪它们的运行状态。

然后,使用等待函数来等待子进程的结束,并获取其返回值。

在实验过程中,我们发现进程的创建和销毁需要消耗一定的系统资源,而且进程之间的同步和通信需要谨慎处理,以避免出现死锁和竞争条件等问题。

2、内存管理实验内存管理是操作系统的核心功能之一,它直接影响系统的性能和稳定性。

在这个实验中,我们研究了动态内存分配和释放的机制。

使用 C++中的 new 和 delete 操作符来分配和释放内存。

通过观察内存使用情况和内存泄漏检测工具,了解了内存分配的效率和可能出现的内存泄漏问题。

同时,我们还探讨了内存分页和分段的概念,以及虚拟内存的工作原理。

通过模拟内存访问过程,理解了页表的作用和地址转换的过程。

3、文件系统实验文件系统是操作系统用于管理文件和目录的机制。

在这个实验中,我们对文件的创建、读写和删除进行了操作。

使用 C++的文件流操作来实现对文件的读写。

通过创建不同类型的文件(文本文件和二进制文件),并对其进行读写操作,熟悉了文件的打开模式和读写方式。

此外,还研究了文件的权限设置和目录的管理,了解了如何保护文件的安全性和组织文件的结构。

4、设备管理实验设备管理是操作系统与外部设备进行交互的桥梁。

操作系统课程设计实验报告

操作系统课程设计实验报告

操作系统课程设计实验报告操作系统课程设计实验报告引言:操作系统是计算机科学中的重要课程,通过实验设计,可以帮助学生更好地理解操作系统的原理和实践。

本文将结合我们在操作系统课程设计实验中的经验,探讨实验设计的目的、实验过程和实验结果,以及对操作系统的理解和应用。

一、实验设计目的操作系统课程设计实验的目的是帮助学生深入理解操作系统的工作原理和实际应用。

通过设计和实现一个简单的操作系统,学生可以更好地掌握操作系统的各个组成部分,如进程管理、内存管理、文件系统等。

同时,实验设计还可以培养学生的动手能力和问题解决能力,提高他们对计算机系统的整体把握能力。

二、实验过程1. 实验准备在进行操作系统课程设计实验之前,我们需要对操作系统的基本概念和原理进行学习和理解。

同时,还需要掌握一些编程语言和工具,如C语言、汇编语言和调试工具等。

这些准备工作可以帮助我们更好地进行实验设计和实现。

2. 实验设计根据实验要求和目标,我们设计了一个简单的操作系统实验项目。

该项目包括进程管理、内存管理和文件系统三个主要模块。

在进程管理模块中,我们设计了进程创建、调度和终止等功能;在内存管理模块中,我们设计了内存分配和回收等功能;在文件系统模块中,我们设计了文件的创建、读写和删除等功能。

通过这些模块的设计和实现,我们可以全面了解操作系统的各个方面。

3. 实验实现在进行实验实现时,我们采用了分阶段的方法。

首先,我们实现了进程管理模块。

通过编写相应的代码和进行调试,我们成功地实现了进程的创建、调度和终止等功能。

接下来,我们实现了内存管理模块。

通过分配和回收内存空间,我们可以更好地管理系统的内存资源。

最后,我们实现了文件系统模块。

通过设计文件的读写和删除等功能,我们可以更好地管理系统中的文件资源。

三、实验结果通过实验设计和实现,我们获得了一些有意义的结果。

首先,我们成功地实现了一个简单的操作系统,具备了进程管理、内存管理和文件系统等基本功能。

《操作系统》实验报告

《操作系统》实验报告

一、实验目的1. 理解进程的概念及其在操作系统中的作用。

2. 掌握进程的创建、调度、同步和通信机制。

3. 学习使用进程管理工具进行进程操作。

4. 提高对操作系统进程管理的理解和应用能力。

二、实验环境1. 操作系统:Windows 102. 软件环境:Visual Studio 20193. 实验工具:C++语言、进程管理工具(如Task Manager)三、实验内容1. 进程的创建与销毁2. 进程的调度策略3. 进程的同步与互斥4. 进程的通信机制四、实验步骤1. 进程的创建与销毁(1)创建进程使用C++语言编写一个简单的程序,创建一个新的进程。

程序如下:```cpp#include <iostream>#include <windows.h>int main() {// 创建进程STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi, sizeof(pi));// 创建进程if (!CreateProcess(NULL, "notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {std::cout << "创建进程失败" << std::endl;return 1;}std::cout << "进程创建成功" << std::endl;// 等待进程结束WaitForSingleObject(pi.hProcess, INFINITE);// 销毁进程CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return 0;}```(2)销毁进程在上面的程序中,通过调用`WaitForSingleObject(pi.hProcess, INFINITE)`函数等待进程结束,然后使用`CloseHandle(pi.hProcess)`和`CloseHandle(pi.hThread)`函数销毁进程。

《操作系统》课内实验报告

《操作系统》课内实验报告

《操作系统》课内实验报告一、实验目的本次《操作系统》课内实验的主要目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握常见操作系统命令的使用,提高对操作系统的实际应用能力和问题解决能力。

二、实验环境本次实验在计算机实验室进行,使用的操作系统为 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)通过“结束任务”按钮可以结束指定的进程,但要注意不要随意结束系统关键进程,以免导致系统不稳定。

操作系统课程实验报告

操作系统课程实验报告

一、实验概述实验名称:操作系统课程实验实验目的:1. 理解操作系统基本概念、原理及功能;2. 掌握操作系统的基本操作和应用;3. 提高实际操作能力和分析问题、解决问题的能力。

实验内容:1. 操作系统基本概念及原理的学习;2. 操作系统基本操作的应用;3. 实验项目:文件读写、多进程、多线程。

二、实验环境操作系统:Windows 10编译器:Visual Studio语言:C/C++实验平台:Windows 10系统下的虚拟机三、实验过程1. 操作系统基本概念及原理的学习操作系统是计算机系统中最基本的系统软件,负责管理计算机硬件资源、提供用户接口以及执行各种应用程序。

在实验过程中,我们学习了以下基本概念及原理:(1)进程管理:进程是操作系统能够进行运算处理的独立单位,具有动态性、并发性、异步性和独立性等特点。

进程管理主要包括进程的创建、调度、同步、通信和终止等。

(2)内存管理:内存管理是操作系统核心功能之一,主要负责分配、回收、保护和管理内存资源。

内存管理方式有分页、分段、段页式等。

(3)文件系统:文件系统是操作系统用于存储、检索和管理文件的机制。

文件系统主要包括目录结构、文件属性、文件操作等。

(4)设备管理:设备管理负责管理计算机系统中的各种外部设备,包括输入、输出和存储设备。

设备管理主要包括设备分配、设备驱动程序、缓冲区管理等。

2. 操作系统基本操作的应用在实验过程中,我们应用以下基本操作:(1)进程管理:创建、调度、同步、通信和终止进程。

(2)内存管理:分配、回收、保护和管理内存资源。

(3)文件系统:创建、删除、读写文件,实现目录结构的管理。

(4)设备管理:分配、回收、控制和管理设备。

3. 实验项目:文件读写、多进程、多线程(1)文件读写实验实验目的:掌握文件的基本操作,实现文件的创建、打开、读取、写入和关闭。

实验步骤:① 创建一个文件,命名为“test.txt”。

② 打开文件,以读写模式。

操作系统课程实验报告

操作系统课程实验报告

操作系统课程实验报告一、实验目的操作系统是计算机系统中最核心的软件之一,它负责管理计算机的硬件资源和软件资源,为用户提供一个方便、高效、安全的工作环境。

本实验的目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握操作系统的常用命令和操作方法,提高解决实际问题的能力。

二、实验环境操作系统:Windows 10开发工具:Visual Studio Code三、实验内容1、进程管理观察进程的创建、终止和状态转换。

使用任务管理器查看系统中的进程信息,包括进程 ID、CPU 使用率、内存占用等。

通过编程实现创建和终止进程的功能。

2、内存管理了解内存的分配和回收机制。

使用 Windows 系统提供的性能监视器查看内存的使用情况。

编程实现简单的内存分配和释放算法。

3、文件系统管理熟悉文件和目录的操作,如创建、删除、复制、移动等。

研究文件的属性,如文件名、文件大小、创建时间等。

通过编程实现文件的读写操作。

4、设备管理认识设备的驱动程序和设备管理策略。

查看系统中的设备信息,如磁盘驱动器、打印机等。

模拟设备的中断处理过程。

四、实验步骤1、进程管理实验打开任务管理器,观察当前系统中正在运行的进程。

可以看到进程的名称、进程 ID、CPU 使用率、内存占用等信息。

使用 C++语言编写一个简单的程序,创建一个新的进程。

在程序中,使用`CreateProcess`函数来创建新进程,并设置进程的属性和参数。

编写另一个程序,用于终止指定的进程。

通过获取进程 ID,然后使用`TerminateProcess`函数来终止进程。

2、内存管理实验打开 Windows 性能监视器,选择“内存”选项卡,可以查看内存的使用情况,包括物理内存、虚拟内存、页面文件等的使用量和使用率。

编写一个 C 程序,使用动态内存分配函数(如`malloc`和`free`)来分配和释放内存。

在程序中,不断分配和释放一定大小的内存块,观察内存的使用情况和性能变化。

操作系统课程设计实验报告

操作系统课程设计实验报告

输出结果按字典排序
输出 当前 目录 ,及 下级 目录
从一个终端登
录,打开一个文
输出
件,保持文件的
指定
打开状态,然后
目录
从另外的终端
登录,去掉文件
的读权限
Ls 命令结束
内核模块:打印 super_block 结构中的一些域的值。
开始
加锁
遍历节点
尾节点
否 是
打印文件系统 所在设备的主 设备号和次设 备号
#define S_IFMT 0170000 记录文件的类型#define S_IFREG0100000 regular #define S_IFDIR 0040000directory #define S_IBLK 0060000 特殊块 #define S_IFCHR 0020000 字符块 #define S_IFIFO 0010000 fifo #define S_IFLNK 0120000 文件连接数 #define S_IFSOCK 0140000 通道 if(S_ISDIR(mode)) str[0] = 'd';是设备 if(S_ISCHR(mode)) str[0] = 'c'; 字符设备 if(S_ISDIR(mode)) str[0] = 'b';块设备 if(S_IRUSR & mode) str[1] = 'r';可读 if(S_IWUSR & mode) str[2] = 'w';可写 if(S_IXUSR & mode) str[3] = 'x';可执行 if(S_IRGRP & mode) str[4] = 'r';可读 if(S_IWGRP & mode) str[5] = 'w';可写 if(S_IXGRP & mode) str[6] = 'x'; 可执行 if(S_IROTH & mode) str[7] = 'r';可读 if(S_IWOTH & mode) str[8] = 'w';可写 if(S_IXOTH & mode) str[9] = 'x';可执行。Struct passwd 结构体 中 pw_name 用户名,pw_passwd 用户密码,pw_uid 用户 id,pw_gid 组 id, pw_gecos 真是名称 pw_dir 用户目录 pw_shell shell 命令。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统课程设计报告班级:团队成员:目录 ................................................................................................................... 错误!未定义书签。

一、实验要求:建立线程系统...................................................................... 错误!未定义书签。

1.1Task 2.1实现文件系统调用 (3)1.1.1题目要求 (3)1.1.2题目分析与实现方案 (3)1.1.3关键点与难点 (4)1.1.4实现代码 (4)1.2 Task 2.2 完成对多道程序的支持 (5)1.2.1题目要求 (5)1.2.2题目分析与实现方案 (5)1.2.3关键点与难点 (6)1.2.4实现代码 (7)1.3 Task 2.3 实现系统调用 (7)1.3.1题目要求 (7)1.3.2题目分析与实现方案 (8)1.3.3关键点与难点 (9)1.3.4实现代码 (9)1.4 Task 2.4 实现彩票调度 (10)1.4.1题目要求 (10)1.4.2题目分析与实现方案 (10)1.4.3关键点与难点 (11)1.4.4实现代码 (11)二、测试结果............................................................................................... 2错误!未定义书签。

一、实验要求:多道程序设计1.1 Task2.1 实现文件系统调用1.1.1题目要求实现文件系统调用(创建,打开,读,写,关闭,unlink),在syscall.h中有详细的记录,可以看一下UserProcess.java中的代码,最好把你自己写的系统调用的代码也放在这里。

记住你不是在实现一个文件系统,而是在给用户进程获取我们给你定义好的文件系统的能力。

我们在start.s里为你提供了用户进程进行系统调用所必需的汇编代码。

(SYSCALL会为每个系统调用产生汇编代码)。

其中Unlink为删除目录相并减少一个连接数,如果链接数为0并且没有任何进程打开该文件,该文件内容才能被真正删除,但是若又进程打开了该文件,则文件暂时不删除直到所有打开该文件的进程都结束时文件才能被删除。

1.1.2题目分析与实现方案系统共提供了七个系统调用:halt (停机, 已经提供),creat (创建并打开磁盘文件),open (打开磁盘文件),read (读IO, 可以是磁盘或屏幕),write (写IO),close (关闭IO),unlink (删除磁盘文件)。

要确保如下几点:1)稳定性, 不能因为一个进程的非法系统调用就使操作系统崩溃, 而应该返回错误代码。

2)halt()调用只能由第一个进程(root process) 执行。

3)系统调用需要读写内存时, 通过readVirtualMemory和writeVirtualMemory进行。

4)文件名以null结尾, 不超过256字符。

5)如果系统调用出错, 应返回-1。

6)为每个打开的IO文件分配一个“文件描述符”, 用整数表示. 每个进程最多可以拥有16个。

其中0和1应分配给标准输入和标准输出(即屏幕),这由SynchConsole类管理。

不同进程可以用相同的文件描述符处理不同的文件。

7)Nachos已经提供了一个简单的文件系统FileSystem(Machine包中), 通过ThreadedKernel.fileSystem访问。

8)系统不需要考虑文件访问的互斥等问题。

方案:1)create系统调用:1.根据传入的fileAddress,从虚拟内存中读出文件名2.判断文件名是否存在,即fileAddress处是否有文件名3.如果不存在,直接创建。

先去找合适的位置,如果已经有大于16个,退出,否则创建,创建只需调用filesystem的open即可(传入的布尔值create为true)2)open系统调用:1.根据传入的fileAddress,从虚拟内存中读出文件名2.判断文件名是否存在,即fileAddress处是否有文件名3.先去找合适的位置,如果已经有大于16个,退出,否则创建只需调用filesystem的open即可(传入的布尔值create为false)4.维护本地描述符表3)read系统调用Read系统调用的三个参数依次为: 文件描述符, 写入的内存地址, 读取的字节数。

在Read系统调用中进行如下操作:1.如果打开文件大于16个或者小于0个,或者打开文件列表为空,直接返回。

2.创建数组temp,把文件内容读入temp,求出读出数据长度3.若读出数据小于0即为出错,返回。

4.把该数据写入虚拟内存。

5.返回写入内存的字节数4)write系统调用Write系统调用的三个参数依次为: 文件描述符, 读内存的地址, 写入文件的字节数。

在Write系统调用中进行如下操作:1.如果打开文件大于16个或者小于0个,或者打开文件列表为空,直接返回。

2.创建数组temp,把虚拟内存中的内容读入temp,得到读出数据长度3.若读出数据小于0即为出错,返回。

4.把该数据写入磁盘。

5.若写的数据长度小于读出的数据长度,则错误,返回错误代码5)close系统调用Close系统调用的唯一一个参数为文件描述符。

在Close系统调用中进行如下操作:1.如果打开文件大于16个或者小于0个,或者打开文件列表为空,直接返回。

2.如果不存在,关闭出错3.否则关闭,把openfile数组中fileDescriptor中的位置置为06)unlink系统调用:1.根据传入的fileAddress,从虚拟内存中读出文件名。

2.如果不存在,不必删除3.如果存在,就删除,出错返回错误代码一般地,在Unlink调用中只需读取文件名并执行fileSystem.remove 方法删除文件即可。

但是,一个文件可能被多个进程打开而不能立即删除,必须等所有打开这个文件的进程都关闭该文件后才能删除。

因此,在Close系统调用中还要增加如下内容:若文件关闭后它在全局文件表中已经不存在且文件名在删除队列中,则此时执行删除文件操作,并将文件从删除队列中移出。

1.1.3关键点与难点注意:以上系统调用只是在一般情况下函数的执行流程。

为了提高系统的健壮性, 在系统调用中还要进行下列错误检查:a)文件名长度不得超过256字符, 不得含有非法字符或空。

b)打开, 创建文件时, 局部描述符表不能满。

c)fileSystem的操作返回值必须正确。

d)readVirtualMemory和writeVirtualMemory的返回值必须正确。

1.1.4实现代码private int handleCreate(int fileAddress){// 限定文件名长度,readVirtualMemoryString 读取文件名String filename =readVirtualMemoryString(fileAddress,256);if(filename ==null)return-1;int fileDescriptor =findEmpty();if(fileDescriptor ==-1)return-1;else{// ThreadedKernel.fileSystem.open()打开文件(第二个参数为true表示创建新文件)openfile[fileDescriptor]=ThreadedKernel.fileSystem.open(filename,true);return fileDescriptor;}}private int handleOpen(int fileAddress){// 限定文件名长度String filename =readVirtualMemoryString(fileAddress,256);if(filename ==null)return-1;int fileDescriptor =findEmpty();// 为空,报错。

if(fileDescriptor ==-1)return-1;else{openfile[fileDescriptor]=ThreadedKernel.fileSystem.open(filename,false);return fileDescriptor;}}private int handleRead(int fileDescriptor,int bufferAddress,int length){// 如果打开文件大于16个或者小于0个,或者打开文件列表为空,直接返回。

if(fileDescriptor >15|| fileDescriptor <0||openfile[fileDescriptor]==null)return-1;byte temp[]=new byte[length];// 通过OpenFile.read读取文件内容int readNumber =openfile[fileDescriptor].read(temp,0, length);if(readNumber <=0)return0;// 把该数据写入虚拟内存。

int writeNumber =writeVirtualMemory(bufferAddress, temp);return writeNumber;}private int handleWrite(int fileDescriptor,int bufferAddress,int length){ // 如果打开文件大于16个或者小于0个,或者打开文件列表为空,直接返回。

if(fileDescriptor >15|| fileDescriptor <0||openfile[fileDescriptor]==null)return-1;// 文件未打开,出错// 创建数组temp,把虚拟内存中的内容读入temp,得到读出数据长度byte temp[]=new byte[length];int readNumber =readVirtualMemory(bufferAddress, temp);// 若读出数据小于0即为出错,返回。

if(readNumber <=0)return0;// 把该数据写入磁盘。

int writeNumber =openfile[fileDescriptor].write(temp,0, length);// 若写的数据长度小于读出的数据长度,则错误,返回错误代码if(writeNumber < length)return-1;// 返回写入文件的字节数return writeNumber;}private int handleClose(int fileDescriptor){// 如果打开文件大于16个或者小于0个,或者打开文件列表为空,直接返回。

相关文档
最新文档