实验一——Linux环境下的进程管理之欧阳光明创编

合集下载

Linux 进程管理实验

Linux 进程管理实验

Linux 进程管理实验一、实验内容:1. 利用bochs观测linux0.11下的PCB进程控制结构。

2. 利用bochs观测linux0.11下的fork.c源代码文件,简单分析其中的重要函数。

3. 在fork.c适当位置添加代码,以验证fork函数的工作原理。

二、Linux进程管理机制分析Linux有两类进程:一类是普通用户进程,一类是系统进程,它既可以在用户空间运行,又可以通过系统调用进入内核空间,并在内核空间运行;另一类叫做内核进程,这种进程只能在内核空间运行。

在以i386为平台的Linux系统中,进程由进程控制块,系统堆栈,用户堆栈,程序代码及数据段组成。

Linux系统中的每一个用户进程有两个堆栈:一个叫做用户堆栈,它是进程运行在用户空间时使用的堆栈;另一个叫做系统堆栈,它是用户进程运行在系统空间时使用的堆栈。

1.Linux进程的状态:Linux进程用进程控制块的state域记录了进程的当前状态,一个Linux 进程在它的生存期中,可以有下面6种状态。

1.就绪状态(TASK_RUNNING):在此状态下,进程已挂入就绪队列,进入准备运行状态。

2.运行状态(TASK_RUNNING):当进程正在运行时,它的state域中的值不改变。

但是Linux会用一个专门指针(current)指向当前运行的任务。

3.可中断等待状态(TASK_INTERRUPTIBLE):进程由于未获得它所申请的资源而处在等待状态。

不管是资源有效或者中断唤醒信号都能使等待的进程脱离等待而进入就绪状态。

即”浅睡眠状态”。

4.不可中断等待状态(TASK_UNINTERRUPTIBLE):这个等待状态与上面等待状态的区别在于只有当它申请的资源有效时才能被唤醒,而其它信号不能。

即“深睡眠状态”。

5.停止状态(TASK_STOPPED):当进程收到一个SIGSTOP信号后就由运行状态进入停止状态,当收到一个SINCONT信号时,又会恢复运行状态。

linux进程管理的实验报告

linux进程管理的实验报告

实验报告:Linux进程管理1. 引言本实验报告将详细介绍Linux系统中进程管理的相关知识和操作。

进程管理是操作系统中的一个重要组成部分,它负责控制和调度系统中运行的各个进程,确保系统资源的合理分配和进程的正常运行。

在本实验中,我们将通过一系列步骤来了解Linux系统中进程的创建、监控和控制。

2. 实验环境为了完成本实验,我们需要在一台运行Linux操作系统的计算机上进行操作。

本实验报告基于Ubuntu 20.04 LTS操作系统进行撰写,但是适用于大多数Linux 发行版。

3. 实验步骤步骤一:创建新进程在Linux系统中,可以通过fork()系统调用来创建新的进程。

以下是一个简单的示例代码:#include <stdio.h>#include <unistd.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程逻辑printf("这是子进程\n");} else if (pid > 0) {// 父进程逻辑printf("这是父进程\n");} else {// 进程创建失败printf("进程创建失败\n");}return0;}步骤二:查看进程信息Linux系统提供了多种命令来查看系统中运行的进程信息。

以下是一些常用的命令:•ps:显示当前终端下的进程列表。

•top:实时显示进程的CPU、内存等资源占用情况。

•pstree:以树状结构显示进程的层次关系。

步骤三:杀死进程有时候我们需要终止一个运行中的进程,可以使用kill命令来发送终止信号给目标进程。

以下是一个示例:kill <PID>请将<PID>替换为目标进程的进程ID。

步骤四:进程优先级调整通过调整进程的优先级,可以影响进程在系统中的调度顺序。

在Linux系统中,可以使用nice命令来调整进程的优先级。

Linux进程管理-实验报告

Linux进程管理-实验报告

《Linux 操作系统设计实践》实验一:进程管理实验目的:(1) 加深对进程概念的理解,明确进程和程序的区别。

(2)进一步认识并发执行的实质.(3) 学习通过进程执行新的目标程序的方法。

(4) 了解Linux 系统中进程信号处理的基本原理.实验环境:Red Hat Linux实验内容:(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程,当此进程运行时,在系统中有一个父进程和两个子进程活动,让每一个进程在屏幕上显示一个字符,父进程显示字符“a";子进程分别显示字符“b”和字符“c”,试观察记录屏幕上的显示结果,并分析原因.程序代码:#include<stdio。

h〉int main(){int p1 ,p2 ;while((p1=fork())==-1);if(p1==0)putchar(’b');else{while((p2=fork())==—1);if(p2==0)putchar(’c');elseputchar(’a');}return 0;}运行结果:bca分析:第一个while里调用fork()函数一次,返回两次。

子进程P1得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来父进程和子进程P1两个分支运行,判断P1==0,子进程P1符合条件,输出“b”;接下来else里面的while里再调用fork()函数一次,子进程P2得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来判断P2==0,子进程P2符合条件,输出“c”,接下来父进程输出“a”,程序结束。

(2)进程的控制①修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。

程序代码:#include〈stdio。

h>int main(){int p1,p2;while((p1=fork())==-1);if(p1==0)printf("Child1 is running!\n”);else{while((p2=fork())==—1);if(p2==0)printf(”Child2 is running!\n”);elseprintf(”Fath er is running!\n”);}return 0;}运行结果:Child1 is running!Child2 is running!Father is running!分析:本实验和上一个实验一样,只是将每个进程输出一个字符改为每个进程输出一句话.第一个while里调用fork()函数一次,返回两次。

实验一——Linux环境下的进程管理系统

实验一——Linux环境下的进程管理系统

软件学院上机实验报告课程名称:操作系统实验项目:实验一:Linux环境下进程管理实验室:耘慧402 姓名:学号:专业班级:实验时间:一、实验目的及要求1.加深对进程概念的理解,明确进程和程序的区别;2. 进一步认识并发执行的实质;3. 分析进程争用资源的现象,学习解决进程互斥的方法;4. 了解Linux系统中进程通信的基本原理;二、实验性质1. 进程的创建:编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

2. 进程的控制:修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

如果在程序中使用系统调用lockf ()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

3. 用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的容;利用wait( )来控制进程执行顺序。

三、实验学时实验性质:验证性实验学时: 4学时实验要求:必做四、实验环境1.实验环境: Linux系统开发环境2.知识准备:(1) Linux系统开发环境搭建;(2) Linux环境下GCC编译器的使用;(3)语言中函数定义与调用、指针和类型的定义与使用、结构的定义、动态存的申请等预备知识。

五、实验容及步骤①实验容:(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

(2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

实验一进程创建 Linux实验报告

实验一进程创建  Linux实验报告

实验一进程创建【实验目的和要求】1、1.了解进程的概念及意义;2.了解子进程和父进程;3.掌握创建进程的方法。

【实验内容】1、1.子进程和父进程的创建;2.编写附件中的程序实例;3.撰写实验报告。

【实验原理】1、原型:#include <unistd.h>pid_t fork(void);在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。

新进程为子进程,而原进程为父进程。

fork函数创建子进程的过程为:使用fork函数得到的子进程是父进程的一个复制品,它从父进程继承了进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端,而子进程所独有的只有它的进程号、资源使用和计时器等。

通过这种复制方式创建出子进程后,原有进程和子进程都从函数fork返回,各自继续往下运行,但是原进程的fork返回值与子进程的fork返回值不同,在原进程中,fork返回子进程的pid,而在子进程中,fork返回0,如果fork返回负值,表示创建子进程失败。

子进程和父进程继续执行fork调用之后的指令。

子进程是父进程的副本。

例如,子进程获得父进程数据空间、堆和栈的副本。

注意,这是子进程所有用的副本。

父进程和子进程并不共享这些存储空间部分。

父进程和子进程共享正文段。

2、原型:#include <unistd.h>pid_t vfork(void);vfork函数的调用序列和返回值与fork相同,但两者的语义不同。

vfork函数用于创建一个新进程,而该进程的目的是exec一个新程序。

vfork不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec,它在父进程的空间中运行。

vfork保证子进程先运行,在它调用exit之后父进程才可能被调度运行,当子进程调用这两个函数中的任意一个时,父进程会恢复运行。

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();}}/* 让用户选择杀死哪个进程。

实验一——Linux环境下的进程管理

实验一——Linux环境下的进程管理

软件学院上机实验报告课程名称:操作系统实验项目:实验一:Linux环境下进程管理实验室:耘慧402 姓名:学号:专业班级:实验时间:一、实验目的及要求1.加深对进程概念的理解,明确进程和程序的区别;2. 进一步认识并发执行的实质;3. 分析进程争用资源的现象,学习解决进程互斥的方法;4. 了解Linux系统中进程通信的基本原理;二、实验性质1. 进程的创建:编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

2. 进程的控制:修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

如果在程序中使用系统调用lockf ()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

3. 用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容;利用wait( )来控制进程执行顺序。

三、实验学时实验性质:验证性实验学时: 4学时实验要求:必做四、实验环境1.实验环境: Linux系统开发环境2.知识准备:(1) Linux系统开发环境搭建;(2) Linux环境下GCC编译器的使用;(3)语言中函数定义与调用、指针和类型的定义与使用、结构的定义、动态内存的申请等预备知识。

五、实验内容及步骤①实验内容:(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

(2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

Linux的进程管理实验报告

Linux的进程管理实验报告

实验报告Linux进程管理实验内容:1,进程运行控制命令2,进程管理命令3,调度进程命令4,信息管理命令姓名:学好:520913080429专业:信息安全09-041,进程运行控制命令[root@localhost ~]# find / -name testing & <==将该执行程序放在后台执行[1] 5673You have new mail in /var/spool/mail/root[root@localhost ~]# fg <=将该程序教会屏幕前执行find / -name testing[1]+ Stopped find / -name testing[root@localhost ~]#[root@localhost /]# vi .bashrc[2]+ Stopped vi .bashrc <=两个进程被丢到后台当中[root@localhost /]#[root@localhost /]# jobs[1]- Stopped find / -name testing (wd: ~)[2]+ Stopped vi .bashrc[root@localhost /]# <=显示有两个工作在后台下,状态为停止[root@localhost /]# find / -name test/usr/lib/ruby/1.8/test/usr/lib/python2.4/email/test/usr/lib/python2.4/test/usr/lib/python2.4/bsddb/test/usr/lib/pgsql/test/usr/bin/test/usr/include/boost/mpl/aux_/test/usr/include/boost/test/usr/share/pear/test/usr/share/doc/db4-devel-4.3.29/ref/test/usr/share/doc/lynx-2.8.5/test/usr/share/doc/ncurses-devel-5.5/test[3]+ Stopped find / -name test[root@localhost /]#[root@localhost /]# vi .bashrc[4]+ Stopped vi .bashrc[root@localhost /]#[root@localhost /]# jobs[1] Stopped find / -name testing (wd: ~)[2] Stopped vi .bashrc[3]- Stopped find / -name test[4]+ Stopped vi .bashrc[root@localhost /]#[root@localhost /]# bg %1[1] find / -name testing & (wd: ~)[root@localhost /]# /usr/share/doc/kernel-doc-2.6.18/Documentation/ABI/testing [root@localhost /]#[root@localhost /]# jobs[1] Running find / -name testing & (wd: ~)[2] Stopped vi .bashrc[3]- Stopped find / -name test[4]+ Stopped vi .bashrc[root@localhost /]# /work/mini2440/linux-2.6.32.2-mini2440/Documentation/ABI/testing[root@localhost /]#[root@localhost /]# bg %2[2] vi .bashrc &[root@localhost /]# jobs[1] Running find / -name testing & (wd: ~)[2]+ Stopped vi .bashrc[3] Stopped find / -name test[4]- Stopped vi .bashrc2,进程管理命令[root@localhost ~]# ps -auxWarning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 2044 636 ? Ss 12:05 0:01 init [5]root 2 0.0 0.0 0 0 ? S 12:05 0:00 [migration/0]root 3 0.0 0.0 0 0 ? SN 12:05 0:00 [ksoftirqd/0]root 4 0.0 0.0 0 0 ? S 12:05 0:00 [watchdog/0]root 5 0.0 0.0 0 0 ? S< 12:05 0:00 [events/0]root 6 0.0 0.0 0 0 ? S< 12:05 0:00 [khelper]root 7 0.0 0.0 0 0 ? S< 12:05 0:00 [kthread]root 9 0.0 0.0 0 0 ? S< 12:05 0:00 [xenwatch]root 10 0.0 0.0 0 0 ? S< 12:05 0:00 [xenbus]root 12 0.0 0.0 0 0 ? S< 12:05 0:00 [kblockd/0]root 13 0.0 0.0 0 0 ? S< 12:05 0:00 [kacpid]root 177 0.0 0.0 0 0 ? S< 12:05 0:00 [cqueue/0]root 181 0.0 0.0 0 0 ? S< 12:05 0:00 [khubd]root 183 0.0 0.0 0 0 ? S< 12:05 0:00 [kseriod]root 238 0.0 0.0 0 0 ? S 12:05 0:00 [pdflush]root 239 0.0 0.0 0 0 ? S 12:05 0:00 [pdflush]root 240 0.0 0.0 0 0 ? S< 12:05 0:00 [kswapd0]root 241 0.0 0.0 0 0 ? S< 12:05 0:00 [aio/0]root 445 0.0 0.0 0 0 ? S< 12:05 0:00 [kpsmoused]root 475 0.0 0.0 0 0 ? S< 12:05 0:00 [scsi_eh_0]root 480 0.0 0.0 0 0 ? S< 12:05 0:00 [kmirrord]root 485 0.0 0.0 0 0 ? S< 12:05 0:00 [ksnapd]root 488 0.0 0.0 0 0 ? S< 12:06 0:01 [kjournald]root 516 0.0 0.0 0 0 ? S< 12:06 0:00 [kauditd]root 550 0.0 0.0 2388 816 ? S<s 12:06 0:01 /sbin/udevd -droot 1271 0.0 0.0 0 0 ? S< 12:06 0:00 [kgameportd]root 2162 0.0 0.0 0 0 ? S< 12:07 0:00 [kjournald]root 2652 0.0 0.2 5276 2584 ? S 12:07 0:01 /usr/sbin/vmtoolsdroot 2704 0.0 0.2 9840 2088 ? Ss 12:07 0:00 cupsdroot 3164 0.0 0.0 12060 636 ? S<sl 12:08 0:00 auditdroot 3166 0.0 0.3 9504 3712 ? S<s 12:08 0:00 python /sbin/audispdroot 3180 0.0 0.0 1704 584 ? Ss 12:08 0:00 syslogd -m 0root 3183 0.0 0.0 1656 404 ? Ss 12:08 0:00 klogd -xrpc 3216 0.0 0.0 1784 548 ? Ss 12:08 0:00 portmaproot 3245 0.0 0.0 1800 732 ? Ss 12:08 0:00 rpc.statdroot 3278 0.0 0.0 4952 568 ? Ss 12:08 0:00 rpc.idmapddbus 3297 0.0 0.1 2852 964 ? Ss 12:08 0:00 dbus-daemon --systemroot 3308 0.0 0.0 2128 756 ? Ss 12:08 0:00 /usr/sbin/hcidroot 3312 0.0 0.0 1724 496 ? Ss 12:08 0:00 /usr/sbin/sdpdroot 3337 0.0 0.0 0 0 ? S< 12:08 0:00 [krfcommd]root 3376 0.0 0.1 33192 1284 ? Ssl 12:08 0:00 pcscdroot 3395 0.0 0.0 1896 444 ? Ss 12:08 0:00 /usr/bin/hidd --serverroot 3415 0.0 0.1 9344 1108 ? Ssl 12:08 0:00 automountroot 3434 0.0 0.0 1656 524 ? Ss 12:08 0:00 /usr/sbin/acpidroot 3445 0.0 0.0 5088 496 ? Ss 12:08 0:00 ./hpiodroot 3450 0.0 0.4 13172 4548 ? S 12:08 0:00 python ./hpssd.pyroot 3465 0.0 0.0 5184 924 ? Ss 12:08 0:00 /usr/sbin/sshdroot 3477 0.0 0.0 2680 884 ? Ss 12:08 0:00 xinetd -stayalive -pidfile /var/root 3497 0.0 0.1 8500 1804 ? Ss 12:08 0:00 sendmail: accepting connections smmsp 3505 0.0 0.1 7564 1448 ? Ss 12:08 0:00 sendmail: Queue runner@01:00:00 root 3518 0.0 0.0 1876 352 ? Ss 12:08 0:00 gpm -m /dev/input/mice -t exps2 root 3529 0.0 0.1 5476 1112 ? Ss 12:08 0:00 crondxfs 3564 0.0 0.1 3940 1780 ? Ss 12:08 0:00 xfs -droppriv -daemonroot 3575 0.0 0.0 1652 504 ? SNs 12:08 0:00 anacron -sroot 3585 0.0 0.0 2216 436 ? Ss 12:08 0:00 /usr/sbin/atdroot 3624 0.5 1.2 25456 12156 ? S 12:08 0:14 /usr/bin/python /usr/sbin/yum-up avahi 3650 0.0 0.1 2684 1364 ? Ss 12:09 0:01 avahi-daemon: running [localhost avahi 3651 0.0 0.0 2552 316 ? Ss 12:09 0:00 avahi-daemon: chroot helper68 3663 0.1 0.4 6236 4308 ? Ss 12:09 0:03 haldroot 3664 0.0 0.1 3112 964 ? S 12:09 0:00 hald-runner68 3670 0.0 0.0 1980 788 ? S 12:09 0:00 hald-addon-acpi: listening on ac68 3677 0.0 0.0 1976 788 ? S 12:09 0:00 hald-addon-keyboard: listening o root 3688 0.0 0.0 1936 616 ? S 12:09 0:00 hald-addon-storage: polling /dev root 3955 0.0 0.0 2100 932 ? S 12:09 0:00 xenstored --pid-file /var/run/xeroot 3961 0.0 0.0 12152 420 ? Sl 12:09 0:00 xenconsoledroot 3963 0.0 0.4 11844 3940 ? S 12:09 0:00 python /usr/sbin/xend startroot 3964 0.0 0.5 63064 4924 ? Sl 12:09 0:00 python /usr/sbin/xend startroot 3965 0.0 0.0 13496 600 ? Ssl 12:09 0:00 blktapctrlroot 4344 0.0 0.0 2292 708 ? Ss 12:09 0:00 /sbin/dhclient -1 -q -lf /var/liroot 4466 0.0 0.0 1912 336 ? S 12:09 0:00 /usr/sbin/smartd -q neverroot 4478 0.0 0.0 1640 432 tty1 Ss+ 12:09 0:00 /sbin/mingetty tty1root 4480 0.0 0.0 1640 428 tty2 Ss+ 12:09 0:00 /sbin/mingetty tty2root 4481 0.0 0.0 1636 428 tty3 Ss+ 12:09 0:00 /sbin/mingetty tty3root 4482 0.0 0.0 1640 432 tty4 Ss+ 12:09 0:00 /sbin/mingetty tty4root 4483 0.0 0.0 1640 432 tty5 Ss+ 12:09 0:00 /sbin/mingetty tty5root 4509 0.0 0.0 1636 428 tty6 Ss+ 12:09 0:00 /sbin/mingetty tty6root 4510 0.0 0.4 16964 4248 ? Ss 12:09 0:00 /usr/sbin/gdm-binary -nodaemon root 4585 0.0 0.2 15988 2652 ? S 12:09 0:00 /usr/sbin/gdm-binary -nodaemon root 4589 0.0 0.1 16964 1508 ? S 12:09 0:00 /usr/sbin/gdm-binary -nodaemon root 4591 0.3 1.3 19960 12916 tty7 Ss+ 12:09 0:08 /usr/bin/Xorg :0 -br -audit 0 -aroot 4799 0.0 0.6 23060 6000 ? Ss 12:15 0:00 /usr/bin/gnome-sessionroot 4828 0.0 0.0 0 0 ? Z 12:15 0:00 [Xsession] <defunct>root 4861 0.0 0.0 4308 508 ? Ss 12:15 0:00 /usr/bin/ssh-agent /usr/bin/dbus root 4864 0.0 0.0 2756 504 ? S 12:15 0:00 /usr/bin/dbus-launch --exit-with root 4865 0.0 0.0 2720 848 ? Ss 12:15 0:00 /bin/dbus-daemon --fork --print- root 4871 0.0 0.3 7348 3416 ? S 12:15 0:00 /usr/libexec/gconfd-2 5root 4875 0.0 0.0 2552 588 ? S 12:15 0:00 /usr/bin/gnome-keyring-daemon root 4877 0.0 0.8 34028 8044 ? Sl 12:15 0:00 /usr/libexec/gnome-settings-daem root 4894 0.0 1.1 25160 11280 ? Ss 12:15 0:00 /usr/lib/scim-1.0/scim-launcherroot 4907 0.0 1.1 39776 11528 ? Ss 12:15 0:00 metacity --sm-client-id=default1root 4912 0.0 1.4 98520 14212 ? Ss 12:15 0:02 gnome-panel --sm-client-id defau root 4914 0.3 1.8 136400 18176 ? Ss 12:15 0:07 nautilus --no-default-window --sroot 4918 0.0 0.3 38896 2948 ? Ssl 12:15 0:00 /usr/libexec/bonobo-activation-s root 4922 0.0 0.3 11360 3092 ? S 12:15 0:00 /usr/libexec/gnome-vfs-daemon root 4926 0.0 0.8 44884 8096 ? Ss 12:15 0:00 eggcups --sm-client-id default4root 4938 0.3 1.9 77512 18920 ? S 12:15 0:08 /usr/lib/vmware-tools/bin32/vmwa root 4941 0.0 0.0 6452 576 ? Ss 12:15 0:00 /usr/lib/scim-1.0/scim-helper-ma root 4942 0.0 0.6 49540 6596 ? Ssl 12:15 0:00 /usr/lib/scim-1.0/scim-panel-gtk root 4946 0.0 0.5 14584 4996 ? Ss 12:15 0:00 bt-applet --sm-disableroot 4948 0.0 0.0 13548 816 ? Ss 12:15 0:00 /usr/lib/scim-1.0/scim-launcher root 4952 0.1 1.3 25236 13336 ? Ss 12:15 0:04 /usr/bin/python -tt /usr/bin/pup root 4960 0.0 0.1 2536 1196 ? S 12:16 0:00 /usr/libexec/gam_serverroot 4962 0.0 1.3 97264 12776 ? S 12:16 0:00 /usr/libexec/wnck-applet --oaf-a root 4964 0.0 0.9 104952 8800 ? S 12:16 0:00 /usr/libexec/trashapplet --oaf-aroot 4980 0.0 0.2 17280 2212 ? Sl 12:16 0:00 ./escd --key_Inserted="/usr/bin/ root 4983 0.1 0.9 74352 9260 ? Ss 12:16 0:02 nm-applet --sm-disableroot 4985 0.0 0.0 2452 828 ? S 12:16 0:00 /usr/libexec/mapping-daemonroot 4992 0.0 0.4 15396 4608 ? Ss 12:16 0:01 pam-panel-icon --sm-client-id de root 4995 0.0 0.6 74052 6320 ? Ss 12:16 0:00 gnome-power-managerroot 4996 0.0 0.0 1820 620 ? S 12:16 0:00 /sbin/pam_timestamp_check -d roo root 5017 0.0 0.4 16404 4068 ? Ss 12:16 0:00 gnome-screensaverroot 5029 0.6 2.6 64052 25252 ? S 12:16 0:14 /usr/bin/python -E /usr/bin/seal root 5046 0.0 0.6 23148 6532 ? S 12:16 0:01 /usr/libexec/notification-area-a root 5049 0.1 1.3 97332 12944 ? S 12:17 0:02 /usr/libexec/mixer_applet2 --oaf root 5052 0.1 1.2 48824 11612 ? S 12:17 0:02 /usr/libexec/clock-applet --oaf-root 5061 0.0 0.1 12292 1000 ? S 12:17 0:00 scim-bridgeroot 5437 0.0 1.7 131360 17252 ? Sl 12:28 0:00 gnome-terminalroot 5442 0.0 0.0 2452 660 ? S 12:28 0:00 gnome-pty-helperroot 5443 0.0 0.1 5052 1516 pts/1 Ss 12:28 0:00 bashroot 5933 0.0 0.1 5004 1248 pts/1 T 12:44 0:00 vi .bashrcroot 6062 0.0 0.1 4800 1108 pts/1 T 12:48 0:00 find / -name testroot 6159 0.0 0.1 5028 1308 pts/1 T 12:50 0:00 vi .bashrcroot 6271 0.0 0.0 4476 952 pts/1 R+ 12:54 0:00 ps -aux[root@localhost ~]#USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDUSER :进程属于那个人的PID :进程号%CPU :使用了多少CPU资源%MEM :使用了多少RAMVSZ RSS :占用的Ram的大小TTY :若为tty1-tty6则为本机用户,STAT :该进程的状态START :该进程开始的日期TIME :该进程运行了多久的时间COMMAND :该进程的内容[root@localhost ~]# toptop - 13:06:05 up 1:00, 1 user, load average: 0.00, 0.01, 0.08Tasks: 123 total, 2 running, 117 sleeping, 3 stopped, 1 zombieCpu(s): 0.7%us, 0.7%sy, 0.0%ni, 98.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stMem: 962500k total, 826544k used, 135956k free, 215324k buffers Swap: 2031608k total, 0k used, 2031608k free, 411772k cachedPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND4591 root 15 0 38392 12m 5316 S 1.3 1.3 0:09.46 Xorg5437 root 15 0 128m 17m 10m R 0.3 1.8 0:00.75 gnome-terminal1 root 15 0 2044 636 540 S 0.0 0.1 0:01.04 init2 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/03 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/04 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/05 root 10 -5 0 0 0 S 0.0 0.0 0:00.12 events/06 root 20 -5 0 0 0 S 0.0 0.0 0:00.02 khelper7 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kthread9 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 xenwatch10 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 xenbus12 root 10 -5 0 0 0 S 0.0 0.0 0:00.42 kblockd/013 root 20 -5 0 0 0 S 0.0 0.0 0:00.00 kacpid177 root 18 -5 0 0 0 S 0.0 0.0 0:00.00 cqueue/0181 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 khubd183 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kseriod238 root 23 0 0 0 0 S 0.0 0.0 0:00.00 pdflush239 root 15 0 0 0 0 S 0.0 0.0 0:00.51 pdflush240 root 18 -5 0 0 0 S 0.0 0.0 0:00.00 kswapd0241 root 18 -5 0 0 0 S 0.0 0.0 0:00.00 aio/0445 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 kpsmoused 475 root 18 -5 0 0 0 S 0.0 0.0 0:00.00 scsi_eh_0480 root 19 -5 0 0 0 S 0.0 0.0 0:00.00 kmirrord485 root 20 -5 0 0 0 S 0.0 0.0 0:00.00 ksnapd488 root 10 -5 0 0 0 S 0.0 0.0 0:01.28 kjournald516 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kauditd550 root 17 -4 2388 816 372 S 0.0 0.1 0:01.48 udevd1271 root 17 -5 0 0 0 S 0.0 0.0 0:00.00 kgameportd 2162 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kjournald 2652 root 15 0 5276 2584 2152 S 0.0 0.3 0:01.59 vmtoolsdYou have new mail in /var/spool/mail/rootTop为动态进程查看cpu使用的情况[root@localhost ~]# sar -u 1 3Linux 2.6.18-8.el5xen (localhost.localdomain) 2011年11月07日13时09分33秒CPU %user %nice %system %iowait %steal %idle13时09分34秒all 1.00 0.00 1.00 0.00 0.00 98.0013时09分35秒all 3.96 0.00 0.00 0.000.00 96.0413时09分36秒all 0.00 0.00 1.00 0.00 0.00 99.00Average: all 1.66 0.00 0.66 0.00 0.00 97.67[root@localhost ~]#查看内存的使用情况[root@localhost ~]# sar -r 1 3Linux 2.6.18-8.el5xen (localhost.localdomain) 2011年11月07日13时10分44秒kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad13时10分45秒134656 827844 86.01 215596 411924 2031608 0 0.00 013时10分46秒134656 827844 86.01 215596 411924 2031608 0 0.00 013时10分47秒134656 827844 86.01 215596 411924 2031608 0 0.00 0Average: 134656 827844 86.01 215596 411924 2031608 0 0.00 0You have new mail in /var/spool/mail/root[root@localhost ~]#关闭进程PID为2652的进程[root@localhost ~]# kill -9 2652[root@localhost ~]#查看系统的内核版本,主机名称,cpu信息[root@localhost ~]# uname -aLinux localhost.localdomain 2.6.18-8.el5xen #1 SMP Fri Jan 26 14:42:21 EST 2007 i686 i686 i386 GNU/LinuxYou have new mail in /var/spool/mail/root[root@localhost ~]#了解cpu的详细信息[root@localhost ~]# more /proc/cpuinfoprocessor : 0vendor_id : GenuineIntelcpu family : 6model : 23model name : Intel(R) Core(TM)2 Duo CPU E7500 @ 2.93GHz stepping : 10cpu MHz : 2925.552cache size : 3072 KBfdiv_bug : nohlt_bug : nof00f_bug : nocoma_bug : nofpu : yesfpu_exception : yescpuid level : 13wp : yesflags : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts acpi mmx fxsrsse sse2 ss nx lm constant_tsc up pni cx16 lahf_lmbogomips : 7338.60[root@localhost ~]#查看进程的优先级[root@localhost ~]# ps -lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD0 S 0 5443 5437 0 75 0 - 1263 wait pts/1 00:00:00 bash0 T 0 5933 5443 0 75 0 - 1251 finish pts/1 00:00:00 vi0 T 0 6062 5443 0 77 0 - 1200 finish pts/1 00:00:00 find0 T 0 6159 5443 0 78 0 - 1257 finish pts/1 00:00:00 vi4 R 0 7163 5443 0 77 0 - 1107 - pts/1 00:00:00 ps 3,调度进程命令[root@localhost ~]#[root@localhost ~]# at 5pmat> shutdown -h -nowat> You have new mail in /var/spool/mail/root[root@localhost ~]# atq[root@localhost ~]# at 5pm shutdown -h -nowUsage: at [-V] [-q x] [-f file] [-m] timeat [-V] [-q x] [-f file] [-m] -t [[CC]YY]MMDDhhmmat -c job [job...](atq | at -l) [-V] [-q x](atrm | at -d | at -r) [-V] [-q x] job ...batch [-V] [-f file] [-m][root@localhost ~]# at -qat: option requires an argument -- qUsage: at [-V] [-q x] [-f file] [-m] timeat [-V] [-q x] [-f file] [-m] -t [[CC]YY]MMDDhhmmat -c job [job...](atq | at -l) [-V] [-q x](atrm | at -d | at -r) [-V] [-q x] job ...batch [-V] [-f file] [-m][root@localhost ~]#[root@localhost ~]#[root@localhost ~]# crontab –e[root@localhost ~]# at 6pmat> sar -u 1 3at> <EOT>job 1 at 2011-11-10 18:00[root@localhost ~]#[root@localhost ~]# atq1 2011-11-10 18:00 a root 一个任务[root@localhost ~]#0 12 * * *mail test </home/test/test.txt[root@localhost ~]# crontab –r 删除所有[root@localhost ~]#crontab –l[root@localhost ~]# atq[root@localhost ~]# vi /etc/crontab 启动iv编辑器SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/# run-parts01 * * * * root run-parts /etc/cron.hourly02 4 * * * root run-parts /etc/cron.daily22 4 * * 0 root run-parts /etc/cron.weekly42 4 1 * * root run-parts /etc/cron.monthly4,信息管理命令[root@localhost ~]# dmesg 显示开机信息[root@localhost ~]#dmesg | more[root@localhost ~]#uptime 查看系统开机时间[root@localhost ~]# uptime08:52:55 up 16 min, 1 user, load average: 0.02, 0.51, 0.55 [root@localhost ~]#whoroot pts/1 2011-11-10 08:49 (:0.0)[root@localhost ~]#[root@localhost ~]# whoamiroot[root@localhost ~]# [root@localhost ~]#last -5。

实验一——Linux环境下的进程管理

实验一——Linux环境下的进程管理

软件学院上机实验报告课程名称:操作系统实验项目:实验一:环境下进程管理实验室:耘慧402 姓名:学号:专业班级:实验时间:一、实验目的及要求1.加深对进程概念的理解,明确进程和程序的区别;2. 进一步认识并发执行的实质;3. 分析进程争用资源的现象,学习解决进程互斥的方法;4. 了解系统中进程通信的基本原理;二、实验性质1. 进程的创建:编写一段程序,使用系统调用()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

2. 进程的控制:修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

如果在程序中使用系统调用()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

3. 用( )创建一个进程,再调用( )用新的程序替换该子进程的内容;利用( )来控制进程执行顺序。

三、实验学时实验性质:验证性实验学时: 4学时实验要求:必做四、实验环境1.实验环境:系统开发环境2.知识准备:(1)系统开发环境搭建;(2)环境下编译器的使用;(3)语言中函数定义与调用、指针和类型的定义与使用、结构的定义、动态内存的申请等预备知识。

五、实验内容及步骤①实验内容:(1)进程的创建编写一段程序,使用系统调用()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

(2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

如果在程序中使用系统调用()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

《Linux操作系统设计实践》实验一:进程管理

《Linux操作系统设计实践》实验一:进程管理

《Linux操作系统设计实践》实验一:进程管理实验目的:(1)加深对进程概念的理解,明确进程和程序的区别。

(2)进一步认识并发执行的实质。

(3)学习通过进程执行新的目标程序的方法。

(4)了解Linux系统中进程信号处理的基本原理实验环境:红帽操作系统实验内容:1.进程的创建fork()。

2. 使用exec函数族使子进程执行新的目标程序。

3.编写一段程序,使其实现进程的软中断通信实验代码的验证:1.编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”:子进程分别显示“b”和“c”。

试观察记录屏幕上显示结果,并分析原因。

#include<stdio.h>int main(){int p1 ,p2 ;while((p1=fork())==-1);if(p1==0){putchar('b');printf(“\n”);}else{while((p2=fork())==-1);if(p2==0){putchar('c');printf(“\n”);}else{putchar('a');printf(“\n”);}return 0;}实验结果:如上所示:a,b,c 出现的顺序是是不固定的。

分析:fork()会产生一个新的子进程。

如果fork成功则在父进程会返回新建立的子进程标识好(PID),而子进程会返回0;如果fork()失败则是返回-1.fork()是一个返回两个参数数的函数,如果fork()返回值大于0时,代表创建fork()函数的下一句是由父进程执行的。

如果返回值为0时,代表创建fork()函数的下一句是由子进程执行的。

因此,上诉程序会形成三个进程:父进程打印字符a,子进程1打印字符b,子进程2打印字符c。

由并发程序运行,可知这三个进程运行的顺序是不固定的。

【操作系统实验报告实验一进程管理(20210814000319)】 进程管理实验报告

【操作系统实验报告实验一进程管理(20210814000319)】 进程管理实验报告

~~\r\n);
public void testblock()
(m);
{
m--;
rryList hblock1 = new rryList();
}
hblock1 = hblock;
// 输出就绪数组和堵塞数组的信息
pcb p = (pcb)list1[j];
public void outputll()
I!
\r\n=======CPU 运行了: + () + 次 =======\r\n);
I!
H*********当前就绪队列的信息!
I!
H*********
I!
当前就绪队列的信息! *********);
//h
for (i = 1; i = n; i++)
为 运行的时间 片次 数,
{
time1Intevl
pcb jincheng = new pcb();
为时间片大小(毫秒)
= i;
// 对进程进行初始化,建立就绪数组、堵塞数组。
= () + 1);
public void input()//对进程进行初始化,建立就绪队列、堵塞队列
第1页共1页
本文格式为 Word 版,下载可任意编辑,页眉双击删除即可。
//r
n=;
为可随机产生的进程数
c=;
(r=m-n)
1=;
//
b1 = b;
,b,c 分别为 ,B,C 三类
c1 = c;
资源的总量
r = m - n;
//i
time1Intevl = ;
为进城计数,i=1…n
= time1Intevl;

实验进程管理实验报告

实验进程管理实验报告

一、实验目的1. 加深对进程概念的理解,明确进程和程序的区别。

2. 进一步认识并发执行的实质,理解进程的创建、调度、同步与通信。

3. 学习使用Linux系统中的进程管理命令,掌握进程的监控、控制与优化。

二、实验环境操作系统:Linux Ubuntu 20.04实验工具:终端(Terminal)、shell命令三、实验内容1. 进程的基本概念与特性2. 进程的创建与调度3. 进程同步与通信4. 进程的监控与优化四、实验步骤1. 进程的基本概念与特性(1)通过阅读相关资料,了解进程的概念、特性和生命周期。

(2)使用shell命令查看当前系统中进程的状态,如ps、top、htop等。

2. 进程的创建与调度(1)使用fork()函数创建进程,观察父子进程之间的关系。

(2)使用exec()函数替换子进程的映像,实现进程的创建。

(3)使用wait()、waitpid()等函数等待子进程结束,控制进程执行顺序。

(4)通过修改进程优先级,观察进程调度策略的变化。

3. 进程同步与通信(1)使用互斥锁(mutex)实现进程同步,防止数据竞争。

(2)使用条件变量(condition variable)实现进程间的条件同步。

(3)使用信号量(semaphore)实现进程间的同步与通信。

(4)通过管道(pipe)、消息队列(message queue)、共享内存(shared memory)等机制实现进程间的通信。

4. 进程的监控与优化(1)使用ps、top、htop等命令监控进程的运行状态。

(2)通过调整进程优先级,优化进程的执行顺序。

(3)使用renice命令调整进程的实时性。

(4)使用nice命令调整进程的调度策略。

五、实验结果与分析1. 进程的基本概念与特性通过实验,我们了解到进程是具有一定独立功能的程序关于某个数据集合的一次运行活动,具有并发性、动态性、独立性、异步性和结构特征等特性。

2. 进程的创建与调度实验过程中,我们成功创建了多个进程,并通过修改进程优先级,观察到调度策略的变化。

linux进程管理的实验报告

linux进程管理的实验报告

linux进程管理的实验报告Linux进程管理的实验报告引言:Linux操作系统是一种开源的操作系统,以其稳定性和高度可定制性而受到广泛使用。

在Linux系统中,进程管理是一个重要的组成部分,它负责控制和管理系统中运行的进程。

本实验报告旨在探讨Linux进程管理的相关概念和实践。

一、进程的基本概念进程是指在计算机系统中正在运行的一个程序实例。

每个进程都有自己的内存空间、寄存器和状态。

在Linux系统中,每个进程都有一个唯一的进程标识符(PID),用于标识和管理进程。

二、进程的创建和终止在Linux系统中,进程的创建是通过fork()系统调用来实现的。

fork()系统调用会创建一个新的进程,新进程是原进程的一个副本,包括代码、数据和堆栈等。

新进程和原进程共享相同的代码段,但是拥有独立的数据和堆栈。

进程的终止可以通过exit()系统调用来实现。

当一个进程调用exit()系统调用时,它会释放所有的资源,并通知操作系统该进程已经终止。

此外,父进程可以通过wait()系统调用来等待子进程的终止,并获取子进程的退出状态。

三、进程的调度和优先级在Linux系统中,进程的调度是由调度器负责的。

调度器根据进程的优先级和调度策略来确定下一个要运行的进程。

Linux系统中有多种调度策略,如先来先服务(FCFS)、最短作业优先(SJF)、轮转调度(Round Robin)等。

进程的优先级用一个数字表示,范围从-20到19,其中-20表示最高优先级,19表示最低优先级。

较高优先级的进程会被优先调度,以保证其能够及时响应用户的请求。

四、进程的状态转换在Linux系统中,进程可以处于不同的状态,如运行态、就绪态和阻塞态等。

进程的状态转换是由操作系统根据进程的行为和外部事件来控制的。

当一个进程被创建时,它处于就绪态,等待被调度执行。

当进程获得CPU资源并开始执行时,它进入运行态。

当进程需要等待某个事件发生时,如等待用户输入或等待某个文件读写完成,它会进入阻塞态。

Linux系统的进程管理实验

Linux系统的进程管理实验

重点:掌握进程管理的相关命令。
难点:熟练操作 Linux 进程管理的命令。 课后作业:
撰写本次实验开题报告 作业批改记录:
教学后记:
一、实验目的 1.掌握进程管理的相关命令; 2.理解 Linux 进程管理的实质。
二、项目背景 在 Windows 2000/2003 系统下,安装 VMWare Workstation,并安装了 RedHat
章节名称
课程教案 实验三:Linux 系统的进程管理
课程类型 理论课□ 讨论课□ 习题课□ 实验课□ 上机课√ 技能课□ 其他□
授课时间
第 9 周 周一 1、2 节
教学进度
学生考勤 应到:
实到:
请假:
旷课:
教学方法 目的要求:
讲授+指导
(1)掌握进程管理的相关命令;
(2)理解 Linux 进程管理的实质。 重点难点:
命令的格式:使用 kill 命令来终止进程 # kill 15627
4)nice 功能:用于设置优先权。
命令的格式: nice [OPTION] [COMMAND [ARG]...]
主要参数:
-n 设置欲执行的指令的优先权等级。等级的范围从-20--19,其中-20 最高,19 最低,只有系统管理者可以设置负数的等级。
# renice +1 -u wenyan -p 3167 6)free 功能:用来显示内存状态。 3. 课堂小结(25 分钟): (1)和学生一起回顾学过的多种命令及其含义。 (2)留出时间让学生自己复习并上机练习不熟悉的命令。
实例: 将 ls 命令的优先权等级加 1 并且执行 ls 命令: $ nice -n 1 ls
5)renice

进程管理操作系统linux实验

进程管理操作系统linux实验

实验进程管理(一)进程的创建实验实验目的1、掌握进程的概念,明确进程的含义2、认识并了解并发执行的实质实验内容1、编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。

试观察记录屏幕上的显示结果,并分析原因。

2、修改上述程序,每一个进程循环显示一句话。

子进程显示'daughter…'及'son ……',父进程显示'parent ……',观察结果,分析原因。

实验准备(1)阅读LINUX的fork.c源码文件(见附录二),分析进程的创建过程。

(2)阅读LINUX的sched.c源码文件(见附录三),加深对进程管理概念的认识。

实验指导一、进程UNIX 中,进程既是一个独立拥有资源的基本单位,又是一个独立调度的基本单位。

一个进程实体由若干个区(段)组成,包括程序区、数据区、栈区、共享存储区等。

每个区又分为若干页,每个进程配置有唯一的进程控制块PCB,用于控制和管理进程。

PCB 的数据结构如下:1、进程表项(Process Table Entry)。

包括一些最常用的核心数据:进程标识符PID、用户标识符UID、进程状态、事件描述符、进程和U区在内存或外存的地址、软中断信号、计时域、进程的大小、偏置值nice、指向就绪队列中下一个PCB 的指针P_Link、指向U 区进程正文、数据及栈在内存区域的指针。

2、U 区(U Area)。

用于存放进程表项的一些扩充信息。

每一个进程都有一个私用的U区,其中含有:进程表项指针、真正用户标识符u-ruid(read user ID)、有效用户标识符u-euid(effective user ID)、用户文件描述符表、计时器、内部I/O参数、限制字段、差错字段、返回值、信号处理数组。

Linux进程控制实验报告1

Linux进程控制实验报告1

Linux进程控制实验报告实验名称: Linux进程控制实验要求: 一.编写一个Linux系统C程序,由父亲创建2个子进程,再由子进程各自从控制台接收一串字符串,保存在各自的全局字符串变量中,然后正常结束。

父进程调用waitpid等待子进程结束,并分别显示每个子进程的进程标识号和所接收的字符串。

二.父进程创建一子进程,父进程向子进程发送数据,子进程接收数据,并写入文件。

关键问题:一.需要用共享内存或使用vfork()函数创建子进程进行进程之间的数据共享及传递。

父进程必须等待子进程结束才能继续执行。

二.注意信号的使用。

子进程需等待父进程发送信号才执行相应操作。

父,子进程之间的通信需要用到共享内存或者父进程用vfork()创建子进程。

设计思路:一.使用共享内存实现数据共享,子进程一用shmaddr1保存输入的字符串,子进程二用shmaddr2保存字符串。

父进程等待两个子进程分别输入完字符串,然后再分别把数据显示出来。

二.用共享内存的方法来实现父子进程之间的通信,首先建立共享内存区域,然后建立子进程,并让子进程等待父进程信号。

在父进程中输入字符串,并把此字符串保存在共享内存区域,然后向子进程发出信号SIGUSR1,若子进程接受到SIGUSR1信号,则把父进程保存在共享内存区域的字符串取出,并把它写入文件。

关键代码:一.#include <unistd.h>#include <stdio.h>#include </usr/include/sys/types.h>#include <string.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/shm.h>#define KEY 1234#define SIZE 64char* shmaddr1;char* shmaddr2;main(){pid_t pid1;pid_t pid2;char* str1;char* str2;int shmid1;int shmid2;shmid1=shmget(23,SIZE,IPC_CREAT|0600);shmid2=shmget(24,SIZE,IPC_CREAT|0600);if ((pid1=fork())<0){printf("creat 1 fail!\n");exit(0);}else if(pid1==0){shmaddr1=(char*)shmat(shmid1,NULL,0);printf("creat 1 successfully!\n");scanf("%s",str1);printf("you enter:%s\n",str1);strcpy(shmaddr1,str1);shmdt(shmaddr1);exit(0);}wait();if ((pid2=fork())<0){printf("creat 2 fail!\n");exit(0);}else if(pid2==0){shmaddr2=(char*)shmat(shmid2,NULL,0);printf("creat 2 successfully!\n");scanf("%s",str2);printf("you enter:%s\n",str2);strcpy(shmaddr2,str2);shmdt(shmaddr2);exit(0);}wait();shmaddr1=(char*)shmat(shmid1,NULL,0);shmaddr2=(char*)shmat(shmid2,NULL,0);printf("one is %s\n",shmaddr1);printf("two is %s\n",shmaddr2);shmdt(shmaddr1);shmdt(shmaddr2);shmctl(shmid1,IPC_RMID,NULL);shmctl(shmid2,IPC_RMID,NULL);exit(0);}实验结果:二.#include<signal.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<sys/ipc.h>#include<sys/shm.h>#define key 1024#define size 160static void sign(int);int shmid;char* shmaddr;main(){pid_t pid;char str[20];shmid=shmget(key,size,IPC_CREAT|0600);if((pid=fork())<0){perror("创建子进程错误!\n");exit(0);}else if(pid==0){if(signal(SIGUSR1,sign)==SIG_ERR){printf("SIGUSR1错误!\n");exit(0);}pause();printf("子进程结束!\n");exit(0);}sleep(1);shmaddr=(char*)shmat(shmid,NULL,0);printf("请输入字符串:");scanf("%s",str);strcpy(shmaddr,str);shmdt(shmaddr);kill(pid,SIGUSR1);wait();shmctl(shmid,IPC_RMID,NULL);}static void sign(int signnum){int fd;char* shmaddr;if(signnum==SIGUSR1){printf("子进程接收到SIGUSR1.\n");shmaddr=(char*)shmat(shmid,NULL,0);if((fd=open("testfile.txt",O_RDWR|O_CREAT|O_TRUNC))==-1){printf("\n打开文件错误!\n");return 0;}else{printf("写入:%s\n",shmaddr);write(fd,shmaddr,20);close(fd);}shmdt(shmaddr);}}实验总结:经过此次实验,我学会了如何通过shm共享内存实现各进程间的数据共享,以及如何在父子进程之间发送信号和传输数据以及一些保存文件的操作,通过这次实验我受益良多。

实验一——Linux环境下的进程管理之欧阳治创编

实验一——Linux环境下的进程管理之欧阳治创编

软件学院上机实验报告课程名称:操作系统实验项目:实验一:Linux环境下进程管理实验室:耘慧402姓名:学号:专业班级:实验时间:一、实验目的及要求1.加深对进程概念的理解,明确进程和程序的区别;2.进一步认识并发执行的实质;3.分析进程争用资源的现象,学习解决进程互斥的方法;4.了解Linux系统中进程通信的基本原理;二、实验性质1.进程的创建:编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

2.进程的控制:修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

如果在程序中使用系统调用lockf ()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

3.用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容;利用wait( )来控制进程执行顺序。

三、实验学时实验性质:验证性实验学时: 4学时实验要求:必做四、实验环境1.实验环境: Linux系统开发环境2.知识准备:(1) Linux系统开发环境搭建;(2) Linux环境下GCC编译器的使用;(3)语言中函数定义与调用、指针和类型的定义与使用、结构的定义、动态内存的申请等预备知识。

五、实验内容及步骤①实验内容:(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

(2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

软件学院欧阳光明(2021.03.07)上机实验报告课程名称:操作系统实验项目:实验一:Linux环境下进程管理实验室:耘慧402姓名:学号:专业班级:实验时间:一、实验目的及要求1.加深对进程概念的理解,明确进程和程序的区别;2.进一步认识并发执行的实质;3.分析进程争用资源的现象,学习解决进程互斥的方法;4.了解Linux系统中进程通信的基本原理;二、实验性质1.进程的创建:编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

2.进程的控制:修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

如果在程序中使用系统调用lockf ()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

3.用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容;利用wait( )来控制进程执行顺序。

三、实验学时实验性质:验证性实验学时: 4学时实验要求:必做四、实验环境1.实验环境: Linux系统开发环境2.知识准备:(1) Linux系统开发环境搭建;(2) Linux环境下GCC编译器的使用;(3)语言中函数定义与调用、指针和类型的定义与使用、结构的定义、动态内存的申请等预备知识。

五、实验内容及步骤①实验内容:(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

(2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

(3)用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容;利用wait( )来控制进程执行顺序。

②实验步骤:1.进程的创建1.1 进程UNIX中,进程既是一个独立拥有资源的基本单位,又是一个独立调度的基本单位。

一个进程实体由若干个区(段)组成,包括程序区、数据区、栈区、共享存储区等。

每个区又分为若干页,每个进程配置有唯一的进程控制块PCB,用于控制和管理进程。

PCB的数据结构如下:(1)进程表项(Process Table Entry)。

包括一些最常用的核心数据:进程标识符PID、用户标识符UID、进程状态、事件描述符、进程和U区在内存或外存的地址、软中断信号、计时域、进程的大小、偏置值nice、指向就绪队列中下一个PCB的指针P_Link、指向U区进程正文、数据及栈在内存区域的指针。

(2)U区(U Area)。

用于存放进程表项的一些扩充信息。

每一个进程都有一个私用的U区,其中含有:进程表项指针、真正用户标识符u-ruid(read user ID)、有效用户标识符u-euid(effective user ID)、用户文件描述符表、计时器、内部I/O参数、限制字段、差错字段、返回值、信号处理数组。

由于UNIX系统采用段页式存储管理,为了把段的起始虚地址变换为段在系统中的物理地址,便于实现区的共享,所以还有:(3)系统区表项。

以存放各个段在物理存储器中的位置等信息。

系统把一个进程的虚地址空间划分为若干个连续的逻辑区,有正文区、数据区、栈区等。

这些区是可被共享和保护的独立实体,多个进程可共享一个区。

为了对区进行管理,核心中设置一个系统区表,各表项中记录了以下有关描述活动区的信息:区的类型和大小、区的状态、区在物理存储器中的位置、引用计数、指向文件索引结点的指针。

(4)进程区表系统为每个进程配置了一张进程区表。

表中,每一项记录一个区的起始虚地址及指向系统区表中对应的区表项。

核心通过查找进程区表和系统区表,便可将区的逻辑地址变换为物理地址。

1.2 进程映像UNIX系统中,进程是进程映像的执行过程,也就是正在执行的进程实体。

它由三部分组成:(1)用户级上、下文。

主要成分是用户程序;(2)寄存器上、下文。

由CPU中的一些寄存器的内容组成,如PC,PSW,SP及通用寄存器等;(3)系统级上、下文。

包括OS为管理进程所用的信息,有静态和动态之分。

1.3 所涉及的系统调用fork( )创建一个新进程。

系统调用格式:pid=fork( )参数定义:int fork( )fork( )返回值意义如下:0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。

>0:在父进程中,pid变量保存的fork( )返回值为子进程的id值(进程唯一标识符)。

-1:创建失败。

如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。

此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程(parent process)的副本,称为子进程(child process)。

子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。

父进程与子进程并发执行。

1.4 核心为fork( )完成以下操作(1)为新进程分配一进程表项和进程标识符进入fork( )后,核心检查系统是否有足够的资源来建立一个新进程。

若资源不足,则fork( )系统调用失败;否则,核心为新进程分配一进程表项和唯一的进程标识符。

(2)检查同时运行的进程数目超过预先规定的最大数目时,fork( )系统调用失败。

(3)拷贝进程表项中的数据将父进程的当前目录和所有已打开的数据拷贝到子进程表项中,并置进程的状态为“创建”状态。

(4)子进程继承父进程的所有文件对父进程当前目录和所有已打开的文件表项中的引用计数加1。

(5)为子进程创建进程上、下文进程创建结束,设子进程状态为“内存中就绪”并返回子进程的标识符。

(6)子进程执行虽然父进程与子进程程序完全相同,但每个进程都有自己的程序计数器PC(注意子进程的PC开始位置),然后根据pid变量保存的fork( )返回值的不同,执行了不同的分支语句。

六、实验数据及结果分析<运行结果1〉分析:由于函数printf()输出的字符串之间不会被中断,因此,每个字符串内部的字符顺序输出时不变。

但是 , 由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。

这与打印单字符的结果相同。

<运行结果2〉分析:因为上述程序执行时,lockf(1,1,0)锁定标准输出设备,lockf(1,0,0)解锁标准输出设备,在lockf(1,1,0)与lockf(1,0,0)中间的for循环输出不会被中断,加锁与不加锁效果不相同。

<运行结果3〉分析:程序在调用fork( )建立一个子进程后,马上调用wait( ),使父进程在子进程结束之前,一直处于睡眠状态。

子进程用exec( )装入命令ls ,exec( )后,子进程的代码被ls的代码取代,这时子进程的PC指向ls的第1条语句,开始执行ls的命令代码。

七、实验总结经过这次上机实验的学习,我们一共做了三道题,碰到的第一问题是Linux系统并非我们通常使用的Windows系统,还未上手便已产生畏惧的心理;碰到的第二个问题,在刚开始搭建环境的时候,..后面的的并非手打而是按Tab键引出之后的代码,之后陆陆续续的一些小问题,在老师、学长耐心的帮助下相对轻松地解决了,相比在课堂上老师的讲解与课件的演示,最大的不同是我更加的直观且真实触摸到了这一学科,在实践的过程中明白了当时逻辑并不清晰的抽象问题——什么是进程,我想在实践的过程中我会更加热爱这个学科并受益匪浅。

附录源程序清单〈程序1〉#include<stdio.h>void main(){int p1,p2;while((p1=fork())==-1);if(p1==0)putchar('b');else{while((p2=fork())==-1);if(p2==0)putchar('c');else putchar('a');}}<程序2〉#include<stdio.h>#include<unistd.h>main(){int p1,p2,i;while((p1=fork())==-1);if(p1==0){lockf(1,1,0);for(i=0;i<50;i++)printf("child %d/n",i); lockf(1,0,0);}else{while((p2=fork())==-1);if(p2==0){lockf(1,1,0);for(i=0;i<50;i++)printf("son %d/n",i);lockf(1,0,0);}else{lockf(1,1,0);for(i=0;i<50;i++)printf("daughter %d/n",i); lockf(1,0,0);}}}〈程序3〉#include<stdio.h>#include<unistd.h>main( ){int pid;pid=fork( ); /*创建子进程*/switch(pid){case -1:/*创建失败*/printf("fork fail!\n");exit(1);case 0:/*子进程*/execl("/bin/ls","ls","-1","-color",NULL); printf("exec fail!\n");exit(1);default:/*父进程*/wait(NULL);/*同步*/printf("ls completed !\n");exit(0);}}。

相关文档
最新文档