30袁卓航操作系统上机报告08
- 格式:doc
- 大小:963.50 KB
- 文档页数:11
操作系统上机实验报告实验一进程的建立1.实验目的学会通过基本的Windows进程控制函数,由父进程创建子进程,并实现父子进程协同工作。
2.实验软硬件环境Dev-C++3.实验内容创建两个进程,让子进程读取一个文件,父进程等待子进程读取完文件后继续执行,实现进程协同工作。
进程协同工作就是协调好两个进程,使之安排好先后次序并以此执行,可以用等待函数来实现这一点。
当需要等待子进程运行结束时,可在父进程中调用等待函数。
4.实验程序及分析实验程序源代码如下:父进程:#include<stdio.h>#include<windows.h>int main(){STARTUPINFO si;PROCESS_INFORMA TION pi; //当Windows创建新进程时,将使用这两个结构体的有关成员。
所以在创建子进程之前应该对结构体进行声明和初始化。
ZeroMemory(&pi,sizeof(pi));ZeroMemory(&si,sizeof(si));si.cb=sizeof(STARTUPINFO);if(CreateProcess("lab1.2.exe",NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL ,NULL,&si,&pi))//创建一个新进程,若是成功,就返回1,进而实现if选择{printf("子进程已创建~\n");int i,sum=0;for(i=1;i<=100;++i){sum+=i;printf("sum=%d\n",sum);} //进行1+2+3+….+100计算WaitForSingleObject(pi.hProcess,INFINITE); FILE *fp;fp=fopen("date.txt","r");char ch=fgetc(fp); //创建文件并打开while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp); //关闭文件}elseprintf("子进程创建失败~\n");return 0;}子进程:#include<stdio.h>#include<stdlib.h>int main(){printf("子进程运行~\n");FILE *fp;if(fp=fopen("date.txt","w")){printf("已经创建文件!\n");int i;for(i=48;i<58;i++) fputc(i,fp);fputc('\n',fp);fclose(fp);printf("已经写入数据:"); //向文本中写入数据fp=fopen("date.txt","r");char ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp); //输出数据}fclose(fp);}else printf("创建文件失败!\n");system("pause");return 0;}5. 实验截图说明及分析6. 实验心得体会掌握了父进程创建子进程的方法,对操作系统多线程认识更深了。
操作系统课程设计实验报告册班级: 130812学号: ********姓名:**目录实验1 Linux系统调用 (2)实验2 实现spinlock以及共享内存调用 (5)实验3 内核模块 (14)实验4 设备驱动 (18)实验5 文件系统 (22)实验编号 1 题目Linux系统调用实验目的加深对系统函数库、操作系统提供的系统调用的共同点和差异的认识,通过认识、了解Linux系统调用的实现方式,强化操作系统为用户提供接口方式的理性认识。
实验内容为Linux内核增加一个系统调用,并编写用户进程的程序来测试。
要求该系统调用能够完成以下功能:1. 该系统调用有1个整型参数。
2. 若参数大于0,则返回自己学号的最后一位。
如学号为248,则返回8。
3. 若参数小于或等于0,则返回自己的学号。
如学号为248,则返回248。
报告内容要求(1) 程序实现方法和思路(2) 测试及结果报告正文一、实验准备联网下载版本为2.6.25.14的linux内核压缩包,使用U盘放入WMware 中安装的Fedora9操作系统中。
解压后文件夹:/usr/src/linux-2..6.25.14。
二、实验步骤(一)、修改内核文件(1)修改内核文件:/usr/src/linux-2..6.25.14/kernel/sys.c 在sys.C文件中添加新的系统调用实现,如下所示:asmlinkage int sys_mycall(int a){if(a>0)return 5;elsereturn 13081175;}截图:(2)在system call table中增加新的系统调用表项,寻找文件/usr/src/linux-2..6.25.14/arch/x86/kernel/syscall_table_32.h,在最后一行添加:.long sys_mycall /*327*/截图:(3)增加新的系统调用编号:修改文件/usr/src/linux-2..6.25.14/include/asm-x86/unistd_32.h 的最后一行,增加:#define __NR_mycall 327 /*my new syscall*/数字紧跟上一行最后一个系统调用的编号。
操作系统上机报告实验一、匿名管道通信一、实验目的学会创建匿名管道,并且能够利用管道进行进程间的通信。
二、实验内容分别建立名为Parent的单文档应用程序和Child的单文档应用程序作为父子进程,由父进程创建一个匿名管道,实现父子进程向匿名管道写入和读取数据。
三、设计与实现过程本实验在VC6.0上实现▪ A.父进程▪先建一个Parent的单文档应用程序,增加“创建管道”“读取数据”“写入数据”三个菜单,并添加消息响应函数OnPipeCreate(),OnPipeRead(),OnPipeWrite()。
在CParentView类中增加成员变量HANDLE类型的hRead,hWrite,初始化变量,并在析构函数中释放句柄:▪void CParentView::OnPipeWrite()▪{▪if(!CreatePipe(…)) /*创建匿名管道*/▪{▪ /*显示消息“创建管道失败!”*/▪ /*退出*/▪}▪if(!CreateProcess(…)) /*创建子进程*/▪{▪ /*关闭句柄hRead、hWrite*/▪ /*显示消息“创建子进程失败!”*/▪ /*退出*/▪}▪}▪void CParentView::OnPipeRead()▪{▪ /*定义一个字符数组,用于存放读取的数据*/▪if(!ReadFile(…)) /*读取数据*/▪{▪ /*显示消息“读取数据失败!”*/▪ /*退出*/▪}▪/*打印读取的数据*/▪/*退出*/▪void CParentView::OnPipeWrite()▪{▪/*定义一个字符数组,用于存放写入的数据*/▪if(!WriteFile(…)) /*写入数据*/▪ /*显示消息“写入数据失败!”*/▪ /*退出*/▪}▪}▪ B.子进程▪建一个Child的单文档,在CChildView中增加两个成员HANDLE 型的成员变量hRead,hWrite,并添加消息响应函数OnPipeRead(),OnPipeWrite(),再添加虚函数OnInitialUpdate(),并在析构函数中释放句柄。
计算机操作系统(cāo zuò xì tǒnɡ)上机实验报告
云南师范大学信息(xìnxī)学院
实验报告
学号:134100010姓名:姜兴玲班级:计科13A 课程名称:操作系统实验名称:存储管理
实验性质:①综合性实验②设计性实验③验证性实验试验时间:2015年5月5日试验地点:睿智4栋212
本试验所用的设备:计算机一台
实验目的
了解计算机的存储并学会管理。
实验内容及过程:
1.右键单击工具栏,打开任务管理器查看性能来了解CPU
使用和页面文件使用。
2、单击开始设置控制面板系统
单击高级然后选择性能的设置来设置系统、管理系统
3、性能和维护打开控制面板切换到分类视图,选择性能和维护来进行操作。
小结:
通过对控制面板的熟悉我们能更好的了解计算机并且能对存储管理更好的了解和学习!
任课教师评语
教师签字: 年月日
注:每学期至少一次设计性实验。
每学期结束请任课教师按时按量统一(tǒngyī)交到教学秘书处
内容总结
(1)计算机操作系统上机实验报告。
实验名称:计算机操作系统上机操作实验实验日期:2023年X月X日实验地点:计算机实验室实验教师:XXX一、实验目的1. 熟悉计算机操作系统的基本概念和功能。
2. 掌握Windows操作系统的基本操作,包括文件管理、系统设置等。
3. 学会使用Windows操作系统的常用工具,如计算器、记事本等。
4. 提高实际操作能力,为以后的学习和工作打下基础。
二、实验内容1. Windows操作系统基本操作(1)启动和关闭计算机(2)桌面操作:添加、删除桌面图标,调整桌面布局(3)文件管理:创建、复制、移动、删除文件和文件夹(4)系统设置:调整屏幕分辨率、设置网络连接、管理用户账户等2. 常用工具使用(1)计算器:进行基本的数学运算(2)记事本:编写简单的文本文件(3)画图:绘制图形和编辑图片(4)写字板:编辑和排版文本3. 系统安全与维护(1)安装和卸载软件(2)磁盘清理和碎片整理(3)病毒查杀(4)备份和还原系统三、实验步骤1. 启动计算机,进入Windows操作系统。
2. 调整桌面布局,添加和删除桌面图标。
3. 创建一个文件夹,命名为“实验文件夹”,并将实验过程中生成的文件和文档保存到该文件夹中。
4. 使用文件管理功能,对实验文件夹中的文件进行复制、移动、删除等操作。
5. 调整屏幕分辨率,设置网络连接,管理用户账户等系统设置。
6. 使用计算器进行数学运算,如加、减、乘、除等。
7. 使用记事本编写一个简单的文本文件,并保存到实验文件夹中。
8. 使用画图工具绘制一个简单的图形,并保存为图片文件。
9. 使用写字板编辑一个文档,并保存为Word文档。
10. 安装一个软件,如QQ,并学习如何卸载软件。
11. 对磁盘进行清理和碎片整理,确保系统运行流畅。
12. 使用杀毒软件查杀病毒,确保系统安全。
13. 学习备份和还原系统的方法,以备不时之需。
四、实验结果与分析1. 通过本次实验,我掌握了Windows操作系统的基本操作,包括文件管理、系统设置等。
编者说明《操作系统》是计算机科学与技术专业的一门核心专业基础课。
学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。
这些原理与技巧可以说是计算机界的前辈们一代接一代不停歇的努力所留下的知识与智慧的结晶,学习和掌握它们对于激发自己的创造力和想象力是很有帮助的。
如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法就是在实践中练习,通过自己模拟设计操作系统的原理实验,可以培养程序设计的方法和技巧,提高编制和理解清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。
使自身更好的掌握操作系统的基本概念、基本原理及基本功能,从而具有分析实际操作系统的基本能力,深入直观的理解操作系统使用的各类算法。
《操作系统实验指导书》是针对这门课的实验编写的,书中设计了三个操作系统原理实验。
三个实验难易层次分明,重点突出,其中实验一(Windows操作系统)和实验二(进程管理)为验证性实验,重在验证教材中的理论原理,而实验三(虚拟存储管理)为设计性实验,重在培养理论原理应用于实践的设计能力。
所有实验共8学时,采用C语言作为编程语言模拟设计完成相关程序。
限于编者的水平,难免有疏漏与错误,敬请读者批评指正。
编者:李可实验一Windows操作系统一、实验题目计算机管理、任务管理、察看了解注册表二、实验目的Windows是目前使用人数最多的操作系统,学习操作系统,对操作系统有更加深入的了解。
三、实验内容1.Windows提供了那些人机交互的界面?2.观察Windows对应用程序运行的支持。
●Windows提供了几种方式启动应用程序?●Windows提供了几种方式让用户改变应用程序外观?●Windows提供了几种方式结束程序的运行?3.了解windows对应用程序的运行时对I/O支持。
系统中有多少个I/O设备?多少种I/O控制方式?能否确信应用程序I/O需要操作系统支持?能体会到“设备独立性”吗?4.观察资源管理器,记录你使用的机器的资源情况:CPU、内存、磁盘分区及容量、文件目录树及文件属性。
《操作系统》上机实验一报告目录一、实验关键问题二、代码设计思路三、实现的关键代码四、程序运行结果五、实验总结一、实验关键问题1.1要求:编写一个Linux系统C程序,由父亲创建2个子进程,再由子进程各自从控制台接收一串字符串,保存在各自的全局字符串变量中,然后正常结束。
父进程调用waitpid等待子进程结束,并分别显示每个子进程的进程标识号和所接收的字符串。
1.2要求:父进程创建一子进程,父进程向子进程发送数据,子进程接收数据,并写入文件。
二、代码设计思路2.1 问题1.1的代码设计思路由父进程创建两个共享内存→分别创建两个子进程→提示用户输入信息,并将信息存到子进程各自对应的共享内存中→等待子进程结束→子进程结束后,父进程被唤醒并与共享内存连接→分别从这两个内存共享中获取数据,并把数据和对应的子进程PID输出到屏幕上→父进程结束2.2问题1.2的代码设计思路由父进程创建管道→创建子进程→父进程关闭读管道,获取用户输入的数据→把数据写入写管道中,关闭写管道→等待子进程结束,此时父进程挂起→子进程关闭写管道→子进程读取父进程放入读管道中的数据,显示数据到屏幕上→将数据写入文件“CP_file.txt”中→关闭读管道,关闭文件→结束子进程→父进程被唤醒后父进程也结束。
三、实现的关键代码3.1 问题1.1的实现代码#include <unistd.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <sys/wait.h>#include <stdio.h>#include <stdlib.h>#define Key0 9876#define Key1 5432#define Size 2048 //Size表示共享内存大小,此处设置为2048int main(){int shmid1, shmid2;//共享内存的标识符//父进程创建共享内存shmid1和shmid2shmid1 = shmget(Key0, Size, IPC_CREAT|0600);shmid2 = shmget(Key1, Size, IPC_CREAT|0600);pid_t pid1, pid2;//子进程标识符char *shmaddr;//连接地址//父进程创建子进程pid1if ((pid1 = fork()) == 0){shmaddr = (char*)shmat(shmid1, NULL, 0);/*shmat()实现子进程pid1与共享内存shmid1的连接*/printf("Child process 1 is running now, enter a string:");/*请求用户输入一个字符串*/fgets(shmaddr, Size-1, stdin);/*fgets()将信息存到shmaddr所指的内存空间*/shmdt(shmaddr);/*shmdt()使该进程脱离该共享内存断,但并不删除该内存段*/return 0;}printf("\nWaitting for child process 1...\n");waitpid(pid1, NULL, 0);//等待子进程pid1结束printf("Child process 1 is over...\n");//父进程创建子进程pid2if ((pid2 = fork()) == 0){shmaddr = (char*)shmat(shmid2, NULL, 0);printf("Child process 2 is running now, enter a string:");fgets(shmaddr, Size-1, stdin);shmdt(shmaddr);return 0;}printf("\nWaitting for chils process 2...\n");waitpid(pid2, NULL, 0);printf("Child process 2 is over...\n\n");shmaddr = (char*)shmat(shmid1, NULL, 0); /*父进程与共享内存shmid1连接*/printf("Child process 1: PID=%d message: %s\n", pid1, shmaddr);/*屏幕显示共享内存shmid1的信息*/shmdt(shmaddr);shmctl(shmid1, IPC_RMID, NULL);//删除共享内存shmid1shmaddr = (char*)shmat(shmid2, NULL, 0);printf("Child process 2: PID=%d message: %s\n", pid2, shmaddr);shmdt(shmaddr);shmctl(shmid2, IPC_RMID, NULL);return 0;}3.2 问题1.2的实现代码#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/wait.h>#define maxsize 2048//maxsize表示传送的最大数据量,此处设置为2048 int main(){pid_t pid;//子进程标识符int pip[2];//管道描述符//创建管道if (pipe(pip) < 0)//管道创建失败{printf("Faile to create pipe!\n");return -1;}//创建子进程if ((pid = fork()) < 0)//子进程创建失败{printf("Faile to create child process!\n");return -1;}char buffer[maxsize];// 数据缓冲区FILE *file;// 文件描述符//子进程执行if ( pid==0 ){close(pip[1]);// 关闭写管道read(pip[0], buffer, maxsize);// 读取父进程发送的管道数据close(pip[0]);// 关闭读管道//屏幕输出子进程接收到得信息printf("Child process is running now, the received record:\n%s", buffer);if ((file=fopen("CP_file.txt", "w"))==NULL)/*打开CP_file.txt文件失败*/{printf("Error!Can't open CP_file.txt.\n");exit(1);}else{fputs(buffer, file);// 成功打开CP_file.txt文件,将数据写入文件中fclose(file);// 关闭文件return 0;}}//父进程执行else{close(pip[0]);// 关闭读管道printf("Parent process is running now, enter the record:\n");fgets(buffer, maxsize-1, stdin);// 接收用户输入的数据write(pip[1], buffer, maxsize);// 接收用户输入的数据close(pip[1]);// 关闭写管道waitpid(pid, NULL, 0);// 父进程等待子进程结束return 0;}}四、程序运行结果4.1 问题1.1的程序运行结果(图4.1所示)(图4.1)4.2 问题1.2的程序运行结果(图4.2所示)(图4.2)五、实验总结通过本次上机实验,我的收获很多。
课程设计(上机实验)报告课程名称:计算机操作系统学生姓名:学号:所在学院:电子与信息工程学院专业:计算机科学与技术指导教师:2011年 1 月 11 日课程设计(上机实验)报告填写说明1.本报告作为指导教师对学生课程设计(上机实验)评分的依据材料之一。
此报告应在指导教师指导下,由学生在课程设计(上机实验)结束时完成,以班为单位收齐后按时交给指导教师批阅;2.本报告内容必须用黑墨水笔工整书写或按信息学院统一设计的电子文档标准格式(可从信息学院网页上下载)打印(小4号宋体,1.5倍行距),禁止打印在其它纸上后剪贴;3.本报告中的“设计说明书”应按论文的格式成文,并直接书写(或打印)在本报告“设计说明书”栏目内。
其内容可以结合设计题目的内容和要求,根据自己在本课程设计(上机实验)阶段所完成的工作,阐明自己所采取的设计思想和方法(硬件的设计及其电原理图分析介绍,和/或软件的算法和数据结构及其主要模块介绍、程序在测试用例下的测试运行结果等)、完成本课程设计的心得体会、设计中的不足及改进设计的设想或建议等。
说明书的篇幅应不少于2000字。
4.对硬件类课程设计,应绘制或打印硬件设计图纸或实验原理图,作为设计报告的附件。
5.软件类课程设计(上机实验)的软件文档(含软件清单和程序运行的有关结果)可以单独打印成册或上传到指导教师指定计算机,作为课程设计报告的附件。
课程设计(上机实验)报告的附件是指导教师对学生课程设计(上机实验)评分的另一个依据。
课程设计(上机实验)题目:目的与任务:内容和要求:在此次实验过程中,我选择了以下几项作为实验内容:4.1 修改md命令4.2.1 修改help命令的显示方式和显示内容4.7 修改close、type等命令,允许不带文件名参数1. 改正某些缺陷2. 允许覆盖同名文件(选做内容)4.9 增加输出重定向功能(选做内容)1. type命令的输出重定向形式4.15 修改read命令,允许不带文件名参数(选做内容)课程设计(上机实习)报告4.1修改md命令命令格式:md <目录名>[ <属性>]设计思想:如果k等于2时,表示有属性参数,将参数转换为小写字母,再逐个与rh s比较,如果是则将属性与相对应的值进行或运算,如果不是则返回负值。
操作系统集中上机实验报告学生:刘亚男学号:班级: 02141101专业:数字媒体技术重庆邮电大学移通学院2013年12月目录实验一:银行家算法 (3)目的和要求 (3)实验内容 (3)算法描述 (3)代码如下: (3)实验结果: (10)实验二:时间片轮转法 (11)基本思想: (11)代码如下: (11)实验结果: (15)实验三:非抢占式优先级调度算法 (15)基本思想: (15)实验结果: (20)集中上机总结 (21)参考文献 (21)实验一:银行家算法目的和要求银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
实验内容1.设计进程对各类资源最大申请表示及初值确定。
2.设定系统提供资源初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其申请是否得到满足。
算法描述银行家可以把一定数量的资金供多个用户周转使用,为保证资金的安全银行家规定:1. 当一个用户对资金的最大需求量不超过银行家现有的资金就要接纳该用户;2. 用户可以分期贷款,但贷的总数不能超过最大需求量;3. 当银行家现有的资金不能满足用户的沿需贷数时,对用户的贷款可推迟支付,但总能使用户在有限的时间里得到贷款;4. 当用户得到所需的全部资金后,一定能在有限的时间里归还所有的资金。
代码如下:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iomanip.h>#include<conio.h>const int MAX_P=20; //允许的最大作业数const int MAXA=10; //定义A 类资源的总数量const int MAXB=5; //定义B 类资源的总数量const int MAXC=7; //定义C 类资源的总数量typedef struct node{int a;int b;int c;int remain_b;int remain_c;}bank;typedef struct node1{char name[20];int a;int b;int c;int need_a;int need_b;int need_c;}process;bank banker;process processes[MAX_P]; int quantity;//初始化函数void initial(){int i;banker.a=MAXA; banker.b=MAXB; banker.c=MAXC;banker.remain_a=MAXA; banker.remain_b=MAXB; banker.remain_c=MAXC;for(i=0;i<MAX_P;i++){ strcpy(processes[i].name,""); processes[i].a=0; processes[i].b=0; processes[i].c=0; processes[i].need_a=0; processes[i].need_b=0; processes[i].need_c=0;}}//新加作业void add(){char name[20];int flag=0;int t;int need_a,need_b,need_c; int i;printf("新加作业\n");printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"); printf("请输入新加作业名:");scanf("%s",name);for(i=0;i<quantity;i++){if(!strcmp(processes[i].name,name)){flag=1;break;}}if(flag){printf("错误,作业已存在\n");}else{printf("本作业所需A 类资源:");scanf("%d",&need_a);printf("本作业所需B 类资源:");scanf("%d",&need_b);printf("本作业所需C 类资源:");scanf("%d",&need_c);t=1;printf("A 类资源:需要%d,现有%d",need_a,banker.remain_a);if(need_a>banker.remain_a){printf("错误,所需A 类资源大于银行家所剩A 类资源\n");t=0;}printf("B 类资源:需要%d,现有%d",need_b,banker.remain_b);if(need_b>banker.remain_b){printf("错误,所需B 类资源大于银行家所剩B 类资源\n");t=0;}printf("C 类资源:需要%d,现有%d",need_c,banker.remain_c);if(need_c>banker.remain_c){printf("错误,所需C 类资源大于银行家所剩C 类资源\n");t=0;}if(t){strcpy(processes[quantity].name,name);processes[quantity].need_a=need_a;processes[quantity].need_b=need_b;processes[quantity].need_c=need_c;quantity++;printf("新加作业成功\n");else{printf("新加作业失败\n");}}}//为作业申请资源void bid(){char name[20];int i,p;int a,b,c;int flag;a=b=c=0;printf("\n 为作业申请资源\n");printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"); printf("要申请资源的作业名:");scanf("%s",name);p=-1;for(i=0;i<quantity;i++){if(!strcmp(processes[i].name,name)){p=i;break;}}if(p!=-1){printf("该作业要申请A 类资源数量:");scanf("%d",&a);printf("该作业要申请B 类资源数量:");scanf("%d",&b);printf("该作业要申请C 类资源数量:");scanf("%d",&c);flag=1;if((a>banker.remain_a)||(a>processes[p].need_a-processes[p].a)){printf("错误,所申请A 类资源大于银行家所剩A 类资源或该进程还需数量\n"); flag=0;}if((b>banker.remain_b)||(b>processes[p].need_b-processes[p].b)){printf("错误,所申请B 类资源大于银行家所剩B 类资源或该进程还需数量\n"); flag=0;}if((c>banker.remain_c)||(c>processes[p].need_c-processes[p].c)){printf("错误,所申请C 类资源大于银行家所剩C 类资源或该进程还需数量\n"); flag=0;if(flag){banker.remain_a-=a;banker.remain_b-=b;banker.remain_c-=c;processes[p].a+=a;processes[p].b+=b;processes[p].c+=c;printf("为作业申请资源成功\n");}else{printf("为作业申请资源失败\n");}}else{printf("该作业不存在\n");}}//撤消作业void finished(){char name[20];int i,p;printf("\n 撤消作业\n");printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"); printf("要撤消作业名:");scanf("%s",name);p=-1;for(i=0;i<quantity;i++){if(!strcmp(processes[i].name,name)){p=i;break;}}if(p!=-1){banker.remain_a+=processes[p].a;banker.remain_b+=processes[p].b;banker.remain_c+=processes[p].c;for(i=p;i<quantity-1;i++){processes[i]=processes[i+1];}strcpy(processes[quantity-1].name,"");processes[quantity-1].a=0;processes[quantity-1].b=0;processes[quantity-1].c=0;processes[quantity-1].need_a=0;processes[quantity-1].need_b=0;processes[quantity-1].need_c=0;quantity--;printf("撤消作业成功\n");}else{printf("撤消作业失败\n");}}//查看资源情况void view(){int i;printf("\n 查看资源情况\n");printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"); printf("银行家所剩资源(剩余资源/总共资源)\n");printf(" A 类:%d/%d",banker.remain_a,banker.a);printf(" B 类:%d/%d",banker.remain_b,banker.b);printf(" C 类:%d/%d",banker.remain_c,banker.c);printf("\n 作业占用情况(已占用资源/所需资源)\n");if(quantity>0){for(i=0;i<quantity;i++){printf("作业名:%s ",processes[i].name);printf(" A 类:%d/%d",processes[i].a,processes[i].need_a);printf(" B 类:%d/%d",processes[i].b,processes[i].need_b);printf(" C 类:%d/%d",processes[i].c,processes[i].need_c);printf("\n");}}else{printf("当前没有作业\n");}}//显示版权信息函数void version(){printf("\n");printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃银行家算法┃\n");printf(" ┠───────────────────────┨\n"); printf(" ┃(c)All Right Reserved YT ┃\n");printf(" ┃移通学院┃\n");printf(" ┃version 2010 build songhua ┃\n");printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); printf("\n");}void main(){int chioce=0;int flag=1;initial();version();while(flag){printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"); printf("1.新加作业2.为作业申请资源3.撤消作业\n");printf("4.查看资源情况0.退出系统\n");printf("请选择:");scanf("%d",&chioce);switch(chioce){case 1: add(); break;case 2: bid(); break;case 3: finished(); break;case 4: view(); break;case 0: flag=0; break;default: printf("选择错误\n");}}}实验结果:实验二:时间片轮转法基本思想:将CPU 的处理时间划分成一个个时间片,就绪队列中的诸进程轮流运行一个时间片,当时间片结束时,就强迫运行进程让出CPU,该进程进入就绪队列,等待下一次调度,同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。
计
算
机
操
作
系
统
上
机
报
告
班级:09软件工程1班学号:200940705130
姓名:袁卓航
周次:15
上机时间:2011-5-30
1.上机目的:
文件管理。
2.上机内容:
说明:请每次上机先建一个以你自己名字全拼首字母的用户,然后所有的操作都是在以此用户登录并将文件存放在自己的主目录中。
1、修改以下文件,显示一个文件的文件结构信息。
#include <unsitd.h>
#inlcude <sys/stat.h>
#include <sys/types.h>
int fstat(int filedes,struct stat *buf);
int stat(const char *path,struct stat *buf);
int lstat(const char *path,struct stat *buf);
//这三个系统调用都可以返回指定文件的状态信息,这些信息被写到结构struct stat的缓冲区中。
通过分析这个结构可以获得指定文件的信息。
void report(struct stat *ptr)
{
printf("The major device no is:%d\n",major(ptr->st_dev));//主设备号
printf("The minor device no is:%d\n",minor(ptr->st_dev));//从设备号
printf("The file's node number is:%d\n",ptr->st_ino);//文件节点号
printf("The file's access mode is:%d\n",ptr->st_mode);//文件的访问模式
printf("The file's hard link number is:%d\n",ptr->st_nlink);//文件的硬链接数目
printf("The file's user id is:%d\n",ptr->uid);//文件拥有者的ID
printf("The file's group id is:%d\n",ptr->gid);//文件的组ID
printf("The file's size is:%d\n",ptr->st_size);//文件的大小
printf("The block size is:%d\n",ptr->blksize);//文件占用的块数量
printf("The number of allocated blocks is:%d\n",ptr->st_blocks);//文件分配块数量
struct tm*accesstime,*lmodifytime,*lchangetime;//访问时间,修改时间,最后一个改变时间(属性)
accesstime=localtime(&(ptr->st_atime));
accesstime=localtime(&(ptr->st_mtime));
accesstime=localtime(&(ptr->st_ctime));
printf("The last access time
is: %d::%d::%d\n",accesstime->hour,accesstime->min,accesstime->sec);
printf("The last modify time
is:%d::%d::%d\n",lmodifytime->hour,lmodifytime->min,lmodifytime->sec);
printf("The last change time
is:%d::%d::%d\n",lchangetime->hour,lchangetime->min,lchangetime->sec);
2、实现dir命令,功能为列出当前文件夹的内容。
提示:可能要用到的子过程。
1、i节点内容获取函数iget( )
2、i节点内容释放函数iput( )
3、目录搜索函数namei( )
4、搜索当前目录下文件的函数iname( )
5、显示目录和文件用函数_dir( )
3.上机结果:
1、
运行结果:
2.
源代码:
运行结果:
4.上机心得:
这次上机的主要内容是Linux系统下的文件管理。
第一题的主要问题出现在两个方面。
第一,在report函数里stat结构体的部分成员变量的名称写错了;第二,头文件的缺少,缺少包含time.h头文件,虽然编译的时候没有警告或者是错误,但localtime函数的确是在time.h里面声明的。
第二题里面,如果直接把目录下的所有目录和文件名读取出来并且输出到终端上不是很困难的,只要调用系统函数readdir就可以做到了。
但是,如果想像系统ls命令那样子美观的输出,那就不那么容易了。
最主要的难点在于如何根据终端的宽度来调整输出的分组数。
在这里,我为了测试出最终的分组数而采用了试探的方法进行分组。
首先,将所有的文件名和目录名排好序,然后,假设最终的分组数为总的文件目录数相同,如果不相同则减少分组的数量,继续测试总宽度是否大于终端宽度,直到找到合适的分组数为止,其主要流程如下:
文件目录名排序;
假设分组数g和文件
目录名数相同
找出各组中长度最长
的文件或目录名,相加
给width
分组数g-- Width <= 终
端宽度
否
是
得到分组数g
1
1。