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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

操作系统实验实验1分析解析Word格式文档下载.docx

1、while(p1=fork( )= = -1); /*创建子进程p1*/if (p1= =0) putchar(); else while(p2=fork( )= = -1); /*创建子进程p2*/if(p2= =0) putchar(else putchar(运行结果:bca,bac, abc ,都有可能。int p1,p2,i;if (p1= =0) for(i=0;i10;i+)printf(daughter %dn,i);else while(p2=fork( )= = -1);if(p2= =0) printf(son %dnparent %dn结果:parentsondaught

2、er.或 parentdaughter等四、分析原因除strace 外,也可用ltrace -f -i -S ./executable-file-name查看以上程序执行过程。1、从进程并发执行来看,各种情况都有可能。上面的三个进程没有同步措施,所以父进程与子进程的输出内容会叠加在一起。输出次序带有随机性。2、由于函数printf( )在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。但由于进程并发执行的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。五、思考题(1)系统是怎样创建进程的?linux 系统创建进程都是用 fo

3、rk() 系统调用创建子进程。Init程序以/etc/inittab为脚本文件来创建系统的新进程的。新进程还克以创建新进程。创建新进程是通过克隆老进程或当前进程来创建的。新进程的创建实用系统调用sys_fork()或sys_clone(),并且在内核模式下完成。在系统调用结束时,系统从物理内存中分配一个心的task_struct()数据结构和进程堆栈,同时获得一个唯一的标示此进程的标识符。通过FORK函数调用促使内核创建一个新的进程,该进程是调用进程的一个精确的副本。新创建的进程为子进程,调用的FORK进程为父进程,而且创建出来的是两个副本,即,两个进程,但他们互不干扰。(2)当首次调用新创建

4、进程时,其入口在哪里?首次创建进程时,入口在进程1那里。(二)进程的控制实验1、掌握进程另外的创建方法2、熟悉进程的睡眠、同步、撤消等进程控制方法 1、用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容2、利用wait( )来控制进程执行顺序三、参考程序#include int pid; pid=fork( ); /*创建子进程*/switch(pid) case -1: /*创建失败*/fork fail!n exit(1); case 0: /*子进程*/ execl(/bin/ls,ls-1-color,NULL);exec fail! default: /*

5、父进程*/ wait(NULL); /*同步*/ls completed ! exit(0); 4、运行结果5、思考(1)可执行文件加载时进行了哪些处理?解:可执行文件加载时首先是创建一个新进程的fork系统调用,然后用于实现进程自我终止的exit系统调用;改变进程原有代码的exec系统调用;用于将调用进程挂起并等待子进程终止的wait系统调用;获得进程标识符的getpid系统调用等处理过程。(2)什么是进程同步?wait( )是如何实现进程同步的?进程同步是指对多个相关进程在执行次序上进行协调,以使并发执行的主进程之间有效地共享资源和相互合作,从而使程序的执行具有可在现行。首先程序在调用fo

6、rk()机那里了一个子进程后,马上调用wait(),使父进程在子进程调用之前一直处于睡眠状态,这样就使子进程先运行,子进程运行exec()装入命令后,然后调用wait(0),使子进程和父进程并发执行,实现进程同步。(三)进程互斥实验实验目的1、进一步认识并发执行的实质2、分析进程竞争资源的现象,学习解决进程互斥的方法 实验内容1、修改实验(一)中的程序2,用lockf( )来给每一个进程加锁,以实现进程之间的互斥2、观察并分析出现的现象main() while(p1=fork( )= = -1);lockf(1,1,0); /*加锁,这里第一个参数为stdout(标准输出设备的描述符)*/fo

7、r(i=0; lockf(1,0,0); /*解锁*/ while(p2=fork( )= =-1);if (p2= =0) /*加锁*/lockf(1,0,0); lockf(1,1,0); parent %dn运行结果或parentdaughter大致与未上锁的输出结果相同,也是随着执行时间不同,输出结果的顺序有所不同。上述程序执行时,不同进程之间不存在共享临界资源(其中打印机的互斥性已由操作系统保证)问题,所以加锁与不加锁效果相同。(四)守护进程实验写一个使用守护进程(daemon)的程序,来实现:1, 创建一个日志文件/var/log/Mydaemon.log 2,每分钟都向其中写入一

8、个时间戳(使用time_t的格式) 注意:要root权限才能在/var/log创建文件。守护神程序:time.hmain()time_t t; /建立time_t格式变量 FILE *fp; /建立文件 fp=fopen(/var/log/Mydaemon.loga/打开文件 pid_t pid; /守护神 pid=fork(); if(pid0)Daemon on duty! else if(pid=0) sleep(60); /等待一分钟再往文件中写入时间戳 t=time(0); fprintf(fp,The current time is %sn,asctime(localtime(&t

9、); fclose(fp);/关闭文件进程通信(一) 信号机制实验1、了解什么是信号2、熟悉LINUX系统中进程之间软中断通信的基本原理1、编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Child process1 is killed by parent!Child process2 is killed by parent!父进程等待两个子进程终止后,输出如下的信息后终止:Parent process is kil

10、led!2、分析利用软中断通信实现进程同步的机理参考程序signal.hvoid waiting( ),stop( );int wait_mark;int p1,p2,stdout;while(p1=fork( )= =-1);if (p10)while(p2=fork( )= =-1);if(p2 wait_mark=1;signal(SIGINT,stop); /*接收到c信号,转stop*/waiting( );kill(p1,16); /*向p1发软中断信号16*/kill(p2,17); /*向p2发软中断信号17*/wait(0);exit(0); elsesignal(17,st

11、op); /*接收到软中断信号17,转stop*/lockf(stdout,1,0);Child process 2 is killed by parent!lockf(stdout,0,0);wait_mark=1;signal(16,stop); /*接收到软中断信号16,转stop*/Child process 1 is killed by parent!void waiting( ) while(wait_mark!=0);void stop( )wait_mark=0;屏幕上无反应,按下C后,显示 Parent process is killed!分析原因上述程序中,signal(

12、)都放在一段程序的前面部位,而不是在其他接收信号处。这是因为signal( )的执行只是为进程指定信号值16或17的作用,以及分配相应的与stop( )过程链接的指针。因而,signal( )函数必须在程序前面部分执行。本方法通信效率低,当通信数据量较大时一般不用此法。思考1、该程序段前面部分用了两个wait(0),它们起什么作用?答:父进程等待两个子进程终止。2、该程序段中每个进程退出时都用了语句exit(0),为什么?该程序中每个进程退出时都用了语句exit(0),这是进程的正常终止。3、为何预期的结果并未显示出?因为只执行成功两个子进程,但是并没有调用两个子进程P1,P2。当signal

13、()让 父进程捕捉从键盘上来的信号(按下C或者break键时),只有捕捉到信号后,父进 程用系统调用kill()向两个子进程发出信号。当子进程捕捉到信号后才能输出信息, 之后父进程输出信息。4、程序该如何修改才能得到正确结果?Voidwaiting(),stop(),alarming();Intwait_mark;Main()IntP1,P2,stdout;if(P1=fork();/*创建子进程P1*/If(p2=fork();/*创建子进程P2*/Wait_mark=1;Signal(SIGINT,stop);/*接收到C信号,转stop*/Signal(SIGALRM,alarming)

14、;/*接收 SIGALRM*/Waiting();Kill(P1,16);/*向P1发软中断信号16*/Kill(P2,17);/*向P2发软中断信号 17*/Wait(0);/*同步*/Printf(“Parentprocessiskilled!n”);Exit(0);ElseSignal(17,stop);/*接收到软中断信号17,转stop*/Signal(SIGINT,SIG_IGN);/*忽略C信号*/While(wait_mark!Lockf(stdout,1,0);Printf(“Child2killedbyparent!n);Lockf(stdout,0,0);Signal(1

15、6,stop);=0)1waiting()Sleep(5);if(wait_mark!kill(getpid(),SIGALRM);alarming()Wait_mark=0;stop();Wait_mark=0(二)进程的管道通信实验1、了解什么是管道2、熟悉UNIX/LINUX支持的管道通信方式编写程序实现进程的管道通信。用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。i

16、nt pid1,pid2; int fd2;char outpipe100,inpipe100;pipe(fd); /*创建一个管道*/while (pid1=fork( )= =-1);if(pid1= =0)lockf(fd1,1,0); sprintf(outpipe,child 1 process is sending message!/*把串放入数组outpipe中*/ write(fd1,outpipe,50); /*向管道写长为50字节的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd1,0,0);while(pid2=fork( )= =-1); if(pid

17、2= =0) lockf(fd1,1,0); /*互斥*/child 2 process is sending message! wait(0); read(fd0,inpipe,50); /*从管道中读长为50字节的串*/%sn,inpipe); wait(0); 延迟5秒后显示 再延迟5秒 child 2 process is sending message!思考题1、程序中的sleep(5)起什么作用?自我阻塞5秒。这样做的目的是令读进程把管道中的已有数据读完后,暂时进入睡眠状态等待,直至写进程又将数据写入管道后,再将读进程唤醒。2、子进程1和2为什么也能对管道进行操作?因为他们的读指针

18、和写指针都指向了管道的索引节点。(三)消息的发送与接收实验 1、了解什么是消息 2、熟悉消息传送的机理消息的创建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为k的消息发送和接收的程序。1、client.csys/types.hsys/msg.hsys/ipc.h#define MSGKEY 75struct msgform long mtype; char mtext1000;msg;int msgqid;void client() int i;msgqid=msgget(MSGKEY,0777); /*打开75#消息队列

19、*/for(i=10;i=1;i-) msg.mtype=i;printf(“(client)sentn”);msgsnd(msgqid,&msg,1024,0); /*发送消息*/ client( );2、server.cvoid server( ) msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*创建75#消息队列*/do msgrcv(msgqid,&msg,1030,0,0); /*接收消息*/ printf(“(server)receivedn”);while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0); /*删除消

20、息队列,归还资源*/server( );程序说明1、为了便于操作和观察结果,编制二个程序client.c和server.c,分别用于消息的发送与接收。2、server建立一个 Key 为75的消息队列,等待其它进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出server。server每接收到一个消息后显示一句“(server)received。”3、client使用 key为75的消息队列,先后发送类型从10到1的消息,然后退出。最后一个消息,即是 server端需要的结束信号。client 每发送一条消息后显示一句 “(client)sent”。4、注意: 二个程序分

21、别编辑、编译为client与server。执行:./server&ipcs -q./client。从理想的结果来说,应当是每当client发送一个消息后,server接收该消息,client再发送下一条。也就是说“(client)sent”和 “(server)received”的字样应该在屏幕上交替出现。实际的结果大多是,先由client发送了两条消息,然后server接收一条消息。此后client 、server交替发送和接收消息。最后server一次接收两条消息。client 和server 分别发送和接收了10条消息,与预期设想一致。开启server开启client,发送信息Server收到信息message的传送和控制并不保证完全同步,当一个程序不在激活状态的时候,它完全可能继续睡眠,造成了上面的现象,在多次send message 后才recieve mes

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

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