亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? statcpu.cpp

?? 小型的操作系統開發的原代碼
?? CPP
字號:
//***********************************************************************/
//    Author                    : Garry
//    Original Date             : Oct,22 2006
//    Module Name               : STATCPU.H
//    Module Funciton           : 
//                                Countains CPU overload ratio statistics related
//                                data structures and routines.
//    Last modified Author      :
//    Last modified Date        :
//    Last modified Content     :
//                                1.
//                                2.
//    Lines number              :
//***********************************************************************/

#include "..\INCLUDE\StdAfx.h"
#include "..\INCLUDE\STATCPU.H"
#include "..\INCLUDE\ARCHSTD.H"


__THREAD_HOOK_ROUTINE  lpCreateHook        = NULL;
__THREAD_HOOK_ROUTINE  lpBeginScheduleHook = NULL;
__THREAD_HOOK_ROUTINE  lpEndScheduleHook   = NULL;
__THREAD_HOOK_ROUTINE  lpTerminalHook      = NULL;

//
//Create hook,when a kernel thread is created,this routine is called.
//
static DWORD CreateHook(__KERNEL_THREAD_OBJECT*  lpKernelThread,DWORD* lpdwUserData)
{
	__THREAD_STAT_OBJECT*        lpStatObj = &StatCpuObject.IdleThreadStatObj;
	DWORD                        dwFlags;

	if((NULL == lpdwUserData) || (NULL == lpKernelThread))  //Invalid parameter.
	{
		return 0L;
	}
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	if(NULL == lpStatObj->lpKernelThread)  //This stat object was not used yet.
	{
		lpStatObj->lpKernelThread = lpKernelThread;
		*lpdwUserData             = (DWORD)lpStatObj;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return 1;
	}
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	//
	//Should create a kernel stat object.
	//
	lpStatObj = (__THREAD_STAT_OBJECT*)GET_KERNEL_MEMORY(sizeof(__THREAD_STAT_OBJECT));
	if(NULL == lpStatObj)  //Can not allocate memory.
	{
		return 0L;
	}
	//Initialize this object.
	lpStatObj->lpKernelThread     = lpKernelThread;
	lpStatObj->CurrPeriodCycle.dwHighPart = 0;
	lpStatObj->CurrPeriodCycle.dwLowPart  = 0;
	lpStatObj->TotalCpuCycle.dwHighPart   = 0;
	lpStatObj->TotalCpuCycle.dwLowPart    = 0;

	lpStatObj->wQueueHdr   = 0;
	lpStatObj->wQueueTail  = 0;
	lpStatObj->lpPrev      = NULL;
	lpStatObj->lpNext      = NULL;
	lpStatObj->wMaxStatRatio    = 0;
	lpStatObj->wCurrPeriodRatio = 0;
	lpStatObj->wOneMinuteRatio  = 0;
	MemZero((LPVOID)lpStatObj->RatioQueue,sizeof(lpStatObj->RatioQueue));  //Clear memory.

	*lpdwUserData             = (DWORD)lpStatObj;  //Save this object.

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	//Insert this object into stat list.
	lpStatObj->lpNext  = StatCpuObject.IdleThreadStatObj.lpNext;
	lpStatObj->lpPrev  = &StatCpuObject.IdleThreadStatObj;
	
	StatCpuObject.IdleThreadStatObj.lpNext->lpPrev = lpStatObj;
	StatCpuObject.IdleThreadStatObj.lpNext         = lpStatObj;
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return 1L;
}

//
//Begin Schedule Hook,when a thread will be scheduled to run,this routine
//is called.
//
static DWORD BeginScheduleHook(__KERNEL_THREAD_OBJECT* lpKernelThread,
							   DWORD*                  lpdwUserData)
{
	if((NULL == lpKernelThread) || (NULL == lpdwUserData))
	{
		return 0L;
	}

	__THREAD_STAT_OBJECT* lpStatObj = (__THREAD_STAT_OBJECT*)(*lpdwUserData);
	__GetTsc(&lpStatObj->PreviousTsc);  //Save current time stamp counter.

	return 1L;
}

//
//End Schedule Hook,when a kernel thread was scheduled to give the CPU,this routine
//is called.
//
static DWORD EndScheduleHook(__KERNEL_THREAD_OBJECT*   lpKernelThread,
							 DWORD*                    lpdwUserData)
{
	if((NULL == lpKernelThread) || (NULL == lpdwUserData))
	{
		return 0L;
	}
	__THREAD_STAT_OBJECT* lpStatObj = (__THREAD_STAT_OBJECT*)(*lpdwUserData);
	__U64                 currtsc;

	__GetTsc(&currtsc);  //Get current time stamp counter.
	u64Sub(&currtsc,&lpStatObj->PreviousTsc,&currtsc);  //Get the difference.

	//Add the difference to current period cycle counter.
	u64Add(&lpStatObj->CurrPeriodCycle,&currtsc,&lpStatObj->CurrPeriodCycle);

	//Add the difference to total CPU cycle counter.
	u64Add(&lpStatObj->TotalCpuCycle,&currtsc,&lpStatObj->TotalCpuCycle);
	return 0L;
}

//
//Terminal Hook,when a kernel thread was destroyed,this routine will be called.
//
static DWORD TerminalHook(__KERNEL_THREAD_OBJECT*      lpKernelThread,
						  DWORD*                       lpdwUserData)
{
	if((NULL == lpKernelThread) || (NULL == lpdwUserData)) //Invalid parameters.
	{
		return 0L;
	}

	__THREAD_STAT_OBJECT* lpStatObj = (__THREAD_STAT_OBJECT*)(*lpdwUserData);
	DWORD                 dwFlags;

	//Delete this statistics object from stat object list.
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpStatObj->lpNext->lpPrev = lpStatObj->lpPrev;
	lpStatObj->lpPrev->lpNext = lpStatObj->lpNext;
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

	//Free this object.
	FREE_KERNEL_MEMORY(lpStatObj);
	return 1L;
}

static BOOL Initialize(__STAT_CPU_OBJECT*  lpStatObj)
{
	lpCreateHook          = CreateHook;
	lpBeginScheduleHook   = BeginScheduleHook;
	lpEndScheduleHook     = EndScheduleHook;
	lpTerminalHook        = TerminalHook;

	//Install hook routines.
	KernelThreadManager.SetThreadHook(THREAD_HOOK_TYPE_CREATE,CreateHook);
	KernelThreadManager.SetThreadHook(THREAD_HOOK_TYPE_BEGINSCHEDULE,BeginScheduleHook);
	KernelThreadManager.SetThreadHook(THREAD_HOOK_TYPE_ENDSCHEDULE,EndScheduleHook);
	KernelThreadManager.SetThreadHook(THREAD_HOOK_TYPE_TERMINAL,TerminalHook);

	//Initialize the StatCpuObject.
	StatCpuObject.IdleThreadStatObj.lpNext = &StatCpuObject.IdleThreadStatObj;
	StatCpuObject.IdleThreadStatObj.lpPrev = &StatCpuObject.IdleThreadStatObj;

	//Save current CPU cycle counter.
	__GetTsc(&lpStatObj->PreviousTsc);

	return TRUE;
}

static __THREAD_STAT_OBJECT*  GetFirstThreadStat()
{
	return NULL;
}

static __THREAD_STAT_OBJECT*  GetNextThreadStat(__THREAD_STAT_OBJECT* lpStatObj)
{
	if(NULL == lpStatObj)
	{
		return NULL;
	}
	return lpStatObj->lpNext;
}

static VOID ShowStat()
{
}

//
//Do statistics action.
//This routine does the following:
// 1. Calculate total CPU cycle past since previous statistics action;
// 2. For each thread statistics object,calculate CPU occupancy ratio;
// 3. Save the result to thread statistics object,as ring queue;
// 4. Update total CPU cycle counter;
// 5. Record current CPU cycle counter.
//
static VOID DoStat()
{
	__STAT_CPU_OBJECT*    lpStatObj       = &StatCpuObject;
	__THREAD_STAT_OBJECT* lpThreadStatObj = NULL;
	__U64                 currtsc;
	__U64                 temp;
	__U64                 remainder;
	WORD                  ratio;

	__GetTsc(&currtsc);
	u64Sub(&currtsc,&lpStatObj->PreviousTsc,&currtsc);  //Get CPU cycle difference.
	__GetTsc(&lpStatObj->PreviousTsc);  //Save current time stamp counter.
	lpStatObj->CurrPeriodCycle.dwHighPart = currtsc.dwHighPart;
	lpStatObj->CurrPeriodCycle.dwLowPart  = currtsc.dwLowPart;

	//Accumulate total CPU cycle since startup.
	u64Add(&lpStatObj->TotalCpuCycle,&currtsc,&lpStatObj->TotalCpuCycle);

	//Calculate each thread's CPU occupancy.
	INT i,j;
	remainder.dwHighPart = 0;
	remainder.dwLowPart  = 1000;  //Divisor used to shrink currtsc later.
	u64Div(&currtsc,&remainder,&currtsc,&remainder); //currtsc = currtsc / 1000.
	lpThreadStatObj = &lpStatObj->IdleThreadStatObj;
	do{
		temp = lpThreadStatObj->CurrPeriodCycle;
		u64Div(&temp,&currtsc,&temp,&remainder); //temp = temp / currtsc.
		ratio = (WORD)(temp.dwLowPart);
		//Clear this period's counter of the kernel thread.
		lpThreadStatObj->CurrPeriodCycle.dwHighPart = 0;
		lpThreadStatObj->CurrPeriodCycle.dwLowPart  = 0;

		//Save calculation result to kernel thread's statistics object.
		lpThreadStatObj->RatioQueue[lpThreadStatObj->wQueueHdr] = ratio;
		lpThreadStatObj->wCurrPeriodRatio                       = ratio;
		//Update ratio queue's pointers.
		lpThreadStatObj->wQueueHdr += 1;
		if(lpThreadStatObj->wQueueHdr == MAX_STAT_PERIOD)  //Exceed queue length.
		{
			lpThreadStatObj->wQueueHdr = 0;
		}
		if(lpThreadStatObj->wQueueHdr == lpThreadStatObj->wQueueTail)
		{
			lpThreadStatObj->wQueueTail += 1;
			if(MAX_STAT_PERIOD == lpThreadStatObj->wQueueTail)
			{
				lpThreadStatObj->wQueueTail = 0;
			}
		}
		//Calculate CPU occupancy ration in last one minute.
		lpThreadStatObj->wOneMinuteRatio   = 0;
		lpThreadStatObj->wMaxStatRatio     = 0;
		for(i = 0,j = lpThreadStatObj->wQueueHdr;i < MAX_STAT_PERIOD;i ++,j --)
		{
			if(j <= 0)
			{
				j = MAX_STAT_PERIOD;
			}

			if(i < ONE_MINUTE_PERIOD)  //Accumulate last ONE_MINUTE_PERIOD
				                                         //result.
			{
				lpThreadStatObj->wOneMinuteRatio += lpThreadStatObj->RatioQueue[j - 1];
			}
			lpThreadStatObj->wMaxStatRatio   += lpThreadStatObj->RatioQueue[j - 1];
		}
		lpThreadStatObj->wOneMinuteRatio /= ONE_MINUTE_PERIOD;
		lpThreadStatObj->wMaxStatRatio   /= MAX_STAT_PERIOD;
		//Process next thread statistics object.
		lpThreadStatObj = lpThreadStatObj->lpNext;
	}while(lpThreadStatObj != &lpStatObj->IdleThreadStatObj);
}

/*************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
*************************************************************************/
//
//Global object StatCpuObject's declaration.
//
__STAT_CPU_OBJECT StatCpuObject = {
	{0},                         //PreviousTsc.
	{0},                         //CurrPeriodCycle.
	{0},                         //TotalCpuCycle.
	{0},                         //IdelThreadStatObj.

	Initialize,                  //Initialize.
	GetFirstThreadStat,          //GetFirstThreadStatObj.
	GetNextThreadStat,           //GetNextThreadStatObj.
	DoStat,                      //DoStat.
	ShowStat                     //ShowStat.
};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合婷婷久久| 亚洲一级不卡视频| 国产精品一区二区视频| 欧美一级淫片007| 蜜臀久久久久久久| 精品成a人在线观看| 国产精品影视天天线| 国产日韩精品一区二区三区在线| 成人精品国产免费网站| 亚洲激情第一区| 56国语精品自产拍在线观看| 韩国欧美国产1区| 国产精品色眯眯| 在线观看91视频| 久久精品国产99久久6| 国产三级精品在线| 99re热这里只有精品视频| 午夜精品视频一区| 久久理论电影网| 91久久线看在观草草青青| 午夜不卡av在线| 日韩精品一级二级 | 亚洲日本青草视频在线怡红院| 91在线视频免费观看| 亚洲一区在线观看免费| 久久伊人中文字幕| 色综合久久六月婷婷中文字幕| 天天综合网 天天综合色| 久久亚洲精华国产精华液 | 国产精品综合视频| 亚洲视频一区二区在线| 欧美一区二区三区日韩视频| 成人中文字幕电影| 午夜精品久久久久久不卡8050| 久久亚洲精品小早川怜子| 欧美影片第一页| 奇米精品一区二区三区四区| 久久久欧美精品sm网站| 91久久精品一区二区| 国产一二三精品| 亚洲成人动漫在线观看| 亚洲欧洲美洲综合色网| 欧美精品一区二区三区久久久| 欧洲国内综合视频| 成熟亚洲日本毛茸茸凸凹| 青青青爽久久午夜综合久久午夜| 国产精品伦理在线| 精品国产乱码久久久久久闺蜜| 在线观看国产精品网站| www.亚洲色图.com| 国内偷窥港台综合视频在线播放| 午夜视黄欧洲亚洲| 亚洲精品久久嫩草网站秘色| 欧美国产精品劲爆| 久久综合精品国产一区二区三区 | 中文字幕免费不卡在线| 欧美电视剧免费观看| 3d动漫精品啪啪1区2区免费| 色网站国产精品| 成人sese在线| 粉嫩久久99精品久久久久久夜 | 午夜久久久久久久久久一区二区| 中文一区二区完整视频在线观看| 2023国产精华国产精品| 日韩精品一区二区在线观看| 337p亚洲精品色噜噜| 欧美在线一二三| 色偷偷成人一区二区三区91| 99久久久国产精品| 成人一级片在线观看| 国产成人av一区二区| 国产精品一区二区三区99| 老司机免费视频一区二区| 日本美女一区二区三区| 日本成人在线不卡视频| 日本一区中文字幕| 天天综合色天天| 日韩av一区二区三区| 免费观看91视频大全| 免费人成黄页网站在线一区二区| 日本三级韩国三级欧美三级| 蜜臀精品一区二区三区在线观看| 麻豆专区一区二区三区四区五区| 久久99精品久久久久久动态图| 久久精品国产99国产| 精品亚洲porn| 国产成人午夜片在线观看高清观看| 国产成人精品免费一区二区| 91免费国产视频网站| 91福利在线看| 91精品国产高清一区二区三区| 欧美不卡视频一区| 欧美激情一区三区| 亚洲女人的天堂| 偷拍亚洲欧洲综合| 久久99精品国产| 成人av电影在线播放| 91电影在线观看| 日韩丝袜情趣美女图片| 久久精品综合网| 亚洲精品视频在线看| 日本va欧美va精品发布| 国产精品综合视频| 欧美最猛性xxxxx直播| 日韩欧美亚洲国产另类| 国产精品午夜久久| 亚洲综合一区二区| 国内精品伊人久久久久av一坑| 成人午夜视频在线观看| 欧美日韩五月天| 久久久久久久久久久久电影| 亚洲视频一区在线| 日本不卡高清视频| 91色porny蝌蚪| 天天色综合成人网| 日本成人超碰在线观看| 国产99久久久国产精品免费看| 色8久久精品久久久久久蜜| 日韩视频123| 1024成人网色www| 久久精品99国产精品| av电影一区二区| 日韩精品一区二区三区中文不卡| 国产精品美女久久久久久久久| 亚洲成人精品一区二区| 国产v日产∨综合v精品视频| 欧美性猛交一区二区三区精品 | 欧美va亚洲va在线观看蝴蝶网| 国产精品天美传媒沈樵| 无码av中文一区二区三区桃花岛| 成人动漫一区二区在线| 日韩视频不卡中文| 香蕉久久夜色精品国产使用方法| 国产高清精品在线| 99国产精品久久久| 精品国产1区二区| 亚洲国产成人av网| 粉嫩嫩av羞羞动漫久久久| 日韩欧美一级二级三级| 亚洲国产精品久久艾草纯爱| 欧美日韩一区二区三区免费看| 中文字幕av一区 二区| 国产伦精品一区二区三区免费迷| 欧美午夜精品理论片a级按摩| 国产精品素人一区二区| 国产乱子伦视频一区二区三区 | 久久久久99精品一区| 三级亚洲高清视频| 在线免费观看视频一区| 国产精品乱码一区二区三区软件| 国内久久婷婷综合| 日韩欧美国产午夜精品| 日韩福利电影在线| 777亚洲妇女| 午夜精品福利一区二区蜜股av | 日韩欧美国产电影| 国产成人在线视频网站| 一区二区三区日韩欧美| 国产大陆a不卡| 26uuu另类欧美| 九九精品一区二区| 日韩区在线观看| 日韩**一区毛片| 欧美精品一二三四| 日本特黄久久久高潮| 在线电影院国产精品| 丝袜脚交一区二区| 欧美一区永久视频免费观看| 日韩精品乱码av一区二区| 91精品国产美女浴室洗澡无遮挡| 日本一区中文字幕 | 欧美日本高清视频在线观看| 一区二区国产视频| 欧美日韩精品三区| 日韩中文欧美在线| 日韩午夜三级在线| 国产高清成人在线| 欧美韩日一区二区三区四区| 成人sese在线| 玉米视频成人免费看| 欧美日韩另类国产亚洲欧美一级| 午夜精品久久久久久久久久久| 91精品国产一区二区| 久久99国产精品免费网站| 久久久久国产精品厨房| av网站免费线看精品| 亚洲一区二区精品3399| 色综合久久99| 亚洲一二三四久久| 精品国产伦一区二区三区观看方式 | 亚洲男人的天堂在线观看| 在线免费av一区| 青青草国产成人99久久| 久久久久久久网| 色综合久久久久久久| 老司机午夜精品| 亚洲人xxxx| 精品理论电影在线观看 | 91麻豆免费观看| 日韩不卡手机在线v区|