资源描述
实验二 进程管理实验指导书
一、实验目的
1.了解进程与程序的区别,加深对进程概念的理解;
2.掌握进程并发执行的原理,及其所引起的同步、互斥问题的方法;
3.掌握进程管理的常用命令及系统调用,并会用C语言实现系统调用。
二、实验内容
实验预备知识:学习LINUX或Windows中有关进程创建、控制的部分;查阅有关LINUX或Windows环境下API中的有关进程创建、控制的部分。(可参考教材2版P34和P69,3版P71)
1.熟悉进程管理常用命令,并完成下列任务:
⑴ 在LINUX下,试用ps命令的各个选项观察系统中诸进程的运行情况;
⑵ 在LINUX下,试用pstree命令观察系统进程的层次;
⑶ 在LINUX下,试用top等命令观察系统中进程运行情况和CPU工作情况;
⑷ 在LINUX下,试用kill、killall、skill等命令来终止进程;
⑸ 在LINUX下,试用at、crontab命令进行进程调度。
2.学习进程管理类系统函数,并用C语言完成下列任务:
⑴ 进程的创建
编写程序,创建两个子进程。当此程序运行时,系统中有一个父进程和两个子进程。父进程在屏幕上显示“a”,子进程分别在屏幕上显示“b”和“c”。
⑵ 进程控制
如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
⑶ 进程通信
建立一管道pipe文件,同时父进程创建子进程。父子共同在此pipe文件上操作,子进程负责向该pipe文件写信息,父进程则从中读信息并输出到屏幕上。
实验二- 9 / 9
三、实验步骤与结果分析
1.Linux的进程
回顾进程的概念。使用此前的信息,完成以下填空:
1) Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的_______________,用于跟踪从进程启动到进程结束。
2) 当启动新进程的时候,内核也给它们分配系统资源,如________和________。
3) 永远不向父进程返回输出的进程叫做______________。
4) 由父进程派生出来的进程叫做__________________进程。
5) ________________进程是一个派生另一个进程的进程。
6) 运行用于提供服务的Linux系统进程是_______________。
7) 如果父进程在子进程之前结束,它创建了一个______________进程。
2.Linux的进程管理命令
步骤1:进入GNOME。
步骤2:访问命令行。写出在GNOME中,打开终端窗口的操作(至少两种方法):
_____________________________________________________________________________________________________________________________________ ____
步骤3:ps命令用于列出当前系统中运行的进程,回顾ps命令。
基本的ps命令显示在当前shell中的进程信息。输入ps命令,将结果填入下表1中。
表1 实验记录
PID
TTY
TIME
CMD
从当前终端窗口中,练习使用给出的每个选项的ps命令。
解释ps -f命令输出的各栏标题的含义,将解释填入表2中
表2 ps -f栏标题
值
描述
UID
PID
PPID
C
STIME
TTY
TIME
CMD
输入 ps -f 命令,显示运行在系统中进程的完全信息,填入表3中。
表3 实验记录
UID
PID
PPID
C
STIME
TTY
TIME
CMD
步骤4:列出系统中运行的所有进程。
输入 ps -ef 命令,显示运行在系统中的各个进程的完全信息。执行该命令,并与ps –f命令的输出结果对照,一致吗?有何不同?
__________________________________________________________________________________________________________________________________________________________ ____
注意分析当前终端窗口中的输出结果:
1)显示了多少个进程?(提示可以使用top命令)
____________________________________________________ ____
2)当前使用的SHELL的进程ID的PID是什么?
____________________________________________________ ____
3)启动SHELL的进程的命令 (CMD) 是什么?
____________________________________________________ ____
4)请观察,什么命令的PID号是1?
____________________________________________________ ____
5)再次运行ps –ef命令,计算进程的数目:
____________________________________________________ ____
步骤5:根据命令名搜索特定的进程。
为了终止一个进程,必须找到该进程的PID。大多数运行的系统中,有上百个进程在运行,ps -ef的列表可能很长。如果知道启动进程的执行程序的名字,可以更快地找到PID。
通过把ps命令的输出结果输入到grep中,可以搜索想要终止的特定进程,确定正确的PID。
grep命令可以在其他命令的输出中搜索所有类型的特征字符串。
1)启动文本编辑器(gedit)程序,再次计算进程的数目,看有什么变化?
____________________________________________________ ____
2)在当前的终端窗口中,执行命令:
ps –e | grep gedit
(文本编辑器的进程名是“gedit”,查找和“gedit”调度守护进程相关的所有进程) ,记录文本编辑器的父进程的CMD是什么?
____________________________________________________ ____
3)在当前终端窗口中执行命令:
pgrep –l gedit
查找所有和“gedit”调度守护进程相关的进程。ps和pgrep命令输出之间有什么不同?
____________________________________________________ ____
步骤6:按照用户查找一个进程。
ps命令可以带 -u (用户) 选项使用,查找指定用户的进程。这个命令比ps-ef使用得更多,因为一般只能够管理属于自己的进程。我们可以通过用户登录名或者UID号来查找用户的进程。用户只能够终止自己的进程,但是超级用户可以终止系统中所有运行的进程。
ps –u login-ID或UID
1)用以姓名创建的用户名登录系统,启动计算器GNOME应用程序。
2)使用带 -u选项的ps命令,查找以登录ID (例如,以姓名创建的用户,登录ID为用户名)运行的所有进程。计算器应用程序的PID是什么?
____________________________________________________ ____
3)使用ps -u命令组合grep,查找“计算机”程序的PID号,而不是使用ps -u查找整个列表。使用什么命令?
提示:猜猜“计算器”程序的命令名中可能有哪个字母,使用grep搜索那些字母。
____________________________________________________ ____
步骤7: 使用kill命令终止一个进程。
信号用于终止、挂起和继续进程。有时候使用Ctrl + c可以终止一个不响应的进程。这样向进程发送一个中断 (INT) 信号,终止它及所有它派生的子进程。
kill命令提供了一个终止不想要的命令进程的直接方法。当想停止一个运行了很长时间的命令的时候,或者当需要终止一个不能够正常退出的进程的时候,它很有用。指定PID正常地杀死一个进程。
kill [-signal] process-id
为了使用kill命令终止一个进程,应该首先键入ps找出进程的PID,然后键入kill紧跟着PID。如果使用kill而没有指定信号,则信号15 (SIGTERM) 将被发送给特定PID号的进程。这叫做软杀死,通常终止了进程。如果可能,最好软杀死进程,这样它可以正确地关闭文件,温和地终止进程。
如果需要强制终止一个进程,可以使用带 -9选项的kill命令。这个选项叫做强制杀死,当shell对所有其他终止信号都不响应的时候,需要使用它来杀死shell。
kill -9 process-id
注意:对于shell之外的进程,把kill –9 (SIGKILL) 作为最后的选项,因为它是一种生硬的方法,不允许正确的进程终止。
1)续步骤6,查看“计算器”进程的PID号是多少?
____________________________________________________ ____
2)软杀死“计算器”程序,它是否还在桌面上运行?
____________________________________________________ ____
3)打开4个虚拟终端,用ps –ef命令,观察这4个虚拟终端的进程标识符,它们的父进程是谁?
____________________________________________________ ____
4)使用kill命令关闭虚拟终端窗口,该如何操作?有没有办法一次将4个虚拟终端窗口同时关闭?
________________________________________________________________________________________________________________________________________________________________________________________
步骤8:运行pstree命令,,以树状结构观察当前的进程。
步骤9:运行top命令观察系统当前的进程状况。
步骤10:创建一个任务,请下午17:30关机,有几种方法,该如何操作。
__________________________________________________________________________________________________________________________________________________________ ____
______________________________________________________________________________________________________________________________________________________________________________
3.进程的创建
使用系统调用fork()可以创建进程,解释fork()函数的功能及使用方法;编辑编译并运行进程创建举例程序,观察记录屏幕上的显示结果,试分析原因。
〈进程创建程序〉
#include<stdio.h>
main()
{ int p1,p2;
if(p1=fork()) /*子进程创建成功*/
putchar('b');
else
{ if(p2=fork( )) /*子进程创建成功*/
putchar ('c');
else putchar ('a'); /*父进程执行*/
}
}
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
4.进程的控制
将每个进程输出一个字符改为每个进程输出一串字符,运行已修改好的程序再观察程序执行时屏幕出现的现象,并分析原因。
〈进程创建程序举例——输出字符串〉
#include<stdio.h>
main()
{ int p1,p2,i;
if(p1=fork())
{ for(i=0;i<500;i++)
printf("parent%d\n",i);
wait(0); /* 保证在子进程终止前,父进程不会终止*/
exit(0);
}
else { if(p2=fork())
{for(i=0;i<500;i++)
printf("son %d\n",i);
wait(0); /* 保证在子进程终止前,父进程不会终止*/
exit(0); /*向父进程信号0且该进程推出*/}
else {for(i=0;i<500;i++)
printf("grandchild %d\n",i);
exit(0);}
}
}
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,解释lockf()函数的功能及用法,运行下面给出的进程控制程序观察并分析出现的现象。
〈进程控制程序举例〉
#include<stdio.h>
main()
{ int p1,p2,i;
if(p1=fork())
{ lockf(1,1,0);
for(i=0;i<500;i++)
printf("parent %d\n",i);
lockf(1,0,0);
wait(0); /* 保证在子进程终止前,父进程不会终止*/
exit(0);
}
else
{ if(p2=fork())
{
lockf(1,1,0);
for(i=0;i<500;i++)
printf("son %d\n",i);
lockf(1,0,0);
wait(0); /* 保证在子进程终止前,父进程不会终止*/
exit(0); }
else
{ lockf(1,1,0);
for(i=0;i<500;i++)
printf("daughter %d\n",i);
lockf(1,0,0);
exit(0); }
}
}
____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
5.进程的管道通信
使用系统调用pipe()可以创建进程,解释pipe()、write()、read()函数的功能及使用方法;编辑编译并运行进程管理通信程序,观察并分析程序运行结果。
〈进程的管道通信程序举例〉
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
int pid1,pid2;
main( )
{
int fd[2];
char outpipe[100],inpipe[100];
pipe(fd); /*创建一个管道*/
while ((pid1=fork( ))==-1);
if(pid1==0)
{
lockf(fd[1],1,0);
sprintf(outpipe,"child 1 process is sending message!");
/*把串放入数组outpipe中*/
write(fd[1],outpipe,50); /*向管道写长为50字节的串*/
sleep(5); /*自我阻塞5秒*/
lockf(fd[1],0,0);
exit(0);
}
else
{
while((pid2=fork( ))==-1);
if(pid2==0)
{
lockf(fd[1],1,0); /*互斥*/
sprintf(outpipe,"child 2 process is sending message!");
write(fd[1],outpipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
wait(0); /*同步*/
read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/
printf("%s\n",inpipe);
wait(0);
read(fd[0],inpipe,50);
printf("%s\n",inpipe);
exit(0);
}
}
}
_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
6.实验小结、建议和体会
____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ 2010年读书节活动方案
一、 活动目的:
书是人类的朋友,书是人类进步的阶梯!为了拓宽学生的知识面,通过开展“和书交朋友,遨游知识大海洋”系列读书活动,激发学生读书的兴趣,让每一个学生都想读书、爱读书、会读书,从小养成热爱书籍,博览群书的好习惯,并在读书实践活动中陶冶情操,获取真知,树立理想!
二、活动目标:
1、通过活动,建立起以学校班级、个人为主的班级图书角和个人小书库。
2、通过活动,在校园内形成热爱读书的良好风气。
3、通过活动,使学生养成博览群书的好习惯。
4、通过活动,促进学生知识更新、思维活跃、综合实践能力的提高。
三、活动实施的计划
1、 做好读书登记簿
(1) 每个学生结合实际,准备一本读书登记簿,具体格式可让学生根据自己喜好来设计、装饰,使其生动活泼、各具特色,其中要有读书的内容、容量、实现时间、好词佳句集锦、心得体会等栏目,高年级可适当作读书笔记。
(2) 每个班级结合学生的计划和班级实际情况,也制定出相应的班级读书目标和读书成长规划书,其中要有措施、有保障、有效果、有考评,简洁明了,易于操作。
(3)中队会组织一次“读书交流会”展示同学们的读书登记簿并做出相应评价。
2、 举办读书展览:
各班级定期举办“读书博览会”,以“名人名言”、格言、谚语、经典名句、“书海拾贝”、“我最喜欢的___”、“好书推荐”等形式,向同学们介绍看过的新书、好书、及书中的部分内容交流自己在读书活动中的心得体会,在班级中形成良好的读书氛围。
3、 出读书小报:
展开阅读全文