CPU的占有率计算

操作系统原理

Posted by chensong on 2020-01-14 22::06::45

前言

正文

一, 周期(时间片)

在这里插入图片描述 我们这里以4GHz就是CPU的频率

我们了解频率单位

Hz 是频率的单位。频率是指电脉冲,交流电波形,电磁波,声波和机械的振动周期循环时,1秒钟重复的次数。 1Hz代表每秒钟周期震动1次,60Hz代表每秒周期震动60次。 Hz是个很小的单位,通常在其前面加上k(千),M(百万),G(十亿),T(万亿)等数量级单位。 KHz,千赫兹,是频率,也可以说是采样率,一般都是44.1KHz的,因为这是音乐CD的标准。 KHZ 千赫兹:千赫,缩写是kHZ或KHZ*,它是交流电(AC)或电磁波(EM)频率的单位,等于1000赫兹(1000Hz)。这个单位也用于信号带宽的度量和描述。 1kHZ频率的AC信号在人类的听觉范围之内。如果此频率的信号加在耳机或扬声器上,那么出来的音调将会有一个斜度,它会降到所谓的“audio midrange”。频率为1kHZ的EM信号的波长为300千米,大约是190英里。标准调幅(AM)广播带宽在535kHZ至1605kHZ的范围内。某些EM的传输在百万kHZ [2] 。 千赫兹是频率的一个相对小的单位,更普遍一些的单位是MHz,等于1,000,000Hz或1,000kHz,还有GHz,它等于1,000,000,000Hz或1,000,000kHz,还有最近比较热的THz,它等于1,000,000,000,000Hz或1,000,000,000KHz。 常见量值

1GHz=1*$10^9$Hz

即我的电脑每秒有4*$10^9$的周期(时间片)

二, cpu定值

即我开启一个线程的电脑每秒有2*$10^9$时间是在cpu计算的CPU时,CPU占有百分比0.5 这还是单核的情况,看上面配置我电脑4核8线程

我开一个线程一直cpu工作 大约 是CPU使用了$0.25$ 但是我CPU核心数是4所以cpu的调度时会分时间片会多一些

下面是我开启一个线程一直工作时候的CPU的占有百分比 在这里插入图片描述

三, 测试程序

/***********************************************************************************************
created: 		2020-01-14

author:			chensong

purpose:		cpu的百分比   核心数    线程数
************************************************************************************************/



#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <cmath>
#include <vector>
#include <math.h>
//程序开始的时纳秒
static std::chrono::steady_clock::time_point g_cur_time = std::chrono::steady_clock::now();
unsigned long long global_count = 0;
unsigned int TICK_TIME = 0;
long long get_time_ms()
{
	//g_cur_time

	return  std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - g_cur_time).count();

}
class celapse
{
public:
	unsigned int get_elapse()
	{
		long long last_time = m_cur_time;
		m_cur_time = get_time_ms();
		if (m_cur_time >= last_time)
		{
			return static_cast<unsigned int>(m_cur_time - last_time);
		}
		else
		{
			return 1;
		}
	}
protected:
private:
	long long m_cur_time = 0;
};



void _work_thread()
{

	unsigned int uDelta = 0;
	celapse temp;
	unsigned long long  temp_count;
	bool	cpu_count = false;
	double PI = 3.14159265;
	int param = 0;
	while (true)
	{
		uDelta += temp.get_elapse();
		int y = 0;
		for (unsigned long long i = 0; i < global_count; ++i)
		{
			if (i != y)
			{
				y = i;
			}
		}
		uDelta = temp.get_elapse();
		if (uDelta < TICK_TIME)
		{
			printf("sleep = %d\n", TICK_TIME - uDelta);
			std::this_thread::sleep_for(std::chrono::milliseconds(TICK_TIME - uDelta));
		}

	}
}
// win cmd [start example.exe 1 400000000  100]
// 参数 - 线程名  线程数  cpu的频率 * 10000000   100
int main(int argc, char *argv[])
{

	printf("std::stoi(argv[1]) = %d, std::stoi(argv[2]) = %u, argv[3] = %u\n", std::stoi(argv[1]), std::stol(argv[2]), std::stoi(argv[3]));
	global_count = std::stol(argv[2]);
	TICK_TIME = std::stoi(argv[3]);
	std::vector<std::thread> 											cthreads;
	for (int i = 0; i < std::stoi(argv[1]); ++i)
	{
		// thread
		cthreads.emplace_back(&_work_thread);
	}
	for (std::thread &thread : cthreads)
	{
		if (thread.joinable())
		{
			thread.join();
		}
	}
	cthreads.clear();
	return EXIT_SUCCESS;
}