

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、linux进程线程管理实验报告 进程线程,死锁试验报告 西安郵電學院 操作系统linux试验报告 题 题 题 系部名称 专业名称 班 级 学号 同学姓名 时间 目1: 进程_ 目2: 线程管理_ 目3: 互斥_ 计算机学院 软件工程 0802 04085048 郭爽乐 2021-10-31 : : 进程线程,死锁试验报告 试验一: 进程管理 一 试验目的 通过观看、分析试验现象,深化理解进程及进程在调度执行和内存空间等方面的特点, 把握在posix 规范中fork和kill系统调用的功能和使用。 二试验要求 2.1 试验环境要求 1. 硬件 (1) 主机:pentium iii 以上; (2)
2、 内存:128mb 以上; (3) 显示器:vga 或更高; (4) 硬盘空间:至少100mb 以上剩余空间。 2. 软件 linux 操作系统,内核2.4.26 以上,预装有x-window 、vi、gcc、gdb 和任 意web 扫瞄器。 2.2 试验前的预备工作 学习man 命令的用法,通过它查看fork 和kill 系统调用的在线关心,并阅读参 考资料,学会fork 与kill 的用法。 复习c 语言的相关内容。 三、试验内容 3.1 补充posix 下进程掌握的残缺版试验程序 3.2回答下列问题: 1. 你最初认为运行结果会怎么样? 2. 实际的结果什么样?有什么特点?试对产生该现象
3、的缘由进行分析。 3. proc_number 这个全局变量在各个子进程里的值相同吗?为什么? 4. kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么? 5. 使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退 出方式哪种更好一些? 四、试验结果 4.1 补充完全的源程序 #includestdio.h #includesys/types.h #includeunistd.h 进程线程,死锁试验报告 #includesignal.h #includectype.h #define max_child_number 10/* 允许建立的子进程个数最大值
4、 */ #define sleep_interval 1/* 子进程睡眠时间 */ int proc_number=0; /* 子进程的编号,从0开头 */ void do_something(); int main(int argc,char *argv) int child_proc_number=max_child_number; /* 子进程个数 */ int i,ch; pid_t child_pid; pid_t pid10=0;/* 存放每个子进程的id */ if(argc1) child_proc_number=atoi(argv1); child_proc_number=(
5、child_proc_number10)?10:child_proc_number; /* 命令行参数中的第一个参数表示建立几个子进程,最多10个 */ /*建立child_proc_number个子进程 * 子进程要执行 * proc_number = i; * do_something(); * 父进程把子进程的id保存到pidi */ for(i=0;ichild_proc_number;i+) child_pid=fork(); if(child_pid= -1) perror(creat error!n); return 1; else if(child_pid0) pidi=chi
6、ld_pid; else proc_number=i; do_something(); /* 让用户选择杀死哪个进程。输入数字(自编号)表示杀死该进程 * 输入q退出 */ 进程线程,死锁试验报告 while(ch=getchar()!='q') if(isdigit(ch) kill(pidch-'0',sigterm); wait(pidch-'0'); kill(0,sigterm); /*杀死本组的全部进程 */ return 0; void do_something() for(;) printf(this is process no.
7、%*dn,proc_number+3,proc_number); sleep(sleep_interval); 4.2 回答上述试验内容中的问题 1预期结果: 会持续输出0-9号进程,直到输入数字键+回车,则会杀死该进程,接下来的输出将不会有该进程号,当输入q+回车,则退出程序。 2实际结果: 与预期差不多,因输入进程总数20大于设定的最大进程数,因此按进程数10来处理。随机输出0-9号进程,sleep(sleep_interval),循环输出,直到输入数字键,则会杀死该数字对应的进程,直到输入q退出循环,然后杀死本组全部进程。 分析:每创建一个子进程时,将其pid存储在pidi中,i存储在p
8、roc_number,然后调用死循环函数do_something(),输出该进程的proc_number; 当输入数字键时,主进程会执行kill(pidch-'0',sigterm),从而杀死(ch-0)号进程。当输入q时循环退出,kill(0,sigterm),杀死本组全部进程。程序退出。 3. proc_number这个全局变量在各个子进程里的值相同,由于子进程相互独立,资源互不影响。 4kill命令在程序中使用了2次:kill(pidch-'0',sigterm); kill(0,sigterm); 第一次是杀死该进程号pidch-0,执行后接下来的结果中
9、不会有该进程号,用另一个终端打开,使用命令ps aux | grep process,由于子进程先于父进程退出,则被杀死的进程为僵死状态,但我加了行代码wait(pidch-'0'),就会使该子进程真正结束。 其次次是杀死本组全部进程。即主进程以及它创建的全部子进程。执行后程序退出,进程结束。 5进程在main函数中return,或调用exit()函数都可以正常退出。 而使用kill命令则是特别退出。 当然是正常退出比较好,若在子进程退出前使用kill命令杀死其父进程,则系统 进程线程,死锁试验报告 会让init进程接管子进程。当用kill命令使得子进程先于父进程退出时,而父进
10、程又没有调用wait函数等待子进程结束,子进程处于僵死状态,并且会始终保持下去,直到系统重启。子进程处于僵死状态时,内核只保存该进程的必要信息以被父进程所需,此时子进程始终占着资源,同时削减了系统可以创建的最大进程数。 试验二: 线程管理 一 试验目的 通过观看、分析试验现象,深化理解线程及线程在调度执行和内存空间等方面的特点,并把握线程与进程的区分。把握在posix 规范中pthread_create() 函数的功能和使用方法。 二试验要求 2.1 试验环境要求 1. 硬件 (1) 主机:pentium iii 以上; (2) 内存:128mb 以上; (3) 显示器:vga 或更高; (4
11、) 硬盘空间:至少100mb 以上剩余空间。 2. 软件 linux 操作系统,内核2.4.26 以上,预装有x-window 、vi、gcc、gdb 和任 意web 扫瞄器。 2.2 试验前的预备工作 阅读参考资料,了解线程的创建等相关系统调用。 三、试验内容 3.1 补充posix 下进程掌握的残缺版试验程序 3.2回答下列问题: 1. 你最初认为前三列数会相等吗?最终一列斜杠两边的数字是相等,还是大于或者 小于关系? 2. 最终的结果如你所料吗?有什么特点?试对缘由进行分析。 3. thread 的cpu 占用率是多少?为什么会这样? 4. thread_worker()内是死循环,它是
12、怎么退出的?你认为这样退出好吗? 进程线程,死锁试验报告 四、试验结果 4.1 补充完全的源程序 #includestdio.h #includesys/types.h #includeunistd.h #includectype.h #includepthread.h #define max_thread 3/* 线程的个数 */ unsigned long long main_counter,countermax_thread; /* unsigned long long是比long还长的整数 */ void* thread_worker(void*); int main(int argc
13、,char argv) int i,rtn; char ch; pthread_t pthread_idmax_thread=0;/* 存放每个线程的id */ for(i=0;imax_thread;i+) pthread_create(pthread_idi,null,thread_worker,(void*)i); /*用pthread_create建一个一般的线程, 线程id存入pthread_idi, 线程执行的函数是thread_worker,并i作为参数传递给线程 */ /* 用户按一次回车执行下面的循环体一次。按q退出 */ do unsigned long long sum=
14、0; for(i=0;imax_thread;i+) sum+=counteri; /* 求全部线程的counter的和 */ printf(counter%d=%llun,i,counteri); printf(main_counter=%llu/sum=%llun,main_counter,sum); while(ch=getchar()!='q'); return 0; void* thread_worker(void* p) int thread_num; thread_num=(int)p; /*把main中的i的值传递给thread_num */ for(;) ma
15、in_counter+; counterthread_num+; 4.3 回答上述试验内容中的问题 1 试验运行前我认为前三列数不会相等,由于三个线程运行次数是随机的,结 进程线程,死锁试验报告 果不行预料,当然counteri值不会肯定相等。而我认为main_counter与sum值应当是相等的。由于都是三个线程的counter之和。 2而试验结果是前三列数的确不相等。不过main_counter与sum的值也不相等,main_counter sum,经分析争论得出解释:由于三个线程在共同争取运行thread_worker()函数,比如main_counter初值为0,pthread_id0
16、执行之后main_counter+1,此时还将来得及将值赋给main_counter,这时的main_counter还是0;pthread_id1也执行这个函数,main_counter+1,若此时在1号线程将main_counter+1的值还未赋给main_counter,即这时的main_counter还是0,pthread_id2也来执行这个函数,main_counter+1,此时三个线程才将加完之后的值赋给main_counter,则main_counter=0+1=1,而真正执行次数sum=0+1+1+1=3。main_counter sum。 3thread的cpu占用率在我的机子
17、上执行结果是181,由于三个线程是无限循环的运行,使得cpu占用率很高。 4thread_worker()函数内是死循环,退出时由于主函数中设置的输入q时循环退出。输入q时主进程执行退出,return 退出程序,则子线程也强制退出。 这样退出不好。 试验三: 互斥 一 试验目的 通过观看、分析试验现象,深化理解理解互斥锁的原理及特点 把握在posix 规范中的互斥函数的功能及使用方法 二试验要求 2.1 试验环境要求 1. 硬件 (1) 主机:pentium iii 以上; (2) 内存:128mb 以上; (3) 显示器:vga 或更高; (4) 硬盘空间:至少100mb 以上剩余空间。 2
18、. 软件 linux 操作系统,内核2.4.26 以上,预装有x-window 、vi、gcc、gdb 和任 意web 扫瞄器。 2.2 试验前的预备工作 预备好上节试验完成的程序thread.c 。 阅读参考资料,了解互斥锁的加解锁机制及相关的系统调用。 三、试验内容 进程线程,死锁试验报告 3.1找到thread.c 的代码临界区,用临界区解决main_counter 与sum 不同步的问题。 3.2阅读下列代码,回答问题: #includestdio.h #includesys/types.h #includeunistd.h #includectype.h #includepthrea
19、d.h #define loop_times 1000 pthread_mutex_t mutex1=pthread_mutex_initializer; pthread_mutex_t mutex2=pthread_mutex_initializer; void* thread_worker(void *); void critical_section(int threadd_num,int i); int main(int argc,char *argv) int rtn,i; pthread_t pthread_id=0; rtn=pthread_create(pthread_id,nu
20、ll,thread_worker,null); if(rtn!=0) printf(pthread_create error!n); return -1; for(i=0;iloop_times;i+) pthread_mutex_lock(mutex1); pthread_mutex_lock(mutex2); critical_section(1,i); pthread_mutex_unlock(mutex2); pthread_mutex_unlock(mutex1); pthread_mutex_destroy(mutex1); pthread_mutex_destroy(mutex2
21、); return 0; void *thread_worker(void* p) int i; for(i=0;iloop_times;i+) pthread_mutex_lock(mutex2); pthread_mutex_lock(mutex1); critical_section(2,i); 进程线程,死锁试验报告 pthread_mutex_unlock(mutex2); pthread_mutex_unlock(mutex1); void critical_section(int thread_num,int i) printf(thread%d:%dn,thread_num,i
22、); 1. 你预想deadlock.c 的运行结果会如何? 2. deadlock.c 的实际运行结果如何?多次运行每次的现象都一样吗?为什么会这样? 四、试验结果 4.1 通过加锁可修改thread.c程序,使得main_counter与sum值同步,源代码如下: #includestdio.h #includesys/types.h #includeunistd.h #includectype.h #includepthread.h #define max_thread 3 unsigned long long main_counter,countermax_thread; void* t
23、hread_worker(void*); int main(int argc,char argv) int i,rtn; char ch; pthread_t pthread_idmax_thread=0; for(i=0;imax_thread;i+) pthread_create(pthread_idi,null,thread_worker,(void*)i); do unsigned long long sum=0; for(i=0;imax_thread;i+) sum+=counteri; printf(counter%d=%llun,i,counteri); printf(main
24、_counter=%llu/sum=%llun,main_counter,sum); while(ch=getchar()!='q'); return 0; 进程线程,死锁试验报告 void* thread_worker(void* p) int thread_num; thread_num=(int)p; for(;) main_counter+; counterthread_num+; 4.2回答上述试验要求中的问题: 1程序运行会消失中止现象,可能会资源互斥。 2实际运行时程序会在运行期间中止,消失死锁现象。多次运行之后现象都一样。 解释如下:主线程申请mutex1资源,而子线程申请mutex2资源,此时主线程连续申请mutex2资源,子线程来申请mutex1资源,而mutex2资源还未被子线程释放,主线程无法申请到,同样的,mutex1资源未被主线程释放则子线程也无法申请到,此时便处于无限循环等待,形成死锁。 修改后的程序: #includestdio.h #includesys/types.h #includeunistd.h #includectype.h #includepthread.h #define loop_times 1000 p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 交通运输安全保障工作计划总结
- 电厂技术年终工作总结4篇
- 万豪店铺转让合同范例
- 幼儿园学期计划星星之火燎原之势
- 社团工作计划活动心得
- 公司搬家合同标准文本详细
- 业务渠道转让合同标准文本
- 万科景观合同标准文本
- 临建活动板房合同范例
- 2025化学品汽油运输合同(合同版本)
- 《 大学生军事理论教程》全套教学课件
- 中考数学计算题练习100道(2024年中考真题)
- 公司组织架构图(可编辑模版)
- 园林绿化工程监理实施细则(完整版)
- 工程监理部人员分工与职责
- 课程设计 CA6140拨叉说明书
- 成语故事杞人忧天PPT教案
- 部编版三年级上册音乐知识点汇总
- 生命体征的测量PPT幻灯片课件
- 吉林省吉林市高考报名登记表
- 质量保证体系结构图(共3页)
评论
0/150
提交评论