第七章 线程的调度、优先级和亲缘性(5)

八、对优先级的抽象说明 Windows API展示了系统的调度程序上的一个抽象层,这样就永远不会直接与调度程序进行通信。 Windows 支持的优先级类 优先级类 描 述 实时 进程中的线程必须立即对事件作出响应, 以便执行关键时间的任务。该进程中的线程还会抢先于操作系统组件之前运行。使用本优先级类时必须极端小心 高 进程中的线程必须立即对事件作出响应,以便执行关键时间的任务。TaskManager(任务管理器)在这个类上运行,以便用户可以撤消脱离控制的进程 高于正常 进程中的线程在正常优先级与高优先级之间运行(这是Windows 2000中的新优先级类) 正常 进程中的线程没有特殊的调度需求 低于正常 进程中的线程在正常优先级与空闲优先级之间运行(这是 Windows 2000中的新优先级类) 空闲 进程中的线程在系统空闲时运行。该进程通常由屏幕保护程序或后台实用程序和搜集统计数据的软件使用 只有当绝对必要的时候,才可以使用高优先级类(Windows Explorer是在高优先级上运行的)。应该尽可能避免使用实时优先级类(管理员或特权用户的用户拥有“提高调度优先级”的权限,否则进程不能用实时优先级类来运行)。大多数进程都属于正常优先级类。 线程优先级 线程优先级 描 述 关键时间 实时优先级类,线程在优先级3 1上运行。其他优先级类,线程在优先级1 5上运行。 最高 线程在高于正常优先级的上两级上运行 高于正常 线程在正常优先级的上一级上运行 正常 线程在进程的优先级类上正常运行 低于正常 线程在低于正常优先级的下一级上运行 最低 线程在低于正常优先级的下两级上运行 空闲 实时优先级类,线程在优先级1 6上运行。其他优先级类,线程在优先级1上运行。 应用程序开发人员从来不必具体设置优先级。系统负责将进程的优先级类和线程的相对优先级映射到一个优先级上。0优先级保留供零页线程使用,系统不允许任何其他线程拥有 0优先级。 一般来说,大多数时候高优先级的线程不应该处于可调度状态。当线程要进行某种操作时,它能迅速获得CPU时间。这时线程应该尽可能少地执行C P U指令,并返回睡眠状态,等待再次变成可调度状态。相反,低优先级的线程可以保持可调度状态,执行大量的C P U指令来进行它的操作。
在Linux系统中,可以使用`sched_setscheduler`函数来设置线程调度策略和优先级。该函数的原型如下: ```c #include <sched.h> int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param); ``` 其中,`pid`参数指定要设置的线程的进程ID,如果`pid`为0,则表示设置当前线程调度策略和优先级。`policy`参数指定调度策略,可以是以下三种之一: - `SCHED_FIFO`:先进先出调度策略。 - `SCHED_RR`:时间片轮转调度策略。 - `SCHED_OTHER`:普通调度策略。 `param`参数是一个指向`sched_param`结构体的指针,用于指定线程优先级。该结构体定义如下: ```c struct sched_param { int sched_priority; // 线程优先级 }; ``` `sched_priority`成员指定线程优先级,取值范围为0~99,数值越大表示优先级越高。 下面是一个示例代码,演示如何使用`sched_setscheduler`函数设置线程调度策略和优先级: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <sched.h> void *thread_func(void *arg) { int i; for (i = 0; i < 5; i++) { printf("Thread %ld is running\n", (long)arg); sleep(1); } return NULL; } int main() { pthread_t tid1, tid2; struct sched_param param; int policy, ret; // 创建两个线程 ret = pthread_create(&tid1, NULL, thread_func, (void *)1); if (ret != 0) { perror("pthread_create"); exit(EXIT_FAILURE); } ret = pthread_create(&tid2, NULL, thread_func, (void *)2); if (ret != 0) { perror("pthread_create"); exit(EXIT_FAILURE); } // 获取当前线程调度策略和优先级 policy = sched_getscheduler(0); printf("Current thread's scheduling policy is %d\n", policy); ret = sched_getparam(0, &param); if (ret != 0) { perror("sched_getparam"); exit(EXIT_FAILURE); } printf("Current thread's priority is %d\n", param.sched_priority); // 设置线程调度策略和优先级 param.sched_priority = 80; ret = sched_setscheduler(0, SCHED_FIFO, &param); if (ret != 0) { perror("sched_setscheduler"); exit(EXIT_FAILURE); } // 获取设置后的线程调度策略和优先级 policy = sched_getscheduler(0); printf("Current thread's scheduling policy is %d\n", policy); ret = sched_getparam(0, &param); if (ret != 0) { perror("sched_getparam"); exit(EXIT_FAILURE); } printf("Current thread's priority is %d\n", param.sched_priority); // 等待线程结束 pthread_join(tid1, NULL); pthread_join(tid2, NULL); return 0; } ``` 该示例代码创建了两个线程,并使用`sched_setscheduler`函数将当前线程调度策略设置为先进先出调度策略,优先级设置为80。最后,等待两个线程结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值