《实际操作系统实验题目及其实验报告要求.doc》由会员分享,可在线阅读,更多相关《实际操作系统实验题目及其实验报告要求.doc(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-/实 验 报 告实验课程: 操作系统实验 学生姓名: 王桥 学 号: 6100412024 专业班级: 计科123班 2014年 6月3 日目 录一、 实验一 1二、 实验二 7三、 实验三 21四、 实验四 28五、 实验五 33南昌大学实验报告 -(1)操作系统安装及其接口环境学生姓名: 王桥 学 号: 6100412024 专业班级: 计科123班 实验类型: 验证 综合 设计 创新 实验日期: 实验成绩: 一、实验目的熟悉Windows/Linux操作系统的安装过程与安装方法,并掌握该操作系统所提供的用户接口环境,并为后续实验做好编程环境准备。二、实验内容1、熟悉Windows/Li
2、nux操作系统的安装过程与安装方法,并掌握该操作系统所提供的用户接口环境,通过系统提供的用户管理程序、查看系统中的用户情况、进程、线程、内存使用情况等,学会使用它进行监视进程的状况、系统资源的使用情况及用户情况。并为后续实验做好编程环境准备。2、用C语言编写一小段程序,使其可以通过某个系统调用来获得OS提供的某种服务。三、实验要求1 了解所安装的操作系统对软硬件资源的具体要求;2 机器最低硬件配置要求;3 操作系统所提供的用户接口环境的熟悉;4 了解主要BIOS CMOS参数的含义及其设置方法;5 掌握程序编写中系统调用的方法。四、主要实验步骤1、选择语言为中文:2)选择第一项“试用 Ubun
3、tu 而不改变计算机中的任何内容”,进入 live 桌面后点击“安装”图标。1)选择语言,可以根据你自己的喜好选择,当然是选择中文(简体)了2)选择时区,默认上海就可以3)选择键盘布局,一般默认U.S.A 就可以4)准备分区,这是安装过程中最重要的一步。选择手动。5)准备分区,这是安装过程中最重要的一步。6)填写用户信息。7)文件迁移向导,点击下一页。8)准备安装。 9)安装完成,重新启动。10)界面如下南昌大学实验报告 -(2)编程模拟进程间的同步和互斥学生姓名: 王桥 学 号: 6100412024 专业班级: 计科123 实验类型: 验证 综合 设计 创新 实验日期: 实验成绩: 一、实
4、验目的通过实验加强对进程同步和互斥的理解,并掌握进程(线程)的创建和调用方法。学会使用信号量解决资源共享问题。学生可以自己选择在Windows或Linux系统下编写。二、实验内容1以下为Linux系统下参考程序,请编译、运行并观察程序的输出,并分析实验结果,写出实验报告。#include#include#include#include#include#include#include#define NUM_PROCS 5#define SEM_ID 250#define FILE_NAME /tmp/sem_aaa#define DELAY 4000000void update_file(int
5、 sem_set_id, char *file_path, int number)struct sembuf sem_op;FILE *file;/等待信号量的数值变为非负数,此处设为负值,相当于对信号量进行P操作sem_op.sem_num=0;sem_op.sem_op=-1;sem_op.sem_flg=0;semop(sem_set_id,&sem_op,1); /*操作一组信号sem_set_id是进程的标识符,sem_op是结构指针。sem_op:如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作
6、将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。*/写文件,写入的数值是当前进程的进程号file=fopen(file_path,w);if(file)/临界区fprintf(file,%dn,number);printf(%dn,number);fclose(file);/发送信号,把信号量的数值加1,此处相当于对信号量进行V操作sem_op.sem_num=0;sem_op.sem_op=1;sem_op.sem_flg=0;semop(sem_set_id,&sem_op,1);/子进程写文件v
7、oid do_child_loop(int sem_set_id,char *file_name)pid_t pid=getpid();int i,j;for(i=0;i3;i+)update_file(sem_set_id,file_name,pid);for(j=0;j4000000;j+); int main(int argc,char *argv)int sem_set_id; /信号量集的IDunion semun sem_val; /信号量的数值,用于semctl()int child_pid;int i;int rc;/ 建立信号量集,ID是250,其中只有一个信号量sem_se
8、t_id=semget(SEM_ID,1,IPC_CREAT|0600);if(sem_set_id=-1)perror(main: semget);exit(1);/把第一个信号量的数值设置为1sem_val.val=1;rc=semctl(sem_set_id,0,SETVAL,sem_val);if(rc=-1)perror(main:semctl);exit(1);/建立一些子进程,使它们可以同时以竞争的方式访问信号量for(i=0;iNUM_PROCS;i+)child_pid=fork();switch(child_pid)case -1: perror(fork);case 0:
9、 /子进程do_child_loop(sem_set_id,FILE_NAME);exit(0);default: /父进程接着运行break;/等待子进程结束for(i=0;iNUM_PROCS;i+)int child_status;wait(&child_status);printf(main:were donen);fflush(stdout);return 0;gcco1 1.c(编译、链接程序)./1(执行程序)2模拟PV操作同步机构,且用PV操作解决生产者消费者问题。模拟PV操作同步机构,且用PV操作解决生产者消费者问题。提示:(1) PV操作同步机构,由P操作原语和V操作原语组
10、成,它们的定义如下:P操作原语P(s):将信号量s减去1,若结果小于0,则执行原语的进程被置成等待信号量s的状态。V操作原语V(s):将信号量s加1,若结果不大于0,则释放一个等待信号量s的进程。这两条原语是如下的两个过程:procedure p (var s: semaphore);begin s:=s-1;if s0 then W(s)end pprocedure v (var s: semaphore);begin s: =s+1;if sPC结束保护现场,PC=当前进程PCB的断点有就绪进程?否是图4-5处理器调度程序流程P(s)GOTO空操作PutGETproduceconsumeV
11、(s)开始j:=PC按j转向各模拟指令对应的过程现行进程为生产者?否是j:=SAij:=PAiPC:=i+1置现行进程为就绪态返回生产者运行结束?置生产者进程为完成态是否图 4-6 模拟处理器指令执行开始SS+1将调用V(s)过程的进程置为就绪找一个等待s信号量的进程置为就绪态S0返回否是开始SS-1将调用P(s)过程的进程置为就绪将调用P(s)过程的进程置为等待信号量s的状态S0返回否是(1)模拟P(S) (2)模拟V(S)图 4-7 模拟PV操作的执行三、实验要求1、 linux操作系统2、 Windows操作系统四、主要实验步骤linux操作系统下的操作步骤: gedit semapho
12、re.c (编辑程序)gcc o semaphore semaphore.c (编译、链接程序)./semaphore(执行程序)生产者和消费者的代码:#include const unsigned short SIZE_OF_BUFFER = 5; /缓冲区长度unsigned short ProductID = 0; /产品号unsigned short ConsumeID = 0; /将被消耗的产品号unsigned short in = 0; /产品进缓冲区时的缓冲区下标unsigned short out = 0; /产品出缓冲区时的缓冲区下标int g_bufferSIZE_OF_
13、BUFFER; /缓冲区是个循环队列bool g_continue = true; /控制程序结束HANDLE g_hMutex; /用于线程间的互斥HANDLE g_hFullSemaphore; /当缓冲区满时迫使生产者等待HANDLE g_hEmptySemaphore; /当缓冲区空时迫使消费者等待DWORD WINAPI Producer(LPVOID); /生产者线程DWORD WINAPI Consumer(LPVOID); /消费者线程int main() /创建各个互斥信号 g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hFullSem
14、aphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); /调整下面的数值,可以发现,当生产者个数多于消费者个数时, /生产速度快,生产者经常等待消费者;反之,消费者经常等待 const unsigned short PRODUCERS_COUNT = 3; /生产者的个数 const unsigned short CONSUMERS_COUNT = 1; /消费者的个数 /总的
15、线程数 const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_COUNT; /各线程的handle DWORD producerIDCONSUMERS_COUNT; /生产者线程的标识符 DWORD consumerIDTHREADS_COUNT; /消费者线程的标识符 /创建生产者线程 for (int i=0;iPRODUCERS_COUNT;+i) hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&produc
16、erIDi); if (hThreadsi=NULL) return -1; /创建消费者线程int i; for ( i=0;iCONSUMERS_COUNT;+i) hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDi); if (hThreadsi=NULL) return -1; while(g_continue) if(getchar() /按回车后终止程序运行 g_continue = false; return 0;/生产一个产品。简单模拟了一下,仅输出新产品的ID号void Prod
17、uce() std:cerr Producing +ProductID . ; std:cerr Succeed std:endl;/把新生产的产品放入缓冲区void Append() std:cerr Appending a product . ; g_bufferin = ProductID; in = (in+1)%SIZE_OF_BUFFER; std:cerr Succeed std:endl; /输出缓冲区当前的状态 for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i : g_bufferi; if (i=in) std:cout - 生产; i
18、f (i=out) std:cout - 消费; std:cout std:endl; /从缓冲区中取出一个产品void Take() std:cerr Taking a product . ; ConsumeID = g_bufferout; out = (out+1)%SIZE_OF_BUFFER; std:cerr Succeed std:endl; /输出缓冲区当前的状态 for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i : g_bufferi; if (i=in) std:cout - 生产; if (i=out) std:cout - 消费;
19、std:cout std:endl; /消耗一个产品void Consume() std:cerr Consuming ConsumeID . ; std:cerr Succeed std:endl;/生产者DWORD WINAPI Producer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMut
20、ex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0;/消费者DWORD WINAPI Consumer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NU
21、LL); return 0;六、 实验数据及处理结果七、 实验体会或对改进实验的建议实验还是挺难的,而且是第一个实验,所以参考了百度的代码。南昌大学实验报告 -(3)编程实现银行家安全算法学生姓名: 王桥 学 号: 6100412024 专业班级: 计科123 实验类型: 验证 综合 设计 创新 实验日期: 实验成绩: 一、实验目的通过实验加强对银行家安全算法的理解和掌握。二、实验内容熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。三、实验要求1、需写出设计说明;2、设计实现代码及说明3、运行结果;四、主要实验步骤#include #include #
22、include int max53; /最大需求矩阵开始定义银行家算法中需要用到的数据,定义了5个进程,3类资源int allocation53;/已分配矩阵int need53;/需求矩阵,int available3;/系统可利用资源int request53;/请求矩阵char *finish5;/表示系统是否有足够的资源分配给进程,开始先令finish【i】=false,当有足够资源给进程i,再令它等于trueint safe5;/存储安全序列int n,i,m;int k=0;int j=0;int work3;/表示系统可供给进程继续运行所需的各类资源数目int works53;v
23、oid start();/表示程序开始void end();/表示程序结束void input();/输入数据void output();/输出数据void change();/系统分配资源,原有资源情况改变void outputsafe();/输出安全序列的资源分配情况int check();/安全性算法void main()/主程序开始start();for (;j=0;)/确认输入数据的正确性,若输入错误,重新输入input();printf(以下为进程资源情况,请确认其是否正确:n);output();printf(数据是否无误:n正确:输入1n错误:输入0n请输入:);scanf(%
24、d,&j);printf(数据确认无误,算法继续。n); if (check()=0)/若check函数返回值为,表示输入的初始数据找不到安全序列,无法进行下一步,程序结束end();exit(0);for(;j=1;)/当有多个进程请求资源时,循环开始printf(请输入请求资源的进程i(下标):);/输入发出请求向量的进程及请求向量scanf(%d,&i);printf(请输入进程P%d的请求向量Request%d:,i,i);for(n=0;nneedi0|requesti1needi1|requesti2needi2;) /若请求向量大于需求资源,则认为是输入错误,要求重新输入prin
25、tf(数据输入有误,请重试!n请输入进程P%d的请求向量Request%d:,i,i);for(n=0;n3;n+)scanf(%d,&requestin);if(requesti0=available0&requesti1=available1& requesti2=available2) /判断系统是否有足够资源提供分配printf(系统正在为进程P%d分配资源n,i);change();/分配资源j=0;elseprintf(系统没有足够的资源,进程P%d需要等待。n,i);if (j=0)/j=0表示系统有足够资源分配的情况printf(当前系统资源情况如下:n);/输出分配资源后的系
26、统资源分配情况output();if(check()=0)/若找不到安全系列,则之前的资源分配无效printf(本次资源分配作废,恢复原来的资源分配状态。n);for (m=0;m3;m+)/恢复分配资源前的系统资源状态availablem+=requestim;allocationim-=requestim;needim+=requestim;output();/输出系统资源状态printf(是否还有进程请求资源?n是:输入1n否:输入0n请输入:);scanf(%d,&j);/若还有进程请求资源,j=1,之前的for循环条件满足end();void line()/美化程序,使程序运行时更加
27、明朗美观printf(-n);void start()/表示银行家算法开始line();printf( 银行家算法开始n);line();void end()/表示银行家算法结束line();printf( 银行家算法结束,谢谢使用n);line();void input()/输入银行家算法起始各项数据for (n=0;n5;n+)printf(请输入进程P%d的相关信息:n,n);printf(Max:);for (m=0;m3;m+)scanf(%d,&maxnm);printf(Allocation:);for (m=0;m3;m+)scanf(%d,&allocationnm);for
28、 (m=0;m3;m+)neednm=maxnm-allocationnm;printf(请输入系统可利用资源数Available:);for (m=0;m3;m+)scanf(%d,&availablem);void output() /输出系统现有资源情况line();printf(资源情况 Max Allocation Need Availablen);printf(进程 A B C A B C A B C A B Cn);line();for(n=0;n5;n+)printf(P%d%9d%3d%3d%5d%3d%3d%6d%3d%3d,n,maxn0,maxn1,maxn2,allo
29、cationn0,allocationn1,allocationn2,needn0,needn1,needn2);if (n=0)printf(%6d%3d%3dn,available0,available1,available2);elseprintf(n);line();void change()/当Requesti,j=Availablej时,系统把资源分配给进程Pi,Availablej和Needi,j发生改变for (m=0;m3;m+)availablem-=requestim;allocationim+=requestim;needim-=requestim;void outputsafe()/输出安全序列的资源分配表printf(该安全序列的资源分配图如下:n);line();printf(资源情况 Work