ImageVerifierCode 换一换
格式:DOCX , 页数:42 ,大小:791.47KB ,
资源ID:23556986      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23556986.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统linux版实验报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统linux版实验报告.docx

1、操作系统linux版实验报告操作系统实验报告(Linux版)网络142 豹 142999实验一 观察Linux进程状态一、实验目的在本实验中学习Linux操作系统的进程状态,并通过编写一些简单代码来观察各种情况下,Linux进程的状态,进一步理解进程的状态及其转换机制。二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Linux Ubuntu操作系统,gcc编译器。(四)查看“不可中断阻塞”状态(D)创建一个C程序,如uninter_status.c,让其睡眠30s代码:#include#includeint main() int i=0,j=0,k=0; for(i=0;i100000

2、0;i+) for(j=0;j1000000;j+) k+; k-; 实验结果:(二)查看“暂停”状态(T) 运行run_status进程,其进入R状态:代码同上:(三)查看“可中断阻塞”状态(S)创建一个C程序,如interruptiblie_status.c,让其睡眠30s编译,后台运行该程序(后接&符号),并使用ps命令查看运行状态代码:#include#includeint main() sleep(30); return;实验结果:(四)查看“不可中断阻塞”状态(D)创建一个C程序,如uninter_status.c,让其睡眠30s编译,后台运行该程序(后接&),并使用ps命令查看运

3、行状态代码:#include#includeint main() if(vfork()=0) sleep(300); return;实验结果:(五)查看“僵尸”进程(Z)创建一个C程序,如zombie_status.c,在其中创建一个子进程,并让子进程迅速结束,而父进程陷入阻塞编译,后台运行该程序(后接&),并使用ps命令查看运行状态(30s)代码:#include#incldueint main() if(fork() sleep(300);实验结果:实验二 观察Linux进程/线程的异步并发执行一、实验目的通过本实验学习如何创建Linux进程及线程,通过实验,观察Linux进程及线程的异步

4、执行。理解进程及线程的区别及特性,进一步理解进程是资源分配单位,线程是独立调度单位。二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Linux Ubuntu操作系统,gcc编译器。三、实验容和步骤1、进程异步并发执行编写一个C语言程序,该程序首先初始化一个count变量为1,然后使用fork函数创建两个子进程,每个子进程对count加1后,显示“I am son, count=x”或“I am daughter, count=x”,父进程对count加1之后,显示“I am father, count=x”,其中x使用count值代替。最后父进程使用waitpid等待两个子进程结束之后

5、退出。编译连接后,多次运行该程序,观察屏幕上显示结果的顺序性,直到出现不一样的情况为止,并观察每行打印结果中count的值。代码:#include#includeint main() pid_t son_pid,daughter_pid; int count=1; son_pid=fork(); if(son_pid=0) count+; printf(i am son,count=%dn,count); else daughter_pid=fork(); if(daughter_pid=0) count+; printf(i am daughter,count=%dn,count); els

6、e count+; printf(i am father,count=%dn,count); waitpid(son_pid,NULL,0); waitpid(daughter_pid,NULL,0); 2、线程异步并发执行编写一个C语言程序,该程序首先初始化一个count变量为1,然后使用pthread_create函数创建两个线程,每个线程对count加1后,显示“I am son, count=x”或“I am daughter, count=x”,父进程对count加1之后,显示“I am father, count=x”,其中x使用count值代替。最后父进程使用pthread_jo

7、in等待两个线程结束之后退出。编译连接后,多次运行该程序,观察屏幕上显示结果的顺序性,直到出现不一样的情况为止,并观察每行打印结果中count的值。代码:#include#include#includevoid *daughter(void *num)int* a=(int *)num;*a+=1;printf(i am daughter,count=%dn,*a);void *son(void *num)int* a=(int *)num;*a+=1;printf(i am son,count=%dn,*a);int main()pthread_t son_tid,daughter_tid;

8、int count=1;pthread_create(&son_tid,NULL,son,&count);pthread_create(&daughter_tid,NULL,daughter,&count);count+;printf(i am parent,count:=%dn,count);pthread_join(son_tid,NULL);pthread_join(daughter_tid,NULL);return 0;实验结果:实验三 使用信号量进行互斥与同步 一、实验目的本实验介绍在Linux中使用信号量进行进程同步、互斥的方法。读者可以通过实验进一步理解进程间同步与互斥、临界区与

9、临界资源的概念与含义,并学会Linux信号量的基本使用方法。二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Linux Ubuntu操作系统,gcc编译器。三、实验容和步骤三、实验容和步骤(一)参考:POSIX以及System VSystem V:Unix众多版本中的一支,最初由AT&T定义,目前为第四个版本,其中定义了较为复杂的API。POSIX:Portable Operating System Interface,IEEE为了统一Unix接口而定义的标准,定义了统一的API接口。Linux即支持System API,又支持POSIX API(二)实验步骤step1:通过实例查看不

10、使用互斥时的情况 (假设文件命名为no_sem.c)编译,同时运行两个进程,显示结果代码:#include#includeint main(int argc,char *argv)char message=x;int i=0;if(argc1)message=argv10;for(i=0;i10;i+)printf(%c,message);fflush(stdout);sleep(rand()%3);printf(%c,message);fflush(stdout);sleep(rand()%2);sleep(10);exit;实验结果:step2:使用信号量来对临界资源进行互斥 (假设文件命

11、名为with_sem.c)编译,同时运行两个进程。观察X和O的出现规律,并分析原因。代码:#include#include#include#include#include#include#includeint main(int argc,char *argv)char message=x;int i=0;if(argc1)message=argv10;sem_t *mutex=sem_open(mysem,O_CREAT,0666,1);for(i=0;i10;i+)sem_wait(mutex);printf(%c,message);fflush(stdout);sleep(rand()%3

12、);printf(%c,message);fflush(stdout);sem_post(mutex);sleep(rand()%2);sleep(10);sem_close(mutex);sem_unlink(mysem);exit(0);实验结果:step3:使用信号量来模拟下象棋红黑轮流走子的情况编写两个C语言程序black_chess.c以及red_chess.c,分别模拟下象棋过程中红方走子和黑方走子过程。走子规则:红先黑后,红、黑双方轮流走子,到第10步,红方胜,黑方输。代码:红色棋#include#include#include#include#include#include#i

13、ncludeint main(int argc,char *argv)int i=0;sem_t *hei=sem_open(chess_black_sem,O_CREAT,0666,1);sem_t *hong=sem_open(chess_red_sem,O_CREAT,0666,0);for(i=0;i10;i+)sem_wait(hei);if(i!=9)printf(Red chess had moved,black,chess go!n);elseprintf(Red chess win!n);fflush(stdout);sem_post(hong);sleep(10);sem_

14、close(hei);sem_close(hong);sem_unlink(chess_red_sem);sem_unlink(chess_black_sem);exit(0);黑色棋 :#include#include#include#include#include#include#includeint main(int argc,char *argv)int i=0;sem_t *hei=sem_open(chess_black_sem,O_CREAT,0666,1);sem_t *hong=sem_open(chess_red_sem,O_CREAT,0666,0);for(i=0;i1

15、0;i+)sem_wait(hong);if(i!=9)printf(Black chess had moved,red chess go!n);elseprintf(Black chess win!n);fflush(stdout);sem_post(hei);sleep(10);sem_close(hei);sem_close(hong);sem_unlink(chess_red_sem);sem_unlink(chess_black_sem);exit(0);实验结果:实验四 作业调度算法模拟一、实验目的(1)掌握周转时间、等待时间、平均周转时间等概念及其计算方法。(2)理解五种常用的进

16、程调度算法(FCFS、SJF、HRRF、HPF、RR),区分算法之间的差异性,并用C语言模拟实现各算法。(3)了解操作系统中高级调度、中级调度和低级调度的区别和联系。二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Linux Ubuntu操作系统,gcc编译器。三、实验容和步骤本实验所选用的调度算法均默认为非抢占式。实验所用的测试数据如下表所示。本实验所用的测试数据如下表所示表 实验测试数据作业Id到达时间执行时间优先权180050028153013830252483520258451526700101782050作业的数据结构:typedef struct node int numb

17、er; / 作业号 int reach_time;/ 作业抵达时间 int need_time;/ 作业的执行时间 int privilege;/ 作业优先权 float excellent;/ 响应比 int start_time;/ 作业开始时间 int wait_time;/ 等待时间 int visited;/ 作业是否被访问过 bool isreached;/ 作业是否已经抵达job;代码:#include #include #include #include/最大作业数量const int MAXJOB=50;/作业的数据结构typedef struct nodeint numbe

18、r;/作业号 int reach_time;/作业抵达时间int need_time;/作业的执行时间int privilege;/作业优先权float excellent;/响应比int start_time;/作业开始时间int wait_time;/等待时间int visited;/作业是否被访问过bool isreached;/作业是否抵达job;job jobs50;/作业序列int quantity;/作业数量/初始化作业序列void initial_jobs()int i;for(i=0;iMAXJOB;i+)jobsi.number=0;jobsi.reach_time=0;j

19、obsi.privilege=0;jobsi.excellent=0;jobsi.start_time=0;jobsi.wait_time=0;jobsi.visited=0;jobsi.isreached=false;quantity=0;/重置全部作业信息void reset_jinfo() int i; for(i=0;iMAXJOB;i+) jobsi.start_time=0; jobsi.wait_time=0; jobsi.visited=0; /查找当前current_time已到达未执行的最短作业,若无返回-1int findminjob(job jobs,int count

20、)int minjob=-1;/=jobs0.need_time;int minloc=-1;int i;for(i=0;ijobsi.need_time&jobsi.visited=0&jobsi.isreached=true)minjob=jobsi.need_time;minloc=i;return minloc;/查找最早到达作业,若全部到达返回-1.int findrearlyjob(job jobs,int count)int rearlyloc=-1;int rearlyjob=-1;int i;for(i=0;ijobsi.reach_time&jobsi.visited=0)

21、rearlyjob=jobsi.reach_time;rearlyloc=i;return rearlyloc;/读取作业数据void readJobdata()FILE *fp;char fname20;int i; /输入测试文件文件名printf(please input job data file namen);scanf(%s,fname);if(fp=fopen(fname,r)=NULL)printf(error, open file failed, please check filename:n);else/依次读取作业信息while(!feof(fp)if(fscanf(fp

22、,%d %d %d %d,&jobsquantity.number,&jobsquantity.reach_time,&jobsquantity.need_time,&jobsquantity.privilege)=4)quantity+;/打印作业信息printf(output the origin job datan);printf(-n);printf(tjobIDtreachtimetneedtimetprivilegen);for(i=0;iquantity;i+)printf(t%-8dt%-8dt%-8dt%-8dn,jobsi.number,jobsi.reach_time,j

23、obsi.need_time,jobsi.privilege);/FCFSvoid FCFS() int i; int current_time=0;int loc;int total_waitime=0;int total_roundtime=0;/获取最近到达的作业loc=findrearlyjob(jobs,quantity);/输出作业流printf(nnFCFS算法作业流n);printf(-n); printf(tjobIDtreachtimetstarttimetwaittimetroundtimen);current_time=jobsloc.reach_time; /每次循环

24、找出最先到达的作业并打印相关信息for(i=0;icurrent_time)jobsloc.start_time=jobsloc.reach_time;current_time=jobsloc.reach_time;elsejobsloc.start_time=current_time;jobsloc.wait_time=current_time-jobsloc.reach_time; printf(t%-8dt%-8dt%-8dt%-8dt%-8dn,loc+1,jobsloc.reach_time,jobsloc.start_time,jobsloc.wait_time,jobsloc.w

25、ait_time+jobsloc.need_time);jobsloc.visited=1;current_time+=jobsloc.need_time;total_waitime+=jobsloc.wait_time; total_roundtime=total_roundtime+jobsloc.wait_time+jobsloc.need_time;/获取剩余作业中最近到达作业loc=findrearlyjob(jobs,quantity); printf(总等待时间:%-8d 总周转时间:%-8dn,total_waitime,total_roundtime); printf(“平均等待时间: %4.2f 平均周转时间: %4.2fn,(float)total_waitime/(quantity),(float)total_roundtime/(quantity); /短作业优先作业调度void SFJschdulejob(job jobs,int count)int main() initial_jobs(); r

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1