• 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;
    }
    


  • 相关阅读:
    内网渗透笔记
    shift粘滞键后门创建/复原批处理
    通过Wireshark抓包进行Cookie劫持
    最全前端资源汇集 (持续整理中)
    HTML5教程之html 5 本地数据库(Web Sql Database)
    myslq 基本命令
    Node.js面试题:侧重后端应用与对Node核心的理解
    44个 Javascript 变态题解析 (上下)
    BAT及各大互联网公司前端笔试面试题--Html,Css篇
    Web前端面试题集锦
  • 原文地址:https://www.cnblogs.com/chaikefusibushiji/p/6775769.html
Copyright © 2020-2023  润新知