linux 实验 广技师 进程管理与系统监视,实验9 linux进程管理与系统监视.doc

广东技术师范学院实验报告

学院:广东技术师范学院专业:软件工程班级:09软件成绩:姓名:学号:组别:组员:实验地点:工业中心204实验日期:2011.10.27指导教师签名:预习情况操作情况考勤情况数据处理情况

实验 9 项目名称: 进程管理

实验目的

理解进程管理的基本原理方法,掌握在Linux系统中查看进程状态、控制进程以及调整进程优先级等基本方法。

实验内容

2.1 进程管理的基本概念

什么是进程管理?要理解这个概念,就必须理解什么是进程。进程是在《操作系统原理》课程中的一个核心概念。进程(Process)是程序的一个执行过程。进程需要占用各种系统资源,包括CPU、内存等,需要读写各类文件,调用各种系统功能。自然,从进程的创建到撤销,操作系统会为它安排一切。不过,操作系统的安排是根据固定的算法所进行,纵使这些算法能根据当前情况不断调整,但不可能预先知道你的需要,然后让某个进程在特定某个时间挂起,让某个进程的优先级升高等等。因此,进程管理是指根据当前实际需求,对进程加以特定的控制。

作为一个管理员,定时查看当前系统中各个进程的具体状态,捕捉各种进程运行的异常,合理分配各类资源,特别是CPU资源给不同的进程,对各类进程有计划地控制等等,都属于进程管理的内容。系统为管理员提供了一系列的工具和命令,以让管理员完成管理工作。

2.2进程管理的基本方法

查看进程状态

获知进程状态是进程管理的第一步。UNIX系统为进程留了许多接口、命令和工具。最典型的是/proc文件系统。这是一个特殊的文件系统。在此文件系统中,每个目录对应于一个进程,目录的名称即为进程的PID号。进入某个进程对应的目录,里面有若干文件,这些文件记录了该进程当前运行的各种相关状态信息。应用程序可通过对这些文件打开并读取(部分甚至还能通过写文件控制进程)来获取进程信息。

例子:查看/proc文件系统

#cd /proc/

#ls

0 12294 16392 213144 28686 376918 53274 688280 864256

1 1245238 163974 217238 295118 381008 561308 69666 876674

……

#cd 1

#ls

#cred lwp psinfo sigact status

对于管理员,更常用的方法是利用ps命令来获知进程的基本状态。请参考以下例子并完成问题。

命令:ps

功能:列出当前活动进程的状态

格式:ps [选项] [参数]

选项:如果不使用任何选项,则列表显示当前工作站的活动进程,并且仅显示部分字段的内容。由于关于ps的选项很多,没必要全部列出并记忆,更常用的做法是记住一些有特定功能的选项组合。常用的选项含义如下:

-f:生成一个长列表(部分字段仍然省略了,但比不加该选项的要多)

-l(list):显示进程的全部列表字段信息

-e:显示除内核进程外的全部进程

-a:显示用户的全部进程

-u(user):显示特定用户的进程,

-k(kernel):显示内核进程

ps命令的一些常见的选项组合示例如下:

(1)仅显示当前工作站的活动进程

# ps

PID TTY TIME CMD

270396 pts/9 0:00 ps

725186 pts/9 0:00 –bash

(2)显示系统中除内核外的所有进程

# ps -e -f

UID PID PPID C STIME TTY TIME CMD

root 1 0 0 Aug 24 - 0:02 /etc/init

……

Zianed 1343542 741620 0 19:29:52 - 0:00 sshd: Zianed@pts/1

(3)显示关于特定用户的进程

# ps -lu user

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

40001 A 85287 421918 905408 0 60 20 1d966400 1012 - 0:00 sshd

240001 A 85287 503876 421918 0 60 20 3b49400 1168 f1000600021e1478 pts/7 0:00

(1)进程的软中断通信 #include #include #include #include int wait_flag; void stop(); main( ) { int pid1, pid2; // 定义两个进程号变量 signal(2,stop); // 或者 signal (14,stop); while((pid1 = fork( )) == -1); // 若创建子进程1不成功,则空循环 if(pid1 > 0) { // 子进程创建成功,pid1为进程号 while((pid2 = fork( )) == -1); // 创建子进程2 if(pid2 > 0) { wait_flag = 1; //sleep(1); // 父进程等待5秒 kill(pid1,SIGUSR1); // 杀死进程1 kill(pid2,SIGUSR2); // 杀死进程2 wait(0); wait(0); printf("\n Parent process is killed !!\n"); exit(0); // 父进程结束 } else { wait_flag = 1; signal(SIGUSR2,stop); // 等待进程2被杀死的中断号17 printf("\n Child process 2 is killed by parent !!\n"); exit(0); } } else { wait_flag = 1; signal(SIGUSR1,stop); // 等待进程1被杀死的中断号16 printf("\n Child process 1 is killed by parent !!\n"); exit(0); } } void stop() { wait_flag = 0; } (2)进程的管道通信 #include #include #include int pid1,pid2; // 定义两个进程变量 main( ) { int fd[2]; char OutPipe[100],InPipe[100]; // 定义两个字符数组 pipe(fd); // 创建管道 while((pid1 = fork( )) == -1); // 如果进程1创建不成功,则空循环 if(pid1 == 0) { lockf(fd[1],1,0); // 锁定管道 sprintf(OutPipe,"\n Child process 1 is sending message!\n"); write(fd[1],OutPipe,50); // 向管道写入数据 sleep(5); // 等待读进程读出数据 lockf(fd[1],0,0); // 解除管道的锁定 exit(0); // 结束进程1 } else { while((pid2 = fork()) == -1); // 若进程2创建不成功,则空循环 if(pid2 == 0) { lockf(fd[1],1,0); sprintf(OutPipe,"\n Child process 2 is sending message!\n"); write(fd[1],OutPipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else { wait(0); // 等待子进程1 结束 read(fd[0],InPipe,50); // 从管道中读出数据 printf("%s\n",InPipe); // 显示读出的数据 wait(0); // 等待子进程2 结束 read(fd[0],InPipe,50); printf("%s\n",InPipe); exit(0); // 父进程结束 } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值