Example #1
0
//功能:执行调度算法
//参数:xml1-调度请求; xml2-负载信息文件;xml21-物理拓扑信息文件;xml22-虚拟机之间的流量关系信息;
//  xml3-调度决策结果文件;    
int execute(char *p_xml1, char *p_xml2, char *p_xml21, char *p_xml22, char *p_xml3)
{
	cls_st_drscontrol dc;

	/*初始化共享数据结构*/
	init_shared_data();

	/*初始化调度控制器*/
	init_drscontrol(&dc);

	dc.sd=&g_sharedata;


	/*解析外部请求文件*/
	dc.parseXML1(p_xml1);

	/*解析负载文件*/
	dc.parseXML2(p_xml2);
	
	/*解析物理拓扑文件*/
	dc.parseXML21(p_xml21);
	
	/*解析亲和性与流量关系文件*/
	dc.parseXML22(p_xml22);


	/*根据读取p_xml1后,确定调用什么算法*/

	
	/*分析系统负载状态*/
	/*
	*  如果存在初始放置的VM,则触发初始放置调度;
	*  
	*  如果存在热点,则触发热点消除;
	*  如果存在冷点,则触发冷点消除;
	*  如果负载均衡,则触发负载均衡;
	*/

	/*调用具体算法*/
	dc.execute_sched(1);

	/*输出结果信息到结果文件*/
	dc.constructXML3(p_xml3);

	return 1;
}
int main(int argc, char *argv[])
{
	struct sigaction action;
	memset(&action, 0, sizeof(struct sigaction));
	action.sa_handler = term;
	sigaction(SIGTERM, &action, NULL);

	int fps = atoi(argv[4]);
	int width = atoi(argv[2]);
	int height = atoi(argv[3]);

	init_shared_data(atoi(argv[2]), atoi(argv[3]));

	QApplication app(argc, argv);
	QWebPage page;

	QPalette palette = page.palette();
	palette.setBrush(QPalette::Base, Qt::transparent);
	page.setPalette(palette);

	page.mainFrame()->setUrl(QUrl::fromUserInput(argv[1]));
	page.setViewportSize(QSize(width, height));
	page.mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
	page.mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);

	pthread_mutex_lock(&data->mutex);
	QImage image(&data->data, width, height, QImage::Format_RGBA8888);
	QPainter painter(&image);
	pthread_mutex_unlock(&data->mutex);

	while (!done) {
		app.processEvents();

		pthread_mutex_lock(&data->mutex);
		image.fill(0);
		page.mainFrame()->render(&painter, QWebFrame::ContentsLayer);
		pthread_mutex_unlock(&data->mutex);

		usleep(1000000 / fps);
	}

	return 0;
}
Example #3
0
int main()//int argc, char* argv[])
{
	int choice,sel;
	//int decistat;
	char xml[5][30]={
		"xml1.xml",
		"xml2.xml",
		"xml21.xml",
		"xml22.xml",
		"xml3.xml"
	};
	//char *fpxml[5];

	char xmldir[100]="./input/test01/";/*文件所在目录*/
	/*亲和性数据*/
	char xmlaffdir[100]="./input/Data/affinity/";
	/*负载均衡*/
	char xmlaffdir1[100]="./input/Data/hotsolve/";

	char xmlnewfiledir[100]="./input/Data/xmltest/";/*新产生的模拟数据所在目录*/

	char xmlaffdir2[100]="./input/Data/initplace/";

	
	//char urlfile[200];

	//FILE *fp;
	
	/*
	if(argc!=6) 
	{
		printf("error, please input 5 parameters!\n");
		exit(0);
	}

	for(i=1;i<argc;i++)
	{
		if((fp=fopen(argv[i],"r"))==NULL)
		{
			printf("%s File open error, please check this file is existed!\n",argv[i]);
			exit(0);
		}
		else 
		{
			fpxml[i]=argv[i];
			fclose(fp);
		}

	}

	printf("All files are existed!\n");

	///////////////////////////////////////////////
	//exit(0);

	*/

	while(1){
		printf("Enter choice:\n");
		printf("1-Load data XML1, XML2(VM & PM), XML21(PM2PM), XML22(VM2VM) from xmldata.\n");
		printf("2-Generate XML2, XML21, XML22 data from generator and initialize all globals.\n");
		printf("3-Getdata from outer cloud computing platforms and initialize all globals.\n");
		printf("4-Make a whole scheduling test and see the result in xml3.\n");
		printf("5-Make scheduling for test, take initialplace as an example by grouping and packing.\n");
		printf("6-Output the actionlist into xml file.\n");		
		printf("0-exit.\n");
		scanf("%d",&choice);
		if(choice==0) break;
		
		switch(choice){
		case 1:
		
			/*初始化全局输入数据结构*/
			init_shared_data();	
			/*从文件加载所有数据*/
			
			//loaddata(xmldir);
			printf("加载数据测试:\n1.加载%s;\n2.加载%s.\n3.加载%s.\n4.加载%s\n5.加载%s\n0-结束.\n输入:",
					xmlaffdir,xmlaffdir1,xmldir,xmlnewfiledir,xmlaffdir2);
				
			scanf("%d",&sel);
			
			while(sel>0){
				
				switch (sel)
				{
				case 1:
					loaddata(xmlaffdir);
					break;
				case 2:

					loaddata(xmlaffdir1);
					break;
				case 3:

					loaddata(xmldir);

					break;
				case 4:
					loaddata(xmlnewfiledir);
					break;
				case 5:
					loaddata(xmlaffdir2);
					break;
				}
	
				printf("加载数据测试:\n1.加载%s;\n2.加载%s.\n3.加载%s.\n4.加载%s\n5.加载%s\n0-结束.\n输入:",
					xmlaffdir,xmlaffdir1,xmldir,xmlnewfiledir,xmlaffdir2);
				scanf("%d",&sel);
			}

			break;
		
		case 2:
			/*初始化全局输入数据结构*/
			//init_shared_data();	
			/*调用产生数据模块,生成xml模拟数据文件到xmlnewfiledir目录下*/
			 //GenerateData(xmlnewfiledir);	
			printf("模拟数据生成,输出见目录%s............\n",xmlnewfiledir);
			printf("分四步完成:\n1.生成VM和PM(见XML2);\n");
			printf("2.生成框(见XML2);\n3.生成组(见XML2);");
			printf("\n4.生成亲和关系(见XML22);\n输入:1-开始,0-结束!\n");

			scanf("%d",&sel);
			while(sel==1){
				GenerateData1(xmlnewfiledir);
				scanf("%d",&sel);
			}
			printf("Please find and check result file in dir: %s.\n",xmlnewfiledir);
			break;	
		case 3:/*由华为提供*/
			
			/**/
			//getdatafromcloud();
			{
				int *ar,i,sum=0;
				ar=(int*)malloc(10*sizeof(int));
				for(i=0;i<10;i++)
				{
					ar[i]=i;
					sum+=ar[i];
				}
				printf("%d\n",sum);
				free(ar);			
			}


			break;/**/
		
		case 4:
			
			
			make_whole_scheduling();
			

			break;
		
		case 5: /*通用调度函数*/
			
			/*初始化全局输入数据结构*/
			init_shared_data();	
			/*A whole scheduling test.*/
			execute(xml[0],xml[1],xml[2],xml[3],xml[4]);
			break;
		case 6:
			//生成XML3
			{
				cls_st_xmlprocess xp;
				//g_sharedata.action_total=0;
			
				xp.sd=&g_sharedata;
				init_xmlprocess(&xp);
				xp.xml_create_by_actions("xml3-1.xml");
			}

			printf("CPU:%d\n",CPU);
			break;
		}	
	}
	
	printf("Thank you for your using!\n");
	
}
Example #4
0
/*功能:生成模拟数据 7.25 陈建海提交*/
void GenerateData1(char *rootdir)
{
	/*初始化全局输入数据结构*/
	cls_st_datagenerator dg;
	cls_st_drscontrol dc;
	char url[200];
	int vnum,pnum,grnum,afnum,emptypmnum,n;
	float a,b,htv;
	int choice,j,sel;

	srand((unsigned)time(NULL)); 

	/*初始化*/
	init_shared_data();	

	/*生成模拟数据*/
	init_drscontrol(&dc);
	
	/*初始化共享数据指针*/
	dc.sd=&g_sharedata;
	/*1.加载生成模拟数据的函数,产生的数据在global中*/
	
	init_generator(&dg);
	dg.sd=&g_sharedata;
	
	/*初始化异构物理机规格*/
	dg.createPMV();
	
	/**/
	printf("Now we generate simulation data:\n");
	

	printf("输入:1.生成PM与VM数据;2-物理拓扑数据。\n");
	
	scanf("%d",&sel);
	if(sel==2) goto topo;


	printf("1.生成PM与VM数据:要求输入VM数(待放置),PM数(包括空载),VM缩放系数,冷热度\n");
	
	/*支持多场景创建*/
	printf("请选择调度决策类型生成相应数据:\n   1-初始放置;\n   2-动态调度:负载均衡;\n");
	printf("   3-动态调度-热点消除;\n   4-动态调度-冷点整合.\n   0-退出。\n-----------------\n输入:");
	
	scanf("%d",&sel);
	
	switch (sel)
	{
	case 1:/*初始放置数据:包括各种冷热度,<0.2,<0.7,<0.9*/
			
		//scanf("%f%f%f",&a,&b,&htv);
		printf("分两步:(1)生成全数据;(2)置PM空载和增加空载PM。\n");
		printf("(1)先输入一个数据规格种数N,表示要生成几种类型的数据到同一个文件。\n");
		printf("每一种规格包括4个参数:1)VM数(待放置),2、3)VM缩放系数范围:(起、止)(如0 0.2,表示在0到0.2之间),\n4)物理机热度系数(0~1,表示PM温度越大).\n");
	
		printf("输入样式如:\n");
		
		printf("3                       ----------表示3种规格\n");
		printf("100 0.0 0.1 0.2          ---------表示第一组规格\n");
		printf("30 0.5 0.8 0.9          ----------表示第二组规格\n");
		printf("100 0.0 0.3 0.7          ---------表示第三组规格\n-------------------------------------\n");
		printf("输入:");
		scanf("%d",&n);
		
		j=0;
		while(j<n){
			scanf("%d",&vnum);
			scanf("%f%f%f",&a,&b,&htv);/*负载范围及冷热度*/
			/*1.生成物理机与VM,FF策略,加载生成模拟数据函数*/
			dg.generate_data_by_vms(vnum,a,b,htv);
			
			printf("累计生成Total VM:%d, total PM:%d.\n",dc.sd->vm_total,dc.sd->pm_total);
			j++;
		}

		
		break;
	case 2:/*负载均衡*/
		printf("分两步:(1)生成全数据;(2)置PM空载和增加空载PM。\n");
		printf("(1)先输入一个数据规格种数N,表示要生成几种类型的数据到同一个文件。\n");
		printf("每一种规格包括4个参数:1)VM数(待放置),2、3)VM缩放系数范围:(起、止)(如0 0.2,表示在0到0.2之间),\n4)物理机热度系数(0~1,表示PM温度越大).\n");
	
		printf("输入样式如:\n");
		printf("3                       ----------表示3种规格\n");
		printf("100 0.0 0.1 0.2         ----------表示第一组规格\n");
		printf("30 0.5 0.8 0.9          ----------表示第二组规格\n");
		printf("100 0.0 0.3 0.7         ----------表示第三组规格\n------------------------------------\n");
		printf("输入:");
		
		scanf("%d",&n);
		j=0;
		while(j<n){
			scanf("%d",&vnum); /*VM数*/
			scanf("%f%f%f",&a,&b,&htv);/*负载范围及冷热度*/
			/*1.生成物理机与VM,FF策略,加载生成模拟数据函数*/
			dg.generate_data_by_vms(vnum,a,b,htv);
	
			printf("Total VM:%d, total PM:%d.\n",dc.sd->vm_total,dc.sd->pm_total);
			j++;
		}


		break;
	case 3:/*热点消除*/
		
		printf("分两步:(1)生成全数据;(2)置PM空载和增加空载PM。\n");
		printf("(1)先输入一个数据规格种数N,表示要生成几种类型的数据到同一个文件。\n");
		printf("每一种规格包括4个参数:1)VM数(待放置),2、3)VM缩放系数范围:(起、止)(如0 0.2,表示在0到0.2之间),\n4)物理机热度系数(0~1,表示PM温度越大).\n");
	
		printf("输入样式如:\n");
		printf("3                        ----------表示3种规格\n");
		printf("100 0.0 0.1 0.2          ---------表示第一组规格:0.2是冷点\n");
		printf("30 0.5 0.8 0.9           ----------表示第二组规格:0.9是热点必须要有\n");
		printf("100 0.0 0.3 0.7          ---------表示第三组规格:0.7是温点\n-------------------------------------\n");
		printf("输入:");
		scanf("%d",&n);
		
		j=0;
		while(j<n){
			scanf("%d",&vnum); /*VM数*/
			scanf("%f%f%f",&a,&b,&htv);/*负载范围及冷热度*/
			/*1.生成物理机与VM,FF策略,加载生成模拟数据函数*/
			dg.generate_data_by_vms(vnum,a,b,htv);
	
			printf("Total VM:%d, total PM:%d.\n",dc.sd->vm_total,dc.sd->pm_total);
			j++;
		}


		break;
	case 4:/*冷点整合*/
		printf("分两步:(1)生成全数据;(2)置PM空载和增加空载PM。\n");
		printf("(1)先输入一个数据规格种数N,表示要生成几种类型的数据到同一个文件。\n");
		printf("每一种规格包括4个参数:1)VM数(待放置),2、3)VM缩放系数范围:(起、止)(如0 0.2,表示在0到0.2之间),\n4)物理机热度系数(0~1,表示PM温度越大).\n");
	
		printf("输入样式如:\n");
		printf("1                       ----------表示1种规格\n");
		printf("100 0.0 0.1 0.2          ---------表示第一组规格,0.2冷点数据\n");
		//printf("30 0.5 0.8 0.9          ----------表示第二组规格\n");
		//printf("100 0.0 0.3 0.7          ---------表示第三组规格\n");
		printf("-------------------------------------\n输入:");
		
		
		scanf("%d",&n);
		j=0;
		while(j<n){
			scanf("%d",&vnum); /*VM数*/
			scanf("%f%f%f",&a,&b,&htv);/*负载范围及冷热度*/
			/*1.生成物理机与VM,FF策略,加载生成模拟数据函数*/
			dg.generate_data_by_vms(vnum,a,b,htv);
	
			printf("Total VM:%d, total PM:%d.\n",dc.sd->vm_total,dc.sd->pm_total);
			j++;
		}
	

		break;
	case 0:
		return;
		break;
	}
/*
	printf("请选择调度决策类型:\n1-初始放置;\n2-动态调度:负载均衡;\n");
	printf("3-动态调度-热点消除;\n4-动态调度-冷点整合.\n0-退出。\n");
	scanf("%d",&sel);
	*/

	printf("是否增加空载PM?(输入:1-增加,0-忽略, 回车)\n输入:");
	/*清空PM*/
	scanf("%d",&sel);
	if(sel==1)
	{
		printf("请输入空载PM数(N)(建议与前面累计生成的PM数一起凑成一个整数,如82,+新输入118=200).\n输入:");
		scanf("%d",&pnum);
		dg.create_empty_pm(pnum);
		printf("累计total PM:%d.\n",dc.sd->pm_total);
	}

	
	/*2.生成框和组*/
	
	printf("2.生成框吗?每个框PM台数自动生成框的信息(输入:0-跳过,1-继续)\n输入:");
	scanf("%d",&choice);
	if(choice==0) goto cgroup;

	printf("输入(PM台数):");
	scanf("%d",&pnum);
	//frnum=_gthis->sd->pm_total/vmcount_perfr+1; /*计算所需框的总数*/
	dg.create_frame(pnum);

	printf("成功创建框,累计生成Total Frame:%d:.\n",dc.sd->fr_total);


cgroup:
	
	printf("3.创建PM分组?(1-创建,0-跳过)\n输入:");
	
	scanf("%d",&choice);
	if(choice==0) goto crv2v;
	
	printf("需要分别创建组及该组的PM数,先输入组个数n,再输入每组的PM数,格式如:\n3\n 5 5 5.\n");
	
	scanf("%d",&grnum);
	
	dc.sd->gr_total=0;

	for(j=0;j<grnum;j++)
	{
		scanf("%d",&pnum);
		dg.create_group(pnum);
	}

	printf("成功创建组,累计生成Total groups:%d:.\n",dc.sd->gr_total);


	
	/*输出到XML2*/
	/*2.将数据保存到XML文件*/
	/*Generate XML2*/
	strcpy(url,rootdir);
	strcat(url,"xml2.xml");
	dc.constructXML2(url);
	
	printf("VMPM模拟数据创建成功,请查看XML文件:%s!\n",url);


crv2v:	
	/*3.亲和性*/
	
	printf("4.创建亲和性关系,请选择类型:\n--------------------------------\n");
	printf("-3:-反组亲和:在不同组中随机选取两个PM,在其上的VM之间创建;\n");
	printf("-2:-反框亲和:在不同框中随机选取两个PM,在其上的VM之间创建;\n");
	printf("-1:-反板亲和:随机选取两个PM,在其上的VM之间创建;\n");
	printf(" 0:-流量亲和:随机选取PM,在其上的VM之间创建;\n");
	printf(" 1:-同板亲和:随机选取一个PM,在其上的VM之间创建;\n");
	printf(" 2:-同框亲和:随机选一个框,框中随机选取两个PM,在其上的VM之间创建;\n");
	printf(" 3:-同组亲和:随机选取一个组,组中随机选取两个PM,在其上的VM之间创建;\n");
	printf("---------------------------------------------------------\n");
	printf("请输入类型号:(4-退出):");
	
	scanf("%d",&choice);
	
	if(choice>3 || choice <-3) goto outp;

	init_generator(&dg);
	dg.sd=&g_sharedata;

	while(choice>=-3 && choice <=3)
	{
		
		if(choice==0)
		{
			printf("请输入边的数量,及流量大小的范围,如(n a b),\n如,生成10条边,流量0,200mbps之间,则输入10 0 200,\n输入:");
			scanf("%d%f%f",&afnum, &a,&b);
			
			dg.create_v2v_by_ta(a,b,afnum,choice);

			printf("成功生成%d条边!累计亲和边总数:%d\n输入(4-退出):",afnum,_gthis->sd->v2v_total);
			
		}
		else
		{	
			printf("请输入数量,如10,表示创建10条亲和边。\n输入:");
			
			scanf("%d",&afnum);
			
			dg.create_v2v_by_ta(0,0,afnum,choice);
			
			printf("成功生成%d条边!累计亲和边总数:%d.\n输入(4-退出):",afnum,_gthis->sd->v2v_total);
			
		}

		scanf("%d",&choice);
	}
	

	
	printf("是否置所有PM为空载(针对初始放置)?(输入1-是,0-忽略)\n输入:");
	scanf("%d",&sel);
	if(sel==1){
		dg.set_empty_pm();		
			/*输出到XML2*/
		/*2.将数据保存到XML文件*/
		/*Generate XML2*/
		strcpy(url,rootdir);
		strcat(url,"xml2.xml");
		dc.constructXML2(url);
	
		printf("VMPM模拟数据创建成功,请查看XML文件:%s!\n-------------------------------------\n输入(0-返回):",url);
	}
	

	/*Generate XML22*/
	strcpy(url,rootdir);
	strcat(url,"xml22.xml");
	dc.constructXML22(url);

	printf("模拟数据创建成功,请查看目录%s中的XML文件!\n",url);

topo:	
	printf("创建物理机拓扑结构数据?交换机端口数为24,PM有4块网口,\n随机生成树形拓扑(1-是,0-忽略)\n输入:");
	scanf("%d",&sel);
	if(sel==1)
	{
		printf("输入物理机PM数:(4K即为4096)");
		scanf("%d",&emptypmnum);
		dg.create_p2p_tree_topo(0,1,emptypmnum);/*生成4K个PM的网络拓扑*/
	}
	else
		return;

	printf("累计生成交换机总数:%d,\n0层物理机与交换机关系总数:%d,\n交换机之间连接关系总数:%d\n",
		_gthis->sd->sw_total,_gthis->sd->p2s_total,_gthis->sd->s2s_total);	

	
	
	/*Generate XML21*/
	strcpy(url,rootdir);
	strcat(url,"xml21.xml");
	dc.constructXML21(url);

	printf("模拟数据创建成功,请查看目录%s中的XML文件!\n",url);


outp:
	printf("模拟数据生成完毕!(0-返回)\n输入:\n");
}