当前位置:文档之家› linux进程线程管理实验报告

linux进程线程管理实验报告

linux进程线程管理实验报告————————————————————————————————作者:————————————————————————————————日期:西安郵電學院操作系统LINUX实验报告题目1:进程______题目2:线程管理__题目3:互斥_____系部名称:计算机学院专业名称:软件工程班级:0802学号:04085048学生姓名:郭爽乐时间:2010-10-31实验一: 进程管理一.实验目的通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。

二.实验要求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. 实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。

3. proc_number 这个全局变量在各个子进程里的值相同吗?为什么?4. kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?5. 使用kill 命令可以在进程的外部杀死进程。

进程怎样能主动退出?这两种退出方式哪种更好一些?四、实验结果4.1 补充完全的源程序#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<signal.h>#include<ctype.h>#define MAX_CHILD_NUMBER 10/* 允许建立的子进程个数最大值 */ #define SLEEP_INTERV AL 1/* 子进程睡眠时间 */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 pid[10]={0};/* 存放每个子进程的id */if(argc>1){child_proc_number=atoi(argv[1]);child_proc_number=(child_proc_number>10)?10:child_proc_number; /* 命令行参数中的第一个参数表示建立几个子进程,最多10个 */ }/*建立child_proc_number个子进程* 子进程要执行* proc_number = i;* do_something();* 父进程把子进程的id保存到pid[i] */for(i=0;i<child_proc_number;i++){child_pid=fork();if(child_pid== -1){perror("creat error!\n");return 1;}else if(child_pid>0)pid[i]=child_pid;else{proc_number=i;do_something();}}/* 让用户选择杀死哪个进程。

输入数字(自编号)表示杀死该进程* 输入q退出 */while((ch=getchar())!='q'){if(isdigit(ch)){kill(pid[ch-'0'],SIGTERM);wait(&pid[ch-'0']);}}kill(0,SIGTERM); /*杀死本组的所有进程 */return 0;}void do_something(){for(;;){printf("This is process NO.%*d\n",proc_number+3,proc_number);sleep(SLEEP_INTERV AL);}}4.2回答上述实验内容中的问题1.预期结果:会持续输出0-9号进程,直到输入数字键+回车,则会杀死该进程,接下来的输出将不会有该进程号,当输入q+回车,则退出程序。

2.实际结果:与预期差不多,因输入进程总数20大于设定的最大进程数,因此按进程数10来处理。

随机输出0-9号进程,sleep(SLEEP_INTERV AL),循环输出,直到输入数字键,则会杀死该数字对应的进程,直到输入q退出循环,然后杀死本组所有进程。

分析:每创建一个子进程时,将其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命令在程序中使用了2次:kill(pid[ch-'0'],SIGTERM); kill(0,SIGTERM);第一次是杀死该进程号pid[ch-‘0’],执行后接下来的结果中不会有该进程号,用另一个终端打开,使用命令ps aux | grep process,因为子进程先于父进程退出,则被杀死的进程为僵死状态,但我加了行代码wait(&pid[ch-'0']),就会使该子进程真正结束。

第二次是杀死本组所有进程。

即主进程以及它创建的所有子进程。

执行后程序退出,进程结束。

5.进程在main函数中return,或调用exit()函数都可以正常退出。

而使用kill命令则是异常退出。

当然是正常退出比较好,若在子进程退出前使用kill命令杀死其父进程,则系统会让init进程接管子进程。

当用kill命令使得子进程先于父进程退出时,而父进程又没有调用wait函数等待子进程结束,子进程处于僵死状态,并且会一直保持下去,直到系统重启。

子进程处于僵死状态时,内核只保存该进程的必要信息以被父进程所需,此时子进程始终占着资源,同时减少了系统可以创建的最大进程数。

实验二: 线程管理一.实验目的通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。

掌握在POSIX 规范中pthread_create() 函数的功能和使用方法。

二.实验要求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 实验前的准备工作阅读参考资料,了解线程的创建等相关系统调用。

三、实验内容3.1 补充POSIX 下进程控制的残缺版实验程序3.2回答下列问题:1. 你最初认为前三列数会相等吗?最后一列斜杠两边的数字是相等,还是大于或者小于关系?2. 最后的结果如你所料吗?有什么特点?试对原因进行分析。

3. thread 的CPU 占用率是多少?为什么会这样?4. thread_worker()内是死循环,它是怎么退出的?你认为这样退出好吗?四、实验结果4.1 补充完全的源程序#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<ctype.h>#include<pthread.h>#define MAX_THREAD 3/* 线程的个数 */unsigned long long main_counter,counter[MAX_THREAD];/* unsigned long long是比long还长的整数 */void* thread_worker(void*);int main(int argc,char argv[]){int i,rtn;char ch;pthread_t pthread_id[MAX_THREAD]={0};/* 存放每个线程的id */for(i=0;i<MAX_THREAD;i++){pthread_create(&pthread_id[i],NULL,thread_worker,(void*)i);/*用pthread_create建一个普通的线程,线程id存入pthread_id[i],线程执行的函数是thread_worker,并i作为参数传递给线程 */}/* 用户按一次回车执行下面的循环体一次。

按q退出 */do{unsigned long long sum=0;for(i=0;i<MAX_THREAD;i++){sum+=counter[i]; /* 求所有线程的counter的和 */printf("counter[%d]=%llu\n",i,counter[i]);}printf("main_counter=%llu/sum=%llu\n",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(;;){main_counter++;counter[thread_num]++;}}4.3回答上述实验内容中的问题1.试验运行前我认为前三列数不会相等,因为三个线程运行次数是随机的,结果不可预料,当然counter[i]值不会一定相等。

相关主题