操作系统原理 实验二 进程管理

操作系统实验系列链接

注:在未加锁情况下,多进程运行结果具有不确定性,大家运行时候不用拘泥于结果
注:在未加锁情况下,多进程运行结果具有不确定性,大家运行的时候不用拘泥于结果
注:在未加锁情况下,多进程运行结果具有不确定性,大家运行的时候不用拘泥于结果

实验一 Linux基本操作

实验目的
(1)熟悉Linux下的基本操作,学会使用各种Shell命令去操作Linux,对Linux有一个感性认识。
(2)学会使用vi编辑器编辑简单的C语言程序,并能对其编译和调试。
实验预备内容
(1)参阅相关Linux操作系统的安装手册,熟悉Linux的基本安装和配置;
(2)参阅相关Linux的命令参考手册,熟悉Linux下的操作命令。
(3)C语言源程序的调试和编译知识。
实验内容:
(1) 以root用户身份登陆,并使用“ls”,“cat”“cd”等常用命令来实现基本的文件操作并观察Linux文件系统的特点;
(2) 使用vi编辑器编写一C程序,并用gcc命令进行编译和链接,并用a.out来进行输出结果。

实验二 进程管理

1、实验目的
(1)加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质。
(3)分析进程竞争资源现象,学习解决进程互斥的方法。
2、实验预备内容
(1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。
(2)阅读Linux的fork.c源文件,分析进程的创建过程。
3、实验内容
(1)进程的创建
编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。

#include 
#include 
#include 


int 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');
	}
putchar('\n');
}

结果:
在这里插入图片描述
(2)进程的控制
修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。

#include 
#include 
#include 


int main()
{
int p1,p2;
while((p1=fork())==-1);
if(p1==0)
for(int i=0;i<50;i++)
    printf("孙子%d\n",i);
else
{
    while((p2=fork())==-1);
    if(p2==0)
    for(int i=0;i<50;i++)
        printf("@儿子@%d\n",i);
    else
        for(int i=0;i<50;i++)
        printf("*爷爷*%d\n",i);
}
}

结果:
操作系统原理 实验二 进程管理_第1张图片

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

#include 
#include 
#include 


int main()
{
	int p1,p2,i;
	while((p1=fork())==-1);
	if(p1==0)
	{
		lockf(1,1,0);
		for(i=0;i<6;i++)
			printf("孩子%d\n",i);
		lockf(1,0,0);
	}
	else
	{
		while((p2=fork())==-1);
		if(p2==0)
		{
			lockf(1,1,0);
			for(i=0;i<6;i++)
				printf("son%d\n",i);
			lockf(1,0,0);
		}
		else
		{
			lockf(1,1,0);
			for(i=0;i<6;i++)
				printf("*爷爷*%d\n",i);
			lockf(1,0,0);
		}
	}
}

结果:
操作系统原理 实验二 进程管理_第2张图片

你可能感兴趣的:(操作系统)