操作系统第二次实验_第1页
操作系统第二次实验_第2页
操作系统第二次实验_第3页
操作系统第二次实验_第4页
操作系统第二次实验_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验一 *题目实验日期:2012-11-2(1) 实验任务:掌握进程的概念(2) 掌握系统调用(3)设计程序,实现结果的不可再现性;使用同步原语,实现结果的可再现性(4)设计程序,对系统的进程数目进行压力测试,对运行时间进行监控实验原理:1.进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序

2、计数器的值和处理寄存器的内容来表示。2.程序在并发执行时,由于失去了封闭性,也将导致其再失去可再现性。程序顺序执行,只要程序执行时的环境和初始条件相同,当程序重复执行时,不论它是从头到尾不停顿地执行,还是“停停走走”地执行,都将获得相同的结果。3压力测试是测试系统在非正常的、超负荷的条件下的运行情况 ,用来评估在超越最大负载的情况下系统将如何运行,考验系统在正常的情况下对某种负载强度的承受能力 。压力测试就是一种破坏性的测试。压力测试是在一种需要反常数量、频率或资源的方式下运行系统,用以判断系统的稳定性和可靠性。4.简单的系统调用(1)fork();当fork()函数返回值为0时,子进程成功创

3、建,以下为子进程作用域(2)syscall(SYS_getpid);调用系统函数syscall(),返回当前进程号(3)getpid();调用系统函数getpid(),返回当前进程号(4)execl( );头文件:#include 原型:int execl(const char *path, const char *arg, .);函数说明:execl()用来执行参数path字符串所代表的文件路径, 接下来的参数代表执行该文件时传递的argv0,argv1.是后一个参数必须用空指针NULL作结束返回值:成功则不返回值, 失败返回-1,失败原因存于errno中实验源程序: 1.创建进程: #in

4、clude /对于此程序而言此头文件用不到 #include #include int main(int argc, char * argv ) int pid = fork(); if (pid 0) printf(error!); else if( pid = 0 ) printf(This is the child process!); else printf(This is the parent process! child process id = %d, pid); return 0; 2程序的不可再现性:#includeint main(int argc,char *argv)

5、printf(Thead %s has start!n ,argv1); sleep(3); printf(Thread %s endedn,argv1);return(0);$cat ecp1.c#include#include#include#includevoid main() int *status; char *f=./tc_print; /*要执行的程序名*/ char *argv13,*argv23,*argv33,*argv43; /*执行程序所需的参数*/ argv10=./tc_print; argv11=1; argv12=0; /*参数结束的标志*/argv20=./t

6、c_print; argv21=2; argv22=0; argv30=./tc_print; argv31=3; argv32=0; argv40=./tc_print; argv41=4; argv42=0; if(fork()=0) /*创建进程*/ execvp(f,argv1); /*执行程序*/ sleep(1); execvp(f,argv2); sleep(1); else if(fork()=0) /*创建进程*/ execvp(f,argv3); sleep(1); else wait(status); execvp(f,argv3); sleep(1); printf(E

7、nd program!n);3. 实现程序结果的可再现性: #include int n=0;int status; /改动地点void pp() n+; if(n=10)return; wait(&status); /改动地点 wait系统调用会使父进程阻塞直到一个子进程结束 if(fork()=0) printf(%d,n); for(n=0;n1000000;n+) ; else pp();int main() int i; for(i=0;i3;i+) pp(); printf(n); return 0;3. 用信号量semget()、semctl()、semop()实现进程同步: #

8、include#include#include#include#include#include#include#include#define SEMKEY (key_t)0x200typedef union _senum int val; struct semid_ds *buf; ushort *array;semun;static int semid;struct sembuf p1=0,-1,0;/第一个是索引量,第二个-1是p操作,1是v操作。struct sembuf v1=0,1,0;int initsem() /*信号量初始化*/ semun x; x.val=0; /用于付信号

9、量初值 if(semid=semget(SEMKEY,1,0600|IPC_CREAT|IPC_EXCL)=-1)/创建信号量集,1为信号量集的中信号的个数 /1为信号量集中信号量个数 if(errno=EEXIST) /已经存在,则获得ID号. semid=semget(SEMKEY,1,0); if(semctl(semid,0,SETVAL,x)=-1) 0索引号, 设置初值,x为初值 perror(semctl failedn); return(-1); return(semid); main() /*主操作*/ int i=0,semid; int j; semid=initsem(

10、); if(fork()=0) semop(semid,&p1,1);/*p操作*/ for(j=0;j1000;j+) printf(reader1 %d n,2*j+1); sleep(1); printf(reader1 finish!n); else if(fork()=0) for(i=0;i1000;i+) printf(reader2 %d n,2*i); sleep(1); printf(reader2 finish!n); semop(semid,&v1,1); 4. 创建进可能多的进程,得到这个数目的极限,进程启动后可以进入死循环:#include #include #in

11、clude #include #define MAXPRO 50 /此处定义估计最大的进程数,可以设为很大#define SELLP 10000int main(void)long max=0;pid_t pid,pidsMAXPRO+1;long i,l=0;for (max=1;maxMAXPRO;max+) pid=fork(); /不断创建进程 if (pid0) printf(nFork process %d %d:,pid,max);pidsmax=pid;elsewhile(1) l+; /进入死循环 for (i=1;imax;i+)if(kill(pidsi,SIGKILL)

12、0) /程序结束时将所有创建的进程强制关闭printf(nProcess %d cannot kill!,pidsi); else printf(nProcess %d have been kill!,pidsi);printf(nThe max processes number is :%dn,max); /输出最大值return 1;5. 递归创建200个进程,记录总体创建的起始时间和结束时间,最后求创建单个线程的平均时间: #include #include #include #include #include #include #define MAXPRO 200 /创建200个进程#

13、define SELLP 10000#define TESTTIME 10long max=0,l=0;void myfork() /递归函数pid_t pid;int status;/if (max=MAXPRO) exit(1);max+;pid=fork(); /递归创建进程if (pid0)waitpid(pid,&status,0); /等待子进程结束if (max=MAXPRO) exit(1);myfork();exit(1);int main(void)long ave=0;time_t time1;struct tm *t1,*t2;pid_t pid,pidsMAXPRO+

14、1;long i,ti;int status;struct timeval tv1TESTTIME,tv2TESTTIME;struct timezone tz;for (l=0;lTESTTIME;l+) /做十组测试max=0;gettimeofday (&tv1l,&tz); /记录开始时间myfork();gettimeofday (&tv2l,&tz); /记录结束时间for(l=0;lTESTTIME;l+) /计算输出printf(nRound %d :The star time is %ds%dus n,l+1, tv1l.tv_sec,tv1l.tv_usec);printf(Round %d :The end time is %ds%dus n, l+1,tv2l.tv_sec,tv2l.tv_usec);ti=(tv2l.tv_sec-tv1l.tv_se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论