西安邮电大学操作系统实验报告.doc_第1页
西安邮电大学操作系统实验报告.doc_第2页
西安邮电大学操作系统实验报告.doc_第3页
西安邮电大学操作系统实验报告.doc_第4页
全文预览已结束

下载本文档

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

文档简介

西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称: 专业名称: 软件工程班 级: 1101班 学生姓名: 学号(8位): 04113027指导教师: 舒新峰实验日期: 2013年12月5日一. 实验目的及实验环境(一) 实验环境Linux 操作系统(2) 实验目的实验1 掌握Linux基本命令 和开发环境1. 掌握常用的Linux shell命令;2. 掌握编辑环境VIM;3. 掌握编译环境gcc及跟踪调试工具gdb。实验2 进程通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。实验3 线程 通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。掌握POSIX 规范中pthread_create() 函数的功能和使用方法。 实验4 互斥通过观察、分析实验现象,深入理解理解互斥锁的原理及特点掌握在POSIX 规范中的互斥函数的功能及使用方法。2. 实验内容实验21. 你最初认为运行结果会怎么样?答:会持续输出0-9号进程,直到输入数字键+回车,则会杀死该进程,接下来的输出将不会有该进程号,当输入q+回车,则退出程序。2. 实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。答:实际的结果与预期差不多。因输入进程总数20大于设定的最大进程数,因此按进程数10来处理。随机输出0-9号进程,sleep(SLEEP_INTERVAL),循环输出,输入数字键,则会杀死该数字对应的进程,直到输入q退出循环,然后杀死本组所有进程。分析:每创建一个子进程时,将其pid存储在pidi中,i存储在proc_number,然后调用死循环函数do_something(),输出该进程的代号proc_number;当输入数字键时,主进程会执行kill(pidch-0,SIGTERM),从而杀死(ch-0)号进程。当输入q时循环退出,kill(0,SIGTERM),杀死本组所有进程。程序退出。3. proc_number这个全局变量在各个子进程里的值相同吗?为什么?答:proc_number这个全局变量在各个子进程里的值相同,因为子进程相互独立,资源互不影响。4. kill命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?答:kill命令在程序中使用了2次:kill(pidch-0,SIGTERM)和kill(0,SIGTERM);第一次是杀死该进程号pidch-0,执行后接下来的结果中不会有该进程号,用另一个终端打开,使用命令ps aux | grep process,因为子进程先于父进程退出,则被杀死的进程为僵死状态,但我加了行代码wait(&pidch-0),就会使该子进程真正结束。第二次是杀死本组所有进程。即主进程以及它创建的所有子进程。执行后程序退出,进程结束。5. 使用kill命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方法哪种更好一些。答:进程在main函数中return,或调用exit()函数都可以正常退出。而使用kill命令则是异常退出。当然是正常退出比较好,若在子进程退出前使用kill命令杀死其父进程,则系统会让init进程接管子进程。当用kill命令使得子进程先于父进程退出时,而父进程又没有调用wait函数等待子进程结束,子进程处于僵死状态,并且会一直保持下去,直到系统重启。子进程处于僵死状态时,内核只保存该进程的必要信息以被父进程所需,此时子进程始终占着资源,同时减少了系统可以创建的最大进程数。实验31. 你最初认为前三列数会相等吗?最后一列斜杠两边的数字是相等,还是大于或者小于关系?答:我认为前三列数不会相等,因为三个线程运行次数是随机的,结果不可预料,当然counteri值不会一定相等。而我认为main_counter与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,即这时的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占有率是多少?为什么会这样?答:thread的CPU占用率在我的机子上执行结果是147,因为三个线程是无限循环的运行,使得cpu占用率很高。4. thread_worker()内饰死循环,它是怎么退出的?你认为这样退出好吗?答: thread_worker()函数内是死循环,退出时因为主函数中设置的输入q时循环退出。输入q时主进程执行退出,return 退出程序,则子线程也强制退出。这样退出不好。实验41. 你预想deadlock.c的运行结果会如何?答:程序运行会出现中止现象,可能会资源互斥。2. 实际运行结果如何?多次运行每次的现象都一样吗?为什么会这样?答:实际运行时程序会在运行期间中止,出现死锁现象。多次运行之后现象都一样。原因是:主线程申请mutex1资源,而子线程申请mutex2资源,此时主线程继续申请mutex2资源,子线程来申请mutex1资源,而mutex2资源还未被子线程释放,主线程无法申请到,同样的,mutex1资源未被主线程释放则子线程也无法申请到,此时便处于无限循环等待,形成死锁。3 方案设计实验2 进程学习man命令的用法,通过它查看fork和kill系统调用的在线帮助,并阅读参考资料,学习fork与kill的用法。补全程序代码,调试运行,观察并分析实验结果。实验3 线程阅读参考资料,了解线程的创建等相关系统调用。补全程序代码,调试运行,观察并分析实验结果。实验4 互斥准备好上节实验3完成的程序。阅读参考资料,了解互斥锁的加锁机制及相关的系统调用。找到实验3程序的代码临界区,用临界区解决main_counter 与sum 不同步的问题。4 测试数据及运行结果五总结在本次实验中,我不仅学会了创建进程命令fork和杀死进程命令kill,还了解了函数int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void *),void *arg)的使用方法,并且大致掌握了PTHR

温馨提示

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

评论

0/150

提交评论