特别声明,本系列学习教程来自【阿发你好】 官网地址:阿发你好
版权声明:本文为博主-黄可可(hkkhuang)-原创文章,未经博主允许可转载,但请标明出处,谢谢!
1、进程与线程
进程:当Test01_1A.exe被加载到内存中运行时,这个运行着的实例称为一个进程。( 可以在任务管理器中查看)
Test01_1A.exe称为程序文件
Test01_1A.exe可以被同时多次运行,每运行一次,则一个进程被创建。
一个进程中包含中多个线程。
2、线程的调度
一个进程中可以创建多个线程。其中至少有一个主线程(main线程)。
由操作系统来负责安排调度:决定哪一个线程被运行。
(注意: 是操作系统决定了一切,我们只是来了解操作系统的行为,并用以达成我们的任务目标)
不同的操作系统,其调度算法可能是不一样的。
但是它们都遵循同一原则: 让所有的线程有机会运行。
2.1 时间片法
时间片法是一种普遍采用的调度算法。
介绍此算法的目的:辅助理解什么是”调度”。
基本原理:操作系统把CPU时间划分为多个均等的时间片。例如,每5ms一个时间片,在每个时间片内运行一个线程。总体上看,各个线程是被轮流运行的。
2.2 线程切换:
- (1) 把当前的线程切到后台,进入队列等待
- (2) 从队列中取得一个正在排队的线程,运行之
- (3) 5毫秒后,再次切换把这个队列称为候选队列,表示这里面的线程都希望自己被立刻运行。
2.3 需要知道:
- (1) 使用Sleep,可以主动让自己的线程提前让出CPU。
- (2) Sleep时间到的时候,该线程并不是被立即执行,而是进入了候选队列。
- (3) 操作系统是如何在候选队列里来挑选下一个线程的呢?不同的操作系统方法可能不一样,只需要大致了解。
注意:关于第2点:
比如,一个程序要Sleep”睡眠”一秒,则在一秒内该线程不被调度。当一秒以后,该线程苏醒,进入候选队列。
2.4 优先级
某些操作系统可能支持线程的优先级, Priority。
也就是说,允许我们在创建线程的时候,指定一下线程的优先级。如果优先级较高,则该线程在运行的时候拥有较高的机会被调度。
但是不推荐使用优先级这个特性,因为:
- (1) 并不是所有的操作系统都支持优先级
- (2) 优先级无法定量:倒底有多优先,是个说不准的事情。
2.5 合理利用Sleep
所以,关于线程调度,我们干预的手段是Sleep。它是所有的操作系统都支持的。
通过积极的Sleep,让出CPU,来达到有效地调度。
再次强调: Sleep不是一个精确的东西,在“醒来”之后不能保证该线程立即被调度。所以,你如果Sleep设定了N毫秒,那么实际间隔的时间一般会大于N。
Sleep一般会支持毫秒量级。
在OSAPI中提供了两个函数:
static void Msleep(int milli_sec); //毫秒量级
static void Sleep(int sec); //秒量级