操作系统实验报告 实验一 进程管理

合集下载

进程管理实验报告

进程管理实验报告

实验2过程管理实验报告学生号姓名班级电气工程系过程、过程控制块等基本原理过程的含义:过程是程序运行过程中对数据集的处理,以及由独立单元对系统资源的分配和调度。

在不同的数据集上运行程序,甚至在同一数据集上运行多个程序,是一个不同的过程。

(2)程序状态:一般来说,一个程序必须有三种基本状态:就绪、执行和阻塞。

然而,在许多系统中,过程的状态变化可以更好地描述,并且增加了两种状态:新状态和终端状态。

1)就绪状态,当一个进程被分配了除处理器(CPU)以外的所有必要资源时,只要获得了处理器,进程就可以立即执行。

此时,进程状态称为就绪状态。

在系统中,多个进程可以同时处于就绪状态。

通常,这些就绪进程被安排在一个或多个队列中,这些队列称为就绪队列。

2)一旦处于就绪状态的进程得到处理器,它就可以运行了。

进程的状态称为执行状态。

在单处理器系统中,只有一个进程在执行。

在多处理器系统中,可能有多个进程在执行中。

3)阻塞状态由于某些事件(如请求输入和输出、额外空间等),执行进程被挂起。

这称为阻塞状态,也称为等待状态。

通常,处于阻塞状态的进程被调度为-?这个队列称为阻塞队列。

4)新状态当一个新进程刚刚建立并且还没有放入就绪队列中时,它被称为新状态。

5)终止状态是什么时候-?进程已正常或异常终止,操作系统已将其从系统队列中删除,但尚未取消。

这就是所谓的终结状态。

(3)过程控制块是过程实体的重要组成部分,是操作系统中最重要的记录数据。

控制块PCB记录操作系统描述过程和控制过程操作所需的所有信息。

通过PCB,一个不能独立运行的程序可以成为一个可以独立运行的基本单元,并且可以同时执行一个进程。

换句话说,在进程的整个生命周期中,操作系统通过进程PCB管理和控制并发进程。

过程控制块是系统用于过程控制的数据结构。

系统根据进程的PCB来检测进程是否存在。

因此,进程控制块是进程存在的唯一标志。

当系统创建一个进程时,它需要为它创建一个PCB;当进程结束时,系统回收其PCB,进程结束。

操作系统lab2实验报告

操作系统lab2实验报告

操作系统lab2实验报告实验目的:本实验的目的是通过设计和实现一个简单的操作系统内核,加深对操作系统基本概念和原理的理解。

具体实验内容包括进程管理、内存管理和文件系统的设计与实现。

实验环境:1.操作系统:Linux2.编程语言:C语言一、实验背景1.1 操作系统简介操作系统是计算机系统中的一个重要组成部分,负责管理和控制计算机的各种资源,提供用户和应用程序的接口,以及协调和调度各种任务的执行。

1.2 实验目标本实验的主要目标是设计和实现一个简单的操作系统内核,包括进程管理、内存管理和文件系统等功能。

二、实验内容2.1 进程管理①进程创建描述进程创建的过程和相关数据结构,包括创建新进程的系统调用、进程控制块等。

②进程调度描述进程调度的算法和实现方式,包括进程调度队列、调度算法等。

③进程同步与通信描述进程同步和通信的机制和方法,包括信号量、互斥锁、条件变量等。

2.2 内存管理①内存分配描述内存分配的算法和实现方式,包括连续内存分配、非连续内存分配等。

②页面置换描述页面置换的算法和实现方式,包括最优页面置换算法、先进先出页面置换算法等。

2.3 文件系统①文件操作描述文件操作的系统调用和相关数据结构,包括文件打开、读写、关闭等。

②文件系统结构描述文件系统的组织结构和实现方式,包括超级块、索引节点、块位图等。

三、实验步骤3.1 环境搭建搭建实验环境,包括安装Linux操作系统、编译器等。

3.2 进程管理实现根据设计要求,实现进程创建、调度、同步与通信等功能。

3.3 内存管理实现根据设计要求,实现内存分配、页面置换等功能。

3.4 文件系统实现根据设计要求,实现文件操作和文件系统结构。

3.5 测试与调试编写测试用例,对实现的操作系统内核进行测试和调试,并记录实验结果。

四、实验结果分析分析测试结果,评估实验过程中遇到的问题和解决方法,总结操作系统内核的性能和功能特点。

五、实验总结对实验过程中的收获和经验进行总结,提出改进和优化的建议。

计算机操作系统实验课实验报告

计算机操作系统实验课实验报告

实验报告实验课程: 计算机操作系统学生姓名:XXX学号:XXXX专业班级:软件2014年12月25日目录实验一熟悉Windows XP中的进程和线程 (3)实验二进程调度 (7)实验三死锁避免—银行家算法的实现 (16)实验四存储管理 (22)实验一熟悉Windows XP中的进程和线程一、实验名称熟悉Windows XP中的进程和线程二、实验目的1、熟悉Windows中任务管理器的使用。

2、通过任务管理器识别操作系统中的进程和线程的相关信息。

3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。

三、实验结果分析1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。

2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表:表一:统计进程的各项主要信息3、启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。

再从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是任务管理器无法结束进程,原因是该系统是系统进程。

4、在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化桌面上图标菜单都消失了、得到的结论 explorer.exe是管理桌面图标的文件(说出explorer.exe进程的作用)。

5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表:进程:explorer.exe 中的各个线程6、注意某些线程前有“+”,如图所示:,说明二者之间的差异前有“+”其器线程下有窗口。

四、心得体会通过本次实验,我了解到了windows系统中进程的管理与操作,我了解了如何切出任务管理器,任务管理器应用与其他与进程相关的知识,明白了有些系统程序不能够关闭,系统中的进程与线程虽然很多,但是其中有许多关联,只要弄清楚其中的关联那么就能够运用好进程与线程,达到我们的目的。

操作系统接口实验报告

操作系统接口实验报告

操作系统接口实验报告一、实验目的本次实验旨在深入理解操作系统接口的概念、功能和使用方法,通过实际操作和编程实践,掌握操作系统提供的接口在程序开发中的应用,提高对操作系统的认知和编程能力。

二、实验环境操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、文件操作接口创建、打开、读取和写入文件文件属性的获取和设置文件的复制、移动和删除2、进程管理接口创建和终止进程获取进程的信息,如进程 ID、内存使用等进程间的通信,如管道、消息队列等3、线程管理接口创建和终止线程线程同步机制,如互斥锁、条件变量等线程的优先级设置和调度4、内存管理接口动态内存分配和释放内存映射文件的使用虚拟内存的操作四、实验步骤1、文件操作接口实验使用`CreateFile` 函数创建或打开一个文件。

通过`ReadFile` 和`WriteFile` 函数进行文件的读写操作。

利用`GetFileAttributes` 函数获取文件属性,并使用`SetFileAttributes` 函数设置文件属性。

运用`CopyFile` 、`MoveFile` 和`DeleteFile` 函数实现文件的复制、移动和删除。

2、进程管理接口实验调用`CreateProcess` 函数创建一个新的进程,并获取进程的 ID 和句柄。

使用`GetProcessMemoryInfo` 函数获取进程的内存使用情况。

通过管道或消息队列实现进程间的通信。

3、线程管理接口实验使用`CreateThread` 函数创建线程,并设置线程的执行函数。

利用互斥锁和条件变量来实现线程间的同步,确保数据的一致性和正确性。

调整线程的优先级,观察线程调度的效果。

4、内存管理接口实验运用`malloc` 和`free` 函数进行动态内存的分配和释放。

使用`CreateFileMapping` 和`MapViewOfFile` 函数实现内存映射文件。

操作系统实验报告哈工大

操作系统实验报告哈工大

计算机操作系统课程实验报告专业信息管理与信息系统班级 1203601学号 120360117姓名乐云指导教师周学权计算机操作系统课程实验报告专业信息管理与信息系统班级 1203601学号 120360114姓名郭鑫指导教师周学权操作系统实验实验1 使用虚拟机安装系统 4学时【实验目的】1.了解虚拟机软件的使用。

2.了解使用虚拟机安装Windows及Ubuntu操作系统。

【实验内容】1. 安装虚拟机软件VirtualBox。

2. 配置VirtualBox环境安装WindowsXP,并在虚拟机中启动windowsXP。

3. 配置VirtualBox环境安装Ubuntu 10.10,并在虚拟机中启动Ubuntu。

【实验环境】VirtualBox4.0Windows XPUbuntu 8.04【实验过程】一、创建虚拟机首先运行VirtualBox,单击左上角的“新建”。

单击下一步。

出现如下图的界面,在名称后输入自己起的名字,如test选择自己想要安装的系统类型和版本,本次试验是安装windows xp系统设置完成后,单击下一步。

接下来是设置虚拟机的内存大小,本次实验操作的计算机内存为4GB,所以我选择分配给我的虚拟机的内存为512MB,然后单击下一步。

接着创建虚拟硬盘,选择创建新的虚拟硬盘,单击下一步。

选择虚拟硬盘的类型,默认选择了VDI类型,单击下一步。

接下来选择为动态扩展类型,因为计算机的存储空间不大。

单击下一步。

动态扩展:如果你为你的虚拟磁盘分配的是10G空间,虚拟磁盘占用真实磁盘空间的范围就为0~10G。

固定大小:如果你为你的虚拟磁盘分配的是10G空间,虚拟磁盘占用真实磁盘空间永远不是10G,不管虚拟磁盘空间是否被全部使用。

选择虚拟机在本地磁盘中的位置和大小,单击下一步。

确认虚拟机的详细情况,点击下一步。

这时我们已经成功的创建了一个虚拟机了,接下来我们要开始配置这个虚拟机安装操作系统选择刚才创建的虚拟机,然后单击上方的“开始”弹出了首次运行向导,单击下一步。

linux常用命令实验实验报告 -回复

linux常用命令实验实验报告 -回复

linux常用命令实验实验报告-回复Linux常用命令实验实验报告一、引言在计算机领域,掌握常用命令是非常重要的。

对于使用Linux操作系统的用户来说,熟悉常用命令更是必备的技能之一。

本篇实验报告将以"Linux常用命令"为主题,介绍并实验一些常用的Linux命令,包括文件与目录管理、权限管理、网络管理、进程管理等方面的命令。

通过本次实验,希望进一步巩固和提升大家对Linux操作系统的理解和实践能力。

二、实验一:文件与目录管理1. 文件列表命令:ls首先,我们来介绍一下`ls`命令,该命令用于列出当前目录下的所有文件和文件夹。

通过在终端中输入`ls`命令,可以查看当前目录下的文件列表。

2. 创建目录命令:mkdir接下来,我们将尝试使用`mkdir`命令创建一个新的目录。

可以输入`mkdir directory_name`来创建一个名为"directory_name"的目录。

3. 切换目录命令:cd使用`cd`命令可以切换当前工作目录。

例如,要进入某个目录,可以使用`cd directory_name`命令。

要返回上一级目录,可以使用`cd ..`。

4. 复制文件命令:cp`cp`命令用于复制文件和目录。

要复制一个文件,可以使用`cp source_file destination_file`命令。

例如,`cp file1.txt file2.txt`将会复制"file1.txt"并将其命名为"file2.txt"。

5. 删除文件命令:rm要删除一个文件,可以使用`rm file_name`命令。

例如,要删除"file.txt"文件,可以输入`rm file.txt`。

6. 查找文件命令:find使用`find`命令可以在文件系统中查找文件。

例如,`find / -namefile_name`将会在根目录下找到名为"file_name"的文件。

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

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

湖南科技大学计算机科学与工程学院操作系统课程设计报告学号:姓名:班级:目录实验一.........................................................一、实验题目.............................................二、实验目的.............................................三、总体设计.............................................一、实验题目二、实验目的.............................................三、总体设计.............................................四、详细设计.............................................五、实验结果与分析.......................................六、小结与心得体会.......................................实验四.........................................................一、实验题目.............................................二、实验目的.............................................三、总体设计.............................................四、详细设计.............................................三、总体设计.............................................四、详细设计.............................................五、实验结果与分析.......................................六、小结与心得体会....................................... 实验七.........................................................一、实验题目.............................................二、实验目的.............................................三、总体设计.............................................四、详细设计.............................................五、实验结果与分析.......................................2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解 Windows进程的“一生”。

操作系统实验报告

操作系统实验报告

操作系统实验报告实验项⽬⼆进程管理⼀、实验⽬的1.理解进程的概念,掌握⽗、⼦进程创建的⽅法。

2.认识和了解并发执⾏的实质,掌握进程的并发及同步操作。

⼆、实验内容1.编写⼀C语⾔程序,实现在程序运⾏时通过系统调⽤fork( )创建两个⼦进程,使⽗、⼦三进程并发执⾏,⽗亲进程执⾏时屏幕显⽰“I am father”,⼉⼦进程执⾏时屏幕显⽰“I am son”,⼥⼉进程执⾏时屏幕显⽰“I am daughter”。

2.多次连续反复运⾏这个程序,观察屏幕显⽰结果的顺序,直⾄出现不⼀样的情况为⽌。

记下这种情况,试简单分析其原因。

3.修改程序,在⽗、⼦进程中分别使⽤wait()、exit()等系统调⽤“实现”其同步推进,并获取⼦进程的ID号及结束状态值。

多次反复运⾏改进后的程序,观察并记录运⾏结果。

三、源程序及运⾏结果源程序1:#include#include#includeint main(int argc, char ** argv ){int pid=fork();if(pid < 0)printf("error!");else if( pid == 0 ){printf("I am son!\n");}else{int pid=fork();if (pid < 0)printf("error!");else if( pid == 0 ){printf(“I am daughter! \n");}elseprintf("I am father!\n");}sleep(1);return 0;}运⾏结果:源程序2:#include#include#includeint main(int argc, char ** argv ) {char *message;int n;int pid=fork();if(pid < 0)printf("error!");else if( pid == 0 ){message="I am daughter!"; pid=getpid();n=3;}else{int pid=fork();if (pid < 0)printf("error!");else if( pid == 0 ){message="I am son!";pid=getpid();n=3;}elsemessage="I am father!";n=3;}for(;n>0;n--){puts(message);sleep(1);}return 0;}运⾏结果:四、实验分析与总结1.实验内容1运⾏结果为什么⽆固定顺序,fork()函数创建进程是如何并发执⾏的。

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

1 实验一 进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。

二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…rw),共有w类,每类数目为r1…rw。随 机产生n进程Pi(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。

三、实验环境 操作系统环境:Windows系统。 编程语言:C#。

四、实验思路和设计 1、程序流程图 2

对进程进行初始化,建立就绪队列、阻塞队列。Input() 触发时钟,调用时间片轮转调度算法。runFcfs()

取就绪队列的第一个进程,判断其运行的时间片是否达到所需次数。如果达到,则释放资源 如果没达到,则运行一个时间片。running()

输出就绪队列和阻塞队列的信息。outputall()

就绪队列为空?

检查阻塞队列,对于当前资源数目满足阻塞队列的进程,由阻塞转入就绪队列。testblock()

检查是否有新进程产生,如果有,则判断系统资源是否够用,如果够用,则分配给该进程,插入就绪队列。如果不够用,则插入阻塞队列。testnew()

显示三类资源情况。rescore()

结束 开始 是 否 3

2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒)

//对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0; 4

listBox1.Items.Add("产生进程ID:" + jincheng.id); listBox1.Items.Add("所需A资源数目:" + jincheng.ra); listBox1.Items.Add("所需B资源数目:" + jincheng.rb); listBox1.Items.Add("所需C资源数目:" + jincheng.rc); listBox1.Items.Add("所需时间片数:" + jincheng.ntime);

if ((a - jincheng.ra) >= 0 && (b - jincheng.rb) >= 0 && (c - jincheng.rc) >= 0) { a = a - jincheng.ra; b = b - jincheng.rb; c = c - jincheng.rc; jincheng.state = 'W'; hready.Add(jincheng);//加入就绪队列 } else { jincheng.state = 'B'; hblock.Add(jincheng);//加入阻塞队列 } listBox1.Items.Add("当前进程状态:" + jincheng.state); } } //从数组起始地址开始输出该数组的内容 public void disp(ArrayList list) { ArrayList list1 = new ArrayList(); list1 = list; if (list1.Count > 0) { for (int j = 0; j < list1.Count; j++) { pcb p = (pcb)list1[j]; listBox1.Items.Add(" " + p.id.ToString() + " " + p.state.ToString() + " " + p.ra.ToString() + " " + p.rb.ToString() + " " + p.rc.ToString()+" " + p.ntime.ToString() + " " + p.rtime.ToString() + " \r\n"); } } else { listBox1.Items.Add("\r\n\t 该队列中没有进程!\r\n"); } } //输出就绪数组和阻塞数组的信息 public void outputall() { listBox1.Items.Add("\r\n=======CPU运行了:" + h.ToString() + "次=======\r\n"); 5

listBox1.Items.Add("*********当前就绪队列的信息!*********"); listBox1.Items.Add("进程ID 进程状态 A资源数 B资源数 C资源数 所需时间片 已运行时间片"); disp(hready); listBox1.Items.Add("*********当前就阻塞列的信息!*********"); listBox1.Items.Add("进程ID 进程状态 A资源数 B资源数 C资源 所需时间片 已运行时间片"); disp(hblock); }

//运行就绪数组的头进程,运行一个时间片,轮转一个时间片,时间片轮转调度算法 public void running() { ArrayList hready1 = new ArrayList(); hready1 = hready; pcb p1 = new pcb(); p1=(pcb)hready1[0]; p1.state='R'; p1.rtime= p1.rtime + 1; h=h+1; listBox1.Items.Add("\r\n~~~~~~~当前正在运行进程ID是:" +p1.id + "~~~~~~~~\r\n"); listBox1.Items.Add("\r\n进程ID 进程状态 A资源数 B资源数 C资源数 所需时间片 已运行时间片\r\n"); listBox1.Items.Add(p1.id + " " +p1.state+ " " + p1.ra + " " + p1.rb + " " + p1.rc + " " + p1.ntime + " " + p1.rtime); if (p1.ntime==p1.rtime) { listBox1.Items.Add(p1.id.ToString()+"的进程已经完成!\r\n"); a = a + p1.ra; b = b + p1.rb; c = c + p1.rc; hready.RemoveAt(0); } else { p1.state='W'; hready1.Add(p1); hready.RemoveAt(0); } } //检测当前资源数目是否满足阻塞数组里进程的需求 public void testblock() { ArrayList hblock1 = new ArrayList(); hblock1 = hblock; for (int m = 0; m < hblock1.Count; m++) { pcb p1 = new pcb();

相关文档
最新文档