版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 unix standard header/* 是 POSIX 标准定义的 unix 类系统定义符号常量的头文件,包含了许多 UNIX 系统服务 的函数原型,例如 read 函数、 write 函数和 getpid 函数 */ 函数原型: pid_t fork(v
3、oid);/* 是 Linux 下的进程号类型,也就是 Process ID _ Type的缩写。其实是宏定义的unsigned int 类型 */函数功能: fork 的功能是创建 子进程 。调用 fork 的进程称为 父进程 。如图 2.1 所示。子 进程是父进程的一个拷贝,它继承了父进程的用户代码、 组代码、 环境变量、 已打开的文件 代码、工作目录及资源限制。 fork 语句执行后,内核向父进程返回子进程的进程号,向子 进程返回 0。 父子进程都从 fork() 的下一句开始并发执行 。返回值:返回值 =-1 :创建失败。返回值 =0 : 程序在子进程中。返回值 0 : 程序在父进程中
4、。 (该返回值是子进程的进程号)编程提示: 虽然子进程是父进程的一个复制品,但父子的行为是不同的。编程时要抓住内 核的返回值。通过返回值,可以知道是父进程还是子进程,因而可以编写不同行为的代码。图 2.1 fork()创建进程示意图发出 wait 调用的进程只要有子进程,就会睡眠(2) wait() 系统调用 头文件: #include 函数原型: pid_t wait(int *status); 函数功能: wait 的功能是等待子进程结束。直到子进程中的一个终止为止。若没有子进程,则该调用立即返回。 函数参数: status 是子进程退出时的状态信息。 返回值:成功则返回子进程号,否则返回
5、-1 。(3) getpid() 系统调用 头文件: unistd.h ,在 VC+6.0 下可以用 process.h 函数原型: pid_t getpid(void);函数功能: wait 的功能是将父进程挂起,等待子进程终止。 getpid 函数用来取得目前进程 的进程 ID,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。 返回值:目前进程的进程 ID 。execnice(4) 其他系统调用 exit 终止进程 执行一个应用程序 改变进程的优先7. 实验内容与步骤(将所有截图换成用户名为你们自己姓名的拼音,并回答所有的问题) (1 )运行图 2.1 所示程序将图 2
6、.1 中的源程序保存为 e201.c 在终端中编译 gcc o e201 e201.c运行 ./e201此时, 程序为死循环,在该终端中无法继续输入命令执行,于是, 我们可以暂时不管这一个 终端,而是再新建一个终端,然后键入 ps e ,列出当前所有进程观察屏幕,是否有两个名为 e201 的进程。比较它们的进程号,判别哪个是父进程,哪 个是子进程。ctrl+c 强制结束。程序中的 while(1); 语句是为了不让程序退出来,以便于你观察进程状态。用 kill 命令 把这两个进程终止。可见,第一个终端如下图所示,已经从死循环中解救出来了。当然,最简单粗暴的方法不是关闭相关进程,而是直接通过对图
7、 2.1 的程序稍加改进,可看见两个进程的进程号。(2) 编写一段名为 e202.c 的源程序 , 使用系统调用 fork() 创建两个子进程 p1 和 p2 。p1 的功能为显示字符 b ,p2 的功能为显示字符 c ,父进程的功能为显示字符 a ,父进程 和两个子进程并发运行。不停的运行 e202 ,观察并记录屏幕上的显示结果。程序设计过程:用 while 语句控制 fork() 直到创建成功。 用 if 语句判别是在子进程中还是在父进程 中。程序运行后会创建三个进程,它们分别是子进程p1、p2 、父进程。这三个进程并发运行。假定子进程有些任务要做, 完成这些任务要花一定时间, 因此,可以
8、用一个延时函数简 单地模拟这些任务。/e202.c #include void delay(int x) /*int i,j;for(i=0;ix;i+) for(j=0;j0 & p20 & p30) printf(A:%dn,getpid(); if(p1=0 & p20 & p30) printf(B:%dn,getpid(); if(p1=0 & p2=0 & p30) printf(C:%dn,getpid(); if(p1=0 & p2=0 & p3=0)printf(D:%dn,getpid(); if(p1=0 & p20 & p3=0) printf(E:%dn,getpid
9、(); if(p10 & p2=0 & p30) printf(F:%dn,getpid();if(p10 & p2=0 & p3=0) printf(G:%dn,getpid(); if(p10 & p20 & p3=0) printf(H:%dn,getpid(); sleep(10);return 0;这些进程构成的进程树为(要画出进程树才有加分哦 ! ):ps f 命令可以查看当前终端进程的进程数关系图8. 心得体会附录 pstree 的用法格式: pstree 以树状图显示进程,只显示进程的名字,且相同进程合并显示。 格式: pstree -p 以树状图显示进程,还显示进程 PID
10、。格式: pstree 格式: pstree -p 以树状图显示进程 PID 为 的进程以及子孙进程, 如果有 -p 参数则同时显示每个进程 的 PID 。附录 Linux 系统调用列表以下是 Linux 系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。其中 有一些函数的作用完全相同,只是参数不同。 (有点像 C+ 函数重载,但是 Linux 核心是用 C 语言写的, 所以只能取成不同的函数名)。还有一些函数已经过时,被新的更好的函数所代替了( gcc 在链接这些函 数时会发出警告),但因为兼容的原因还保留着,这些函数在前面标上“*”号以示区别。各系统调用的使用方法,可
11、以通过 man 命令获得。、进程控制:fork创建一个新进程clone按指定条件创建子进程execve运行可执行文件exit中止进程exit立即中止当前进程getdtablesize进程所能打开的最大文件数getpgid获取指定进程组标识号setpgid设置指定进程组标志号getpgrp获取当前进程组标识号setpgrp设置当前进程组标志号getpid获取进程标识号getppid获取父进程标识号getpriority获取调度优先级setpriority设置调度优先级modify ldt读写进程的本地描述表nanosleep使进程睡眠指定的时间nice改变分时进程的优先级pause挂起进程,等待
12、信号personality设置进程运行域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创建一
13、个子进程,以供执行新程序,常与 execve 等同时使用wait等待子进程终止wait3参见 waitwaitpid等待指定子进程终止wait4参见 waitpidcapget获取进程权限capset设置进程权限getsid获取会晤标识号setsid设置会晤标识号二、文件系统控制1、文件读写操作fcntl文件控制open打开文件creat创建新文件close关闭文件描述字read读文件write写文件readv从文件读入数据到缓冲数组中writev将缓冲数组里的数据写入文件pread对文件随机读pwrite对文件随机写lseek移动文件指针llseek在 64 位地址空间里移动文件指针dup复
14、制已打开的文件描述字dup2按指定条件复制文件描述字flock文件加 / 解锁pollI/O 多路转换truncate截断文件ftruncate参见 truncateumask设置文件权限掩码fsync把文件在内存中的部分写回磁盘2、文件系统操作access确定文件的可存取性chdir改变当前工作目录fchdir参见 chdirchmod改变文件方式fchmod参见 chmodchown改变文件的属主或用户组fchown参见 chownlchown参见 chownchroot改变根目录stat取文件状态信息lstat参见 statfstat参见 statstatfs取文件系统信息fstatfs
15、参见 statfsreaddir读取目录项getdents读取目录项mkdir创建目录mknod创建索引结点rmdir删除目录rename文件改名link创建链接symlink创建符号链接unlink删除链接readlink读符号链接的值mount安装文件系统umount卸下文件系统ustat取文件系统信息utime改变文件的访问修改时间utimes参见 utimequotactl控制磁盘配额三、系统控制ioctlI/O 总控制函数sysctl读/ 写系统参数acct启用或禁止进程记账getrlimit获取系统资源上限setrlimit设置系统资源上限getrusage获取系统资源使用情况us
16、elib选择要使用的二进制函数库ioperm设置端口 I/O 权限iopl改变进程 I/O 权限级别outb低级端口操作reboot重新启动swapon打开交换文件和设备swapoff关闭交换文件和设备bdflush控制 bdflush 守护进程sysfs取核心支持的文件系统类型sysinfo取得系统信息adjtimex调整系统时钟alarm设置进程的闹钟getitimer获取计时器值setitimer设置计时器值gettimeofday取时间和时区settimeofday设置时间和时区stime设置系统日期和时间time取得系统时间times取进程运行时间uname获取当前 UNIX 系统的
17、名称、版本和主机等信息vhangup挂起当前终端nfsservctl对 NFS 守护进程进行控制vm86进入模拟 8086 模式create module创建可装载的模块项delete module删除可装载的模块项init module初始化模块query module查询模块信息*get kernel syms取得核心符号 , 已被 query module 代替四、内存管理brk改变数据段空间的分配sbrk参见 brkmlock内存页面加锁munlock内存页面解锁mlockall调用进程所有内存页面加锁munlockall调用进程所有内存页面解锁mmap映射虚拟内存页munmap去除内
18、存页映射mremap重新映射虚拟内存地址msync将映射内存中的数据写回磁盘mprotect设置内存映像保护getpagesize获取页面大小sync将内存缓冲区数据写回硬盘cacheflush将指定缓冲区中的内容写回磁盘五、网络管理getdomainname取域名setdomainname设置域名gethostid获取主机标识号sethostid设置主机标识号10gethostname获取本主机名称sethostname设置主机名称六、socket 控制socketcallsocket 系统调用socket建立 socketbind绑定 socket 到端口connect连接远程主机acce
19、pt响应 socket 连接请求send通过 socket 发送信息sendto发送 UDP 信息sendmsg参见 sendrecv通过 socket 接收信息recvfrom接收 UDP 信息recvmsg参见 recvlisten监听 socket 端口select对多路同步 I/O 进行轮询shutdown关闭 socket 上的连接getsockname取得本地 socket 名字getpeername获取通信对方的 socket 名字getsockopt取端口设置setsockopt设置端口参数sendfile在文件或端口间传输数据socketpair创建一对已联接的无名 sock
20、et七、用户管理getuid获取用户标识号setuid设置用户标志号getgid获取组标识号setgid设置组标志号getegid获取有效组标识号setegid设置有效组标识号geteuid获取有效用户标识号seteuid设置有效用户标识号setregid分别设置真实和有效的的组标识号setreuid分别设置真实和有效的用户标识号getresgid分别获取真实的 ,有效的和保存过的组标识号setresgid分别设置真实的 ,有效的和保存过的组标识号getresuid分别获取真实的 ,有效的和保存过的用户标识号setresuid分别设置真实的 ,有效的和保存过的用户标识号setfsgid设置文件系统检查时使用的组标
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 银川市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(精练)
- 商洛市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(模拟题)
- 商丘市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(预热题)
- 株洲市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解ab卷
- 辽源市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(各地真题)
- 新余市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及参考答案详解一套
- 2026年北海市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(研优卷)
- 克州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(培优)
- 连云港市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(综合题)
- 思茅市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(研优卷)
- 2023年工商管理毕业大作业答案解析
- 2025年10月自考13887经济学原理中级押题
- 2019-2023年北京市中考真题数学试题汇编:圆解答题(第24题)
- 国际经济与贸易《国际结算》课程教学大纲
- 11 第十一章 不停航施工方案与措施
- 医院卒中中心建设各种制度、流程汇编
- 1.1船舶电力推进系统的组成课件讲解
- DB46-T 610-2023 浮式深水养殖网箱锚泊系统及安装技术规范
- JTJ034-2000 公路路面基层施工技术规范
- 福建游神介绍英文
- 《禁骑电动自行车》班会课件
评论
0/150
提交评论