CPU线程调度
实验过程:
1.假设CPU数为n,创建n+1个线程。
2.1-n号线程先创建,运行while死循环。
3.n+1号线程最后创建,运行一开始先Sleep 0.1秒,然后不断写文件1.txt
实验结果:
1.txt被创建,内容为54M的"nihao"
实验结论:
相同优先级的多个线程平摊CPU时间,每个线程以时间片为执行单位。
时间片用完后,CPU先看有没有更高优先级的线程等待执行,优先让级别高的先运行;然后看有没有同等优先级的线程等待运行,有就轮到它来执行。
windows CPU调度以线程为调度粒度。
线程状态转换图:
线程阻塞会让出CPU。
导致阻塞的函数如WaitForSingleObject、recv、accept。
线程调用阻塞式函数时就进入核心态开始执行核心代码了,不再执行用户代码,此时控制权就转交给OS的调度程序,调度程序会调用其他线程执行。
只要线程进入阻塞或者挂起状态,调度器将剥夺其所分配的剩余CPU时间片,而执行别的线程。
实验代码:
#include <string>
#include <iostream>
#include <fstream>
#include <process.h>
#include <Windows.h>
unsigned int __stdcall F1(void *arg)
{
while(1);
_endthreadex(0);
return 0;
}
unsigned int __stdcall F2(void *arg)
{
Sleep(100);
std::ofstream o("C:\\Documents and Settings\\Administrator\\桌面\\1.txt", std::ios::app);
while(1)
o<<"nihao"<<std::endl;
_endthreadex(0);
return 0;
}
int main()
{
SYSTEM_INFO si;
GetSystemInfo(&si);
int num = si.dwNumberOfProcessors;
for(int i = 0; i < num+1; i++)
{
if(i != num)
_beginthreadex(NULL, 0, F1, NULL, 0, NULL);
else
_beginthreadex(NULL, 0, F2, NULL, 0, NULL);
}
while(1)
Sleep(100000000);
return 0;
}
浙公网安备 33010602011771号