操作系统管理Linux系统进程进程互斥实验进程的控制实验实验0304Word文档格式.docx

上传人:b****5 文档编号:18366757 上传时间:2022-12-15 格式:DOCX 页数:23 大小:683.80KB
下载 相关 举报
操作系统管理Linux系统进程进程互斥实验进程的控制实验实验0304Word文档格式.docx_第1页
第1页 / 共23页
操作系统管理Linux系统进程进程互斥实验进程的控制实验实验0304Word文档格式.docx_第2页
第2页 / 共23页
操作系统管理Linux系统进程进程互斥实验进程的控制实验实验0304Word文档格式.docx_第3页
第3页 / 共23页
操作系统管理Linux系统进程进程互斥实验进程的控制实验实验0304Word文档格式.docx_第4页
第4页 / 共23页
操作系统管理Linux系统进程进程互斥实验进程的控制实验实验0304Word文档格式.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

操作系统管理Linux系统进程进程互斥实验进程的控制实验实验0304Word文档格式.docx

《操作系统管理Linux系统进程进程互斥实验进程的控制实验实验0304Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统管理Linux系统进程进程互斥实验进程的控制实验实验0304Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。

操作系统管理Linux系统进程进程互斥实验进程的控制实验实验0304Word文档格式.docx

实验内容及要求(详见实验讲义与实验指导书):

步骤1:

登录进入Linux。

步骤2:

访问命令行。

单击“系统工具”-“终端”命令,打开“终端”窗口。

步骤3:

回顾系统进程概念。

每个运行的程序都会创建一个进程,进程分配到一个唯一的进程标识符(PID)。

PID被系统用于标识和跟踪进程,直到进程结束。

操作系统内核管理所有进程的初始化和终止。

每一个进程都要求系统资源(例如CPU时间和RAM空间)在其中工作。

当进程启动的时候,操作系统把系统资源分配给每个进程,当进程终止的时候,系统回收这些资源。

在Linux系统启动的时候,首先启动的两个进程是sched(调度)和init(初始化),它们管理着其他进程。

Linux系统中有几种不同类型的进程:

守护进程:

由Linux内核启动的进程,为了特定目的而存在。

例如,lpsched守护进程存在只是为了处理打印作业。

父进程:

派生其他进程的进程是父进程。

一个叫做init的守护进程是第一个调用的进程。

每一个进程,除了init之外,都有一个父进程。

子进程:

由其他进程派生出来的进程叫做子进程。

孤儿进程:

在进程返回输出之前,它的父进程结束了,这样的进程叫做孤儿进程。

僵进程:

子进程没有带着输出返回给父进程。

这样的进程在系统中变成丢失的进程。

使用此前的信息,完成以下填空:

1)Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的PID进程标识符,用于跟踪从进程启动到进程结束。

2)当启动新进程的时候,内核也给它们分配系统资源,如内存空间和CPU资源。

3)永远不向父进程返回输出的进程叫做____。

4)由父进程派生出来的进程叫做_____。

5)_____进程是一个派生另一个进程的进程。

6)运行用于提供服务的Linux系统进程是____。

7)如果父进程在子进程之前结束,它创建了一个_____进程。

步骤4:

回顾ps命令和信息。

ps命令用于列出当前系统中运行的进程。

如果一个进程耗时太长,或者看上去好像已经终止了,表现为一个终端窗口不再响应或挂起,通常需要使用ps查看系统中的进程。

通过列出进程,可以查看初始化进程的命令或程序的名字,以及所有它派生出来的子进程。

通过多次执行ps命令,查看进程的时间——进程占用的CPU时间,可以检查一个进程是否还在运行。

如果时间不再增长,那么进程可能已经终止了。

如果进程占用太长的时间或者已经停止,可以使用ps命令检查进程的进程ID(PID),然后杀死进程。

ps命令的输出将显示PID号和与其相关的命令或程序。

PID号通常用于终止一个进程。

ps命令(ps[-options])的3个主要选项如下表所示。

表3-5ps命令选项

ps选项意义功能

Ps无选项显示当前shell或终端窗口中,当前用户的进程信息

ps–e每一个显示系统中每一个进程的信息

ps–f完全产生一个完全列表,给出每个进程的所有可用信息

ps-uuserid用户显示特定用户的所有进程

基本的ps命令显示在当前shell中的进程信息,用户只能够查看在这个终端窗口中初始化的进程。

输入ps命令,将结果截图贴到实验报告。

从当前终端窗口中,练习使用给出的每个选项的ps命令。

输入ps-f命令,显示运行在系统中的某个进程的完全信息,结果部分截图贴到实验报告。

ps-f栏标题

值描述

UID初始化进程的用户ID

PID进程的进程标识号。

PID可以用来杀死进程

PPID进程的父进程标识号

C进程的优先级

STIME进程的启动时间

TTY控制进程终端的终端举型

TIME进程使用的CPU时间的数量

CMD命令名守护进程(执行的程序的名字)

步骤5:

列出系统中运行的所有进程。

输入ps-ef命令,显示运行在系统中的各个进程的完全信息。

执行该命令,并与ps–f命令的输出结果对照,一致吗?

有何不同?

____________________

注意分析当前终端窗口中的输出结果:

a.显示了多少个进程?

___________________________________________________________________

b.PID是什么?

_________________________________________________

c.启动进程的命令(CMD)是什么?

_____________________________________________________

d.请观察,什么命令的PID号是1?

__________________________________________________

e.再次运行ps-ef|wc-l命令,计算进程的数目并把输出结果输入到wc命令中:

______________________________________________

执行manps命令,可以打开Linux用户命令手册,了解ps命令的用法,输入wq命令可退出用户手册的阅读。

man命令可以执行吗?

结果如何?

______________________________________________________________

步骤6:

试调试下二段代码。

并写明结果(考虑fork与sleep是什么函数)

1、

intmain()

{

intp1,i;

while((p1=fork())==-1);

if(p1>

0)

for(i=0;

i<

5;

i++)

{

printf("

Iamparent.\n"

);

sleep

(1);

}

else

Iamchild.\n"

return0;

}

2、

wait(0);

exit(0);

1.修改以下代码,用lockf()来给每一个进程加锁,以实现进程之间的互斥

//=======================================

#include<

stdio.h>

main()

intp1,p2;

while((p1=fork())==-1);

/*创建子进程p1*/

if(p1==0)putchar('

b'

while((p2=fork())==-1);

/*创建子进程p2*/

if(p2==0)putchar('

c'

elseputchar('

a'

intp1,p2,i;

if(p1==0)

for(i=0;

10;

printf("

daughter%d\n"

i);

while((p2=fork())==-1);

if(p2==0)

son%d\n"

parent%d\n"

2、观察并分析出现的现象【写进实验报告】

与未上锁的输出结果相比,结果有无不同?

原因?

将打印字符串的循环次数改为1000结果加锁与否的结果又是否相同?

1、用fork()创建一个进程,再调用exec()用新的程序替换该子进程的内容

2、利用wait()来控制进程执行顺序

实验用到的软件(:

虚拟机,vi编译器

实验内容及关键步骤(代码)Q3(15分)

1.管理Linux系统进程

1)Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的进程标识符(pid),用于跟踪从进程启动到进程结束。

2)当启动新进程的时候,内核也给它们分配系统资源,如CPU时间和RAM空间。

3)永远不向父进程返回输出的进程叫做init的守护进程。

4)由父进程派生出来的进程叫做子进程。

5)父进程是一个派生另一个进程的进程。

6)运行用于提供服务的Linux系统进程是守护进程_。

7)如果父进程在子进程之前结束,它创建了一个_孤儿进程。

 

ps–f与ps-ef执行命令出来的结果不一样,ps-f命令只显示student的某些进程,而ps-ef不但显示了student的所有进程还有root根目录下的所有进程。

还有标题目录不一样。

a.显示了133个进程?

b.PID是进程标识符。

c.启动进程的命令(CMD)是命令名守护进程

______

___

e.再次运行 

ps-ef|wc-l命令,计算进程的数目并把输出结果输入到wc命令中:

__

_

可以执行,结果如图:

运行结果:

main()

wait(0);

for(i=0;

{

printf("

sleep

(1);

}

exit(0);

Iamparent.

Iamparent.

Iamchild.

Iamchild.

Iamchild.Iamchild.

Fork();

一个现有进程可以调用fork函数创建一个新进程。

fork函数

一个现有进程可以调用fork函数创建一个新进程。

由fork创建的新进程被称为子进程(childprocess)。

fork函数被调用一次但返回两次。

两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。

子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。

sleep函数

sleep函数执行挂起一段时间,用在unsignedsleep(unsignedseconds)中,在VC中使用带上头文件#include<

windows.h>

,在gcc编译器中,使用的头文件因gcc版本的不同而不同  #include<

unistd.h>

解释执行结果:

在UNIX系统中,一个进程结束了,但是他的父进程没有等待(调用wait/waitpid)他,那么他将变成一个僵尸进程.但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管他,成为他的父进程,一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构。

pid=wait(NULL);

如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。

程序在调用fork()建立一个子进程后,马上调用wait(),使父进程在子进程结束之前,

一直处于睡眠状态。

子进程用exec()装入命令ls,exec()后,子进程的代码被ls的代码

取代,这时子进程的PC指向ls的第1条语句,开始执行ls的命令代码。

注意在这里wait()给我们提供了一种实现进程同步的简单方法。

进程互斥实验

用lockf()来给下面的程序每一个进程加锁,以实现进程之间的互斥

if(p1==0) 

putchar('

if(p2==0) 

else 

putchar('

输出结果:

daughter 

%d\n"

son 

parent 

修改后:

与未上锁的输出相比结果有所不同,上锁之后的结果只显示daughter的内容,将循环次数改成1000后,加锁与否的结果也不相同,不加锁只显示son和parent的内容,而加锁之后显示daughter的内容。

由于给后面的循环输出语句块加了锁,所以该语句只能被当前进程访问,即使其他进程获得处理机也无法访问,只有当前进程获得处理机并接着中断的地方继续执行完毕将锁释放其他的进程才能访问。

所以输出结果按照顺序依次输出。

(四)分析以下程序的输出结果【写进实验报告】:

#include<

int*fp;

fp=fopen("

to_be_locked.txt"

"

w+"

if(fp==NULL)

Failtocreatefile"

exit(-1);

while((p1=fork())==-1);

if(p1==0)

lockf(*fp,1,0);

/*加锁*/

for(i=0;

 

fprintf(fp,"

lockf(*fp,0,0);

/*解锁*/

while((p2=fork())==-1);

if(p2==0)

lockf(*fp,0,0);

wait(NULL);

lockf(*fp,1,0);

fprintf(fp,"

fclose(fp);

编译运行,catto_be_locked.txt查看输出结果,如下图所示:

daughter0

daughter1

daughter2

daughter3

daughter4

daughter5

daughter6

daughter7

daughter8

daughter9

son0

son1

son2

son3

son4

son5

son6

son7

son8

son9

parent0

parent1

parent2

parent3

parent4

parent5

parent6

parent7

parent8

parent9

分析:

程序开始定义了文件读写指针用于打开指定的文件,当文件不存在时则自动创建。

然后有创建了一个进程p1,p1获得处理机执行,给文件读写指针加锁,这样,即使p1失去处理机,其他获得处理机的进程也无法访问文件指针指向的文件,当p1再次获得处理机后继续执行直至进程p1结束并解锁;

p1结束后父进程获得处理机执行又创建了进程p2,p2获得处理机执行,也给文件指针加锁,同理直至p2运行完解锁;

p2结束后父进程获得处理机,父进程也给文件指针加锁,直至父进程执行完毕解锁,程序结束。

进程的控制实验

1、用fork()创建一个进程,再调用exec()用新的程序替换该子进程的内容

输出结果

分析原因

程序在调用fork()建立一个子进程后,马上调用wait(),使父进程在子进程结束之前,一直处于睡眠状态。

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

实验过程中遇到的问题解决办法与实验体会Q4(需手写,10分)

这次的作业比较多,做了比较长的时间,中间也遇到了无数的小问题,在同学的帮助下都顺利的解决了

评阅教师特殊评语:

评阅教师:

日期:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1