实验2进程管理

实验2进程管理
实验2进程管理

实验2 进程管理

1、实验目的

(1)加深对进程概念的理解,明确进程和程序的区别。

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

(3)分析进程竞争资源现象,学习解决进程互斥的方法。

(4)了解Linux系统中进程通信的基本原理。

2、实验预备内容

(1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。

(2)阅读Linux的fork.c源文件,分析进程的创建过程。

3、实验内容

(1)进程的创建

编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。(2)进程的控制

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

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

(3)①编写一段程序,使其现实进程的软中断通信。

要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:

Child Processll is Killed by Parent!

Child Processl2 is Killed by Parent!

父进程等待两个子进程终止后,输出如下的信息后终止

Parent Process is Killed!

②在上面的程序中增加语句signal (SIGNAL, SIG-IGN) 和signal (SIGQUIT, SIG-IGN), 观察执行结果,并分析原因。

(4)进程的管道通信

编制一段程序,实现进程的管理通信。

使用系统调用pipe()建立一条管道线;两个子进程P1和P2分别向管道中写一句话:

Child 1 is sending a message!

Child 2 is sending a message!

而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。

要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。

4、思考

(1)系统是怎样创建进程的?

(2)可执行文件加载时进行了哪些处理?

(3)当首次调用新创建进程时,其入口在哪里?

(4)进程通信有什么特点?

实验2 指导

[实验内容]

1.进程的创建

〈任务〉

编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。〈程序〉

#include

main()

{

int p1,p2;

if(p1=fork()) /*子进程创建成功*/

putchar('b');

else

{

if(p2=fork()) /*子进程创建成功*/

putchar('c');

else putchar('a'); /*父进程执行*/

}

}

<运行结果>

bca(有时会出现abc的任意的排列)

分析:从进程执行并发来看,输出abc的排列都是有可能的。

原因:fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,所以输出abc的排列都是有可能的。

2.进程的控制

<任务>

修改已编写好的程序,将每个程序的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。如果在程序中使用系统调用lockf()来给每个程序加锁,可以实现进程之间的互斥,观察并分析出现的现象。

〈程序1〉

#include

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);

}

}

}

〈运行结果〉

parent….

son…

grandchild…

grandchild…

或grandchild

…son

…grandchild

…son

…parent

分析:由于函数printf()输出的字符串之间不会被中断,因此,每个字符串内部的字符顺序输出时不变。但是 , 由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。

〈程序2〉

#include

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);

}

}

}

<运行结果〉

输出parent块,son块,grandchild块的顺序可能不同,但是每个块的输出过程不会被打断。

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

3.软中断通信

〈任务1〉

编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用

kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:child process1 is killed by parent!

child process2 is killed by parent!

父进程等待两个子进程终止后,输出以下信息后终止:

parent process is killed!

<程序流程图>

〈程序〉

#include

#include

#include

void waiting(),stop(),alarming();

int wait_mark;

main()

{

int p1,p2;

if(p1=fork()) /*创建子进程p1*/

{

if(p2=fork()) /*创建子进程p2*/

{

wait_mark=1;

signal(SIGINT,stop); /*接收到^c信号,转stop*/

signal(SIGALRM,alarming);/*接受SIGALRM

waiting();

kill(p1,16); /*向p1发软中断信号16*/

kill(p2,17); /*向p2发软中断信号17*/

wait(0); /*同步*/

wait(0);

printf("parent process is killed!\n");

exit(0);

}

else

{

wait_mark=1;

signal(17,stop);

signal(SIGINT,SIG_IGN); /*忽略^c信号*/

while (wait_mark!=0);

lockf(1,1,0);

printf("child process2 is killed by parent!\n");

lockf(1,0,0);

exit(0);

}

}

else

{

wait_mark=1;

signal(16,stop);

signal(SIGINT,SIG_IGN); /*忽略^c信号*/

while (wait_mark!=0)

lockf(1,1,0);

printf("child process1 is killed by parent!\n");

lockf(1,0,0);

exit(0);

}

}

void waiting()

{

sleep(5);

if (wait_mark!=0)

kill(getpid(),SIGALRM);

}

void alarming()

{

wait_mark=0;

}

void stop()

{

wait_mark=0;

}

<运行结果>

不做任何操作等待五秒钟父进程回在子进程县推出后退出,并打印退出的顺序;或者点击ctrl+C后程序退出并打印退出的顺序。

〈任务2〉

在上面的任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。这里,signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略键信号以及忽略中断信号。

<程序>

#include

#include

#include

int pid1,pid2;

int EndFlag=0;

int pf1=0;

int pf2=0;

void IntDelete()

{

kill(pid1,16);

kill(pid2,17);

}

void Int1()

{

printf("child process 1 is killed !by parent\n");

exit(0);

}

void Int2()

{

printf("child process 2 is killed !by parent\n");

exit(0);

}

main()

{

int exitpid;

if(pid1=fork())

{

if(pid2=fork())

{

signal(SIGINT,IntDelete);

waitpid(-1,&exitpid,0);

waitpid(-1,&exitpid,0);

printf("parent process is killed\n");

exit(0);

}

else

{

signal(SIGINT,SIG_IGN);

signal(17,Int2);

pause();

}

}

else

{

signal(SIGINT,SIG_IGN);

signal(16,Int1);

pause();

}

}

〈运行结果〉

请读者将上述程序输入计算机后,执行并观察。

进程管理实验报告

实验2过程管理实验报告学生号姓名班级电气工程系过程、过程控制块等基本原理过程的含义:过程是程序运行过程中对数据集的处理,以及由独立单元对系统资源的分配和调度。在不同的数据集上运行程序,甚至在同一数据集上运行多个程序,是一个不同的过程。(2)程序状态:一般来说,一个程序必须有三种基本状态:就绪、执行和阻塞。然而,在许多系统中,过程的状态变化可以更好地描述,并且增加了两种状态:新状态和终端状态。1)就绪状态,当一个进程被分配了除处理器(CPU)以外的所有必要资源时,只要获得了处理器,进程就可以立即执行。此时,进程状态称为就绪状态。在系统中,多个进程可以同时处于就绪状态。通常,这些就绪进程被安排在一个或多个队列中,这些队列称为就绪队列。2)一旦处于就绪状态的进程得到处理器,它就可以运行了。进程的状态称为执行状态。在单处理器系统中,只有一个进程在执行。在多处理器系统中,可能有多个进程在执行中。3)阻塞状态由于某些事件(如请求输入和输出、额外空间等),执行进程被挂起。这称为阻塞状态,也称为等待状态。通常,处于阻塞状态的进程被调度为-?这个队列称为阻塞队列。4)新状态当一个新进程刚刚建立并且还没有放入就绪队列中时,它被称为新状态。5)终止状态是

什么时候-?进程已正常或异常终止,操作系统已将其从系统队列中删除,但尚未取消。这就是所谓的终结状态。(3)过程控制块是过程实体的重要组成部分,是操作系统中最重要的记录数据。控制块PCB记录操作系统描述过程和控制过程操作所需的所有信息。通过PCB,一个不能独立运行的程序可以成为一个可以独立运行的基本单元,并且可以同时执行一个进程。换句话说,在进程的整个生命周期中,操作系统通过进程PCB管理和控制并发进程。过程控制块是系统用于过程控制的数据结构。系统根据进程的PCB来检测进程是否存在。因此,进程控制块是进程存在的唯一标志。当系统创建一个进程时,它需要为它创建一个PCB;当进程结束时,系统回收其PCB,进程结束。过程控制块的内容过程控制块主要包括以下四个方面的信息。过程标识信息过程标识用于对过程进行标识,通常有外部标识和内部标识。外部标识符由流程的创建者命名。通常是一串字母和数字。当用户访问进程时使用。外部标识符很容易记住。内部标识符是为了方便系统而设置的。操作系统为每个进程分配一个唯一的整数作为内部标识符。通常是进程的序列号。描述性信息(process scheduling message)描述性信息是与流程调度相关的一些有关流程状态的信息,包括以下几个方面。流程状态:表

实验二进程管理

实验二进程管理 (一)实验目的或实验原理 1.加深对进程概念的理解,明确进程和程序的区别。 2.进一步认识并发执行的实质。 3.分析进程竞争资源现象,学习解决进程互斥的方法。 4.了解Linux系统中进程通信的基本原理。 (二)实验内容 1.进程的创建。 2.进程的控制。 3.①编写一段程序,使其现实进程的软中断通信。 要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Processll is Killed by Parent! Child Processl2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止 Parent Process is Killed! ②在上面的程序中增加语句signal (SIGNAL, SIG-IGN) 和signal (SIGQUIT, SIG-IGN), 观察执行结果,并分析原因。 4.进程的管道通信。 编制一段程序,实现进程的管理通信。 使用系统调用pipe()建立一条管道线;两个子进程P1和P2分别向管道中写一句话: Child 1 is sending a message! Child 2 is sending a message! 而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。 要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。 实验2 指导 [实验内容] 1.进程的创建 〈任务〉 编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。 〈程序〉 #include<> main() { int p1,p2; if(p1=fork()) /*子进程创建成功*/ p utchar('b'); else { if(p2=fork()) /*子进程创建成功*/

操作系统实验报告--实验一--进程管理

实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图

2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0;

操作系统实验二(进程管理)

操作系统进程管理实验 实验题目: (1)进程的创建编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。 (2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。 (3)编制一段程序,使其实现进程的软中断通信。要求:使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按Del键);当捕捉到中断信号后,父进程调用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Child process 1 is killed by parent! Child process 2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止:Parent process is killed! 在上面的程序中增加语句signal(SIGINT, SIG_IGN)和signal(SIGQUIT, SIG_IGN),观察执行结果,并分析原因。 (4)进程的管道通信编制一段程序,实现进程的管道通信。使用系统调用pipe( )建立一条管道线;两个进程P1和P2分别向管道各写一句话:Child 1 is sending a message! Child 2 is sending a message! 而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。 实验源程序及报告: (1)、进程的创建 #include int main(int argc, char *argv[]) { int pid1,pid2; /*fork first child process*/ if ( ( pid1=fork() ) < 0 ) { printf( "ProcessCreate Failed!"); exit(-1); }

实验二 进程管理

实验二进程管理 实验目的 通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程与程序的区别。 实验内容 1、了解系统调用fork()、exec()、exit()和waitpid()的功能和实现过程。 2、编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。 3、编写一段程序,使用系统调用fork()来创建一个子进程,子进程通过系统调用exec()更换自己的执行代码,显示新的代码“new program.”后,调用exit()结束。而父进程则调用waitpid()等待子进程结束,并在子进程结束后显示子进程的标识符,然后正常结束。

实验指导 一、所涉及的系统调用 1、getpid 在2.4.4版内核中,getpid是第20号系统调用,其在Linux函数库中的原型是: getpid的作用很简单,就是返回当前进程的进程ID,请大家看以下的例子: 这个程序的定义里并没有包含头文件sys/types.h,这是因为我们在程序中没有用到pid_t类型,pid_t类型即为进程ID的类型。事实上,在i386架构上(就是我们一般

PC计算机的架构),pid_t类型是和int类型完全兼容的,我们可以用处理整形数的方法去处理pid_t类型的数据,比如,用"%d"把它打印出来。 编译并运行程序getpid_test.c: 再运行一遍: 正如我们所见,尽管是同一个应用程序,每一次运行的时候,所分配的进程标识符都不相同。 2、fork 在2.4.4版内核中,fork是第2号系统调用,其在Linux函数库中的原型是:

实验项目二进程管理

实验项目二进程管理 一、实验目的 1.理解进程的概念,掌握父、子进程创建的方法。 2.认识和了解并发执行的实质,掌握进程的并发及同步操作。 二、实验内容 1.编写一C语言程序,实现在程序运行时通过系统调用fork( ) 创建两个子进程,使父、子三进程并发执行,父亲进程执行 时屏幕显示“I am father ,”儿子进程执行时屏幕显示“I am son ”,女儿进程执行时屏幕显示“ I am daughter。” 2.多次连续反复运行这个程序,观察屏幕显示结果的顺序,直 至出现不一样的情况为止。记下这种情况,试简单分析其原 因。 3.修改程序,在父、子进程中分别使用wait() 、exit()等系统调用 “实现”其同步推进,并获取子进程的ID 号及结束状态值。 多次反复运行改进后的程序,观察并记录运行结果。 三、源程序及运行结果 源程序 1: #include #include #include #include int main() { pid_t pid; char *a; int num; printf("starting:\n");

pid = fork(); if (pid == -1) { printf("failed"); exit(1); } else if (pid == 0) { a = "I am son"; } else { a = "I am father"; pid = fork(); if (pid == -1) { printf("failed"); exit(1); } else if (pid == 0) { a = "I am daughter"; } } for (num=3;num>0;num--) { puts(a); sleep(1); } exit(0); } 运行结果:

实验二

实验2 进程管理 1、实验目的 (1)加深对进程概念的理解,明确进程和程序的区别。 (2)进一步认识并发执行的实质。 (3)分析进程竞争资源现象,学习解决进程互斥的方法。 (4)了解Linux系统中进程通信的基本原理。 2、实验预备内容 (1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。 (2)阅读Linux的fork.c源文件,分析进程的创建过程。 3、实验内容 (1)进程的创建 编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。(2)进程的控制 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。 如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。 (3)①编写一段程序,使其实现进程的软中断通信。 要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Processll is Killed by Parent! Child Processl2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止 Parent Process is Killed! ②在上面的程序中增加语句signal (SIGNAL, SIG-IGN) 和signal (SIGQUIT, SIG-IGN), 观察执行结果,并分析原因。

Linux实验五 进程管理命令

实验五进程管理命令 一、实验目的 (1)了解如何监视系统运行状态 (2)掌握查看、删除进程的正确方法 (3)掌握命令在后台运行的用法 (4)掌握进程手工、调度启动的方法 二、常用命令 who 查看当前在线用户 top 监视系统状态 ps 查看进程 kill 向进程发信号 bg 把进程变成后台运行 & 把进程变成后台运行 fg 把后台进程变成前台运行 jobs 显示处于后台的进程。 at 在指定的时刻执行指定的命令或命令序列 batch 在系统负载较低、资源较空闲时执行命令或命令序列以上命令的具体用法请参阅教材、课件和man手册 三、实验内容 1、用top命令察看当前系统的状态,并识别各进程的有关栏目。 2、用ps命令察看系统当前的进程,并把系统当前的进程保存到文件 process中。

3、用ps命令察看系统当前有没有init进程。 4、输入“cat <回车>” 按-z 键,出现什么情况?输入fg命令出现什么情况? 答:将cat进程挂起,fg将挂起进程调到前台运行 按-c 键,出现什么情况? 答;强制中断 5、输入“find / -name ls*>temp &”,该命令的功能是什么? 查看该进程; 答:在根目录下按名字查找以ls开头的文件,并把查询结果保存到temp文件,并且把进程置为后台运行 输入killall find命令后,再查看该进程。 答:输入该命令后回车后,和fand相关的进程全部被杀死 6、输入“find / -name ls*>temp &” 输入jobs命令,出现什么情况? 答;查看后台进程的信息 输入fg命令出现什么情况? 答:将后台进程调到前台运行

复习课件操作系统实验二进程管理.doc

操作系统实验 实验二进程管理 学号 姓名 班级 华侨大学电子工程系

实验目的 1、理解进程的概念,明确进程和程序的区别。 2、理解并发执行的实质。 3、掌握进程的创建、睡眠、撤销等进程控制方法。 实验内容与要求 基本要求:用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。 实验报告内容 1、进程、进程控制块等的基本原理。 进程是现代操作系统中的一个最基本也是最重要的概念,掌握这个概念对于理解操作系统实质,分析、设计操作系统都有其非常重要的意义。为了强调进程的并发性和动态性,可以给进程作如下定义:进程是可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。 进程又就绪、执行、阻塞三种基本状态,三者的变迁图如下: 由于多个程序并发执行,各程序需要轮流使用CPU,当某程序不在CPU上运行时,必须保留其被中断的程序的现场,包括:断点地址、程序状态字、通用寄存器的内容、堆栈内容、程序当前状态、程序的大小、运行时间等信息,以便程序再次获得CPU时,能够正确执行。为了保存这些内容,需要建立—个专用数据结构,我们称这个数据结构为进程控制块PCB (Process Control Block)。 进程控制块是进程存在的惟一标志,它跟踪程序执行的情况,表明了进程在当前时刻的状态以及与其它进程和资源的关系。当创建一个进程时,实际上就是为其建立一个进程控制块。 在通常的操作系统中,PCB应包含如下一些信息: ①进程标识信息。为了标识系统中的各个进程,每个进程必须有惟一的标识名或标 识数。 ②位置信息。指出进程的程序和数据部分在内存或外存中的物理位置。 ③状态信息。指出进程当前所处的状态,作为进程调度、分配CPU的依据。 ④进程的优先级。一般根据进程的轻重缓急其它信息。 这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。

操作系统-实验三-进程管理-实验报告

计算机与信息工程学院实验报告 一、实验内容 1.练习在shell环境下编译执行程序 (注意:①在vi编辑器中编写名为sample.c的c语言源程序 ②用linux自带的编译器gcc编译程序,例如:gcc –o test sample.c ③编译后生成名为test.out的可执行文件; ④最后执行分析结果;命令为:./test) 注意:linux自带的编译程序gcc的语法是:gcc –o 目标程序名源程序名,例如:gcc –o sample1 sample1.c,然后利用命令:./sample 来执行。如果仅用“gcc 源程序名”,将会把任何名字的源程序都编译成名为a.out的目标程序,这样新编译的程序会覆盖原来的程序,所以最好给每个源程序都起个新目标程序名。 2.进程的创建 仿照例子自己编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a”,子进程分别显示字符“b”和“c”。观察记录屏幕上的显示结果,并分析原因。 3.分析程序 实验内容要在给出的例子程序基础上,根据要求进行修改,对执行结果进行分析。二、

实验步骤 1. 利用fork()创建一个小程序 (1)编写程序 #include main () { int i=5; pid_t pid; pid=fork(); for(;i>0;i--) { if (pid < 0) printf("error in fork!"); else if (pid == 0) printf("i am the child process, my process id is %d and i=%d\n",getpid(),i); else printf("i am the parent process, my process id is %d and i=%d\n",getpid(),i); } for(i=5;i>0;i--) { if (pid < 0) printf("error in fork!"); else if (pid == 0) printf("the child process, my process id is %d and i=%d\n",getpid(),i); else printf("the parent process, my process id is %d and

2016物联网 实验二 进程管理

实验2 进程管理 学号:姓名:班级: 背景知识 Windows的任务管理器提供了用户计算机上正在运行的程序和进程的相关信息,也显示了最常用的度量进程性能的单位。使用任务管理器,可以打开监视计算机性能的关键指示器,快速查看正在运行的程序的状态,或者终止已停止响应的程序。也可以使用多个参数评估正在运行的进程的活动,以及查看CPU 和内存使用情况的图形和数据。其中: 1) “应用程序”选项卡显示正在运行程序的状态,用户能够结束、切换或者启动程序。 2) “进程”选项卡显示正在运行的进程信息。例如,可以显示关于CPU 和内存使用情况、页面错误、句柄计数以及许多其他参数的信息。 3) “性能”选项卡显示计算机动态性能,包括CPU 和内存使用情况的图表,正在运行的句柄、线程和进程的总数,物理、核心和认可的内存总数(KB) 等。 实验目的 通过在Windows 任务管理器中对程序进程进行响应的管理操作,熟悉操作系统进程管理的概念,学习观察操作系统运行的动态性能。工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 需要准备一台运行Windows操作系统的计算机。 实验内容与步骤 1. 使用任务管理器终止进程 2. 显示其他进程计数器

3. 更改正在运行的程序的优先级 4.Process Explorer的使用 启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口,如图2-1所示。 图2-1 Windows的任务管理器 在本次实验中,你使用的操作系统版本是: win10 当前机器中由你打开,正在运行的应用程序有: 1)windpw资源管理器 2)WPS writer 3)电脑管家 Windows“任务管理器”的窗口由7个选项卡组成,分别是: 1)进程 2) 性能

实验二 进程控制

实验四进程控制 【实验目的】 1、掌握进程的概念,明确进程和程序的区别。 2、认识和了解并发执行的实质。 3、分析进程争用资源的现象,学习解决进程互斥的方法。 【实验内容】 1、进程的创建(必做题) 编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。 <参考程序> # include 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 main() { int p1, p2, i; while((p1=fork())= = -1); if(p1= =0) for(i=0;i<500;i++) printf(“child%d\n”,i); else

If(p2= =0) for(i=0;i<500;i++) printf(“son%d \n”,i); else for(i=0;i<500;i++) printf(“daughter%d \n”,i); } } 3、编写程序创建进程树如图1和图2所示,在每个进程中显示当前进程识别码和父进程识别码。(必做题) 【思考题】 1、系统是怎样创建进程的? 2、当首次调用新创建进程时,其入口在哪里? 3、当前运行的程序(主进程)的父进程是什么? 【实验报告】 1、列出调试通过程序的清单,分析运行结果。 2、给出必要的程序设计思路和方法(或列出流程图)。 3、回答思考题。 4、总结上机调试过程中所遇到的问题和解决方法及感想。 #include main() {int p1,p2,p3; while((p1=fork())==-1); if(p1==0) { while((p2=fork())==-1); if(p2==0) { 父进程 图1 进程树 图2 进程树

实验2-进程控制与通信管理

年级11级专业计算机科学与技术班级五班 组号12组实验室9#205 日期2014/05/17 实验 名称 实验二、进程控制与通信管理 实验内容 分项内容 实验级别 1、Linux 系统常用进程管理命令的使用操作系统观察级 2、Linux 系统常用进程创建与管理的系统调用原码阅读与系统编程级 3、Windows平台常用进线程控制API 原码阅读与系统编程级 4、进程同步与互斥控制(读者写者、一家人吃苹果桔子、 哲学家吃饭) 码阅读与系统编程级 5、简单进程通信(管道、消息缓冲、邮件槽等) (原码阅读与系统编程 级) 小组成员 姓名学号组内分工自我评分教师评分 独立完成实验二(1)良好 独立完成实验二(2)良好 独立完成实验二(3)良好 独立完成实验二(4)良好 独立完成实验二(5)良好 小 组 成 绩 评 定 教师签名: 年月日

实验分项1 1、Linux 系统常用进程管理命令的使用2、Linux 系统常用进程创建与管理的系统调用3、Windows平台常用进线程控制API 4、进程同步与互斥控制5、简单进程通信 实验目的一、实验目的: 1、加深对进程概念的理解,明确进程和程序的区别。 2、进一步认识并发执行的实质。 3、分析进程争用资源的现象,学习解决进程互斥的方法。 实 验要求具体题目:进程创建、进程控制 系统平台:Linux/Windows操作系统 实验原理步骤(算法流程)二、实验原理 1.Linux 系统常用进程管理命令 (1)at命令:定时运行命令 让系统在两天后的17:30执行文件data中指定的作业,使用命令: #at -f data 15:30 +2 days (2)bg命令后台运行命令 如果要将一个大目录的文件进行排序后,将结果输入到一个文件中,可以使用命令:#du -a / | sort -rn > /tmp/du.sorted (3)Fg挂起程序 使用fg命令时,要加入后台任务号码,如果不加任何号码,则所变动的均是当前任务。 #du -a / | sort -rn > /tmp/du.sorted &[1] 237 #fg 1 (4)Jobs显示后台程序 先把两个进程放在系统后台运行,然后使用jobs命令查看后台任务的执行情况: #du -a /etc > user.data & [1] 233 # find / -name core -type f -ls > core.data & [2] 234 #jobs -l [1] + 237 Running du -a /etc > user.data [2] - 238 Running find / -name core -type f -ls > core.data (5)kill命令杀掉进程

操作系统实验2进程管理报告

实验一进程管理 一、实验目的: 1.加深对进程概念的理解,明确进程和程序的区别; 2.进一步认识并发执行的实质; 3.分析进程争用资源的现象,学习解决进程互斥的方法; 4.了解Linux系统中进程通信的基本原理; 二、实验预备容: 1.阅读Linux的sched.h源码文件,加深对进程管理概念的理解; 2.阅读Linux的fork()源码文件,分析进程的创建过程; 三、实验环境说明: 1.此实验采用的是Win7(32bit)下虚拟机VMware-workstation-10.0.4 build-2249910; 2.ubuntu 版本 3.19.0; 3.直接编写c文件在终端用命令行执行; 4.虚拟机分配8G存中的1024M; 5.虚拟机名称knLinux; 6.ubuntu用户名kn; 四、实验容: 1.进程的创建: a)题目要求: 编写一段程序,使用系统调用fork() 创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显 示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。 试观察记录屏幕上的显示结果,并分析原因。 b)程序设计说明: 一个父进程,两个子进程,分别输出显示a,b,c。 c)源代码:

d)运行结果:

e)分析: 由输出结果可知,运行结果不唯一,可以是abc,acb,bca等多种情况。 因为在程序中,并没有三个进程之间的同步措施,所以父进程和子进程的 输出顺序是随机的。在试验次数足够大的情况下,6中顺序都有可能出现: abc, acb, bac, bca, cab, cba。 2.进程的控制: a)修改已经编写的程序,将每个进程输出一个字符改为每个进程输出一句话, 再观察程序执行时屏幕上出现的现象,并分析原因。 i.程序设计说明: 将第一个程序中输出字符的语句改为输出parent process和child process1&2的语句。 ii.源代码:

实验二-实验报告(进程管理)

实验二模拟实现进程管理 组长:和林软件1402 一、实验目的 1.理解进程的概念,明确进程和程序的区别。 2.理解并发执行的实质。 3.掌握进程的创建,睡眠,撤销等进程控制方法。 二、实验容 用C语言,JAVA语言,C++语言编写程序,模拟实现创建新的进程;查看运行进程,换出某个进程;杀死运行进程。 三、实验准备 1.进程的定义 进程是程序在一个数据集合上的运行过程,是系统资源分 配和调度的一个独立单位。一个程序在不同的数据集合上 运行,乃至一个程序在同样数据集合上的多次运行都是不 同的进程。 2.进程的状态 通常情况下,一个进程必须具有就绪,执行和阻塞三种基本

情况。 1)就绪状态 当进程已分配到除处理器外的所有必要资源后,只要再 获得处理器就可以立即执行,这时进程的状态就为就绪 状态。在一个系统里,可以有多个进程同时处于就绪状 态,通常把这些就绪进程排成一个或多个队列,称为就 绪队列。 2)执行状态 处于就绪状态的进程一旦获得处理器,就可以运行,进 程状态也就处于执行状态,在单处理器系统中,只能有 一个进程处于执行状态,在多处理器系统中,则可能有 多个进程处于执行状态 3)阻塞状态 正在执行的进程因为发生某些事件而暂停运行,这种受 阻暂停的状态称为阻塞状态,也可称为等待状态。通常 将处于阻塞状态的进程拍成一个队列,称为阻塞队列, 在有些系统中,也会按阻塞原因的不同将阻塞状态的进 程排成多个队列。 3.进程状态之间的转换

4.进程控制块 1)进程控制块的作用 进程控制块是进程实体的重要组成部分,主要包含下述四个方面的信息: a)进程标示信息 b)说明信息 c)现场信息 d)管理信息 5.进程控制块的组织方式 1)方式 2)索引方式 6.进程控制原语 1)创建原语 2)撤销原语 3)阻塞原语 4)唤醒原语 7.程序代码 #include #include using namespace std; void clrscr(); void create(); void run( ); void exchange( );//唤出 void kill( ); void wakeUp( );//唤醒 struct process_type{

实验2 Linux进程管理

实验2 Linux进程管理 实验目的 1、加深对进程概念的理解,明确进程和程序的区别 2、进一步认识并发执行的实质 3、分析进程争用资源的现象,学习解决进程互斥的方法 实验性质 验证性实验,必做,3课时 预习与实验要求 1、阅读Linux的sched.h源码文件,加深对进程概念的理解 2、阅读Linux的fork.c源码文件,分析进程的创建过程 要用到的系统调用 1、int fork( )创建一个新进程 头文件:#include #include 返回值的意义:0,创建子进程,从子进程返回的id值 -1,创建失败 大于0,从父进程返回的子进程id值 2、lockf(files, function, size)锁定/解锁文件或文件的某段 该函数的头文件为:#include 参数定义:int lockf(int files, int function, long size) 含义:files是文件描述符; function为1(常量F_LOCK)表示互斥锁定,为0(常量F_ULOCK)表示解锁; size是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。 实验内容 0、创建进程。 输入并运行下面的程序。思考为什么会输出两行信息。【建议用emacs或gedit编辑】 int main(){

int pid; pid = fork(); switch(pid){ case -1: printf("fail to create process\n"); return 1; case 0: //对于子进程来讲,变量pid的值为0 printf("I'm son, my pid is %d, my father's pid is %d\n", getpid(), getppid()); break; default: //对于父进程来讲,pid记录了返回的子进程的ID,必然大于0 printf("I'm father, my pid is %d, my son's pid is %d\n", getpid(), pid); } return 0; } 输出结果并非是一行,而是2行。比如,结果可能是: I'm son, my pid is 1860, my father's pid is 1859 I'm father, my pid is 1859, my son's pid is 1860 解释: fork函数被调用一次但返回两次。两次返回的唯一区别:子进程中返回0值,父进程中返回子进程ID。 为什么返回两次?原因:linux将父进程的地址空间、数据空间、堆、栈等资源复制一份给子进程,子进程是父进程的副本,只有代码段是共享的。注意:由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。不同的是,fork()返回给父进程的是新建子进程的ID,返回给子进程的是0。 如果对“返回”还难以理解,想一下学C语言时候的函数调用。函数调用时,将返回地址入栈,再将实参入栈。被调函数从栈中取出参数,赋值给形参,执行完后,取出返回地址,跳回去继续执行。 1、验证进程并发执行 编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符串:父进程显示“parent is working”;两个子进程分别显示“son is working”和“daughter is working”。多运行几次该程序,观察屏幕上的显示结果,并分析原因。 <程序1如下>文件名为a21.c #include main(){ int p1,p2; while((p1=fork( ))= = -1); /*创建子进程,将其ID号给p1,直到成功*/ if(p1= =0) printf(“son is working\n”);/*子进程返回的p1才为0,说明此时子进程执行*/ else{/*p1>0,说明此p1是父进程函数调用返回的子进程的ID号*/ while((p2=fork( ))= = -1); /*创建子进程p2,将其ID号给p2,直到成功*/ if(p2= =0) printf(“dauthter is working”); /*子进程p2执行*/ else printf(“parent”);/*父进程执行*/ }

操作系统实验报告实验一进程管理.docx

. 实验一进程管理 一、目的 程度是理机管理的核心内容。本要求写和一个的程度程序。通本 加深理解有关程控制、程列的概念,并体会和了解程度算法的具体施法。 二、实验内容及要求 1、程控制PCB 的构( PCB 构通常包括以下信息:程名(程ID )、程先数、 片、程所占用的CPU 、程的状、当前列指等。可根据的不同,PCB 构的内容可以作适当的增)。了便于理,程序中的某程运行以片位算。各程的 数以及程需运行的片数的初始均由用定。 2 、系源( r1?r w),共有w,每数目r1? r w。随机生 n程 P i( id,s(j,k) ,t),0<= i<= n,0<= j<=m,0<=k<=dt 运行,在运行程中,会随机申新的源。 3、每个程可有三个状(即就状W 、运行状R、等待或阻塞状B),并假初始状 就状。建立程就列。 4、制程度算法:片度算法 本程序用算法 n 个程行度,程每行一次,CPU 片数加 1,程需要的片 数减 1。在度算法中,采用固定片(即:每行一次程,程的行片数已行了1个位),, CPU 片数加 1,程需要的片数减1,并排列到就列的尾上。 三、实验环境 操作系境:Windows 系。 程言: C# 。 四、实验思路和设计 1、程序流程

. 开始 对进程进行初始化,建立就绪队列、阻塞队列。Input() 触发时钟,调用时间片轮转调度算法。runFcfs() 是 就绪队列为空?结束 否 输出就绪队列和阻塞队列的信息。 outputall() 取就绪队列的第一个进程,判断其运行的时间片 是否达到所需次数。如果达到,则释放资源 如果没达到,则运行一个时间片。running() 检查阻塞队列,对于当前资源数目满足阻塞队列的进程, 由阻塞转入就绪队列。testblock() 检查是否有新进程产生,如果有,则判断系统资源是否 够用,如果够用,则分配给该进程,插入就绪队列。如 果不够用,则插入阻塞队列。testnew() 显示三类资源情况。rescore()

电大操作系统实验报告进程管理实验

一、实验题目:进程管理实验 二、实验目的和要求: 实验目的:(1)加深对进程概念的理解,尤其是进程的动态性、并发性。 (2)了解进程如何被创建和终止。 (3)学会查看进程的状态信息。 (4)学会使用进程管理命令。 (5)学会在后台运行进程。 实验要求:(1)理解有关进程的概念,能用ps命令列出系统中进程的有关信息,并进行分析。 (2)理解进程的创建及族系关系。 (3)能使用&,jobs,bg,at等命令控制进程的运行。 (4)了解终止进程的方法。 三、实验内容: 1.使用ps命令查看系统中运行进程的信息。 2.利用系统调用实现进程的创建、终止、等待、睡眠等操作。 四、实验技术和方法: (说明:对本实验涉及的教材中的相关内容进行归纳总结,只需简要说明即可。)加深对进城概念的理解,尤其是进程的动态性、并发性。学会使用ps命令观察进程的状态,并分析进程族系关系;能使用& , jobs, bg, at 等命令控制进程的运行利用系统调用实现进程的创建、终止、等待、睡眠等操作。

五、实验环境: (说明:列出本实验使用到的软件平台和工具,如Linux系统版本,shell类型,vi编辑工具等。) 在虚拟机中的Linux RedHat Linux 9 六、实验步骤和结果: (说明:详细给出实验步骤和结果。实验步骤不一定与《实验指南》中的完全一 致。对实验结果,除文字说明外,对一些关键结果,需要给出一些界面截图。)1、输入ps 命令 PS命令用来报告系统当前的进程状态。 2、输入ps –e命令

可以显示系统中运行的所有进程,包括系统进程和用户进程。 3、输入ps –f命令 可以得到进程详细信息。 4、输入ps –el 命令 显示进程环境变量列出长表。 二、进程控制 1、后台进程 (1)$grep “注册用户名” /etc/passwd > /tmp/abc &

相关文档
最新文档