线程属性设置在Linux和Windows下区别(调度策略和亲和性)


前言

线程属性包括是否分离、亲和性、调度策略和优先级等。Linux默认的调度策略是CFS(完全公平调度算法),而Windows是基于优先级抢占式的策略。

鉴于Linux与Windows在线程属性设置的较大差异性,分为调度策略和亲和性两方面进行重点介绍。


一、调度策略

1.Linux调度策略

Linux的调度策略一般分为分时系统和实时系统。

  • 分时系统是指使用CPU的时间达到分配给进程的时间(时间片)时,就会切换到其他进程;
  • 实时系统是指按照执行优先级进行调度,及时响应外部事件的请求,在规定的时间内完成对该事件的处理。

Linux采用了两种优先级的范围。

  • nice值,变换范围是从 -20 到 +19 ,默认值为 0,越大的 nice 值意味着更低的优先级。
  • 实时优先级,变化范围是从 0 到 99(包括0 和 99)。与 nice 值相反,实时优先级值越高意味着进程优先级越高,任何实时进程的优先级都高于普通的进程。
策略名称调度类型详细介绍
SCHED_OTHER分时调度方式循环时间分配调度策略,用户进程的默认策略。调度器根据调度类动态调整优先级。
对于O(1),时间片长度根据静态优先级设置,即更高优先级的工作分配到更长的时间。对于CFS(彻底公平调度),时间片是动态的。
SCHED_FIFO实时调度方式先到先服务策略,设置实时优先级,根据实时优先级计算调度权值,选择权值最高的任务使用CPU。该任务将一直占有CPU直到有优先级更高的任务就绪或者主动放弃。
SCHED_RR实时调度方式时间片轮转策略,根据任务的实时优先级和nice值,优先选择实时优先级高的任务,其次根据nice值,设置任务时间片,当时间片使用完时,执行权将转移到其他进程。
SCHED_BATCH分时调度方式批处理调度策略,与SCHED OTHER类似,但期望的线程是CPU消耗型,不是I/O交互消耗型。
SCHED_IDLE优先级最低,在CPU空闲时,即SCHED_IDLE 等级以外处于可执行状态的进程或线程消失时,才进行执行。

2.Windows调度策略

Windows 基于优先级和抢占调度算法来调度线程。

  • Windows 调度程序确保具有最高优先级的线程总是在运行的。由于调度程序选择运行的线程会一直运行,直到被更高优先级的线程所抢占,或终止,或时间片已到,或调用阻塞系统调用(如 I/O)。
  • 如果在低优先级线程运行时,更高优先级的实时线程变成就绪,那么低优先级线程就被抢占。这种抢占使得实时线程在需要使用 CPU 时优先得到使用。

每个线程的优先级基于它所属的优先级类型和它在该类型中的相对优先级。

整个调度程序采用 32 级的优先级方案,以便确定线程执行顺序。它分为两大类,可变类包括优先级从1〜15的线程,实时类包括优先级从16〜31的线程。

REALTIME_PRIORITYHIGH_PRIORITYABOVE NORMAL_PRIORITYNORMAL_PRIORITYBELOW_NORMAL_PRIORITYIDLE_PRIORITY
TIME_CRITICAL311515151515
HIGHEST2615121086
ABOVE_NORMAL251411975
NORMAL241310864
BELOW_NORMAL23129753
LOWEST22118642
IDLE1611111

二、亲和性

CPU 亲和性(affinity)就是进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性。

  • 软亲和性:指进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,Linux 内核进程调度器天生就具有被称为软 CPU 亲和性的特性,这意味着进程通常不会在处理器之间频繁迁移。
  • 硬亲和性:利用Linux内核提供给用户的API,强行将进程或者线程绑定到某一个指定的cpu核运行。这样可以提高缓存命中率,确保特殊进程长时间运行。

1.Linux亲和性设置

//参考宏定义
void CPU_ZERO (cpu_set_t *set) //这个宏对CPU集set进行初始化,将其设置为空集
void CPU_SET (int cpu, cpu_set_t *set) //这个宏将指定的cpu加入CPU 集set中
void CPU_CLR (int cpu, cpu_set_t *set) //这个宏将指定的cpu从CPU 集set中删除
int CPU_ISSET (int cpu, const cpu_set_t *set) //如果cpu是CPU集 set的一员,这个宏就返回一个非零值(true),否则就返回零(false)
//关键函数
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,const cpu_set_t *cpuset); 
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,cpu_set_t *cpuset);

2.Windows亲和性设置

//关键函数
DWORD_PTR SetThreadAffinityMask(HANDLE hThread,DWORD_PTR dwThreadAffinityMask);
BOOL SetThreadGroupAffinity(HANDLE hThread, const GROUP_AFFINITY *GroupAffinity, PGROUP_AFFINITY PreviousGroupAffinity);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值