linux进程线程管理实验报告
更新时间:2023-07-21 01:04:01 阅读量: 实用文档 文档下载
进程线程,死锁实验报告
西安郵電學院
操作系统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_INTERVAL 1/* 子进程睡眠时间 */
int proc_number=0; /* 子进程的编号,从0开始 */
void do_something();
int 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_INTERVAL);
}
}
4.2 回答上述实验内容中的问题
1.预期结果:
会持续输出0-9号进程,直到输入数字键+回车,则会杀死该进程,接下来的输出将不会有该进程号,当输入q+回车,则退出程序。
2.实际结果:
与预期差不多,因输入进程总数20大于设定的最大进程数,因此按进程数10来处理。随机输出0-9号进程,sleep(SLEEP_INTERVAL),循环输出,直到输入数字键,则会杀死该数字对应的进程,直到输入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]值不会一定相等。而我认为main_counter与sum值应该是相等的。因为都是三个线程的counter之和。
2.而实验结果是前三列数确实不相等。不过main_counter与sum的值也不相等,main_counter < sum,经分析讨论得出解释:因为三个线程在共同争取运行thread_worker()函数,比如main_counter初值为0,pthread_id[0]执行之后main_counter+1,此时还未来得及将值赋给main_counter,这时的main_counter还是0;pthread_id[1]也执行这个函数,main_counter+1,若此时在1号线程将main_counter+1的值还未赋给main_counter,即这时的main_counter还是0,pthread_id[2]也来执行这个函数,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 退出程序,则子线程也强制退出。 这样退出不好。
实验三: 互斥
一. 实验目的
通过观察、分析实验现象,深入理解理解互斥锁的原理及特点
掌握在POSIX 规范中的互斥函数的功能及使用方法
二.实验要求
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 实验前的准备工作
准备好上节实验完成的程序thread.c 。
阅读参考资料,了解互斥锁的加解锁机制及相关的系统调用。
三、实验内容
进程线程,死锁实验报告
3.1找到thread.c 的代码临界区,用临界区解决main_counter 与sum 不同步的问题。
3.2阅读下列代码,回答问题:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<ctype.h>
#include<pthread.h>
#define LOOP_TIMES 1000
pthread_mutex_t mutex1=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2=PTHREAD_MUTEX_INITIALIZER;
void* thread_worker(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){
printf("pthread_create ERROR!\n");
return -1;
}
for(i=0;i<LOOP_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;
}
void *thread_worker(void* p){
int i;
for(i=0;i<LOOP_TIMES;i++){
pthread_mutex_lock(&mutex2);
pthread_mutex_lock(&mutex1);
critical_section(2,i);
进程线程,死锁实验报告
pthread_mutex_unlock(&mutex2);
pthread_mutex_unlock(&mutex1);
}
}
void critical_section(int thread_num,int i){
printf("Thread%d:%d\n",thread_num,i);
}
1. 你预想deadlock.c 的运行结果会如何?
2. deadlock.c 的实际运行结果如何?多次运行每次的现象都一样吗?为什么会这样?
四、实验结果
4.1 通过加锁可修改thread.c程序,使得main_counter与sum值同步,源代码如下:
#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];
void* thread_worker(void*);
int main(int argc,char argv[]){
int i,rtn;
char ch;
pthread_t pthread_id[MAX_THREAD]={0};
for(i=0;i<MAX_THREAD;i++){
pthread_create(&pthread_id[i],NULL,thread_worker,(void*)i);
}
do{
unsigned long long sum=0;
for(i=0;i<MAX_THREAD;i++){
sum+=counter[i];
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;
for(;;){
main_counter++;
counter[thread_num]++;
}
}
4.2回答上述实验要求中的问题:
1.程序运行会出现中止现象,可能会资源互斥。
2.实际运行时程序会在运行期间中止,出现死锁现象。多次运行之后现象都一样。 解释如下:主线程申请mutex1资源,而子线程申请mutex2资源,此时主线程继续申请mutex2资源,子线程来申请mutex1资源,而mutex2资源还未被子线程释放,主线程无法申请到,同样的,mutex1资源未被主线程释放则子线程也无法申请到,此时便处于无限循环等待,形成死锁。
修改后的程序:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<ctype.h>
#include<pthread.h>
#define LOOP_TIMES 1000
pthread_mutex_t mutex1=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2=PTHREAD_MUTEX_INITIALIZER;
void* thread_worker(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){
printf("pthread_create ERROR!\n");
return -1;
}
for(i=0;i<LOOP_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;
}
void *thread_worker(void* p){
int i;
for(i=0;i<LOOP_TIMES;i++){
critical_section(2,i);
pthread_mutex_unlock(&mutex2); pthread_mutex_unlock(&mutex1); }
}
void critical_section(int thread_num,int i){ printf("Thread%d:%d\n",thread_num,i); }
正在阅读:
linux进程线程管理实验报告07-21
高中地理学习方法:思维描图法03-30
南京航空航天大学毕设要求06-13
发电厂的设备检修 - 图文02-27
文员实习日记30篇05-29
手链,绳子编法大全 - 图文01-19
2篇2022年学校党总支贯彻执行党组织领导下的校长负责制情况自查03-26
落实意识形态工作责任制述职报告3篇09-07
辞职信 辞职报告范文06-10
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 线程
- 进程
- 实验
- 报告
- linux
- 管理
- 长沙房地产研究月报-2014年5月
- 荆轲刺秦王(教师版)
- 断桥铝合金门窗施工方案
- 小净距、长距离重叠盾构隧道设计、施工技术
- 2018教师预备党员入党转正思想汇报
- 杭州江南实验学校初二年级2006学年第二学期期中总结大
- 第一章第一节 观察多种多样的生物和细胞 中考科学第一轮复习
- 钱乙撰&183;&183;小儿药证直诀
- 李盛霖——始终保持党的先进性和纯洁性坚持不懈地抓好交通运输系统反腐倡廉建设
- 2国际招投标相关概念
- 6S现场管理评分表
- 均匀色空间下红宝石颜色定量分级
- 美国究竟惧怕中国什么?
- 大学生心理健康教育课程改革研究
- 遥感监测情况的说明
- 安全防范系统验收
- 4503(32)合成空气压缩机油在螺杆式空气压缩机上的应用
- 高一习题 英语课时作业16
- 7.2 分子的热运动
- 从生活走向物理,从物理走向社会