欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    操作系统第二次实验.docx

    • 资源ID:27643553       资源大小:438.43KB        全文页数:14页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    操作系统第二次实验.docx

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

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

    3、0时,子进程成功创建,以下为子进程作用域(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.

    4、创建进程: #include /对于此程序而言此头文件用不到 #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,cha

    5、r *argv) 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; /*参数结束的标志*/a

    6、rgv20=./tc_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);

    7、 printf(End 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=i

    10、nitsem(); 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 #inclu

    11、de #include #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; else while(1) l+; /进入死循环 for (i=1;imax;i+) if(kill(pids

    12、i,SIGKILL)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

    13、/创建200个进程#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

    14、pid,pidsMAXPRO+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.

    15、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_sec)*1000000+(tv2l.tv_usec-tv1l.tv_usec);printf(Round %d :All time is %d usn,l+1,ti);ave+=ti/MAXPRO;printf(Round %d :The average time is %dus n, l+1,ti/MAXPRO);printf(Last the average time is %dus n,ave/TESTTIME);return 1;实验结果:


    注意事项

    本文(操作系统第二次实验.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

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

    收起
    展开