华南理工大学《高级操作系统》实验报告
高级操作系统实验报告二

目录实验报告 (2)一、模块的编写 (2)1.1代码的编写 (2)1.2Makefile的编写 (2)二、编写测试代码 (3)2.1 代码的编写 (3)2.2 代码的分析 (6)三、测试结果分析 (6)3.1测试结果 (6)3.2创建的进程树 (7)3.3结果分析 (7)四、内核进程调度算法分析 (8)4.1内核进程调度流程 (8)4.2寻找最高优先级进程 (9)4.3进程切换 (10)4.4完成进程切换后 (10)五、内核编译 (11)5.1基本流程 (11)5.2遇到的问题 (11)实验报告一、模块的编写1.1代码的编写示例的代码不太可行,改为如下代码:#include <linux/module.h>#include <linux/init.h>#include <linux/moduleparam.h>int init_module(void)//模块初始化是调用此函数{printk("<0>Hello World!\n");//显示紧急信息,示例中使用<1>不会显示在shell上,会记录在/var/log/message中return 0;}void cleanup_module(void){printk("<0>Goodbye!\n");}1.2Makefile的编写将此代码保存为hellomod.c文件,此文件不可以直接用gcc编译,需要配置一个Makefile文件(Makefile第一个字母必须大写),Makefile文件如下:obj-m := hellomod.oPWD :=$(shell pwd)default:make -C /lib/modules/2.6.18-164.el5xen/build SUBDIRS=$(PWD) modulesclean:rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions然后将shell进入当前目录下:[root@localhost hellomod]#make[root@localhost hellomod]#insmod hellomod.koHello World![root@localhost hellomod]#rmmod hellomod.koGoodbye!模块编写成功!二、调度算法测试代码2.1 代码的编写这个测试代码是在老师的测试代码上改动的,老师的测试代码上有基础问题,不太适合我的机器,比如耗时程序时间比较短,无法测试出时间,每次测出的时间都为0,故将其循环和参数改大。
操作系统实验实验报告

操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。
本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 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 等进行文件的创建、读取和写入操作。
《高级操作系统》实验指导书

《高级操作系统》实验指导书实验环境:VMware, Red Hat Enterprise Linux 5(内核版本2.6.18) 硬件环境:内存2G以上,硬盘空间20G以上一、Linux基本命令shell编程(学时4)实验目的:本实验的目的是熟练掌握Linux系统的使用,熟悉Linux常用命令,掌握Linux shell脚本的编写方法,掌握VI的基本使用技巧,熟练配置samba服务、NFS服务。
实验要求:在进行本实验之前,应熟练课程内容,在上机之前做好实验计划,编写好相应的代码.实验内容:(1)Linux常用命令(2)Linux shell脚本的编写方法,使用Shell脚本计算1-100和;(3)熟悉VI的基本用法(4)配置samba服务、NFS服务三、Linux的进程管理(学时2)实验目的:(1)要求编写多进程程序,熟练掌握fork、exec、wait、等函数的用法,进一步了解Linux多进程编写的步骤。
(2)编写完整的守护进程并掌握调试方法。
实验要求:进程的编写步骤实验内容:(1)有3个进程,其中一个为父进’程,其余2个为该父进程的子进程,其中一个子进程运行”ls -l”指令,另一个子进程在暂停5秒后异常退出,并等待子进程退出信息,待收集到该信息,父进程就返回。
(2)首先建立守护进程,在该守护进程中创建一个子进程,子进程暂停10秒,然后自动退出,并由守护进程收集子进程的退出信息,这些信息都在/var/log/messages中输出,子进程退出后,守护进程循环暂停,间隔为10秒。
四、Linux字符设备驱动程序的编制(学时2)实验目的:通过本实验能够深入理解Linux基本内容,掌握其驱动方法.实验要求:在进行本实验之前,应熟练课程内容,在上机之前做好实验计划,编写好相应的代码,这样才能在2个学时完成实验内容。
实验内容:编写Scull字符启动,完成字符设备驱动!。
操作系统实验报告6

操作系统实验报告6一、实验目的本次操作系统实验的主要目的是深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关技术,通过实际操作和观察,增强对操作系统工作原理的理解,并提高解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,实验工具包括 Visual Studio 2019 等。
三、实验内容(一)进程管理实验1、创建多个进程,并观察它们的运行状态和资源占用情况。
通过编写简单的C++程序,使用Windows API 函数创建多个进程。
在程序中,设置不同的进程优先级和执行时间,观察操作系统如何调度这些进程,以及它们对 CPU 使用率和内存的影响。
2、进程间通信实现了进程间的管道通信和消息传递。
通过创建管道,让两个进程能够相互交换数据。
同时,还使用了 Windows 的消息机制,使进程之间能够发送和接收特定的消息。
(二)内存管理实验1、内存分配与释放使用 C++的动态内存分配函数(如`malloc` 和`free`),在程序运行时动态申请和释放内存。
观察内存使用情况,了解内存碎片的产生和处理。
2、虚拟内存管理研究了 Windows 操作系统的虚拟内存机制,通过查看系统的性能监视器,观察虚拟内存的使用情况,包括页面文件的大小和读写次数。
(三)文件系统实验1、文件操作进行了文件的创建、读取、写入、删除等基本操作。
通过编写程序,对不同类型的文件(如文本文件、二进制文件)进行处理,了解文件系统的工作原理。
2、目录操作实现了目录的创建、删除、遍历等功能。
了解了目录结构在文件系统中的组织方式和管理方法。
四、实验步骤(一)进程管理实验步骤1、打开 Visual Studio 2019,创建一个新的 C++控制台项目。
2、在项目中编写代码,使用`CreateProcess` 函数创建多个进程,并设置它们的优先级和执行时间。
3、编译并运行程序,通过任务管理器观察进程的运行状态和资源占用情况。
华工操作系统实验

sem_wait(&full); sem_wait(&mutex); int ju = 0; for ( int i = 0; i < N; i++) {
if ((buffer[i] >= 'A' && buffer[i] <= 'Z' ) || (buffer[i] >= 'a' && buffer[i] <= 'z'))
理发师问题的描述 :一个理发店接待室有 n 张椅子 , 工作室有 1 张 椅子 ;没有顾客时 , 理发师睡觉 ; 第一个顾客来到时 ,必须将理发师唤 醒; 顾客来时如果还有空座的话 , 他就坐在一个座位上等待 ;如果顾客 来时没有空座位了 , 他就离开 ,不理发了 ;当理发师处理完所有顾客 , 而又没有新顾客来时 ,他又开始睡觉 。 3. 读者写者问题 教材中对读者写者问题算法均有描述 ,但这个算法在不断地有读者流的情况下 , 写者会被阻塞 。 编写一个写者优先解决读者写者问题的程序 ,其中读者和写者 均是多个进程 , 用信号量作为同步互斥机制 。
.
专业 . 专注
.
..
..
..
1. 生产者消费者问题 ( pro_con.c )
#include <pthread.h> #include <unistd.h> #include <semaphore.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <malloc.h>
高级操作系统实验报告

一、实验背景与目的随着计算机技术的飞速发展,操作系统作为计算机系统的核心,其重要性日益凸显。
为了更好地理解操作系统的工作原理和设计思想,我们选择了高级操作系统课程,并完成了以下实验:1. 实验背景本次实验基于Linux操作系统,通过对Linux系统内部结构和操作过程的研究,掌握Linux系统的基本操作、文件系统管理、进程管理、内存管理、设备管理等方面的知识。
2. 实验目的(1)熟悉Linux操作系统的基本操作,包括登录、退出、文件与目录操作等。
(2)掌握Linux系统下的进程管理,包括进程的创建、调度、同步、通信等。
(3)了解Linux系统下的内存管理,包括虚拟内存、页面置换算法等。
(4)学习Linux系统下的设备管理,包括设备驱动程序、I/O调度等。
二、实验内容与步骤1. 实验一:Linux基本操作(1)实验目的:熟悉Linux系统的基本操作。
(2)实验步骤:① 登录Linux系统。
② 使用命令行查看系统信息,如CPU型号、内存大小等。
③ 创建和删除文件与目录。
④ 查看文件内容。
2. 实验二:文件系统管理(1)实验目的:掌握Linux系统下的文件系统管理。
(2)实验步骤:① 使用命令行查看文件系统类型。
② 查看文件系统分区。
③ 使用命令行创建和删除文件系统。
④ 使用命令行挂载和卸载文件系统。
3. 实验三:进程管理(1)实验目的:掌握Linux系统下的进程管理。
(2)实验步骤:① 使用命令行查看系统进程。
② 创建和终止进程。
③ 调整进程优先级。
④ 实现进程同步与互斥。
4. 实验四:内存管理(1)实验目的:了解Linux系统下的内存管理。
(2)实验步骤:① 使用命令行查看内存信息。
② 查看内存分配情况。
③ 实现页面置换算法。
5. 实验五:设备管理(1)实验目的:学习Linux系统下的设备管理。
(2)实验步骤:① 使用命令行查看设备信息。
② 编写简单的设备驱动程序。
③ 实现I/O调度。
三、实验结果与分析1. 实验结果通过本次实验,我们成功完成了以下任务:(1)熟悉了Linux操作系统的基本操作。
高级操作系统实验说明

高级操作系统实验说明0FTP本次实验所需全部软件以及实验说明可以从该Ftp获得:ftp://219.219.218.203用户名:globus密码:globus助教联系方式:Email:zzxiong@mhx@1Globus简介请参考丁老师的课件:DOS-CH7-Globus Tutorial.ppt2实验内容概述本次实验的内容是安装Globus并在其上进行简单的应用。
我们在Windows环境下使用虚拟机VMWare进行实验。
VMWare支持多台虚拟机同时工作。
我们要求同学们用VMWare创建两台虚拟机,用这两台虚拟机搭建一个含有两个节点的cluster和Grid系统。
3参考资料✧GT4 Admin Guide Globus Toolkits的管理员手册✧/dvnews/show.aspx?id=1566&cid=50一个简明的安装步骤✧The GT4 Programmer‟s Tutorial 程序员手册++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++以下段落为第一次实验的内容++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++4Globus的安装4.0 起步4.0.1使用VMWare创建虚拟机并安装Linux我们的目标是要获得两台运行Linux系统的虚拟机。
请从ftp上下载debian.rar,解压缩后用VMWare打开。
该压缩包内为安装好Linux的虚拟机。
安装好的linux中有两个账户:root 和globus,它们的密码都是globus。
请自行创建常用的账户。
也可以用VMWare创建新的虚拟机然后从光盘安装Linux。
如果要安装Debian发行版请从ftp上下载debian-40r3-i386-CD-1_080217.iso进行安装。
华科操作系统实验报告

华科操作系统实验报告一、实验目的操作系统是计算机系统的核心组成部分,对于理解计算机的工作原理和提高计算机应用能力具有重要意义。
本次华科操作系统实验的主要目的是通过实际操作和实践,深入理解操作系统的基本概念、原理和功能,掌握操作系统的核心技术和应用方法,提高我们的实践能力和问题解决能力。
二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 2004),开发工具包括 Visual Studio Code、GCC 编译器等。
实验硬件环境为个人计算机,配置为英特尔酷睿 i7 处理器、16GB 内存、512GB 固态硬盘。
三、实验内容1、进程管理进程创建与销毁进程调度算法模拟进程同步与互斥2、内存管理内存分配与回收算法实现虚拟内存管理3、文件系统文件操作与管理文件系统的实现与优化4、设备管理设备驱动程序编写设备分配与回收四、实验步骤及结果1、进程管理实验进程创建与销毁首先,使用 C 语言编写程序,通过系统调用创建新的进程。
在程序中,使用 fork()函数创建子进程,并在子进程和父进程中分别输出不同的信息,以验证进程的创建和执行。
实验结果表明,子进程和父进程能够独立运行,并输出相应的信息。
进程调度算法模拟实现了先来先服务(FCFS)、短作业优先(SJF)和时间片轮转(RR)三种进程调度算法。
通过模拟多个进程的到达时间、服务时间和优先级等参数,计算不同调度算法下的平均周转时间和平均等待时间。
实验结果显示,SJF 算法在平均周转时间和平均等待时间方面表现较好,而 RR 算法能够提供较好的响应时间和公平性。
进程同步与互斥使用信号量和互斥锁实现了进程的同步与互斥。
编写了生产者消费者问题的程序,通过信号量控制生产者和消费者对缓冲区的访问,避免了数据竞争和不一致的情况。
实验结果表明,信号量和互斥锁能够有效地实现进程间的同步与互斥,保证程序的正确性。
2、内存管理实验内存分配与回收算法实现实现了首次适应(First Fit)、最佳适应(Best Fit)和最坏适应(Worst Fit)三种内存分配算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3) clrSysCall:接受 0 个参数,用于把系统调用次数数组清零。
6. 为三个系统调用增加具体实现
在/usr/src/linux-2.6.18/kernel/sys.c 中实现这三个函数:
asmlinkage int sys_allSysCall(void){ int i=0; printk("Times of system calls\n"); for(;i<NR_syscalls;i++) printk("System call [%d] was called %ld times. \n",i,callCount[i]); return 0; }
在用户空间无法直接调用系统调用来执行内核代码,所以需要通过软中断的方式来实现系统调用。通 过int $0x80指令产生系统软中断,触发异常使得系统切换到内核态执行128号异常处理程序,调用 system_call()函数。但是仅仅陷入内核空间是不够的,还需要通过eax寄存器把相应的系统调用号传递给 内核。在陷人内核之前,用户空间就把相应系统调用所对应的号放入eax中了。这样系统调用处理程序一旦 运行,就可以从eax中得到数据。system_call()函数通过将给定的系统调用号与NR_syscalls做比较来检查 其有效性。如果它大于或者等于NR syscalls,该函数就返回一ENOSYS。否则,就执行相应的系统调用。由 于系统调用表中的表项是以32位(4字节)类型存放的,所以内核需要将给定的系统调用号乘以4,然后用所 得的结果在该表中查询其位置。
实验过程:
内核安装
1. 安装 vmware workstation,并在其上安装 CentOS 5.8。 2. 安装 vmware-tools,设置共享文件夹。并把内核文件 linux-2.6.18.tar.xz 下载至共享文
件夹当中(/mnt/hgfs/sharedFiles)。 3. 登录 root,把内核文件压缩包解压至/usr/src 目录下:
incl callCount(,%eax,4)这条会变代码的含义是:incl 是对后面的地址的内容进行自增 操作,也就是对 callCount(,%eax,4)这个元素的内容+1。其中 eax 是用户空间传递到 eax 寄存器中的系统调用号。,%eax,4 的含义是 eax 寄存器里面的值乘以 4,由于系 统调用表中的表项是以 32 位(4 字节)类型存放的,所以内核需要将给定的系统调用 号乘以 4,所以是对 callCount 第%eax*4 个元素进行增量操作。
4. 为三个新增的系统调用添加系统调用号的宏
在/usr/src/linux-2.6.18/include/asm/unistd.h 中添加三个系统调用的调用号: #define __NR_allSysCall 318 #define __NR_spcSysCall 319 #define __NR_clrSysCall 320 把__NR_syscalls 这个记录系统调用总数的宏增加 3 #define __NR_syscalls 321
syscall(test_allSysCall); return 0; }
测试结果:
所有系统调用的次数都已被列出(这里只显示前几个),函数正常工作。 (2) 测试 spcSysCall(): test_spcSysCall.c
#include<linux/unistd.h> #include<stdlib.h> #include<stdio.h> #include<errno.h> #define test_spcSysCall 319 int main() {
课程大作业报告书
题目:高级操作系统与分布式系统大作业
学院
计算机科学与工程
专 业 计算机科学与技术(全英创新班)
学生姓名
黄炜杰
学生学号
201230590051
联系方式 _15626243309(Tel)/651476895(QQ)_
指导教师
吴一民
课程编号
S0812011
课程学分
2分
起始日期
2016 年 1 月 11 日
【实验环境】 操作系统: Centos-5.8-i386(内核版本 2.6.18-308) 编译的内核: 2.6.18 虚拟机: VMware Workstation 12.1.0.2487
【虚拟机账号密码】★★★★ 账号:root 密码:aaasss
实验一
实验内容
【实验原理】
linux系统调用是linux在其内核里都有一些内建的函数,这些函数可以用来完成一些系统级别的功能。 这些函数代表了从用户空间到内核空间的一种转换,例如在用户空间调用open函数,则会在内核空间调用 sys_open。Linux中每个系统调用都有相应的系统调用号,这样,通过这个独一无二的号就可以关联系统调 用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就被用来指明到底是要执行哪个系统调 用。进程不会提及系统调用的名称。在这次试验采用的linux-2.6.18内核中共有317个系统调用,他们储存在 sys_call_table的数据结构当中,这个数据结构在此内核中的entry.S中定义。sys_call_table是一张由指向实 现各种系统调用的内核函数的函数指针组成的表。
5. 在头文件中声明三个系统调用
在/usr/src/linux-2.6.18/include/linux/syscalls.h 的尾部添加: asmlinkage int sys_allSysCall(void); asmlinkage int sys_spcSysCall(int sys_callNum); asmlinkage int sys_clrSysCall(void);
Linux系统本身并未有记录系统调用次数的数据结构,因此我们需要在内核中定义一个全局数组来记录 每个系统调用被执行的次数。从调用的原理上看,要记录每个系统调用被执行的次数,我们可以在 system_call()参数检查成功后,对相应的系统调用次数做一次增量操作,这样就完成了执行次数记录的工 作。为了能得到该数组信息和对该数组进行操作,我们还需要定义自己的系统调用。我们定义的系统调用 可以相应地在entry.S中的sys_call_table添加,并重新编译内核,使用该函数。
实验概述
【实验目的及要求】 内核版本要求:
Linux-2.6.18 实验任务:
1.修改 system_call(),使内核能够记录每一个系统调用被使用的次数。同时,为了使应用 程序能够查询到这些数据,本实验要求实现两个系统调用,一个供应用程序来查询某个特 定系统调用被使用的次数,另一个系统调用将系统调用计数清零。编制一个用户态程序调 用你所增加的这两个系统调用,统计在一段时间内各系统调用被调用的次数。 2.修改系统的缺页异常处理程序使之能够记录系统缺页次数和当前进程的缺页次数。同样, 本实验也要求实现两个系统调用,一个供应用程序查询缺页次数,另一个系统调用将缺页 计数清零。编制一个用户态程序你所增加的这两个系统调用,统计在一段时间内你的进程 缺页的次数。
2. 修改 system_call(),使其能对每个系统调用进行计数
在/usr/src/linux-2.6.18/arch/i386/kernel/entry.S 的 syscall_call:和 call *sys_call_table (,%eax,4)之间插入语句: vim /usr/src/linux-2.6.18/arch/i386/kernel/entry.S incl callCount(,%eax,4)
8. 编写测试函数
(1) 测试 allSysCall(): test_allSysCall.c
#include<linux/unistd.h> #include<stdlib.h> #include<stdio.h> #include<errno.h> #define test_allSysCall 318 int main() {
asmlinkage int sys_clrSysCall(void){ int i=0; for (;i < NR_syscalls;i++) callCount[i]=0; printk("Times of system call setted to 0.\n"); return 0; }
7. 重新编译内核
int sysNum; scanf("%d",&sysNum); syscall(test_spcSysCall,sysNum); return 0; }
7. 安装内核: make install
8. 内核版本验证: vim /boot/grub/grub.conf 查看内核版本列表,可以看到 2.6.18 内核已安装,修改 default=0, 默认启动新安装的内核。
9. 重启,查看内核版本: uname –a 内核从 2.6.18-308 变为 2.6.18,内核安装成功。
asmlinkage int sys_spcSysCall(int callNum){ if(callNum < NR_syscalls && callNum >= 0){ printk("System call --%d has been call %ld time(s). \n",callNum,mycount[callNum]); return callCount[callNum]; } else{ printk("Inviliad system call number.\n"); return -1; } }
记录系统调用次数
1. 创建一个全局数组记录系统调用次数