操作系统实验报告 观察进程并发性x

计算机操作系统实验报告

PAGE

PAGE #

计算机操作系统实验报告

PAGE

PAGE #

评语:课中检查完成的题号及题数: 课后完成的题号与题数:

成绩:指导教师

成绩:

实验报告

实验名称:

观察进程的并发性

日期:

2011.5.7

班级:

学号:

姓名:

一、实验目的:

通过创建子进程,观察父子进程的并发执行过程,区别顺序执行和并发执行; 明确进程和程序的区别;加深对操作系统进程概念和进程并发特性的理解。

二、实验内容:

进程的创建。编制一段程序,使用系统调用fork()创建两个子进程,在此程序运 行时,系统中就有一个父进程和两个子进程在活动。让每一个进程在屏幕上显示一 个字符:父进程显示字符a,两个子进程分别显示字符b和子符C。试观察、记录并 分析屏幕上进程调度和并发执行的情况。若在程序中使用系统调用 nice()来改变各

进程的优先级,观察出现的现象.

三、项目要求及分析:

为了体现出进程的并发性,首先在父进程创建一个子进程,进程里利用循环方式输出 字符“ b”,然后在父进程里又创建子进程 2,进程2里循环输出字符“ C”,在父进程里 循环输出 字符“ a”。这样程序运行时,父子进程之间并发执行,并输出相应的字符。

对于nice()函数的应用,我主要是先输出子进程 1的优先级,然后用nice函数修 改子进程的优先级,然后观察运行结果。对于子进程 2也用nice函数修改了其优先级,

再观察运行结果。

四、具体实现:

4.1流程图

r开始

4.2添加函数的代码

1)进程之间的并发性

#i ncludevstdio.h>

#in clude< un istd.h>

#in cludevsys/t yp es.h>

#in clude vsys/wait.h〉

int mai n()

{

int i,j,k;

int p id=fork(); //new first thread if(p id==O) //first thread

{

忆巾=0)<5)++)

{

prin tf("first:b\t\tj=%d\n",j); slee p(1);

} exit(O);

}

else if(pi d>0) //ma in thread

{

int pi=fork();// new sec ond thread if(pi==0) //sec ond thread

{

for(k=0;k<5;k++)

{

prin tf("seco nd:c\tk=%d\n",k); slee p(1);

exit(O);

}

else if(pi>0) //main thread

{

for(i=0;i<5;i++)

{

prin tf("mai n: a\t\ti=%d\n",i);

slee p(1);

}

wait pid( pid,0,0); //wait first thread over

wait pid( pi,0,0); // wait sec ond thread over prin tf("mai n thread exit\r\n");

exit(0);

}

else //sec ond thread failed

{

p error("f unction fork() error!\r\n"); exit(1);

}

}

else //first thread failed

{

p error("fu nctio n fork() error!\r\n"); exit(1);

} return 0;

}

2) nice函数的应用 #i ncludevstdio.h>

#in cludev uni std.h>

#in cludevsys/t yp es.h>

#in clude vsys/wait.h>

int mai n()

{

int i,j,k;

int old pri’newpn;

int p id=fork(); //new first thread

if(p id==0) //first thread

{

printfC'parentpid is %d\n",get pp id());

old pri=get priority( PRIO _P ROCESS,get pid()); prin tf("first thread old p riority=%d\n",old pri); newpn=n ice(5);

prin tf("first thread new p riority=%d\n",newp ri); for(j=0;jv5;j++)

{

prin tf("first:b\t\tj=%d\n",j);

slee p(1);

}

exit(O);

}

else if(pi d>0) //ma in thread

{

int pi=fork();// new sec ond thread if(pi==O) //sec ond thread {

nice (2);

for(k=0;kv5;k++)

{

prin tf("seco nd:c\tk=%d\n",k); slee p(1);

exit(O);

}

else if(pi>0) //main thread

{

for(i=0;iv5;i++)

{

prin tf("mai n: a\t\ti=%d\n",i);

slee p(1);

}

wait pid( pid,0,0); //wait first thread over

wait pid( pi,0,0); // wait sec ond thread over

prin tf("mai n thread exit\r\n"); exit(0);

}

else //new thread failed

{

p error("fu nctio n fork() error!\r\n"); exit(1);

}

else //new thread failed

{

p error("f unction fork() error!\r\n"); exit(1);

} return 0;

}

五、调试运行结果:

1)进程之间的并发性结果

TirsTJj main: a second:匚 first: b main: J second:c second;c main: a first :b second:c firstib main: a second:c main: a first :b main thread

exit

1

k

*

i

1

k

1

2

1

1

3

4

计算机操作系统实验报告

3. PAGE

3.

PAGE #

计算机操作系统实验报告

PAGE

PAGE #

1

k

1

k

J

i

k

1

2

1

3

3

3

4

4

4

main : a first: b second;c main : a first :b second:c first ;b main: a second: c first: b mair: a second;c f irst: b main : a seccnd:c

父子进程并发运行的结果

2) nice函数的应用

exit

]=

k=

1 =

J =

k =

1 =

r

J =

k=

j

1

2

2

2

3

3

3

4

4

4

main: a

parentpid is

5379

first thread

old priority=0

first thread

new p「io「ity=5

:b

second:c

k=0

first: b

3=1

main; a

i=1

second:c

k=1

first :b

3=2

main : a

1=2

seconds

炉2

first: b

main: a

i=3

second;c

k 二 3

main: a

i=4

first: b

运用nice函数前后结果对比

六、所遇问题及解决方法:

对Linux的操作不是很熟悉,有请老师辅导。

nice()函数之前没接触过,上网找了一些资料,对nice函数有了一定的了解,在程序 中我是通过改变子进程1和子进程2的优先级,并且输出子进程1优先级改变前后的大 小。最后运行程序,体会nice ()函数的作用。观察到在nice ()函数应用前后,输出 字符的顺序确实有一定的改变。体会到优先级的数值越小优先级越高,数值越大优先级 越低。

七、实验总结:

1.0。通过这次试验,对linux的操作有了进一步的了解,深深体会到, fork()

1.

0。

因此可通过返回值来判断当前进程是父进程还是子进程。使用 fork函数得到的子进

程是父进程的一个复制品,它从父进程处复制了整个进程的地址空间,包括进程上 下文,进程堆栈,内存信息,打开的文件描述符,信号控制设定,进程优先级,进 程组号,当前工作目录,根目录,资源限制,控制终端等。而子进程所独有的只是 它的进程号,资源使用和计时器等。在 fork()函数返回后,父子进程会根据不同的

返回值执行不同的代码,一般是通过 if语句来判断是从父进程还是子进程返回。

2.当首次调用新创建的子进程时,其入口一般在 fork()函数返回等于零的分支里。

2.

nice函数在当前程序运行优先级基础之上调整指定值得到新的程序运行优先级。优

10。先级的范围为-20?19等40个等级,其中数值越小优先级越高,数值越大优先级 越低,既-20的优先级最高,19的优先级最低。若调整后的程序运行优先级高于-20, 则就以优先级-20来运行命令行;若调整后的程序运行优先级低于 19,则就以优先 级19来运行命 令行。若nice命令未指定优先级的调整值,则以缺省值 10

10。