前言
正文
一, 周期(时间片)
我们这里以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;
}