最新进程的创建与并发执行_第1页
最新进程的创建与并发执行_第2页
最新进程的创建与并发执行_第3页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、实验二 进程管理2.1 进程的创建与并发执行1. 实验目的(1) 加深对进程概念的理解 , 理解进程和程序的区别。(2) 认识并发进程的实质。分析进程争用资源的现象,学习解决进程互斥的方法。(3) 理解系统调用和用户命令的区别。2. 实验类型: 验证型3. 实验学时: 24. 实验原理和知识点(1) 实验原理: 程序的并发执行具有随机性和不可再现性。 程序并发执行会导致资源共享和 资源竞争, 各程序向前执行的速度会受资源共享的制约。 程序的动态执行过程用进程这个概 念来描述。 由于向前推进的速度不可预知, 所以多个进程并发地重复执行, 整体上得到的结 果可能不同。但要注意,就其中某单个进程而言

2、,其多次运行结果是确定的。(2) 知识点:进程、子进程、并发执行的特性;5. 实验环境(硬件环境、软件环境) :(1) 硬件环境: Intel Pentium III 以上 CPU, 128MB 以上内存, 2GB 以上硬盘(2) 软件环境: linux 操作系统。6. 预备知识(1) fork() 系统调用头文件: #include <unistd.h>unix standard header/* 是 POSIX 标准定义的 unix 类系统定义符号常量的头文件,包含了许多 UNIX 系统服务 的函数原型,例如 read 函数、 write 函数和 getpid 函数 */ 函数

3、原型: pid_t fork(void);/* 是 Linux 下的进程号类型,也就是 Process ID _ Type的缩写。其实是宏定义的unsigned int 类型 */函数功能: fork 的功能是创建 子进程 。调用 fork 的进程称为 父进程 。如图 2.1 所示。子 进程是父进程的一个拷贝,它继承了父进程的用户代码、 组代码、 环境变量、 已打开的文件 代码、工作目录及资源限制。 fork 语句执行后,内核向父进程返回子进程的进程号,向子 进程返回 0。 父子进程都从 fork() 的下一句开始并发执行 。返回值:返回值 =-1 :创建失败。返回值 =0 : 程序在子进程中

4、。返回值 >0 : 程序在父进程中。 (该返回值是子进程的进程号)编程提示: 虽然子进程是父进程的一个复制品,但父子的行为是不同的。编程时要抓住内 核的返回值。通过返回值,可以知道是父进程还是子进程,因而可以编写不同行为的代码。父退程(进程号;1869)include <scdio.h>匸 rr.am () int pl;plfark(); t这里裱返回1听口if(pi=a)printf(HBonnn); while(1);elseprintf(rtfathernH): wait();仓健进程子进程(进程号:16TO)注;子进程是父送程的一个拷贝父子送程都从下一包幵绘执行.

5、父子送程年发技厅°#mclde <stdio. h> int main() inE pl; pl=fork ;t_这里披返回Difpl=O<printf(sonXn" while(1);elseprintf(nfathernn; wait (;图 2.1 fork()创建进程示意图wait()系统调用头文件:#in clude <sys/wait.h> 函数原型:pid_t wait(i nt *status);发出wait调用的进程只要有子进程,就会睡眠函数功能:wait的功能是等待子进程结束。直到子进程中的一个终止为止。若没有子进程,则该调

6、用立即返回。函数参数:status是子进程退出时的状态信息。返回值:成功则返回子进程号,否则返回-1。getpid()系统调用头文件:unistd.h ,在 VC+6.0 下可以用 process.h函数原型:pid_t getpid(void);函数功能:wait的功能是将父进程挂起,等待子进程终止。getpid函数用来取得目前进程的进程ID,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。 返回值:目前进程的进程ID。(4) 其他系统调用 exit -终止进程execnice执行一个应用程序 改变进程的优先7. 实验内容与步骤(将所有截图换成用户名为你们自己姓名的拼音,

7、并回答所有的问题)(1 )运行图2.1所示程序将图2.1中的源程序保存为 e201.c在终端中编译gcc p e201 e201.c运行./e201y i n ji.aottYou You ' S gcc -o e20i e201 . cI yinjiYouYou * )3 ./e201sonfather此时,程序为死循环,在该终端中无法继续输入命令执行,于是,我们可以暂时不管这一个终端,而是再新建一个终端,然后键入PS -3,列出当前所有进程¥ i nj iYou "$ 卩!t 弋FID TTYThtE:CMD1 ?00:00:00I Hit2 ?00:00:00

8、misrntinn/O3 ?00:00:00ksoftirqd/O4 ?00:00:00fitchdoE/O5 ?00:00:00events/06 ?00:00:00khelper7 ?00:00:00kthread10 ?00:00:00kblcKkd/O11 ?00:00:00kacpid175 ?O0iC0:0OcQucue/ti观察屏幕,是否有两个名为e201的进程。比较它们的进程号,判别哪个是父进程,哪个是子进程。3713 pts/100;00:00bash3755 pts/I00:00:00c2013756 pts/100i00:23e2dl3762 pts/200;00;00b

9、ash3790 pts/200:00:00psyi njiou "SyinjiaotyouVou 'S kill 3755y i njl tntYauYou " |S kill 3756 ylnJiao»YouYou "3 ps -eFID TTVTIMECMD1 ?00:00:00init2 ?OO; 00: 00 mi g rail di)/03 ?00:00:00ksoftirqd/O程序中的while(1);语句是为了不让程序退出来,以便于你观察进程状态。用kill 命令把这两个进程终止。可见,第一个终端如下图所示,已经从死循环中解救出来

10、了。yinjiaotYouYou '3 - Z&201sonfather已终止y i n j i. noiiYouYd u *jS |ctrl+c强制结束。当然,最简单粗暴的方法不是关闭相关进程,而是直接通过 对图2.1的程序稍加改进,可看见两个进程的进程号。#include <stdiorh>int main()int pl:pl=fork();if(pi=e)p rlntf (' son : dXn * ( getpid ();/whiled);elsewait();p rintf (" fathe r:%dn", getpid();

11、 yi nji aoaYouYou "S gcc -c e20I e201.c I yinjiao&YouYou *$ ./e201ton:3B45father:a844编写一段名为e202.c 的源程序,使用系统调用fork() 创建两个子进程 pl和p2。 pl 的功能为显示字符'b' ,p2的功能为显示字符'c',父进程的功能为显示字符'a',父进程和两个子进程并发运行。不停的运行e202,观察并记录屏幕上的显示结果。程序设计过程:用while 语句控制fork() 直到创建成功。用if语句判别是在子进程中还是在父进程 中

12、。程序运行后会创建三个进程,它们分别是子进程pl、p2、父进程。这三个进程并发运行。假定子进程有些任务要做, 完成这些任务要花一定时间, 因此,可以用一个延时函数简 单地模拟这些任务。e202.c#i nclude <stdio.h>void delay(i nt x)/*int i,j;for(i=0;i<x;i+) for(j=0;j<x;j+);int mai n()in t p1,p2;while(p 1= fork()=-1);/*if(p1=0)/*delay(4096);/*putchar('b');/*else while(p2=fork

13、()=-1); /* if(p2=0)/*delay(2048);/*putchar('c');/*elseputchar('a');/*延时函数*/创建子进程pl */子进程pl创建成功*/子进程pl延时*/子进程pl显示字符'b' */创建子进程p2 */子进程p2创建成功*/子进程p2延时*/子进程p2显示字符'c' */父进程显示字符'a' */return 0;按向上的光标键、回车,运行刚才的程序。快速重复这个步骤,观察并记录结果。I yi njiaoYouYou "S gcc -o e202

14、e202«cI yinjiaoYouYou S 4/e2Q2bcayinjiaottYouYou '$ ./e202ca i i nji aofiiYouYou *S b. /e2C2I ayinji aoYcuYou 'S bc/e202I fly inJiao* You You '* |S be. /e202*1 yinjiaottYouYou "S he./e202a yi nji ao<»YouYou * S be - /e202a yinjiaoftYouYcu * S be,/e202basinjiaoYcuYou *S

15、c./e202ca yinjiao®YouYolj "$ b-/e202ca yinJiao®YcuYou *$ b. /e202I ayinjiaoYouYoubc./e202r一 _ -bJ请回答问题:屏幕上是否有时显示 bac,有时显示bca,。为什么会这样呢?(3) 参考(1)完成下列程序设计父子进程同步实验:编写一段程序,使用系统调用fork()创建一个子进程,子进程求1+2+100的和并打印出来,使用系统调用wait()让父进程等待子进程结束。请贴出源代码截图:include <stdlo.h>int main()int pl;pl=for

16、k);if (pl=0)int i;int su m=01Tor(i=i;i+)(sum=sum+i; printf("son:dn'f getpidf); printf <" 1 十2十十1£)百寻小口 * ( sum);elsewaitO;prlntT("father;%dn " , getpid():)请贴出正确运行截图:yi njiaottYouYou ° t -o e203 e203.cyi njtaowYouou 'S ./e203son:674S1-1-2+ 1-100=3050father:674

17、7y i ntji aottYouYou ' S |(4) 已知下列Linux程序执行后,运行结果如下,请画出进程家族树(以进程号标示进程, 注意,每次运行进程号都不一样)。/L in ux程序#i nclude "stdio.h"#i nclude "un istd.h"int mai n()in t p1,p2,p3;p1= fork();p2=fork();p3=fork();/注:getpid() 获取当前进程pidif(p1>0 && p2>0 && p3>0) printf("

18、;A:%dn”,getpid(); if(p 1=0 && p2>0 && p3>0) printf("B:%dn",getpid();if(p 1=0 && p2=0 && p3>0) printf("C:%dn",getpid(); if(p 1=0 && p2=0 && p3=0)printf("D:%dn",getpid();if(p 1=0 && p2>0 && p3=0)

19、printf("E:%dn",getpid(); if(p1>0 && p2=0 && p3>0) printf("F:%dn",getpid();if(p1>0 && p2=0 && p3=0) printf("G:%dn",getpid(); if(p1>0 && p2>0 && p3=0) prin tf("H:%dn",getpid(); sleep(10);return 0; Is

20、 V <WV<WyinJiaoftYouYou *S ,/e204Di8292C:B291L:8293B:8290F:829411:8296A: 8289yinjiaoouYou '|这些进程构成的进程树为(要画出进程树才有加分哦!):yinJia0»Ycu¥ou 'S pslree -p.电、 fJI; Sis.204(8292)II JU nn_- UV- IIIJl. I.JU A JIXJ jf-gn-:)mc-i5rnti nal (6906) nsh(6909) 2<U(B289) 204:8290)4:,8291>-20

21、4(8293) -204:8294j 4: 8295)>-=204(6296)yi nji aowYouYcu *|$ pstree -p S2S9e204( 8289)re204( 8290Jre204( 8291J 204( 8292) 204(8293)204(8294) 204(8295)204(8296)ylnji aoYouYou S |ps f命令可以查看当前终端进程的进程数关系图8心得体会附录pstree 的用法格式:pstree以树状图显示进程,只显示进程的名字,且相同进程合并显示。格式:pstree -p以树状图显示进程,还显示进程PID。格式:pstree <

22、pid>格式:pstree -p <pid>以树状图显示进程 PID为<pid>的进程以及子孙进程,如果有-p参数则同时显示每个进程的 PID。附录Lin ux系统调用列表以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。其中 有一些函数的作用完全相同,只是参数不同。(有点像C+函数重载,但是Linux核心是用C语言写的,所以只能取成不同的函数名)。还有一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发岀警告),但因为兼容的原因还保留着,这些函数在前面标上“*号以示区别。各系统调用的使用方法,可以通过 ma

23、n命令获得。、进程控制:fork创建一个新进程clone按指定条件创建子进程execve运行可执行文件exit中止进程exit立即中止当前进程getdtablesize进程所能打开的最大文件数getpgid获取指定进程组标识号setpgid设置指定进程组标志号getpgrp获取当前进程组标识号setpgrp设置当前进程组标志号getpid获取进程标识号getppid获取父进程标识号getpriority获取调度优先级setpriority设置调度优先级modify_ldt读写进程的本地描述表nanosleep使进程睡眠指定的时间nice改变分时进程的优先级pause挂起进程,等待信号perso

24、nality设置进程运行域prctl对进程进行特定操作ptrace进程跟踪sched_get_priority_max取得静态优先级的上限sched_get_priority_min取得静态优先级的下限sched_getparam取得进程的调度参数sched_getscheduler取得指定进程的调度策略sched_rr_get_interval取得按RR算法调度的实时进程的时间片长度sched setparam设置进程的调度参数sched setscheduler设置指定进程的调度策略和参数sched yield进程主动让岀处理器,并将自己等候调度队列队尾vfork创建一个子进程,以供执行新

25、程序,常与execve等同时使用wait等待子进程终止wait3参见waitwaitpid等待指定子进程终止wait4参见 waitpidcapget获取进程权限capset设置进程权限getsid获取会晤标识号setsid设置会晤标识号二、文件系统控制1、文件读写操作fcntl文件控制open打开文件creat创建新文件close关闭文件描述字read读文件write写文件readv从文件读入数据到缓冲数组中writev将缓冲数组里的数据写入文件pread对文件随机读pwrite对文件随机写lseek移动文件指针seek在64位地址空间里移动文件指针dup复制已打开的文件描述字dup2按指定

26、条件复制文件描述字flock文件加/解锁pollI/O多路转换truncate截断文件ftruncate参见 truncateumask设置文件权限掩码fsync把文件在内存中的部分写回磁盘2、文件系统操作access确定文件的可存取性chdir改变当前工作目录fchdir参见chdirchmod改变文件方式fchmod参见chmodchown改变文件的属主或用户组fchown参见chownIchown参见chownchroot改变根目录stat取文件状态信息Istat参见statfstat参见statstatfs取文件系统信息fstatfs参见statfsreaddir读取目录项getden

27、ts读取目录项mkdir创建目录mknod创建索引结点rmdir删除目录rename文件改名link创建链接symlink创建符号链接unlink删除链接readlink读符号链接的值mount安装文件系统umount卸下文件系统ustat取文件系统信息utime改变文件的访问修改时间utimes参见utimequotactl控制磁盘配额三、系统控制ioctlI/O总控制函数sysctl读/写系统参数acct启用或禁止进程记账getrlimit获取系统资源上限setrlimit设置系统资源上限getrusage获取系统资源使用情况uselib选择要使用的二进制函数库ioperm设置端口 I/O

28、权限iopl改变进程I/O权限级别outb低级端口操作reboot重新启动swapon打开交换文件和设备swapoff关闭交换文件和设备bdflush控制bdflush 守护进程sysfs取核心支持的文件系统类型sysinfo取得系统信息adjtimex调整系统时钟alarm设置进程的闹钟getitimer获取计时器值setitimer设置计时器值gettimeofday取时间和时区settimeofday设置时间和时区stime设置系统日期和时间time取得系统时间times取进程运行时间uname获取当前UNIX系统的名称、版本和主机等信息vhangup挂起当前终端nfsservctl对N

29、FS守护进程进行控制vm86进入模拟8086模式create_module创建可装载的模块项delete module删除可装载的模块项init module初始化模块query module查询模块信息*get kernel syms取得核心符号,已被query module代替四、内存管理brk改变数据段空间的分配sbrk参见brkmlock内存页面加锁munlock内存页面解锁mlockall调用进程所有内存页面加锁munlockall调用进程所有内存页面解锁mmap映射虚拟内存页munmap去除内存页映射mremap重新映射虚拟内存地址msync将映射内存中的数据写回磁盘mprotec

30、t设置内存映像保护getpagesize获取页面大小sync将内存缓冲区数据写回硬盘cacheflush将指定缓冲区中的内容写回磁盘五、网络管理getdomainname取域名setdomainname设置域名gethostid获取主机标识号sethostid设置主机标识号gethostname获取本主机名称sethostname设置主机名称六、socket 控制socketcallsocket系统调用socket建立socketbind绑定socket 到端口connect连接远程主机accept响应socket 连接请求send通过socket发送信息sendto发送UDP信息sendmsg参见sendrecv通过socket接收信息recvfrom接收UDP信息recvmsg参见recvlisten监听socket端口select对多路同步I/O进行轮询shutdown关闭socket上的连接getsockname取得本地socket 名字getpeername获取通信对方的 socket名字g

温馨提示

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

评论

0/150

提交评论