西 安 邮 电 大 学
(计算机学院)
课内实验报告
实验名称: 进程管理
专业名称: 软件工程 班 级: 学生姓名: 学号(8位): 指导教师: 舒新峰 实验日期: 2014年11月4日
一. 实验目的及实验环境 (一)、实验环境
1. 硬件
(1) 主机:Pentium III 以上; (2) 内存:128MB 以上; (3) 显示器:VGA 或更高;
(4) 硬盘空间:至少100MB 以上剩余空间。 2. 软件
Ubuntu下gcc编译器、gdb调试工具。 (二)、实验目的
进程: 1、通过观察、分析实验现象,深入理解多进程并发执行的过程、fork函数在创建子进程时对内存的操作;2、加深对进程概念的理解,明确进程和程序的区别; 3、进一步认识并发执行的实质; 4、分析进程争用资源的现象,学习解决进程互斥的方;5、了解Linux系统中进程通信的基本原理。
线程:1、理解多线程的概念,学会Linux编程中的线程的创建与终止。2、理解多线程并发工作时对资源的抢占,通过本实验掌握在Linux操作系统中遵循Posix线程标准接口进行多线程程序编程,熟练掌握线程的创建pthread_create()。
互斥与死锁:1、理解死锁的产生原因与Linux编程中对临界资源进行加锁使得多进程或多线程对临界资源进行互斥访问。2、利用信号量或者互斥锁实现线程间的同步。 二、实验内容 <1>、完成程序填空 <2>、回答下列问题 进程:
1、你最初认为运行结果会怎么样?
答:会持续输出0-9号进程,直到输入数字键+回车,则会杀死该进程,接下来的输出将不会有该进程号,当输入q+回车,则退出程序。
2、实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
答:实际的结果与预期差不多。因输入进程总数3小于设定的最大进程数,因此按进程数3来处理。随机输出0-2号进程,sleep(SLEEP_INTERVAL),循环输出,输入数字键,则会杀死该数字对应的进程,直到输入q退出循环,然后kill杀死本组所有进程。分析:每创建一个子进程时,将其pid存储在pid[i]中,i存储在proc_number,然后调用死循环函数do_something(),输出该进程的代号proc_number;当输入数字键时,主进程会执行kill(pid[ch-'0'],SIGTERM),从而杀死(ch-‘0’)号进程。当输入q时循环退出,kill(0,SIGTERM),杀死本组所有进程,程序退出。
3、proc_number 这个全局变量在各个子进程里的值相同吗?为什么?
答:相同,因为子进程相互独立,资源互不影响。
4、kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?
答:kill命令在程序中使用了2次:kill(pid[ch-'0'],SIGTERM)和kill(0,SIGTERM); 第一次是杀死该进程号pid[ch-‘0’],执行后接下来的结果中不会有该进程号,就会使该子进程真正结束。
第二次是杀死本组所有进程。即主进程以及它创建的所有子进程。执行后程序退出,进程结束。
5、使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?
答:进程在main函数中return,或调用exit()函数都可以正常退出。 而使用kill命令则是异常退出。 当然是正常退出比较好,若在子进程退出前使用kill命令杀死其父进程,则系统会让init进程接管子进程。当用kill命令使得子进程先于父进程退出时,而父进程又没有调用wait函数等待子进程结束,子进程处于僵死状态,并且会一直保持下去,直到系统重启。子进程处于僵死状态时,内核只保存该进程的必要信息以被父进程所需,此时子进程始终占着资源,同时减少了系统可以创建的最大进程数。
6.在do_something()输出pro_number的地址,把do_something里的死循环改成10次,问实际创建的子进程个数有什么变化?
答:pro_number的地址不变,当把死循环改成10次后,子进程个数只有10个,并且杀死后的进程还是会重新输出。 线程:
1、你最初认为前三列数会相等吗?最后一列斜杠两边的数字是相等,还是大于或者小于关系?
答:我认为前三列数不会相等,因为线程之间在抢占cpu资源,三个线程运行次数是随机的,最后一列的数字左边等于右边。
2、最后的结果如你所料吗?有什么特点?试对原因进行分析。
答:最后的结果不是我所预料的,最后斜杠两边的数字时一样的,原因在与我在程序中添加了信号量。
3、thread 的CPU 占用率是多少?为什么会这样?
答:在我的电脑上cpu占用率147%,一个方面是线程执行的都是无限循环的代码,另一方面是线程之间抢占资源很激烈。
4、thread_worker()内是死循环,它是怎么退出的?你认为这样退出好吗?
答:thread_worker()函数内是死循环,退出时因为主函数中设置的输入q时循环退出。整个进程的终止导致了所有线程的结束,这样结束线程不好,因为如果线程使用临界资源的时候没有释放就结束了,那么这个临界资源就会被认为是被已经退出的线程占用着,从而得不到释放。 互斥与死锁:
1、你预想deadlock.c 的运行结果会如何?
答:运行结果可能会发生中止现象,我认为thread1和thread2会相互争抢资源,有一定的概率发生死锁,因为他们的运行顺序是抢占式的。
2、deadlock.c 的实际运行结果如何?多次运行每次的现象都一样吗?为什么会这样?