现在的位置: 首页 > 综合 > 正文

操作系统课程设计创建新进程造成消耗系统资源死机问题的原因

2014年09月05日 ⁄ 综合 ⁄ 共 1040字 ⁄ 字号 评论关闭

首先要明确一个概念:

1、初始化:C++中变量的初始化是如下形式:
int a = 0;

也就是说在创建变量的时候,在内存中为这个变量开辟一段内存,同时把这个数值填进去。如果只是定义变量

int a;

那么此时虽然 创建了a变量,为a变量开辟了一个内存空间,但是此时这段内存空间里面的值没有被指定,是随机的,也就是垃圾值

2、赋值

赋值是在定义了变量之后,利用其他内存块中的数值来覆盖当前变量的所在的内存。

初始化只能进行一次,即在变量定义的时候,但是赋值却可以进行多次。



在实验2-1的时候,可能大家没有发现,所谓的创建进程就是以你自己写出代码的那个进程为父进程,进而运行这个程序创建一些子进程,并且程序做了明确的限制,只创建5个进程就停止这个程序。


int main(int argc, char *argv[])
{
	int nClone;
	//nClone = 0;     NO1

	if(argc > 1)
	{
		::sscanf(argv[1], "%d", &nClone);
	}
	nClone = 0;     NO2
	cout << "Process ID:" << ::GetCurrentProcessId()
		<<",Clone ID:" << nClone
		<<endl;

	const int c_nCloneMax = 5;
	if(nClone < c_nCloneMax)
	{
		StartClone(++nClone);
	}

	getchar();
	return 0;
}

这是我们这次实验的主函数,当我们运行这个程序的时候,第一次执行的就是父进程,因为我们在运行程序的时候没有为main函数提供多余的参数,所以此时argc参数个数是等于1,所以此时不执行if那个语句。改了 第二次的样子应该像上面一样,先是定义这个NCLONE变量,此时这个变量里面就是垃圾值,因为没有初始化,该变量所在的内存里面的值不确定,是随机的,因为跳过了IF语句执行了nCloneDE  = 0,这个赋值语句,所以当前执行的这个父进程没有问题。但是在父进程创建第一个子进程的时候,nClone因为是做进程个数的计数器,此时已经变为1,创建子进程的时候,再调用Main函数就会执行主函数里面的if语句,因为要把当前创建子进程的个数传递进去,因为只有这样,随着创建进程个数的增加,整个程序才会停止,但是因为第二次修改在if语句后面把本来已经获取到值得nClone给覆盖了,再次改成0,所以此时程序就默认以前是只创建了一个进程,一次类推,程序不断的默认只创建一个进程,永远不会被限制条件所限制停止程序,最终耗光所有的系统资源,造成死机 

抱歉!评论已关闭.