线程调度
单线程
单线程顺序执行,所有函数的调用和返回都是线性的,每次运行的结果一致。不用有线程间抢占的问题;
多线程
多线程中,多个线程可以同时或者交替运行,他们的执行顺序取决于操作系统调度器和线程同步机制;
操作系统调度器
调度器(Scheduler)操作系统内核中有一个调度器(Scheduler),它负责决定哪个线程(或进程)在什么时候运行。
调度器是实现多任务并发的关键组件。
调度策略:调度策略定义了操作系统如何选择一个线程去执行;

- 时间片轮转:每个线程被分配一个时间片,以轮转的方式运行,有助于保证每个线程获得等量的CPU时间。
- 优先级调度: 每个线程根据优先级获得调度,高优先级的线程先运行。
- 抢占式调度:如果有更高优先级的线程准备就绪,会中断当前线程;实时系统经常使用此策略;保证关键任务实时响应;
- 非抢占式调度:当前线程执行直到它主动让出 CPU(如调用 sleep/yield)
- 多级反馈队列:结合了轮转和优先级调度的特点,根据线程的行为和需求动态调整其优先级。
举例:
| 策略 | 描述 |
|---|---|
SCHED_OTHER |
非实时线程,默认策略,默认优先级是0;基于时间片 + nice (+19~-20)值越小,线程越容易被调度。 |
SCHED_FIFO |
实时策略,**先进先出,无时间片限制 ** ;优先级高的线程会一直运行,直到他主动放弃cpu |
SCHED_RR(Round-Robin, RR) |
实时策略,时间片轮转;优先级高的线程运行一段时间后可以被抢占 |
SCHED_DEADLINE |
适用于硬实时任务,指定 deadline 时间 |


线程同步机制
https://www.cnblogs.com/chivalrySun/p/18872633
1.互斥锁:保证同一时间只有一个线程访问关键代码。
2.条件变量:线程等待某个条件成立再继续执行。
3.信号量:控制线程数量,或者让某线程等待另一个线程的信号。
4.屏障:让多个线程在某一点上同步,全部到达后才继续。
什么时候会进行调度?
-
当前线程主动放弃 CPU
调用如 sleep()、pthread_cond_wait()、usleep()、pause()、read()(阻塞)等函数;线程进入阻塞/等待状态,系统会从就绪队列中调度另一个线程运行。 -
时间片用完(抢占式调度)
对于使用时间片策略(如 SCHED_OTHER 或 SCHED_RR)的线程,运行时间达到系统分配的时间片长度后会被强制中断;内核调度器选择另一个就绪线程运行。 -
有更高优先级线程准备就绪
如果有一个实时线程(SCHED_FIFO 或 SCHED_RR)或更高优先级线程就绪,调度器会立刻抢占当前线程;此为“抢占式调度”。 -
中断处理后调度
比如硬件 I/O 完成触发中断,唤醒了某个线程;调度器可能立即切换到这个线程。 -
从内核态返回用户态前(如系统调用返回时)
某些系统调用(比如 write()、select() 等)完成后,可能会触发调度;这是为了检查是否有更高优先级的线程需要运行。 -
线程/进程终止
当前线程执行结束(调用 pthread_exit() 或函数返回),调度器必须选择另一个线程运行。
实际执行顺序
线程的执行顺序在多线程程序中并不由程序代码决定,而是由操作系统调度器根据调度策略动态决定的。
如果希望控制多线程中的执行顺序,需要结合调度策略和线程同步机制共同使用;
一般来讲线程执行顺序取决于以下几个因素:
- 线程的优先级;
- 是否正在等待资源(I/O、锁等);
- CPU 是否空闲/负载是否过高;
- 系统是否是多核,多线程能否并行运行;
- 调度器当前状态(例如 RT 优先级线程插入)。
参考链接:
https://blog.csdn.net/weixin_45842280/article/details/135897687
https://www.cnblogs.com/chay/p/10587477.html
https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux_for_real_time/8/html/optimizing_rhel_8_for_real_time_for_low_latency_operation/con_thread-scheduling-policies_optimizing-rhel8-for-real-time-for-low-latency-operation
https://blog.csdn.net/luohaha66/article/details/134051122
https://www.ibm.com/docs/zh/aix/7.3.0?topic=programming-scheduling-threads
https://juejin.cn/post/7348864869230116883
浙公网安备 33010602011771号