linux实验报告_第1页
linux实验报告_第2页
linux实验报告_第3页
linux实验报告_第4页
linux实验报告_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

西安郵電學院西安郵電學院 LinuxLinux 实验报告实验报告 题题 目目 1 进程进程 题题 目目 2 线程线程 题题 目目 3 互斥互斥 系部名称系部名称 计算机学院 专业名称专业名称 软件工程 班班 级级 0802 学号学号 04085047 学生姓名学生姓名 王晶晶 指导教师指导教师 陈莉君 时间时间 2010 年年 10 月月 29 号号 11 月月 9 号号 实验实验 1 进程进程 1 1 实验目的 通过观察 分析实验现象 深入理解进程及进程在调度执行和内存空间等方面的特点 掌握在 POSIX 规范中 fork 和 kill 系统调用的功能和使用 1 2 实验要求 1 2 1 实验环境要求 1 硬件 1 主机 Pentium III 以上 2 内存 128MB 以上 3 显示器 VGA 或更高 4 硬盘空间 至少 100MB 以上剩余空间 2 软件 Linux 操作系统 内核 2 4 26 以上 预装有 X Window vi gcc gdb 和任 意 web 浏览器 1 2 2 学生实验前的准备工作 学习 man 命令的用法 通过它查看 fork 和 kill 系统调用的在线帮助 并阅读参 考资料 学会 fork 与 kill 的用法 复习 C 语言的相关内容 1 3 实验内容 1 先猜想一下这个程序的运行结果 假如运行 process 20 输出会是什么样 执行 process20 会输出 10 个进程交替执行 输入要删除的进程编号 回车则删除该进程 输入 q 回车删除进程组 程序结束 2 然后按照注释里的要求把代码补充完整 运行程序 可以多运行一会儿 并在 此期间启动 关闭一些其它进程 看 process 的输出结果有什么特点 记录下这个结果 3 开另一个终端窗口 运行 ps aux grep process 命令 看看 process 究竟启动了多少个 进程 回到程序执行窗口 按 数字键 回车 尝试杀掉一两个进程 再到另一个窗口看进程 状况 执行 forkTest 10 输入命令 ps aux grep forkTest 后显示有 12 个进程在运行 10 个 子进程 1 个父进程 最后一个为 ps aux grep forkTest 命令的进程号 删除 1 号进程 后 再输入 ps aux grep forkTest 命令 则显示的进程数为 11 按 q 退出程序再看进程情况 1 4 回答下列问题 1 你最初认为运行结果会怎么样 进程交替执行 当输入某进程编号加回车后该进程会被杀死 不再输出 当输入 q 加回车 后剩余的所有子进程都被杀死 程序运行结束 2 实际的结果什么样 有什么特点 试对产生该现象的原因进行分析 结果与上述的预期相同 特点 各进程交替执行 无确定顺序 分析 当程序执行到 for i 0 i child proc number i 循环后 调用 fork 函数创建第 一个子进程 然后父进程与该子进程交替执行 当子进程抢到 cpu 时继续往下执行 if child pid 0 语句中的程序段 若在执行到 do something 语句时 则调用该函数 执行死循环 for 输出该进程的相关内容 并在输出语句后加上 sleep SLEEP INTERVAL 语句 给其他进程抢占 cpu 的机会 这个过程不一定可以连续的执行下去 因为在该过程 中 父进程随时可能抢到 cpu 再次执行 fork 创建另一个子进程或者执行 else 语句 由其上次执行到的位置决定 该子进程的执行与第一个子进程类似 自此该 3 个进程 交替执行 当父进程执行 fork 时 则继续创建新的子进程以此类推 直到父进程完成 for i 0 i child proc number i 循环 child proc number 个子进程创建完成 此时 child proc number 个子进程加一个父进程一起交替性运行 当父进程再次抢到 cpu 时 则执行 while ch getchar q 循环时 则按用户的输入杀死相应的进程 用户输入 q 时 则杀死子进程组 while ch getchar q 循环结束 当执行 return 0 语句后该父 进程也结束 整个程序结束 3 proc number 这个全局变量在各个子进程里的值相同吗 为什么 不相同 因为子进程会把父进程的所有资源复制一份 而父进程在创建一个新的子进程时的 i 值都 不同 当新创建子进程执行时 将 i 赋值给该子进程的变量 proc number 4 kill 命令在程序中使用了几次 每次的作用是什么 执行后的现象是什么 当输入要删除的进程编号时会调用一次 kill 最后输入 q 结束时会调用一次 kill 输入要删除的进程编号后 执行的结果为 输出除过已被删掉的进程的其余进程信息 输入 q 则显示 已终止 整个程序执行结束 5 使用 kill 命令可以在进程的外部杀死进程 进程怎样能主动退出 这两种退 出方式哪种更好一些 进程自己调用 exit 或程序执行完后 return 进程自己调用 exit 结束的方式会比较好 6 补充后的程序源代码 include include include include include define MAX CHILD NUMBER 10 define SLEEP INTERVAL 2 int proc number 0 void do something int main int argc char argv int child proc number MAX CHILD NUMBER int i char ch pid t child pid pid t pid 10 0 if argc 1 child proc number atoi argv 1 child proc number child proc number 10 10 child proc number for i 0 i child proc number i child pid fork if child pid 0 proc number i pid i getpid do something else if child pid 0 perror fork error n else pid i child pid while ch getchar q if isdigit ch if pid ch 0 1 kill pid ch 0 SIGTERM pid ch 0 1 kill 0 SIGTERM return 0 void do something for printf This prcess is NO d n proc number 3 proc number sleep SLEEP INTERVAL 实验实验 2 线程线程 2 1 实验目的 通过观察 分析实验现象 深入理解线程及线程在调度执行和内存空间等方面的特点 并 掌握线程与进程的区别 掌握在 POSIX 规范中 pthread create 函数的功能和使用方法 2 2 实验要求 2 2 1 实验环境要求 1 硬件 1 主机 Pentium III 以上 2 内存 128MB 以上 3 显示器 VGA 或更高 4 硬盘空间 至少 100MB 以上剩余空间 2 软件 Linux 操作系统 内核 2 4 26 以上 预装有 X Window vi gcc gdb 和任 意 web 浏览器 2 2 2 学生实验前的准备工作 阅读参考资料 了解线程的创建等相关系统调用 2 3 实验内容 按照注释里的要求把代码补充完整 正确编译程序后 先预计一下这个程序的运行结果 具体的结果会是什么样 运行程序 开另一个终端窗口 运行 ps aux 命令 看看 thread 的运行情况 注意查看 thread 的 CPU 占用率 并记录下这个结果 预计输出的前三列数不相等 main counter 的值与 sum 的值相等 且为前三列显示的线 程运行次数之和 运行 ps aux 命令后 thread 的 CPU 占用率为 197 2 4 实验中的问题 1 你最初认为前三列数会相等吗 最后一列斜杠两边的数字是相等 还是大于或者 小于关系 不会相等 因为三个进程交替执行 每个进程运行的时间及次数都不确定 main count 的值应该等于 sum 的值等于 3 个线程执行次数的总和 2 最后的结果如你所料吗 有什么特点 试对原因进行分析 不 前 3 列的输出结果与预期结果相同 但 main count 的值大于 sum 的值 分析 因为 main counter 属于临界资源 可能会出现当一个线程正在执行 main counter 时 另一个线程也要执行 main counter 的情况 这样就会使 main counter 的值不准确 又线程运行顺序的不确定性 交替性 可能在一个线程执行了 main counter 后 还未执行 counter thread num 时 CPU 便被主线程抢去 执行 for i 0 i MAX THREAD i 循环 使 sum counter i 此时 sum 的值便比 main counter 的值小了 再输出个各线程巡行的次数 及 main counter 和 sum 的值 结 果与预期的理论值不符 3 thread 的 CPU 占用率是多少 为什么会这样 197 因为三个线程调用的函数执行的是一个死循环 for 使得 CPU 的利用率过高 4 thread worker 内是死循环 它是怎么退出的 你认为这样退出好吗 输入 q 回车 主线程会退出 while 循环 执行 return 函数 结束整个程序 自然子线程 也都被迫终止 死循环也就退出了 这样的退出不好 5 补充及修改后的程序源代码 include include include include include define MAX THREAD 3 unsigned long long main counter counter MAX THREAD unsigned long long 鏄 瘮 long 杩橀暱鐨勬暣褰 void thread worker void int main int argc char argv int i ch int num 3 pthread t thid pthread id MAX THREAD 0 for i 0 i MAX THREAD i num i i if pthread create thread worker else printf thread creater failed n exit 1 do unsigned long long sum 0 姹傛墍鏈夌嚎绋媍 ounter 鐨勫拰 for i 0 i MAX THREAD i sum counter i printf d llu i counter i printf n n llu n llu n n main counter sum while ch getchar q return 0 void thread worker void p int thread num thread num int p for main counter counter thread num sleep 1 return NULL 实验实验 3 互斥互斥 3 1 实验目的 通过观察 分析实验现象 深入理解理解互斥锁的原理及特点 掌握在 POSIX 规范中的互斥函数的功能及使用方法 3 2 实验要求 3 2 1 实验环境要求 1 硬件 1 主机 Pentium III 以上 2 内存 128MB 以上 3 显示器 VGA 或更高 4 硬盘空间 至少 100MB 以上剩余空间 2 软件 Linux 操作系统 内核 2 4 26 以上 预装有 X Window vi gcc gdb 和任意 web 浏 览器 3 2 2 学生实验前的准备工作 准备好上节实验完成的程序 thread c 阅读参考资料 了解互斥锁的加解锁机制及相关的系统调用 4 3 实验内容 1 找到 thread c 的代码临界区 用临界区解决 main counter 与 sum 不同步的问题 在使用到 main counter 与 sum 临界资源的临界区上加上 p v 操作 修改后的 thread c 的代码如下 include include include include include define MAX THREAD 3 unsigned long long main counter counter MAX THREAD unsigned long long 鏄 瘮 long 杩橀暱鐨勬暣褰 pthread mutex t mutext PTHREAD MUTEX INITIALIZER pthread mutex t mutex PTHREAD MUTEX INITIALIZER void thread worker void int main int argc char argv int i ch int num 3 pthread t thid pthread id MAX THREAD 0 for i 0 i MAX THREAD i num i i if pthread create else printf thread creater failed n exit 1 pthread mutex lock do unsigned long long sum 0 姹傛墍鏈夌嚎绋媍 ounter 鐨勫拰 for i 0 i MAX THREAD i sum counter i printf d llu i counter i printf n n llu n llu n n main counter sum while ch getchar q pthread mutex unlock pthread mutex destroy pthread mutex destroy return 0 void thread worker void p int thread num thread num int p for pthread mutex lock main counter counter thread num sleep 1 pthread mutex unlock return NULL 仔细阅读程序 编译程序后 先预计一下这个程序的运行结果 运行程序 若程序没有响应 按 ctrl c 中断程序运行 然后再重新运行 如此 反复若干次 记录下每次的运行结果 若产生了死锁 请修改程序 使其不会死锁 4 4 实验中的问题 1 你预想 deadlock c 的运行结果会如何 线程 1 2 会交替运行 且执行到一半会终止 2 deadlock c 的实际运行结果如何 多次运行每次的现象都一样吗 为什么会这样 交替执行 每次执行到一半都会终止 每次运行的结果不同 线程终止是因为 线程的推进顺序不合法 如果在线程 1 执行 pthread mutex lock 语句 申请 1 号资源成功后 线程 2 又执行 pthread mutex lock 语句 申请 2 号资源成功 当线程 1 想要申请 2 号资源 即执行 pthread mutex lock 语句或线程 2 想要申请 1 号资源 即执行 pthread mutex lock 时 这两个线程将陷入无限的等待状态而产生死锁 为避免死锁的产生 则应调换线程 1 或线程 2 对 1 2 号资源加锁的顺序 即使线程 1 2 对 1 2 号资源的加锁顺序一致 即一次性为其分配了它所需要的所有资源 避免了死锁的产 生 3 修改前补充的程序源代码 include include include include include define LOOP TIMES 10000 pthread mutex t mutex1 PTHREAD MUTEX INITIALIZER pthread mutex t mutex2 PTHREAD MUTEX INITIALIZER void thread worker void void critical section int thread num int i int main void int rtn i pthread t pthread id 0 rtn pthread create if rtn 0 printf pthread create ERROR n return 1 for i 0 i LOOP TIMES i pthread mutex lock pthread mutex lock critical section 1 i pthread mutex unlock pthread mutex unlock pthread mutex destroy pthread mutex destroy return 0 void thread worker void p int i for i 0 i LOOP TIMES i pthread mutex lock pthread mutex lock critical section 2 i pthread mutex unlock pthread mutex unlock void critical section int thread num int i printf

温馨提示

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

评论

0/150

提交评论