实验一、进程管理实验_第1页
实验一、进程管理实验_第2页
实验一、进程管理实验_第3页
实验一、进程管理实验_第4页
实验一、进程管理实验_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

实验一实验一 linux 进程的创建与控制进程的创建与控制 实验目的 1 加深对进程概念的理解 明确进程和程序的区别 2 进一步认识并发执行的实质 3 分析进程争用资源的现象 学习解决进程互斥的方法 实验环境 编程环境 TC 或者 VC 操作系统软件 linux 准备知识 一 基本概念一 基本概念 1 进程的概念 进程与程序的区别 2 并发执行的概念 3 进程互斥的概念 二 系统调用二 系统调用 系统调用是一种进入系统空间的办法 通常 在 OS 的核心中都设置了一组用于实现 各种系统功能的子程序 并将它们提供给程序员调用 程序员在需要 OS 提供某种服务的时 候 便可以调用一条系统调用命令 去实现希望的功能 这就是系统调用 因此 系统调 用就像一个黑箱子一样 对用户屏蔽了操作系统的具体动作而只是控制程序的执行速度等 各个不同的操作系统有各自的系统调用 如 windows API 便是 windows 的系统调用 Linux 的系统调用与之不同的是 Linux 由于内核代码完全公开 所以可以细致的分析出其 系统调用的机制 三 相关函数 三 相关函数 1 1 fork 函数函数 fork 函数创建一个新进程 其调用格式为 int fork 其中返回 int 取值意义如下 正确返回 等于 0 创建子进程 从子进程返回的 ID 值 大于 0 从父进程返回的子进程的进程 ID 值 错误返回 等于 1 创建失败 2 2 wait 函数函数 wait 函数常用来控制父进程与子进程的同步 在父进程中调用 wait 函数 则父进程被阻塞 进入等待队列 等待子进程结束 当子进程结束时 会产生一个 终止状态字 系统会向父进程发出 SIGCHLD 信号 当接到信号后 父进程提取子进 程的终止状态字 从 wait 函数返回继续执行原程序 其调用格式为 include include pid t wait int statloc 正确返回 大于 0 子进程的进程 ID 值 等于 0 其它 错误返回 等于 1 调用失败 3 3 exit 函数函数 exit 函数是进程结束最常调用的函数 在 main 函数中调用 return 最终也 是调用 exit 函数 这些都是进程的正常终止 在正常终止时 exit 函数返回进 程结束状态 其调用格式为 include void exit int status 其中 status 为进程结束状态 4 4 kill 函数函数 kill 函数用于删除执行中的程序或者任务 其调用格式为 kill int PID int IID 其中 PID 是要被杀死的进程号 IID 为向将被杀死的进程发送的中断号 关于 Linux 下的 C 语言编程 1 编辑器可使用 vi 2 编译器使用 gcc 格式 gcc option filename 例如 gcc o main main c 主要的 option o 指定输出文件名 不指定则生成默认文件 a out 其它的参数见帮助 man gcc 实验内容和步骤 1 进程的创建 编写一段程序 使用系统调用 fork 创建两个子进程 当此程序运行时 在系 统中有一个父进程和两个子进程活动 让每个进程在屏幕上显示一个字符 父显示 a 子进程分别显示 b 和 c 观察记录显示结果 并分析原因 include main int p1 p2 while p1 fork 1 if p1 0 putchar b else while p2 fork 1 if p2 0 putchar c else putchar a 运行 运行结果 root localhost gcc o lsj lsj c root localhost lsj bca root localhost lsj bca root localhost lsj bca root localhost lsj ba root localhost c lsj bca root localhost lsj bca root localhost lsj bca root localhost lsj ca root localhost b 分析原因 从进程并发执行来看 各种情况都有可能 上面的三个进程没有同步措施 所以父进程与子进程的输出内容会叠加在一起 输出次序带有随机性 由于函数 printf 在输出字符串时不会被中断 因此 字符串内部字符顺序输出不 变 但由于进程并发执行的调度顺序和父子进程抢占处理机问题 输出字符串的顺序和 先后随着执行的不同而发生变化 这与打印单字符的结果相同 2 进程控制 修改已编写的程序 将每个进程输出一个字符改为每个进程输出一句话 在观察程序执行 时屏幕上出现的现象 并分析原因 编写一段程序 使用系统调用 fork 来创建两个子进程 并由父进程重复显示字符串 parent 和自己的标识数 而子进程则重复显示字符串 child 和自己的标识数 include include main int p1 p2 while p1 fork 1 if p1 0 printf child s pid d n getppid else while p2 fork 1 if p2 0 printf child s pid d n getppid else printf parent s pid d n getppid 结果 root localhost gcc o lsj lsj c root localhost lsj child 1 s pid 4852 child 2 s pid 4852 parent s pid 3224 root localhost lsj child 1 s pid 4903 child 2 s pid 4903 parent s pid 3224 root localhost lsj child 1 s pid 4918 parent s pid 3224 root localhost child 2 s pid 1 lsj child 1 s pid 4945 child 2 s pid 4945 parent s pid 3224 root localhost lsj child 1 s pid 5270 parent s pid 3224 root localhost child 2 s pid 5270 分析原因 进程标识数随机产生 输出次序也有随机性 3 编写一段程序 使用系统调用 fork 来创建一个子进程 子进程通过系统调用 exec 更换自己的执行代码 显示新的代码 new program 后 调用 exit 结束 而父进程则 调用 waitpid 等待子进程结束 并在子进程结束后显示子进程的标识符 然后正常结束 代码 main int p p fork if p 0 execl root new 0 exit 1 else printf parent d getpid waitpid printf child d getpid 新建 C 程序 new c main printf new program 分析原因 先编译 root 下的 new c 产生 new 应用程序 execl root new 0 调用 root 目录下的 new 应用程序 执行输出 new program 问题讨论 1 系统是怎样创建进程的 答 系统创建的第一个进程是 init 进程 系统中所有的进程都是由当前进程使用系统调用 fork 创建的 子进程被创建后继承了父进程的资源 子进程共享父进程的虚存空间 写 时拷贝 copy on write 子进程在创建后共享父进程的虚存内存空间 只是在两个进程 中某一个进程需要向虚拟内存写入数据时才拷贝相应部分的虚拟内存 子进程在创建后执 行的是父进程的程序代码 2 可执行文件加载时进行了哪些处理 答 当操作系统装载一个可执行文件的时候 首先操作系统判断该文件是否是一个合法的 可执行文件 如果是操作系统将按照段表中的指示为可执行程序分配地址空间 3 当首次调用新创建进程时 其入口在哪里 答 fork 系统调用创建的子进程继承了原进程的 conte

温馨提示

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

评论

0/150

提交评论