操作系统 fork()_第1页
操作系统 fork()_第2页
操作系统 fork()_第3页
操作系统 fork()_第4页
操作系统 fork()_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1 并发程序设计 实验目的 掌握在程序中创建新进程的方法 观察并理解多道程序并发执 行的现象 实验原理 fork 建立子进程 子进程得到父进程地址空间的一个复制 返回值 成功时 该函数被调用一次 但返回两次 fork 对 子进程返回 0 对父进程返回子进程标识符 非 0 值 不成功时 对父进程返回 1 没有子进程 实验内容 首先分析一下程序运行时其输出结果有哪几种可能性 然后实 际调试该程序观察其实际输出情况 比较两者的差异 分析其中 的原因 void main void int x 5 if fork x 30 printf d n x else printf d n x printf d n x 实验要求 每个同学必须独立完成本实验 提交实验报告 源程序和可执 行程序 实验报告中必须包含预计的实验结果 关键代码的分 析 调试记录 实际的实验结果 实验结果分析等内容 2 一 源程序 1 1 程序 include include pid t 类型的定义 include 函数 fork getpid 定义 void main void int x 5 if fork x 30 printf d n x else printf d n x printf d n x 1 2 预测结果 1 5 5 35 35 2 35 35 5 5 3 5 35 5 35 4 5 35 35 5 5 35 5 35 5 3 6 35 5 5 35 7 35 35 1 3 实际结果 administrator ubuntu yanhong cc 1 c administrator ubuntu yanhong a out 35 35 5 5 administrator ubuntu yanhong cc 1 c administrator ubuntu yanhong a out 5 5 35 35 1 4 结果分析 结果表明 子进程先执行还是父进程先执行是不确定的 这两个进程是来子进程先执行还是父进程先执行是不确定的 这两个进程是来 自同一个程序的两次执行 二者是并发的 自同一个程序的两次执行 二者是并发的 若是父进程先执行修改了若是父进程先执行修改了 x 子进程中的 子进程中的 x 也不会因此而改变 也不会因此而改变 因为在因为在 fork 之后 子进程拥有了自己的数据区 二者不再共享数之后 子进程拥有了自己的数据区 二者不再共享数 据 各自的修改已不会再互相干扰 据 各自的修改已不会再互相干扰 4 实验心得 一 对进程的理解 一个进程包含三个元素 1 一个可以执行的程序 2 和该进程相关联的全部数据 包括变量 内存空间 缓冲区等 3 程序的执行上下文 一个进程表示的就是一个可执行程序的一次执行过程中的一个状态 操作系统对进程的管理 典型的情况 是通过进程表完成的 进程表中的每个表项 记录的是当前操作系统中一个进程的情况 对于单 CPU 而言 每个特定的时刻只有一个进 程占用 CPU 但是系统中有可能同时存在有多个活动的 等待执行的 或继续执行的 进 程 为微观上串行而宏观上并行的结果 二 对 fork 的理解 当程序执行到 pid fork 时 执行了一次系统调用 子进程和父进程的可执行程序是同 一个程序 上下文和数据 绝大部分就是原进程 父进程 的拷贝 但它们是两个相但它们是两个相 互独立的进程互独立的进程 fork fork 以后 子进程就相当于父进程的兄弟一样了 以后 子进程就相当于父进程的兄弟一样了 三 对并发程序设计的理解 并发程序设计 concurrent programming 是指由若干个可同时执行的程序模块组成程 序的程序设计方法 这种可同时执行的程序模块称为进程 组成一个程序的多个进组成一个程序的多个进 程可以同时在多台处理器上并行执行 也可以在一台处理器上交叉程可以同时在多台处理器上并行执行 也可以在一台处理器上交叉 执行 采用并发程序设计可以缩短程序执行时间 提高计算机系统执行 采用并发程序设计可以缩短程序执行时间 提高计算机系统 的效率 的效率 在并发程序设计中 将加工后的数据送入缓冲区和从缓冲区取出数据打印输出必须依 次进行 在数据送入缓冲区前不能打印输出 在缓冲区内的数据没有打印输出完毕时不能 输入 否则 一批数据可能被重复打印或者一批数据还没有打印输出就被新送入的数据冲 掉 因此 对 送入缓冲区 和 从缓冲区取出数据 两个操作必须加以约制 以保证它 们依次执行 否则就会发生错误 产生这个问题的原因是两个进程都要访问缓冲区 也就 是说它们有一个公共变量 在并发程序设计中 各进程对公共变量的访问必须加以约制 这种约制称为同步 进程的同步是通过同步机制实现的 现已有多种同步机制 具有代表 性的是 PV 操作和管程 5 补充 fork 的返回值 有以下三种情况 1 父进程中 返回子进程的 pid 2 子进程中 返回 0 3 子进程中 返回 1 当进程数达到最上限 或者没有空闲内存空间可供分配时 返回一个负 以下为我对本问题的进一步探究 2 1 程序 include include include void main void int x 5 if fork int y 9 x 30 printf d n x else printf d n y printf d n x printf d n x 结果出现错误 2 c In function main 2 c 15 error y undeclared first use in this function 2 c 15 error Each undeclared identifier is reported only once 2 c 15 error for each function it appears in 原因是子进程不认识 y 因为它不能共享到它不能共享到 fork 以后父进程中的数据以后父进程中的数据 6 再一次验证了 fork 的功能 对以上程序做修改后可得 3 1 程序 include include include void main void int x 5 int y 9 if fork x 30 printf d n x else printf d n y printf d n x printf d n x 结果 administrator ubuntu yanhong vi 4 c administrator ubuntu yanhong cc 4 c administrator ubuntu yanhong a out 35 35 9 5 5 4 1 程序 意外的发现 A include include include void main void int x 5 printf d n x 7 if fork x 30 printf d n x else printf d n x printf d n x administrator ubuntu yanhong vi 6 c administrator ubuntu yanhong cc 6 c administrator ubuntu yanhong a out 5 35 35 5 5 将第一个 printf d n x printf d x 后得到 B 程序 B include include include void main void int x 5 printf d x if fork x 30 printf d n x else 8 printf d n x printf d n x administrator ubuntu yanhong vi 6 c administrator ubuntu yanhong cc 6 c administrator ubuntu yanhong a out 5 35 35 5 5 5 结果对比分析 以上两个程序显然都是先调用了父进程再调用了子进程 可是为什么小小的改变会使第二 个程序后面多输出一个 5 呢 原来是 n 的原因 当值被送入缓冲区后 如果后面有 n 则缓冲区被刷新 那么第二次子进 程去调用它时就没有值了 所以程序 A 中后面只有两个 5 但是程序 B 后面有 3 个 5 5 1 程序 以下为验证程序 include include include void main void int x 5 if fork x 30 printf d n x else printf d n x printf d n x administrator ubuntu yanhong vi 7 c administrator ubuntu yanhong cc 7 c administrator ubuntu yanhong a out 5 35 administrator ubuntu yanhong cc 7 c administrator ubuntu yanhong a out 35 5 include include include 9 void main void int x 5 if fork printf d n x else x 30 printf d n x printf d n x administrator ubuntu yanhong vi 8 c administrator ubuntu yanhong cc 8 c administrator ubuntu yanhong a out 5 5 35 35 administrator ubuntu yanhong cc 8 c administrator ubuntu yanhong a out 35 35 5 5 6 1 getpid 的返回 include include main pid t pid pid fork if pid printf error in fork else if pid 0 printf i am the child process my process id is dn getpid else printf i am the parent process my process id is dn getpid 结果是 root localhost c a out i am the child process my process id is 4286 10 i am the parent process my process id is 4285 1 派生子进程的进程 即父进程 其 pid 不变 2 对子进程来说 对子进程来说 fork 返回给它返回给它 0 但它的但它的 pid 不是不是 0 之所以 fork 返回 0 给它 是因为它随时可以调用 getpid 来获取自己的 pid 3 fork 之后父子进程除非采用了同步手段 否则不能确定谁先运行 之后父子进程除非采用了同步手段 否则不能确定谁先运行 也不能确定谁先结束 也不能确定谁先结束 认为子进程结束后父进程才从 fork 返回的 这是不对的 fork 不是这样的 vfork 才这样 4 当一个进程调用了 fork 以后 系统会创建一个子进程 这个子进程和父进程不同的地方只 有他的进程 ID 和父进程 ID 其他的都是一样 就象符进程克隆 clone 自己一样 当然创建两个 一模一样的进程是没有意义的 为了区分父进程和子进程 我们必须跟踪 fork 的返回值 当 fork 掉用失败的时候 内存不足或者是用户的最大进程数已到 fork 返回 1 否则 fork 的返回 值有重要的作用 对于父进程 fork 返回子进程的 ID 而对于 fork 子进程返回 0 我们根据我们根据 这个返回

温馨提示

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

评论

0/150

提交评论