ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:19.44KB ,
资源ID:19132750      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19132750.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(linux进程线程管理实验报告1Word文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

linux进程线程管理实验报告1Word文档格式.docx

1、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 实验前的准备工作学习man 命令的用法,通过它查看fork 和kill 系统调用的在线帮助,并阅读参考资料,学会fork 与kill 的用法。复习C 语言的相关内容。三、实验内容3.1 补充POSIX 下进程控制的残缺版实验程序3.2回答下列问题:1. 你最初认为运行结果会怎么样

2、?2. 实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。3. proc_number 这个全局变量在各个子进程里的值相同吗?为什么?4. kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?5. 使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?四、实验结果4.1 补充完全的源程序#includesys/types.hunistd.hsignal.hctype.h#define MAX_CHILD_NUMBER 10/* 允许建立的子进程个数最大值 */#define SLEEP_INTERVAL 1/* 子进程睡眠时间

3、 */int proc_number=0; /* 子进程的编号,从0开始 */void do_something(); 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=(child_proc_number10)?10:child_proc_number;/*

4、 命令行参数中的第一个参数表示建立几个子进程,最多10个 */ /*建立child_proc_number个子进程* 子进程要执行* proc_number = i; * do_something();* 父进程把子进程的id保存到pidi */ for(i=0;i0) pidi=child_pid; else proc_number=i; do_something(); /* 让用户选择杀死哪个进程。输入数字(自编号)表示杀死该进程* 输入q退出 */ while(ch=getchar()!=q) if(isdigit(ch) kill(pidch-0,SIGTERM); wait(&pid

5、ch-); kill(0,SIGTERM); /*杀死本组的所有进程 */ return 0;void do_something() for(; printf(This is process NO.%*dn,proc_number+3,proc_number); sleep(SLEEP_INTERVAL);4.2 回答上述实验内容中的问题1 预期结果:会持续输出0-9号进程,直到输入数字键+回车,则会杀死该进程,接下来的输出将不会有该进程号,当输入q+回车,则退出程序。2 实际结果:与预期差不多,因输入进程总数20大于设定的最大进程数,因此按进程数10来处理。随机输出0-9号进程,sleep(

6、SLEEP_INTERVAL),循环输出,直到输入数字键,则会杀死该数字对应的进程,直到输入q退出循环,然后杀死本组所有进程。分析:每创建一个子进程时,将其pid存储在pidi中,i存储在proc_number,然后调用死循环函数do_something(),输出该进程的代号proc_number;当输入数字键时,主进程会执行kill(pidch-,SIGTERM),从而杀死(ch-0)号进程。当输入q时循环退出,kill(0,SIGTERM),杀死本组所有进程。程序退出。3. proc_number这个全局变量在各个子进程里的值相同,因为子进程相互独立,资源互不影响。4kill命令在程序中使

7、用了2次:kill(pidch-第一次是杀死该进程号pidch-0,执行后接下来的结果中不会有该进程号,用另一个终端打开,使用命令ps aux | grep process,因为子进程先于父进程退出,则被杀死的进程为僵死状态,但我加了行代码wait(&),就会使该子进程真正结束。第二次是杀死本组所有进程。即主进程以及它创建的所有子进程。执行后程序退出,进程结束。5进程在main函数中return,或调用exit()函数都可以正常退出。而使用kill命令则是异常退出。当然是正常退出比较好,若在子进程退出前使用kill命令杀死其父进程,则系统会让init进程接管子进程。当用kill命令使得子进程先

8、于父进程退出时,而父进程又没有调用wait函数等待子进程结束,子进程处于僵死状态,并且会一直保持下去,直到系统重启。子进程处于僵死状态时,内核只保存该进程的必要信息以被父进程所需,此时子进程始终占着资源,同时减少了系统可以创建的最大进程数。实验二: 线程管理通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。掌握在POSIX 规范中pthread_create() 函数的功能和使用方法。阅读参考资料,了解线程的创建等相关系统调用。1. 你最初认为前三列数会相等吗?最后一列斜杠两边的数字是相等,还是大于或者小于关系?2. 最后的结果如你所料吗?试对

9、原因进行分析。3. thread 的CPU 占用率是多少?为什么会这样?4. thread_worker()内是死循环,它是怎么退出的?你认为这样退出好吗?pthread.h#define MAX_THREAD 3/* 线程的个数 */unsigned long long main_counter,counterMAX_THREAD;/* unsigned long long是比long还长的整数 */void* thread_worker(void*);int main(int argc,char argv) int i,rtn; char ch; pthread_t pthread_idM

10、AX_THREAD=0;/* 存放每个线程的id */MAX_THREAD; pthread_create(&pthread_idi,NULL,thread_worker,(void*)i);/*用pthread_create建一个普通的线程, 线程id存入pthread_idi, 线程执行的函数是thread_worker,并i作为参数传递给线程 */* 用户按一次回车执行下面的循环体一次。按q退出 */ do unsigned long long sum=0; for(i=0; sum+=counteri; /* 求所有线程的counter的和 */ printf(counter%d=%l

11、lun,i,counteri);main_counter=%llu/sum=%llun,main_counter,sum); while(ch=getchar()!void* thread_worker(void* p) int thread_num; thread_num=(int)p; /*把main中的i的值传递给thread_num */ main_counter+; counterthread_num+; 4.3 回答上述实验内容中的问题1 试验运行前我认为前三列数不会相等,因为三个线程运行次数是随机的,结果不可预料,当然counteri值不会一定相等。而我认为main_counte

12、r与sum值应该是相等的。因为都是三个线程的counter之和。2 而实验结果是前三列数确实不相等。不过main_counter与sum的值也不相等,main_counter sum,经分析讨论得出解释:因为三个线程在共同争取运行thread_worker()函数,比如main_counter初值为0,pthread_id0执行之后main_counter+1,此时还未来得及将值赋给main_counter,这时的main_counter还是0;pthread_id1也执行这个函数,main_counter+1,若此时在1号线程将main_counter+1的值还未赋给main_counter

13、,即这时的main_counter还是0,pthread_id2也来执行这个函数,main_counter+1,此时三个线程才将加完之后的值赋给main_counter,则main_counter=0+1=1,而真正执行次数sum=0+1+1+1=3。main_counter sum。3 thread的CPU占用率在我的机子上执行结果是181,因为三个线程是无限循环的运行,使得cpu占用率很高。4 thread_worker()函数内是死循环,退出时因为主函数中设置的输入q时循环退出。输入q时主进程执行退出,return 退出程序,则子线程也强制退出。这样退出不好。实验三: 互斥通过观察、分析

14、实验现象,深入理解理解互斥锁的原理及特点掌握在POSIX 规范中的互斥函数的功能及使用方法准备好上节实验完成的程序thread.c 。阅读参考资料,了解互斥锁的加解锁机制及相关的系统调用。3.1找到thread.c 的代码临界区,用临界区解决main_counter 与sum 不同步的问题。3.2阅读下列代码,回答问题:#define LOOP_TIMES 1000pthread_mutex_t mutex1=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_t mutex2=PTHREAD_MUTEX_INITIALIZER;void* thread_worke

15、r(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,NULL,thread_worker,NULL); if(rtn!=0)pthread_create ERROR! return -1;LOOP_TIMES; pthread_mutex_lock(&mutex1);mutex2); critical_section(1,i); pthread_m

16、utex_unlock(& pthread_mutex_destroy(&void *thread_worker(void* p) int i; critical_section(2,i);void critical_section(int thread_num,int i) printf(Thread%d:%dn,thread_num,i);1. 你预想deadlock.c 的运行结果会如何?2. deadlock.c 的实际运行结果如何?多次运行每次的现象都一样吗?4.1 通过加锁可修改thread.c程序,使得main_counter与sum值同步,源代码如下:#define MAX_T

17、HREAD 3pthread_mutex_t main_counter_mutex=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_t counter_mutex=PTHREAD_MUTEX_INITIALIZER;counter_mutex); int thread_num; thread_num=(int)p; for(; pthread_mutex_lock(&main_counter_mutex); main_counter+; pthread_mutex_unlock(& counterthread_num+;4.2回答上述实验要求中的问题:1程序运行会出现中止现象,可能会资源互斥。2实际运行时程序会在运行期间中止,出现死锁现象。多次运行之后现象都一样。解释如下:主线程申请mutex1资源,而子线程申请mutex2资源,此时主线程继续申请mutex2资源,子线程来申请mutex1资源,而mutex2资源还未被子线程释放,主线程无法申请到,同样的,mutex1资源未被主线程释放则子线程也无法申请到,此时便处于无限循环等待,形成死锁。修改后的程序:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1