操作系统实验报告

操作系统

一、实验一 通过 VMware 虚拟机软件安装 Linux

二、实验目的

(1)学会安装 VMware 虚拟机软件并掌握其使用方法。
(2)学会使用 VMware 虚拟机安装 Linux 操作系统
(3)熟悉 Linux 下的 C/C++编程环境:vi/gedit 编辑器 + gcc 编译器 +gdb 调试器。

三、实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码)

1)安装 VMware workstation 虚拟机软件并新建一个虚拟机
2)使用 VMware 虚拟机安装 Linux 操作系统
3)熟悉 Linux 下的 C/C++编程环境:vi/gedit 编辑器 + gcc 编译器 +gdb 调试器

四、实验结果与分析

在这里插入图片描述
在这里插入图片描述
学会在虚拟机中编写C语言程序,输出一个”hello”

五、小结与心得体会

第一次操作虚拟机,我对其有了初步了解和认识。并知道了如何在LINUX系统中编写和编译C程序。

一、实验二 Windows 进程管理

二、实验目的

(1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。
(2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解 Windows 进程的“一生”。 (3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法

三、实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码)

背景知识
在这里插入图片描述
在这里插入图片描述
实验内容和步骤
(1)编写基本的 Win32 Consol Application
(2) 创建进程
(3) 父子进程的简单通信及终止进程

四、实验结果与分析

(1)编写基本的 Win32 Consol Application
在这里插入图片描述

点击运行,程序报错,经检查,是因为使用了中文标点,改为英文引号后,成功运行,结果如图
在这里插入图片描述
(2) 创建进程
步骤二:运行结果
在这里插入图片描述

进程状态:
在这里插入图片描述
步骤三:加入参数运行结果
在这里插入图片描述
进程状态:在这里插入图片描述
步骤四:运行结果,无限生成进程在这里插入图片描述

结论:nClone和创建的进程数有关。
变量的定义和初始化方法(位置)对程序的执行结果有影响。
如果在判定语句内定义和初始化会使程序受到影响
(3)父子进程的简单通信及终止进程
步骤二:运行结果
在这里插入图片描述
输入字符后子进程终止
在这里插入图片描述

步骤三:运行结果:子进程无限生成,程序陷入死循环
字符串“child”将作为形参传递给子进程的 main 函数,由于字符串不匹配,main()中决定了其行为是父进程,所以子进程无限生成,程序陷入死循环。
在这里插入图片描述
步骤四:运行结果 :
在这里插入图片描述
步骤五:CreateMutex() 创建“自杀”互斥程序体
OpenMutex() 打开“自杀”互斥体
ReleaseMutex() 释放互斥体的所有权
WaitForSingleObject()使进程进入等待状态,直到某特定对象被通知。
父进程先通过CreateMutex() 创建“自杀”互斥程序体,然后建立子程序,子进程调用OpenMutex()打开互斥体,等待父进程的键盘响应,父进程调用 ReleaseMutex()释放互斥体的所有权,这个信号会发送给子进程的 WaitForSingleObject 过程。
WaitForSingleObject(hMutexSuicide, INFINITE)使子进程进入阻塞状态,等待父进程通过互斥体发来的信号,信号触发后,子进程“自杀”.

五、小结与心得体会

通过本次实验,我直观的看到了进程的创建与终止,还有父子进程的通信,互斥方法的具体实践,学会了创建进程,终止进程,以及进程的简单通信,是一次不错的理论实践。

一、实验三 Linux 进程控制

二、实验目的

通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程和程序之间的区别

三、实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码)

背景知识
exec 系列有 6 个函数,原型如下:
extern char **environ;
int execl( const char *path, const char *arg, …);
int execlp( const char *file, const char *arg, …);
int execle( const char *path, const char *arg , …, char * const envp[]);
int execv( const char *path, char *const argv[]);
int execve (const char *filename, char *const argv [], char *const envp[]);

四、实验结果与分析

在这里插入图片描述
多次运行结果:()出现多次不同结果的原因是因为设置了随机数,sleep(rand())会导致结果不一样。
在这里插入图片描述
(我的系统用户名为 abc 所以看起来有些混乱)
结果分析:系统调用 fork()创建子进程后,子进程通过系统调用 exec更换自己原有的执行代码,转去执行 Linux 命令/bin/ls (显示当前目录的列表)。
父进程则调用 waitpid()等待子进程结束,并在子进程结束后显示子进程的标识符Child Complete,然后正常结束。
在这里插入图片描述
分析: pid > 0: 等待进程 id 为 pid 的子进程。 pid == 0: 等待与自己同组的任意子进程。
pid == -1: 等待任意一个子进程
pid < -1: 等待进程组号为-pid 的任意子进程。

四、小结与心得体会

这次实验我懂得了如何在Linux 上创建进程,如何利用子进程执行新任务。了解了进程与子进程的关系。

实验四 Linux 进程间通信

实验目的

Linux 系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据,通过本实验,理解熟悉 Linux 支持的消息通信机制。

实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码)

semget()—获得信号量的 IPC 标识符。 msgget()—获得消息队列的 IPC 标识符。
shmget()—获得共享内存的 IPC 标识符。
控制 IPC 资源的系统调用有:semctl()—对信号量资源进行控制的函数。 msgctl()—对消息队列进行控制的函数。 shmctl()—对共享内存进行控制的函数。
上述函数为获得和设置资源的状态信息提供了一些命令。例如: IPC_SET 命令:设置属主的用户标识符和组标识符。IPC_STAT 和 IPC_INFO 命令:获得资源状态信息。
IPC_RMID 命令:释放这个资源。
操作 IPC 资源的系统调用有: semop()—获得或释放一个 IPC 信号量。 可以实现 P、V 操作。 msgsnd()—发送一个 IPC 消息。msgrcv()—接收一个 IPC 消息。shmat()—将一个 IPC 共享内存段添加到 进程的地址空间 shmdt()——将 IPC 共享内存段从私有的地址空间剥离。

实验结果与分析

(1)使用系统调用 msgget(),msgsnd(),msgrcv()及 msgctl()编制一长度为 1K 的消息的发送和接收程序。在这里插入图片描述
在这里插入图片描述
消息的创建,发送和接收。
(2)观察参考程序,说明控制消息队列系统调用 msgctl()在此起什么作用?
msgctl()对消息队列进行控制
从理论上说,上述程序应当是每当 client 发送一条消息后,server 接收该消息,client 再发送下一条,也即是应该交替出现“(client)sent”和“(server)received”,但实际结果大多不是这样,会出现几个“(client)sent”连续后再几个“(server)received”,请分析原因。
因为while((i=fork())-1);
if(!i) SERVER();
while((i=fork())
-1);
if(!i) CLIENT(); 因为有while循环所以,SERVER()和CLIENT()是分别连续执行的。

小结与心得体会

通过这次实验,我知道了如何进行进程间的简单通信,掌握了对一些进程通信的函数的掌握,深刻理解并学习了进程通信的相关内容。
实验五 Windows 线程的互斥与同步
实验目的
(1) 回顾操作系统进程、线程的有关概念,加深对 Windows 线程的理解。
(2) 了解互斥体对象,利用互斥与同步操作编写生产者-消费者问题的并发程序,加深对 P (即semWait)、V(即 semSignal)原语以及利用 P、V 原语进行进程间同步与互斥操作的理解。
实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码)
生产者消费者问题
实验结果与分析
步骤3:线程的第一个执行函数是 Producer(LPVOID);是其中的第三个参数
步骤4:在这里插入图片描述
互换生产者消费者数量,使生产者数小于消费者数,当生产出来后马上被消费在这里插入图片描述
在这里插入图片描述
当生产者数大于消费者数时,“货物”总是堆在“仓库”
步骤5:EmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
在这里插入图片描述
没有任何结果,因为初始资源数变为了0
步骤6:
1.CreateMutex 中有3个参数,第一个参数为代表安全属性的指针,初值一般为NULL,第二个参数为布尔类型,初始值一般为False,表示其不属于任何线程,第三个参数表示名称
2. CreateSemaphore 有四个参数。第一个表示采用不允许继承的默认描述符,第二个表示信号量的初值,第三个设置信号量的最大值,第四个指定信号机对象的名称。
3. P操作:WaitForSingleObject(EmptySemaphore,INFINITE);
V操作:ReleaseSemaphore(EmptySemaphore,1,NULL);
4.可以替代,将mutex作为一个原理类似于互斥量的信号量在这里插入图片描述

小结与心得体会

这次实验我复习了操作系统进程、线程的有关概念,加深了我对 Windows 线程的理解。
同时我了解互斥体对象,利用互斥与同步操作编写生产者-消费者问题的并发程序,加深对 P (即semWait)、V(即 semSignal)原语以及利用 P、V 原语进行进程间同步与互斥操作的理解。

实验六 内存管理

实验目的

了解 Windows 的内存结构和虚拟内存的管理,理解进程的虚拟内存空间和物理内存的映射关系。加深对操作系统内存管理、虚拟存储管理等理论知识的理解。

实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码)

耗尽内存是 Windows 系统中最常见的问题之一。当系统耗尽内存时,所有进程对内存的总需求超出了系统的物理内存总量。随后,Windows 必须借助它的虚拟内存来维持系统和进程的运行。

实验结果与分析

虚拟内存每页容量为:4.00KB_________ 最小应用地址:0x00010000
最大应用地址:0x7ffeffff__________________________________________
当前可供应用程序使用的内存空间为:2GB________________
当前计算机的实际内存大小为:1.99GB__________________________
理论上每个 Windows 应用程序可以独占的最大存储空间是:4GB_________
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
简单描述 windows 进程的虚拟内存管理方案
WINDOWS 中采用的虚拟存储管理方案是通过不同访问权限和空间类型来划分进程。

小结与心得体会

这次实验使了解 Windows 的内存结构和虚拟内存的管理,理解进程的虚拟内存空间和物理内存的映射关系。加深了我对操作系统内存管理、虚拟存储管理等理论知识的理解。

一、实验八 磁盘调度算法的模拟与实现

二、实验目的

(1) 了解磁盘结构以及磁盘上数据的组织方式。
(2) 掌握磁盘访问时间的计算方式。
(3) 掌握常用磁盘调度算法及其相关特性。

三、总体设计(含背景知识或基本原理与算法、模块介绍、设计步骤等) 实验基本知识及原理

磁盘调度算法
磁盘调度的目的是要尽可能降低磁盘的寻道时间,以提高磁盘 I/O 系统的性能。
先进先出算法:按访问请求到达的先后次序进行调度。
最短服务时间优先算法:优先选择使磁头臂从当前位置开始移动最少的磁盘 I/O 请求进行调度。
SCAN(电梯算法):要求磁头臂先沿一个方向移动,并在途中满足所有未完成的请求,直到它到达这个方向上的最后一个磁道,或者在这个方向上没有别的请求为止,后一种改进有时候称作LOOK 策略。然后倒转服务方向,沿相反方向扫描,同样按顺序完成所有请求。 C-SCAN(循环扫描)算法:在磁盘调度时,把扫描限定在一个方向,当沿某个方向访问到最后一个磁道时,磁头臂返回到磁盘的另一端,并再次开始扫描。
模块介绍:分五个模块:FIFO()函数、SSTF()函数、SCAN()函数、C-SCAN()函数、main()函数
设计步骤:先在主函数中定义数据组,然后构建基本框架,最后依次编写函数,

三、详细设计(含主要的数据结构、程序流程图、关键源代码等) 程序流程图

在这里插入图片描述
先在主函数中定义测试数据数组,同时写下基本框架。
在这里插入图片描述
FIFO函数,使用for循环依次输出,并计算跨越磁道数在这里插入图片描述
SSTF函数,先进行排序,然后找到离当前磁道最近的磁道号,设置FLAG标记磁道是否访问,然后从当前磁道比较往哪边距离更近,比较后,选择较近的一方,将其中的数据放入数组b中,直到这边全访问完(下标变为0或max且已被访问),然后再向另一边寻找,直到访问完。在这里插入图片描述
在这里插入图片描述
SCAN函数,先进行排序,然后找到离当前磁道最近且与磁针方向相同的磁道号(这里默认初始往大的方向),然后在此方向访问直至访问完,然后再往回访问完
在这里插入图片描述
在这里插入图片描述
CSCAN函数,先进行排序,找到与磁头方向相同且最近的磁道,这里默认初始往大的方向,
由于磁头只能单向移动,如同一个循环,所以访问完最大的以后接着访问最小的。在这里插入图片描述

五、实验结果与分析

FIFO算法在这里插入图片描述
SSTF算法
在这里插入图片描述
SCAN算法
在这里插入图片描述
C-SCAN算法
在这里插入图片描述
分析:先进先出函数跨越磁道数最多,性能最低,但实现最简单。
SSTF算法和SCAN算法性能比较好,SSTF性能最好,但SSTF计算量太大,SCAN计算量相对较小。
C-SCAN算法性能也还可以,但比不上SSTF算法,但其实现较为简单,计算量较小。

六、小结与心得体会

这次实验我复习了以前学的磁盘调度的知识,包括,磁盘调度算法,同时编写代码算是对以前知识的一次实践,加深巩固了我的知识。同时充分理解了算法的优缺点,如实现简单,计算量大等特点。

一、实验九 虚拟内存系统的页面置换算法模拟

二、实验目的

通过对页面、页表、地址转换和页面置换过程的模拟,加深对虚拟页式内存管理系统的页面置换原理和实现过程的理解。

三、总体设计(含背景知识或基本原理与算法、模块介绍、设计步骤等)

1)最佳置换算法(OPT):置换时淘汰“未来不再使用的”或“在离当前最远位置上出现的”页面。
2)先进先出置换算法(FIFO):置换时淘汰最先进入内存的页面,即选择驻留在内存时间最长的页面被置换。
3)最近最久未用置换算法(LRU):置换时淘汰最近一段时间最久没有使用的页面,即选择上次使用距当前最远的页面淘汰
模块介绍:1.随机生成函数2.随机数转换为对应页面的函数3.FIFO算法函数4.OPT算法函数4.LRU算法函数5.主函数
设计步骤:1.在主函数中写出基本框架,定义好函数和数据结构等等2.先写一个简单的随机生成函数3.完成先进先出算法4.完成OPT算法5.完成LRU算法6.改进随机生成函数7.完成转换函数。

四、详细设计(含主要的数据结构、程序流程图、关键源代码等)

数据结构在这里插入图片描述
在这里插入图片描述
生成随机指令序列函数在这里插入图片描述
转换对应页面函数
在这里插入图片描述
判断是否命中在这里插入图片描述
FIFO函数
在这里插入图片描述
LRU算法在这里插入图片描述
在这里插入图片描述
OPT算法在这里插入图片描述
在这里插入图片描述

六、实验结果与分析

按要求生成随机数。
在这里插入图片描述
转换成相应页面序列。
在这里插入图片描述
输入物理块数后,选择FIFO算法:
在这里插入图片描述
在这里插入图片描述
选择OPT算法:
在这里插入图片描述
在这里插入图片描述

选择LRU算法:
在这里插入图片描述
在这里插入图片描述
分析:
FIFO 算法缺页率最高,性能最低
OPT算法缺页率最低,性能最高,但仅仅是理论最高,是不可能实现的
LRU算法缺页率低于FIFO算法,LRU算法利用了局部性原理,所以性能更高。

思考:
如果增加分配给作业的内存块数,将会对作业运行过程中的缺页率产生什么影响?
答:缺页率一定下降。
为什么一般情况下,LRU 具有比 FIFO 更好的性能?
答:LRU算法会把最近一段时间最久没使用的页面给剔除掉,而FIFO算法则是一个简单的队列,完全没有考虑局部性原理,所以利用了局部性原理的LRU算法一般情况下性能更好。

七、小结与心得体会

这次实验,我复习了页面置换的算法,受益匪浅,能够切实的感受这些算法,而不仅仅停留在书本上,更直观地理解了他们的优缺点及其定义。并且,通过这些实验,我也感受到了操作系统的魅力,希望在今后的学习生活中,能见识并接触到更多这种学习的魅力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值