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

加入VIP,省得不是一点点
 

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

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

下载须知

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

版权提示 | 免责声明

本文(实验一、进程管理实验.doc)为本站会员(sk****8)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

实验一、进程管理实验.doc

1、实验一 linux进程的创建与控制【实验目的】 1、加深对进程概念的理解,明确进程和程序的区别; 2、进一步认识并发执行的实质; 3、分析进程争用资源的现象,学习解决进程互斥的方法; 【实验环境】编程环境:TC或者VC操作系统软件: linux 【准备知识】 一基本概念 1、进程的概念;进程与程序的区别。 2、并发执行的概念。 3、进程互斥的概念。 二系统调用 系统调用是一种进入系统空间的办法。通常,在OS的核心中都设置了一组用于实现各种系统功能的子程序,并将它们提供给程序员调用。程序员在需要OS提供某种服务的时候,便可以调用一条系统调用命令,去实现希望的功能,这就是系统调用。因此,系统调用就

2、像一个黑箱子一样,对用户屏蔽了操作系统的具体动作而只是控制程序的执行速度等。各个不同的操作系统有各自的系统调用,如windows API,便是windows的系统调用,Linux的系统调用与之不同的是Linux由于内核代码完全公开,所以可以细致的分析出其系统调用的机制。 三相关函数。 1 fork( )函数 fork()函数创建一个新进程。 其调用格式为:int fork(); 其中返回int 取值意义如下: 正确返回: 等于0:创建子进程,从子进程返回的ID值; 大于0:从父进程返回的子进程的进程ID值。 错误返回: 等于1:创建失败。 2 wait( )函数 wait()函数常用来控制父进

3、程与子进程的同步。在父进程中调用wait()函数,则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,会产生一个终止状态字,系统会向父进程发出SIGCHLD信号。当接到信号后,父进程提取子进程的终止状态字,从wait()函数返回继续执行原程序。 其调用格式为: #include #include (pid_t) wait(int *statloc); 正确返回:大于0:子进程的进程ID值; 等于0:其它。 错误返回:等于1:调用失败。 3 exit( )函数 exit()函数是进程结束最常调用的函数,在main()函数中调用return,最终也是调用exit()函数。这些都是进程的正

4、常终止。在正常终止时,exit()函数返回进程结束状态。 其调用格式为: #include void exit(int status); 其中status为进程结束状态。 4 kill( )函数 kill()函数用于删除执行中的程序或者任务。 其调用格式为: kill(int PID,int IID); 其中:PID是要被杀死的进程号,IID为向将被杀死的进程发送的中断号。关于Linux下的C语言编程 1)编辑器可使用vi 2)编译器使用gcc 格式:gccoption filename 例如:gcc -o main main.c 主要的option -o 指定输出文件名(不指定则生成默认文件

5、a.out) 其它的参数见帮助(man gcc) 【实验内容和步骤】1进程的创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符,父显示a,子进程分别显示“b”和“c”,观察记录显示结果,并分析原因。#includemain() int p1,p2; while(p1=fork()= =-1); if(p1=0) putchar(b); elsewhile(p2=fork()=-1);if(p2= =0) putchar(c);else putchar(a);运行运行结果:rootlocalhost #

6、gcc -o lsj lsj.crootlocalhost # ./lsjbcarootlocalhost # ./lsjbcarootlocalhost # ./lsjbcarootlocalhost # ./lsjbarootlocalhost # c./lsjbcarootlocalhost # ./lsjbcarootlocalhost # ./lsjbcarootlocalhost # ./lsjcarootlocalhost # b分析原因:从进程并发执行来看,各种情况都有可能。上面的三个进程没有同步措施,所以父进程与子进程的输出内容会叠加在一起。输出次序带有随机性。由于函数pri

7、ntf( )在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。但由于进程并发执行的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。2.进程控制( 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。)编写一段程序,使用系统调用fork()来创建两个子进程,并由父进程重复显示字符串:“parent:”和自己的标识数,而子进程则重复显示字符串“child:”和自己的标识数。#include#includemain() int p1,p2; while(p1=fork()=

8、-1); if(p1=0) printf(childs pid=%dn,getppid(); elsewhile(p2=fork()=-1);if(p2=0)printf(childs pid=%dn,getppid();else printf(parents pid=%dn,getppid();结果: rootlocalhost # gcc -o lsj lsj.crootlocalhost # ./lsjchild 1s pid=4852child 2s pid=4852parents pid=3224rootlocalhost # ./lsjchild 1s pid=4903child

9、2s pid=4903parents pid=3224rootlocalhost # ./lsjchild 1s pid=4918parents pid=3224rootlocalhost # child 2s pid=1./lsjchild 1s pid=4945child 2s pid=4945parents pid=3224rootlocalhost # ./lsjchild 1s pid=5270parents pid=3224rootlocalhost # child 2s pid=5270分析原因:进程标识数随机产生,输出次序也有随机性3. 编写一段程序,使用系统调用fork()来

10、创建一个子进程。子进程通过系统调用exec( )更换自己的执行代码,显示新的代码“new program.”后,调用exit()结束。而父进程则调用waitpid()等待子进程结束,并在子进程结束后显示子进程的标识符,然后正常结束。代码:main()int p;p=fork();if(p=0)execl(“/root/new”,0);exit(1);elseprintf(“parent=%d”,getpid();waitpid();printf(“child=%d”,getpid();新建C程序new.c:mainprintf(“new program.”);分析原因:先编译root下的new

11、.c,产生new应用程序,execl(“/root/new”,0);调用root目录下的new应用程序,执行输出new program.问题讨论1.系统是怎样创建进程的?答:系统创建的第一个进程是init进程。系统中所有的进程都是由当前进程使用系统调用fork()创建的。子进程被创建后继承了父进程的资源。 子进程共享父进程的虚存空间。写时拷贝 (copy on write):子进程在创建后共享父进程的虚存内存空间,只是在两个进程中某一个进程需要向虚拟内存写入数据时才拷贝相应部分的虚拟内存。子进程在创建后执行的是父进程的程序代码。2.可执行文件加载时进行了哪些处理?答:当操作系统装载一个可执行文件的时候,首先操作系统判断该文件是否是一个合法的可执行文件。如果是操作系统将按照段表中的指示为可执行程序分配地址空间。3.当首次调用新创建进程时,其入口在哪里?答:fork系统调用创建的子进程继承了原进程的context,也就是说fork调用成功后,子进程与父进程并发执行相同的代码。但由于子进程也继承了父进程的程序指针,所以子进程是从fork()后的语句开始执行(也就是新进程调用的入口)。另外fork在子进程和父进程中的返回值是不同的。在父进程中返回子进程的PID,而在子进程中返回0。所以可以在程序中检查PID的值,使父进程和子进程执行不同的分支。

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。