西安邮电大学操作系统进程实验报告含源码_第1页
西安邮电大学操作系统进程实验报告含源码_第2页
西安邮电大学操作系统进程实验报告含源码_第3页
西安邮电大学操作系统进程实验报告含源码_第4页
西安邮电大学操作系统进程实验报告含源码_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、 西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称: 进程管理 专业名称: 软件工程班 级: 学生姓名: 学号(8位): 指导教师: 舒新峰实验日期: 2014年11月4日1. 实验目的及实验环境(一)、实验环境1. 硬件(1) 主机:Pentium III 以上;(2) 内存:128MB 以上;(3) 显示器:VGA 或更高;(4) 硬盘空间:至少100MB 以上剩余空间。2. 软件Ubuntu下gcc编译器、gdb调试工具。(二)、实验目的 进程: 1、通过观察、分析实验现象,深入理解多进程并发执行的过程、fork函数在创建子进程时对内存的操作;2、加深对进程概念的理解,明确进程

2、和程序的区别; 3、进一步认识并发执行的实质; 4、分析进程争用资源的现象,学习解决进程互斥的方;5、了解Linux系统中进程通信的基本原理。线程:1、理解多线程的概念,学会Linux编程中的线程的创建与终止。2、理解多线程并发工作时对资源的抢占,通过本实验掌握在Linux操作系统中遵循Posix线程标准接口进行多线程程序编程,熟练掌握线程的创建pthread_create()。 互斥与死锁:1、理解死锁的产生原因与Linux编程中对临界资源进行加锁使得多进程或多线程对临界资源进行互斥访问。2、利用信号量或者互斥锁实现线程间的同步。二、实验内容、完成程序填空、回答下列问题进程:1、你最初认为运

3、行结果会怎么样? 答:会持续输出0-9号进程,直到输入数字键+回车,则会杀死该进程,接下来的输出将不会有该进程号,当输入q+回车,则退出程序。2、实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。 答:实际的结果与预期差不多。因输入进程总数3小于设定的最大进程数,因此按进程数3来处理。随机输出0-2号进程,sleep(SLEEP_INTERVAL),循环输出,输入数字键,则会杀死该数字对应的进程,直到输入q退出循环,然后kill杀死本组所有进程。分析:每创建一个子进程时,将其pid存储在pidi中,i存储在proc_number,然后调用死循环函数do_something(),输出该

4、进程的代号proc_number;当输入数字键时,主进程会执行kill(pidch-0,SIGTERM),从而杀死(ch-0)号进程。当输入q时循环退出,kill(0,SIGTERM),杀死本组所有进程,程序退出。3、proc_number 这个全局变量在各个子进程里的值相同吗?为什么? 答:相同,因为子进程相互独立,资源互不影响。4、kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么? 答:kill命令在程序中使用了2次:kill(pidch-0,SIGTERM)和kill(0,SIGTERM);第一次是杀死该进程号pidch-0,执行后接下来的结果中不会有该进程号,就会

5、使该子进程真正结束。第二次是杀死本组所有进程。即主进程以及它创建的所有子进程。执行后程序退出,进程结束。5、使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些? 答:进程在main函数中return,或调用exit()函数都可以正常退出。而使用kill命令则是异常退出。当然是正常退出比较好,若在子进程退出前使用kill命令杀死其父进程,则系统会让init进程接管子进程。当用kill命令使得子进程先于父进程退出时,而父进程又没有调用wait函数等待子进程结束,子进程处于僵死状态,并且会一直保持下去,直到系统重启。子进程处于僵死状态时,内核只保存该进程的必要

6、信息以被父进程所需,此时子进程始终占着资源,同时减少了系统可以创建的最大进程数。6.在do_something()输出pro_number的地址,把do_something里的死循环改成10次,问实际创建的子进程个数有什么变化?答:pro_number的地址不变,当把死循环改成10次后,子进程个数只有10个,并且杀死后的进程还是会重新输出。线程:1、你最初认为前三列数会相等吗?最后一列斜杠两边的数字是相等,还是大于或者小于关系? 答:我认为前三列数不会相等,因为线程之间在抢占cpu资源,三个线程运行次数是随机的,最后一列的数字左边等于右边。2、最后的结果如你所料吗?有什么特点?试对原因进行分析

7、。 答:最后的结果不是我所预料的,最后斜杠两边的数字时一样的,原因在与我在程序中添加了信号量。 3、thread 的CPU 占用率是多少?为什么会这样? 答:在我的电脑上cpu占用率147%,一个方面是线程执行的都是无限循环的代码,另一方面是线程之间抢占资源很激烈。 4、thread_worker()内是死循环,它是怎么退出的?你认为这样退出好吗? 答:thread_worker()函数内是死循环,退出时因为主函数中设置的输入q时循环退出。整个进程的终止导致了所有线程的结束,这样结束线程不好,因为如果线程使用临界资源的时候没有释放就结束了,那么这个临界资源就会被认为是被已经退出的线程占用着,从

8、而得不到释放。互斥与死锁:1、你预想deadlock.c 的运行结果会如何?答:运行结果可能会发生中止现象,我认为thread1和thread2会相互争抢资源,有一定的概率发生死锁,因为他们的运行顺序是抢占式的。2、deadlock.c 的实际运行结果如何?多次运行每次的现象都一样吗?为什么会这样?答:实际的运行结果是:开始几次运行正常,但是经过多次的运行之后,其中一次会让程序卡死,无法再执行。这是因为thread1锁定了资源1,thread2锁定了资源2,两个线程又同时需要对方的资源,这样导致了死锁。三方案设计进程:利用fork( )函数创建进程,并将每个进程的进程号保存在主进程中保存进程号

9、的数组。每个进程输出自己是第几个进程与自己的进程号。当用户输入q时,主进程向每个进程发送终止信号,杀死所有进程;学习fork与kill的用法,补全程序代码,调试运行,观察并分析实验结果。线程:主进程创建三个线程并发工作。这三个线程都对main_counter进程修改(没执行一次循环将main_counter加1),也将属于自己线程的变量counteri加1,最后比较三个线程counter值之和与main_counter的大小。补全程序代码,调试运行,观察并分析实验结果。互斥与死锁: 准备好上节实验3完成的程序。阅读参考资料,了解互斥锁的加锁机制及相关的系统调用。找到实验3程序的代码临界区,用临

10、界区解决main_counter与sum不同步的问题。对main_counter与sum加锁实现三个线程的互斥访问。四测试数据及运行结果进程:线程:互斥与死锁:五总结 在本次实验中,我学会了创建进程和杀死进程,创建线程和杀死线程,线程的种类,和线程创建及管理机制并且了解了线程互斥锁的类型。重新理解了互斥与同步的概念以及死锁及其相关内容。更进一步认识死锁的发生条件和预防死锁发生的方法。死锁发生的条件有互斥条件,占有且等待条件,不可抢占条件等。我们只要破坏死锁发生条件之一我们就可以预防死锁的发生!本实验采用破坏占有且等待条件预防死锁发生!处理及调度的算法有一定的难度,因为其理论上的难度,但是通过学

11、习让我对其有了更加深入的了解,让我认识到了,操作系统是一项真正实用,而且很有意义的学科,增加了我对操作系统的兴趣,也为以后的学习打下理论基础。六、源代码线程:#include#include#include#include#include#define MAX_CHILD_NUMBER 10#define SLEEP_INTERVAL 2int proc_number=0;void do_something();main(int argc,char* argv)int child_proc_number=MAX_CHILD_NUMBER;int i;char ch;pid_t child_pi

12、d;pid_t pid10=0;/*存放每个子进程的id*/if(argc1)child_proc_number=atoi(argv1);child_proc_number=(child_proc_number10)?10:child_proc_number;for(i=0;ichild_proc_number;i+)child_pid=fork();if(child_pid=-1)perror(fork);else if(child_pid=0)proc_number=i;do_something();elsepidi=child_pid;/*用户选择杀死进程,数字表示杀死该进程,q表示退出

13、*/printf(请输入要杀死进程的编号(q退出):n);while(ch=getchar()!=q)if(isdigit(ch)kill(pidch-0,SIGTERM);/*杀死本组的所有进程*/for(i=0;i=proc_number;i+)kill(pidi,SIGTERM);kill(0,SIGTERM);return;void do_something()for(;)printf(This is process No.%d and its pid is %dn,proc_number,getpid();sleep(SLEEP_INTERVAL);线程:#include #incl

14、ude #include #include #include #include#define MAX_THREAD 3 /* 线程的个数 */unsigned long long main_counter, counterMAX_THREAD; /* unsigned long long是比long还长的整数 */sem_t S1,S2;void* thread_worker(void*); void *thread_worker(void *p)int thread_num;thread_num=(int)p; for(;) sem_wait(&S1); sem_wait(&S2); cou

15、nterthread_num+;/* 本线程的counter加一 */ main_counter+;/* 主counter 加一 */ sem_post(&S2); sem_post(&S1); int main(int argc,char *argv)int i,rtn,ch; pthread_t pthread_idMAX_THREAD=0; sem_init(&S1,0,1); sem_init(&S2,0,1); for(i=0;iMAX_THREAD;i+) rtn=pthread_create(&pthread_idi,NULL,thread_worker,(void*)i); d

16、o unsigned long long sum=0; sem_wait(&S1); sem_wait(&S2); for(i=0;iMAX_THREAD;i+)/* 求所有counter的和 */ sum+=counteri; printf(第%d个counter的值是%llun,i+1,counteri); printf(main_counter的值:%llu sum的值%llun,main_counter,sum); sem_post(&S2); sem_post(&S1); while(ch=getchar()!=q); return 0; 互斥锁:#include #include

17、#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);void *thread_worker(void *p) int i; for(i=0;iLOOP_TIMES;i+)/对互斥锁上锁 pthrea

18、d_mutex_lock(&mutex1); pthread_mutex_lock(&mutex2); 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);int main() int rtn,i; pthread_t pthread_id=0; rtn=pthread_create(&pthread_id,NUL

19、L,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);return 0;信号量:#include#include#include#include#include#include#define LOOP_TIMES 10000sem_t S1,S2;void *thread

温馨提示

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

评论

0/150

提交评论