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