Linux内核线程优先级设置的方法介绍
- 格式:doc
- 大小:13.00 KB
- 文档页数:1
Linux内核的三种调度策略:1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务.一旦占用cpu则一直运行.一直运行直到有更高优先级任务到达或自己放弃3,SCHED_RR实时调度策略,时间片轮转.当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾.放在队列尾保证了所有具有相同优先级的RR任务的调度公平Linux线程优先级设置,可以通过以下两个函数来获得线程可以设置的最高和最低优先级,函数中的策略即上述三种策略的宏定义:int sched_get_priority_max(int policy);int sched_get_priority_min(int policy);SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高.设置和获取优先级通过以下两个函数:int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);例如以下代码创建了一个优先级为10的线程:struct sched_param{int __sched_priority; //所要设定的线程优先级};例:创建优先级为10的线程pthread_attr_t attr;struct sched_param param;pthread_attr_init(&attr);pthread_attr_setschedpolicy(&attr, SCHED_RR);param.sched_priority = 10;pthread_attr_setschedparam(&attr, ¶m);pthread_create(xxx , &attr , xxx , xxx);pthread_attr_destroy(&attr);本文来自CSDN博客,转载请标明出处:内核线程、轻量级进程、用户线程和LinuxThreads库(2010-04-22 10:20:07)转载标签:杂谈内核线程内核线程只运行在内核态,不受用户态上下文的拖累。
linux setpriority 用法Linux setpriority 函数用于设置进程的优先级。
该函数用于改变进程的调度优先级,以便在多个正在运行的进程中进行调度。
本文将一步一步回答关于setpriority 的用法。
第一步:概述setpriority 函数属于POSIX 标准的一部分,它允许用户在Linux 操作系统中调整进程的优先级。
这在一些需要实时性能和资源管理的应用程序中非常有用。
通过调整进程的优先级,可以确保关键任务的优先处理。
第二步:函数原型setpriority 函数的函数原型如下所示:c#include <sys/resource.h>int setpriority(int which, id_t who, int prio);该函数接受三个参数:which、who 和prio。
第三步:参数解释1. which:指定谁的优先级需要被调整。
这个参数可以是下面任意一个值:- PRIO_PROCESS:用于指定调用进程自身的进程ID。
- PRIO_PGRP:用于指定与调用进程处于同一进程组中的进程组ID。
- PRIO_USER:用于指定与调用进程属于同一用户ID 的全部进程。
2. who:who 参数指定对哪个进程组、进程或用户的优先级进行设置。
如果which 参数设置为PRIO_PROCESS,则who 参数指定进程的ID。
如果which 参数设置为PRIO_PGRP,则who 参数指定进程组的ID。
如果which 参数设置为PRIO_USER,则who 参数指定用户的ID。
3. prio:prio 参数用于指定要设置的优先级。
它的范围通常是-20 到19,其中-20 是最高优先级,19 是最低优先级。
第四步:函数返回值setpriority 函数的返回值是成功设置优先级的进程的ID,如果出现错误,则返回-1。
第五步:使用示例下面是一个使用setpriority 函数的示例:c#include <stdio.h>#include <sys/resource.h>#include <sys/types.h>#include <unistd.h>int main() {int result = setpriority(PRIO_PROCESS, getpid(), -10);if (result == -1) {perror("setpriority");return 1;}printf("Priority set successfully.\n");return 0;}在上面的示例中,我们使用setpriority 函数将调用进程的优先级设置为-10。
Linux线程的状态与调度1,线程的⽣命周期线程从创建、运⾏到结束总是处于下⾯五个状态之⼀:新建状态、就绪状态、运⾏状态、阻塞状态及死亡状态。
1.新建状态(New):当⽤new操作符创建⼀个线程时,例如new Thread(r),线程还没有开始运⾏,此时线程处在新建状态。
当⼀个线程处于新⽣状态时,程序还没有开始运⾏线程中的代码2.就绪状态(Runnable)⼀个新创建的线程并不⾃动开始运⾏,要执⾏线程,必须调⽤线程的start()⽅法。
当线程对象调⽤start()⽅法即启动了线程,start()⽅法创建线程运⾏的系统资源,并调度线程运⾏run()⽅法。
当start()⽅法返回后,线程就处于就绪状态。
处于就绪状态的线程并不⼀定⽴即运⾏run()⽅法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运⾏线程。
因为在单CPU的计算机系统中,不可能同时运⾏多个线程,⼀个时刻仅有⼀个线程处于运⾏状态。
因此此时可能有多个线程处于就绪状态。
对多个处于就绪状态的线程是由Java运⾏时系统的线程调度程序(thread scheduler)来调度的。
3.运⾏状态(Running)当线程获得CPU时间后,它才进⼊运⾏状态,真正开始执⾏run()⽅法.4. 阻塞状态(Blocked)线程运⾏过程中,可能由于各种原因进⼊阻塞状态:1>线程通过调⽤sleep⽅法进⼊睡眠状态;2>线程调⽤⼀个在I/O上被阻塞的操作,即该操作在输⼊输出操作完成之前不会返回到它的调⽤者;3>线程试图得到⼀个锁,⽽该锁正被其他线程持有;4>线程在等待某个触发条件;......所谓阻塞状态是正在运⾏的线程没有运⾏结束,暂时让出CPU,这时其他处于就绪状态的线程就可以获得CPU时间,进⼊运⾏状态。
5. 死亡状态(Dead)有两个原因会导致线程死亡:1) run⽅法正常退出⽽⾃然死亡,2) ⼀个未捕获的异常终⽌了run⽅法⽽使线程猝死。
linux下常见的调度策略及调度原理Linux是一种开源的操作系统,广泛应用于服务器和嵌入式设备中。
在Linux系统中,进程调度策略是操作系统的核心组成部分之一,它决定了进程的执行顺序和时间分配。
本文将介绍Linux下常见的调度策略及其调度原理。
在Linux系统中,常见的进程调度策略包括先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)和优先级调度(Priority Scheduling)等。
先来先服务(FCFS)是一种简单而直观的调度策略,它按照进程到达的先后顺序进行调度。
即当一个进程到达系统时,它将被放入就绪队列的末尾,并等待CPU的分配。
当CPU空闲时,系统将选择就绪队列中的第一个进程分配给CPU执行。
这种调度策略的优点是公平性强,但缺点是无法处理长作业和短作业的差异,容易产生"饥饿"现象。
最短作业优先(SJF)调度策略是根据进程的执行时间来决定优先级的调度策略。
即系统会选择执行时间最短的进程先执行,以减少平均等待时间。
这种调度策略的优点是能够最大程度地减少平均等待时间,但缺点是可能会出现长作业等待时间过长的问题。
时间片轮转(RR)是一种基于时间片的调度策略,每个进程被分配一个固定长度的时间片。
当一个进程的时间片用完时,系统将把CPU分配给下一个进程。
这种调度策略的优点是能够有效地平衡进程之间的响应时间,但缺点是可能会导致频繁的上下文切换。
优先级调度(Priority Scheduling)是一种根据进程优先级来决定调度顺序的策略。
每个进程被分配一个优先级,优先级越高的进程越容易被调度执行。
这种调度策略的优点是能够根据不同进程的需求进行灵活调度,但缺点是可能会导致低优先级进程的"饥饿"问题。
在Linux系统中,调度算法的实现是通过内核的进程调度器来完成的。
内核中的调度器会根据不同的调度策略来选择下一个要执行的进程,并将其上下文切换到CPU中执行。
linux 线程优先级设置方法Linux操作系统中,线程是轻量级的进程,合理设置线程的优先级可以优化系统资源的分配,提高程序的执行效率。
本文将详细介绍Linux线程优先级的设置方法。
一、线程优先级概述在Linux操作系统中,线程优先级通常分为两种:静态优先级和动态优先级。
1.静态优先级:在创建线程时分配的优先级,通常在程序运行过程中不会改变。
2.动态优先级:系统根据线程的运行情况动态调整的优先级,通常与线程的CPU使用时间、等待时间等因素有关。
二、设置线程优先级的方法1.使用sched_setparam()函数设置静态优先级函数原型:```cint sched_setparam(pid_t pid, const struct sched_param *param);```示例代码:```c#include <stdio.h>#include <unistd.h>#include <sched.h>#include <pthread.h>void *thread_function(void *arg) {// 线程函数代码}int main() {pthread_t tid;struct sched_param param;int policy;// 创建线程pthread_create(&tid, NULL, thread_function, NULL);// 获取当前线程的调度策略和优先级pthread_getschedparam(pthread_self(), &policy, ¶m);// 设置优先级(数值越大,优先级越高)param.sched_priority = 30;// 设置线程优先级if (pthread_setschedparam(tid, policy, ¶m) != 0) { perror("pthread_setschedparam");return 1;}// 等待线程结束pthread_join(tid, NULL);return 0;}```2.使用nice()函数设置动态优先级函数原型:```cint nice(int inc);```示例代码:```c#include <stdio.h>#include <unistd.h>#include <sys/resource.h>int main() {// 获取当前进程的nice值int old_nice = nice(0);// 设置新的nice值(数值越小,优先级越高)if (nice(-10) == -1) {perror("nice");return 1;}// 输出新的优先级printf("New priority: %d", old_nice - 10);return 0;}```三、总结本文介绍了Linux线程优先级的设置方法,包括使用sched_setparam()函数设置静态优先级和使用nice()函数设置动态优先级。
Linux内核的三种调度策略:1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务。
一旦占用cpu则一直运行。
一直运行直到有更高优先级任务到达或自己放弃3,SCHED_RR实时调度策略,时间片轮转。
当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。
放在队列尾保证了所有具有相同优先级的RR任务的调度公平Linux线程优先级设置首先,可以通过以下两个函数来获得线程可以设置的最高和最低优先级,函数中的策略即上述三种策略的宏定义:int sched_get_priority_max(int policy);int sched_get_priority_min(int policy);SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。
设置和获取优先级通过以下两个函数param););attr,,const struct sched_param *paramint pthread_attr_setschedparam(pthread_attr_t*attrparam););attr,,struct sched_param *param int pthread_attr_getschedparam(const pthread_attr_t*attrparam sched_priority = 51;//设置优先级系统创建线程时,默认的线程是SCHED_OTHER。
所以如果我们要改变线程的调度策略的话,可以通过下面的这个函数实现。
int pthread_attr_setschedpolicy(pthread_attr_t*attrattr,,int policy);上面的param使用了下面的这个数据结构:struct sched_param {int __sched_priority;//所要设定的线程优先级};我们可以通过下面的测试程序来说明,我们自己使用的系统的支持的优先级:stdio..h>#include<stdiopthread..h>#include<pthreadsched..h>#include<sched#include<assert.h>attr))static int get_thread_policy(pthread_attr_t*attr{int policy;,&policypolicy););attr,&int rs =pthread_attr_getschedpolicy(attr==0);assert(rs rs==policy))switch(policy{case SCHED_FIFO:printf("policy= SCHED_FIFO\n");break;case SCHED_RR:printf("policy= SCHED_RR");break;case SCHED_OTHER:printf("policy=SCHED_OTHER\n");break;default:printf("policy=UNKNOWN\n");break;}return policy;}attr,,int policy) static void show_thread_priority(pthread_attr_t*attr{int priority = sched_get_priority_max(policypolicy););priority!=-1););assert(priority!=-1printf ("max_priority=%d\n",priority priority);); priority priority== sched_get_priority_min (policy policy);); assert (priority!=-1priority!=-1);); printf ("min_priority=%d\n",priority priority);); }static int get_thread_priority (pthread_attr_t *attr attr)){struct sched_param param; int rs = pthread_attr_getschedparam (attr attr,&,¶m param);); assert (rs rs====0); printf ("priority=%d",param param..__sched_priority __sched_priority);); return param.__sched_priority __sched_priority;; }static void set_thread_policy (pthread_attr_t *attr attr,,int policy) {int rs = pthread_attr_setschedpolicy (attr attr,,policy policy);); assert (rs rs====0); get_thread_policy get_thread_policy((attr attr);); }int main (void ){pthread_attr_t attr; struct sched_param sched; int rs; rs = pthread_attr_init (&attr attr);); assert (rs rs====0);int policy = get_thread_policy (&attr attr);); printf ("Show current configuration of priority\n"); show_thread_priority show_thread_priority(&(&attr attr,,policy policy);); printf ("show SCHED_FIFO of priority\n"); show_thread_priority show_thread_priority(&(&attr attr,,SCHED_FIFO SCHED_FIFO);); printf ("show SCHED_RR of priority\n"); show_thread_priority show_thread_priority(&(&attr attr,,SCHED_RR SCHED_RR);); printf ("show priority of current thread\n"); int priority = get_thread_priority (&attr attr););printf ("Set thread policy\n");); printf ("set SCHED_FIFO policy\n");); set_thread_policy set_thread_policy(&(&attr attr,,SCHED_FIFO SCHED_FIFO);); printf ("set SCHED_RR policy\n");); set_thread_policy set_thread_policy(&(&attr attr,,SCHED_RR SCHED_RR);); printf ("Restore current policy\n");); set_thread_policy set_thread_policy(&(&attr attr,,policy policy););rs = pthread_attr_destroy (&attr attr);); assert (rs rs====0); return 0; }下面是测试程序的运行结果:policy policy==SCHED_OTHER Show current configuration of priority max_priority max_priority==0 min_priority min_priority==0 show SCHED_FIFO of priority max_priority max_priority==99 min_priority min_priority==1 show SCHED_RR of priority max_priority max_priority==99 min_priority min_priority==1 show priority of current thread priority priority==0Set thread policy set SCHED_FIFO policy policy policy== SCHED_FIFO set SCHED_RR policy policy policy== SCHED_RRRestore current policy policy policy==SCHED_OTHER Linux 线程调度策略与优先级(二)上一篇文章介绍了上一篇文章介绍了Linux 下的调度策略和优先级,在Ubuntu09.10Ubuntu09.10上的一些特性,这里测试上的一些特性,这里测试一下其中的两种特性,一下其中的两种特性,SCHED_OTHER SCHED_OTHER 和SCHED_RR SCHED_RR,还有就是优先级的问题,是不是能够保证,高,还有就是优先级的问题,是不是能够保证,高优先级的线程,就可以保证先运行。
Linux命令行使用技巧如何查看和管理系统进程优先级在Linux操作系统中,进程优先级是指操作系统对运行中的进程进行调度和分配资源的重要参数之一。
通过合理地设置进程优先级,能够有效地提高系统的性能和稳定性。
本文将介绍一些Linux命令行使用技巧,帮助你查看和管理系统进程优先级。
一、查看系统进程1. top命令:top命令是Linux下常用的查看系统进程的命令。
通过top命令,你可以实时地查看各个进程的运行情况、进程ID、CPU使用率等信息。
2. ps命令:ps命令也是查看系统进程的常用命令。
通过ps命令,你可以查看当前用户的进程情况、各个进程的状态、进程ID等信息。
二、了解进程优先级在Linux系统中,进程的优先级用一个范围为-20到19的数值表示,其中-20表示最高优先级,19表示最低优先级。
默认情况下,普通用户创建的进程的优先级为0,系统进程的优先级通常较高。
三、修改进程优先级1. renice命令:renice命令用于修改已经运行的进程的优先级。
通过renice命令,你可以提高或降低进程的优先级。
假设你想将进程ID为12345的进程的优先级提高到10,你可以使用以下命令:```renice 10 12345```2. nice命令:nice命令用于在启动进程时指定进程的优先级。
通过nice命令,你可以创建一个具有较高或较低优先级的进程。
假设你想在运行一个新的进程时将其优先级设置为5,你可以使用以下命令:```nice -n 5 command```其中,command表示你要运行的命令或程序。
四、管理系统进程优先级1. taskset命令:taskset命令用于将进程绑定到指定的CPU或CPU 集。
通过taskset命令,你可以管理进程的调度情况。
假设你想将进程ID为12345的进程绑定到CPU 0上,你可以使用以下命令:```taskset -p 0x1 12345```2. chrt命令:chrt命令用于修改进程的调度策略和优先级。
使用nice和renice命令在Linux中调整进程优先级标题:使用nice和renice命令在Linux中调整进程优先级在Linux操作系统中,为了有效管理系统资源,我们可以使用nice 和renice命令来调整进程的优先级。
通过增加或减少进程的优先级,可以让系统更好地分配资源,提高系统的性能和稳定性。
本文将详细介绍nice和renice命令的用法及其在系统管理中的应用。
一、nice命令的基本用法1. nice命令的作用nice命令用于运行指定的命令,并将其优先级设为指定值。
优先级的范围从-20(最高优先级)到19(最低优先级)。
默认情况下,命令的优先级为0。
2. nice命令的语法nice [-n N] command-n N:指定命令运行的优先级,N为-20至19之间的值。
3. nice命令的示例假设我们要运行一个CPU密集型的程序"myprog",并将其优先级设为最低值,可以使用以下命令:nice -n 19 myprog二、renice命令的基本用法1. renice命令的作用renice命令用于调整已经在运行中的进程的优先级。
2. renice命令的语法renice [-n N] [-g|-p|-u] ID ...-n N:指定要调整的进程的优先级值,N的范围同样是-20至19之间的值。
-g:将指定的进程组的优先级进行调整。
-p:将指定的进程的优先级进行调整。
-u:将指定的用户的所有进程的优先级进行调整。
ID:进程、进程组或用户的标识符。
3. renice命令的示例假设我们已经运行了一个进程,它的进程ID为1234,现在我们想将该进程的优先级调整为最高值,可以使用以下命令:renice -n -20 -p 1234三、nice和renice命令的应用场景1. 资源管理在多个用户或进程同时运行的情况下,通过使用nice和renice命令,可以根据实际情况为不同的进程设置合适的优先级,以保证系统的正常运行。
linux setpriority 用法摘要:1.引言2.setpriority 命令的作用和用途3.setpriority 命令的基本语法和参数4.setpriority 命令的实例操作5.结论正文:【引言】在Linux 系统中,进程的调度是一个非常重要的环节。
系统需要根据进程的优先级来决定各个进程执行的顺序。
setpriority 命令就是用来修改进程优先级的一个工具。
本文将为大家介绍setpriority 命令的用法和相关知识。
【setpriority 命令的作用和用途】setpriority 命令用于设置进程的优先级。
进程优先级决定了进程在执行时的调度顺序。
优先级数值越低,进程的优先级越高。
通过调整进程优先级,可以影响进程的执行速度和响应时间。
setpriority 命令主要应用于嵌入式Linux 系统、实时系统等领域。
【setpriority 命令的基本语法和参数】setpriority 命令的基本语法如下:```setpriority [options] <priority> <process_id>```其中,`<priority>` 是要设置的进程优先级,取值范围为-20(最高优先级)到19(最低优先级)。
`<process_id>` 是要修改优先级的进程的ID。
setpriority 命令的主要参数有:- `-o`,显示详细信息。
- `-p`,指定要修改优先级的进程的进程组。
- `-n`,指定要修改优先级的进程的进程名称。
【setpriority 命令的实例操作】假设有一个进程ID 为12345,我们想要将其优先级设置为5,可以执行以下命令:```setpriority -p 12345 5```【结论】setpriority 命令是Linux 系统中用于修改进程优先级的一个重要工具。
通过调整进程优先级,可以影响进程的执行速度和响应时间,从而满足不同场景的需求。
linux内核中的workqueue 和work 使用方法示例及解释说明1. 引言1.1 概述Linux内核是操作系统的核心,工作队列(workqueue)和work是其重要的组成部分。
工作队列提供了一种异步机制,用于处理长时间运行的任务或者需要在后台执行的任务。
而work则是具体的任务对象,通过将任务封装为work对象,可以方便地在工作队列中进行调度和管理。
1.2 文章结构本文将详细介绍Linux内核中的工作队列(workqueue)和work的使用方法,并通过示例和解释说明来展示其具体应用。
文章分为五个部分:引言、Workqueue和Work基础知识、Workqueue使用方法、Work使用方法和示例说明以及结论与展望。
1.3 目的本文旨在帮助读者全面了解Linux内核中工作队列和work的概念以及它们的使用方法。
通过深入解析其原理和实践案例,读者可以掌握如何利用工作队列和work来进行高效地后台任务处理,并为未来的研究和应用提供思路和参考。
2. Workqueue和Work基础知识:2.1 Workqueue介绍:Workqueue是Linux内核中的一种机制,用于管理和执行工作任务。
它是一种异步处理的机制,可以在后台处理一些耗时的操作,而不会阻塞系统或其他任务的执行。
2.2 Work介绍:Work是由Workqueue管理的工作任务。
每个Work代表一个需要在后台执行的具体工作。
一个Work可以被认为是一段代码,在特定条件或事件发生时被调用执行。
2.3 Work之间的关系:Workqueue可以创建和管理多个Work任务。
当某个条件满足时,例如硬件中断发生或定时器超时,Workqueue会从任务队列中选择一个可用的Work,并将其分配给空闲的内核线程来运行,以完成相应的工作。
在这个过程中,多个Work之间不存在直接依赖关系。
每个Work都是独立地被分配、执行和管理。
它们并行运行,并且不需要等待其他Work的完成。
linux c语言 setpriority方法在Linux系统中,进程的优先级是一个重要的资源调度策略,它决定了系统在面对多个同时运行的进程时,优先处理哪个进程。
通过调整进程的优先级,可以影响系统资源的分配,从而实现不同的系统行为。
在C语言中,可以使用setpriority()函数来设置进程的优先级。
一、setpriority()函数简介setpriority()函数是Linux系统中用于设置进程优先级的函数,它接受三个参数:pid、policy和prio。
pid表示要设置优先级的进程ID,policy指定了优先级的策略,prio是进程的优先级值。
setpriority()函数的作用是将指定进程的优先级设置为指定的值。
二、setpriority()函数的参数说明1.pid:要设置优先级的进程ID。
可以是进程的PID(进程号)或进程组ID (表示一组相似进程的标识符)。
2.policy:指定了优先级的策略,有PRIO_PROCESS(单个进程优先级)、PRIO_IO_HIGHEST(I/O高优先级)、PRIO_IO_RISKY(I/O风险高的优先级)、PRIO_CLASSIC(经典优先级)、PRIO_PROCESS_ANNOTATION(任务注解中的任务等级)和PRIO_PROCESS_RR(轮询式负载均衡的进程优先级)。
其中,常用的策略是PRIO_PROCESS。
3.prio:进程的优先级值,范围从-20到20,数值越大表示优先级越高。
三、setpriority()函数的调用方式setpriority()函数的调用方式很简单,只需要将pid、policy和prio作为参数传递给该函数即可。
例如:```cpid_tpid=getpid();//获取当前进程IDintpolicy=PRIO_PROCESS;//设置策略为单个进程优先级intprio=5;//设置进程优先级为5setpriority(PRIO_PROCESS,pid,policy);//设置当前进程的优先级```四、setpriority()函数的应用场景setpriority()函数在以下场景中非常有用:1.高优先级任务调度:当需要紧急处理某个任务时,可以通过设置该任务的优先级来确保它能够得到及时处理。
linux setpriority 用法-回复Linux setpriority是一个系统调用函数,用于设置进程的优先级。
优先级决定了进程在系统资源分配中的相对重要性,高优先级的进程会获得更多的CPU时间,确保其能够及时响应用户的请求。
本文将详细介绍setpriority函数的用法,并提供一步一步的指导,使读者能够充分了解如何正确使用setpriority函数。
1. 确定进程ID在开始之前,我们需要确定要设置优先级的进程的进程ID。
可以使用命令`ps -ef`来列出当前运行的所有进程,通过查看输出结果,找到要设置优先级的进程的PID。
2. 包含头文件在程序中,我们需要包含头文件`<sys/resource.h>`,该头文件中包含了setpriority函数的声明。
3. 设置进程优先级调用setpriority函数时,需要传入三个参数,分别是`which`、`who`和`priority`。
- `which`参数用于指定进程的类型,有三个取值:PRIO_PROCESS、PRIO_PGRP和PRIO_USER。
其中PRIO_PROCESS表示根据进程ID确定进程,PRIO_PGRP表示根据进程组ID确定进程,PRIO_USER表示根据用户ID确定进程。
- `who`参数用于指定进程的ID,根据`which`参数的取值不同,`who`参数的含义也有所不同。
- `priority`参数用于设置进程的优先级,取值范围为-20到19,其中-20表示最高优先级,19表示最低优先级。
下面是一个使用setpriority函数设置进程优先级的示例代码:c#include <sys/resource.h>#include <stdio.h>int main() {int pid = 12345; 要设置优先级的进程IDint priority = -10; 设置的优先级int result = setpriority(PRIO_PROCESS, pid, priority);if (result == 0) {printf("成功设置进程优先级!\n");} else {printf("设置进程优先级失败!\n");}}4. 编译和运行程序保存上述代码为一个C文件,使用gcc编译器进行编译:bashgcc -o setpriority_example setpriority_example.c编译成功后,运行可执行文件:bash./setpriority_example根据程序的输出结果,判断是否成功设置了进程的优先级。
Linux的进程优先级NI和PR为什么要有进程优先级?这似乎不⽤过多的解释,毕竟⾃从多任务操作系统诞⽣以来,进程执⾏占⽤cpu的能⼒就是⼀个必须要可以⼈为控制的事情。
因为有的进程相对重要,⽽有的进程则没那么重要。
进程优先级起作⽤的⽅式从发明以来基本没有什么变化,⽆论是只有⼀个cpu的时代,还是多核cpu时代,都是通过控制进程占⽤cpu时间的长短来实现的。
就是说在同⼀个调度周期中,优先级⾼的进程占⽤的时间长些,⽽优先级低的进程占⽤的短些。
请⼤家真的不要混淆了系统中的这两个概念:nice(NI)和priority(PR),他们有着千丝万缕的关系,但对于当前的Linux系统来说,它们并不是同⼀个概念。
我们看这个命令:⼤家是否真的明⽩其中PRI列和NI列的具体含义有什么区别?同样的,如果是top命令:⼤家是否搞清楚了这其中PR值和NI值的差别?如果没有,那么我们可以⾸先搞清楚什么是nice值。
什么是NICE值?NICE值应该是熟悉Linux/UNIX的⼈很了解的概念了,它是反应⼀个进程“优先级”状态的值,其取值范围是-20⾄19,⼀共40个级别。
这个值越⼩,表⽰进程”优先级”越⾼,⽽值越⼤“优先级”越低。
例如,我们可以通过NICE命令来对⼀个将要执⾏的bash命令进⾏NICE值设置,⽅法是:1. [root@zorrozou-pc0 zorro]# nice -n 10 bash这样我就⼜打开了⼀个bash,并且其nice值设置为10,⽽默认情况下,进程的优先级应该是从⽗进程继承来的,这个值⼀般是0。
我们可以通过nice命令直接查看到当前shell的nice值:1. [root@zorrozou-pc0 zorro]# nice2. 10对⽐⼀下正常情况:1. [root@zorrozou-pc0 zorro]# exit退出当前nice值为10的bash,打开⼀个正常的bash,我们查看下其 Nice值:1. [root@zorrozou-pc0 zorro]# bash2. [root@zorrozou-pc0 zorro]# nice3. 0另外,使⽤renice命令可以对⼀个正在运⾏的进程进⾏nice值的调整,我们也可以使⽤⽐如top、ps等命令查看进程的nice值,具体⽅法我就不多说了,⼤家可以参阅相关man page。
linux线程优先级取值范围
在Linux系统中,线程优先级的取值范围是0~99,其中数值越大表示优先级越高。
然而,这只代表了部分情况。
实际上,线程优先级的取值范围和具体的系统实现有关。
在Linux中,线程的优先级由nice值和系统默认优先级共同决定。
系统默认优先级为120,nice值的取值范围为-20~19。
因此,通过计算公式线程数值 = 系统默认优先级+ nice值,可以得出线程的最小优先级为100,最大优先级为139。
然而,如果考虑实时进程和非实时进程,Linux进程实际上实现了140个优先级范围,取值范围是从 [0, 139]。
其中,实时进程的优先级范围是[0, 99],而非实时进程的优先级范围是[100, 139]。
所以,线程优先级的取值范围还要考虑到实时进程和非实时进程的差别。
请注意,具体的取值范围可能因Linux内核版本和系统配置而有所不同。
如需了解更多关于Linux线程优先级的取
值范围的信息,建议查阅相关的技术手册或咨询专业的技术人员。
内核支持线程的实现方法线程是指在一个进程中,执行不同的程序流,每个程序流有自己的执行上下文和堆栈。
在多线程环境中,多个线程共享进程的资源,可以具有独立的执行流程,提高了程序的效率和并发能力。
内核支持线程是操作系统中的一项重要功能,本文将介绍内核支持线程的实现方法。
线程实现内核支持用户级线程和内核级线程的实现方式。
例如,在现代的 Linux 操作系统中,使用 POSIX 线程库来实现用户级线程,使用内核线程实现内核级线程。
用户级线程是由应用程序实现的,独立于内核空间。
每个线程都有自己的堆栈和寄存器等状态信息,不需要内核支持。
在实现用户级线程时,需要考虑以下问题:1. 线程执行的上下文切换:线程在执行时需要保存当前的执行状态,例如 CPU 寄存器、堆栈等信息。
在切换到另一个线程时,需要保存上一个线程的状态并恢复新的线程的状态。
2. 线程调度:根据不同的调度算法,选择下一个要执行的线程。
例如,使用轮转法实现线程轮流执行,使用抢占式调度方法实现优先级调度。
3. 与线程同步和互斥:不同的线程在共享同一个资源时,需要进行同步和互斥,以防止冲突和竞争条件的出现。
例如,使用互斥锁和信号量等机制来保护共享资源。
4. 线程的创建和销毁:应该提供创建和销毁线程的接口,以便用户程序管理线程的生命周期。
内核级线程是由内核实现的,能够进行更为灵活的线程调度和同步方式。
在实现内核级线程时,需要考虑以下问题:1. 线程执行的上下文切换:与用户级线程类似,内核级线程在执行时需要保存当前的状态并进行上下文切换。
不同的是,内核级线程需要考虑更多的硬件及系统资源方面的问题,如页表切换以及进程间调度和通信等问题。
2. 线程调度:内核级线程可以使用更加高级的调度算法,例如实时调度或者针对多核心处理器的调度算法等。
此外,内核级线程可以利用更多的硬件资源进行线程调度,以实现更高效的操作。
3. 与线程同步和互斥:内核级线程可以使用硬件机制来进行同步和互斥,例如微处理器上的原子操作指令等。
linux cpu调度机制摘要:1.Linux CPU 调度机制概述2.Linux CPU 调度算法3.Linux CPU 调度参数4.Linux CPU 调度实例5.总结正文:一、Linux CPU 调度机制概述Linux 操作系统采用了一种基于红黑树的进程调度算法,该算法能够根据进程的优先级、等待时间等因素动态地调整进程的执行顺序,确保系统资源得到高效利用。
在Linux 系统中,CPU 调度机制主要负责管理系统中所有进程的执行顺序和资源分配。
二、Linux CPU 调度算法1.先来先服务(FCFS)算法:按照进程到达时间先后顺序进行调度。
2.最短作业优先(SJF)算法:优先执行估计执行时间最短的进程。
3.优先级调度:根据进程优先级进行调度,优先级高的进程先执行。
4.时间片轮转(RR)算法:为每个进程分配一个固定的时间片,进程按照顺序轮流执行。
5.多级反馈队列(MFQ)算法:将进程分为多个优先级队列,优先级高的队列先执行。
三、Linux CPU 调度参数1.进程优先级:通过nice 值和renice 命令设置进程优先级。
2.时间片长度:通过系统参数hrtimer_interval 和hrtimer_res_ms 设置时间片长度。
3.进程调度算法:通过/proc/sys/kernel/sched_algorithm 文件设置调度算法。
4.调度器性能参数:通过/proc/sys/kernel/sched_responsiveness 文件设置。
四、Linux CPU 调度实例假设有一个Linux 系统,其中有两个进程A 和B,它们的nice 值分别为10 和20。
系统时间片长度为100ms。
按照FCFS 算法,进程A 和B 将按照到达时间先后顺序执行。
按照SJF 算法,进程B 因为执行时间短,将优先执行。
按照优先级调度,进程B 因为优先级高,将优先执行。
按照RR 算法,每个进程将分配一个时间片,轮流执行。
Linux中使用nice和renice命令调整进程优先级在Linux操作系统中,进程的优先级对于系统的性能和响应时间至关重要。
通过调整进程的优先级,可以在多个进程运行时合理分配系统资源,提高系统的整体效率。
nice和renice命令是Linux系统中常用的调整进程优先级的工具。
本文将介绍如何使用nice和renice命令进行进程优先级的调整。
一、nice命令的使用nice命令用于执行一个命令,并设置该命令的优先级。
通过设置nice值,可以使某个进程以较低的优先级运行,从而释放系统资源给其他进程。
nice值的范围是-20到19,数值越低表示优先级越高。
下面是使用nice命令的语法:nice [-n nice值] 命令例如,如果我们要运行一个进程,并将其优先级设置为10,可以使用以下命令:nice -n 10 command需要注意的是,普通用户只能将进程的优先级调低,即增加nice值。
如果想要提高进程的优先级,需要以超级用户(root)身份执行nice命令。
二、renice命令的使用renice命令用于修改正在运行的进程的优先级。
通过renice命令,可以对已经运行的进程重新设置nice值,改变进程的优先级。
下面是使用renice命令的语法:renice [-n nice值] 进程ID例如,如果我们要将进程ID为1234的进程的优先级增加到5,可以使用以下命令:renice -n 5 1234需要注意的是,如果不指定-n参数,则renice命令将使用默认的nice值进行调整。
三、实际应用案例1. 调整进程的优先级假设我们有一个需要执行的命令command,我们可以使用nice命令设置该命令的优先级:nice -n 10 command这将使command命令以较低的优先级运行,从而释放系统资源给其他进程。
2. 修改已经运行的进程的优先级假设我们的系统上有一个运行中的进程,其进程ID为1234,我们可以使用renice命令修改该进程的优先级:renice -n 5 1234这将将进程1234的优先级增加到5,提高其在系统资源中的竞争力。
Linux 2.6.19.x内核编译配置选项简介(1)Code maturity level options代码成熟度选项Prompt for development and/or incomplete code/drivers显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择General setup常规设置Local version - append to kernel release在内核版本后面加上自定义的版本字符串(小于64字符),可以用"uname -a"命令看到Automatically append version information to the version string自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持Support for paging of anonymous memory (swap)使用交换分区或者交换文件来做为虚拟内存System V IPCSystem V进程间通信(IPC)支持,许多程序需要这个功能.必选,除非你知道自己在做什么IPC NamespacesIPC命名空间支持,不确定可以不选POSIX Message QueuesPOSIX消息队列,这是POSIX IPC中的一部分BSD Process Accounting将进程的统计信息写入文件的用户级系统调用,主要包括进程的创建时间/创建者/内存占用等信息BSD Process Accounting version 3 file format使用新的第三版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的文件格式Export task/process statistics through netlink通过netlink接口向用户空间导出任务/进程的统计信息,与BSD Process Accounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的Enable per-task delay accounting在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间UTS NamespacesUTS名字空间支持,不确定可以不选Auditing support审计支持,某些内核模块(例如SELinux)需要它,只有同时选择其子项才能对系统调用进行审计Enable system-call auditing support支持对系统调用的审计Kernel .config support把内核的配置信息编译进内核中,以后可以通过scripts/extract-ikconfig脚本来提取这些信息Enable access to .config through /proc/config.gz允许通过/proc/config.gz访问内核的配置信息Cpuset support只有含有大量CPU(大于16个)的SMP系统或NUMA(非一致内存访问)系统才需要它Kernel->user space relay support (formerly relayfs)在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口Initramfs source file(s)initrd已经被initramfs取代,如果你不明白这是什么意思,请保持空白Optimize for size (Look out for broken compilers!)编译时优化内核尺寸(使用"-Os"而不是"-O2"参数编译),有时会产生错误的二进制代码Enable extended accounting over taskstats收集额外的进程统计信息并通过taskstats接口发送到用户空间Configure standard kernel features (for small systems)配置标准的内核特性(为小型系统)Enable 16-bit UID system calls允许对UID系统调用进行过时的16-bit包装Sysctl syscall support不需要重启就能修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核行为的参数或变量Load all symbols for debugging/kksymoops装载所有的调试符号表信息,仅供调试时选择Include all symbols in kallsyms在kallsyms中包含内核知道的所有符号,内核将会增大300KDo an extra kallsyms pass除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项Support for hot-pluggable devices支持热插拔设备,如usb与pc卡等,Udev也需要它Enable support for printk允许内核向终端打印字符信息,在需要诊断内核为什么不能运行时选择BUG() support显示故障和失败条件(BUG和W ARN),禁用它将可能导致隐含的错误被忽略Enable ELF core dumps内存转储支持,可以帮助调试ELF格式的程序Enable full-sized data structures for core在内核中使用全尺寸的数据结构.禁用它将使得某些内核的数据结构减小以节约内存,但是将会降低性能Enable futex support快速用户空间互斥体可以使线程串行化以避免竞态条件,也提高了响应速度.禁用它将导致内核不能正确的运行基于glibc的程序Enable eventpoll support支持事件轮循的系统调用Use full shmem filesystem启用shmem支持.shmem是基于共享内存的文件系统(可能用到swap),在启用TMPFS后可以挂载为tmpfs供用户空间使用,它比简单的ramfs先进许多Use full SLAB allocator使用SLAB完全取代SLOB进行内存分配,SLAB是一种优秀的内存分配管理器,推荐使用Enable VM event counters for /proc/vmstat允许在/proc/vmstat中包含虚拟内存事件记数器Loadable module support可加载模块支持Enable loadable module support打开可加载模块支持,如果打开它则必须通过"make modules_install"把内核模块安装在/lib/modules/中Module unloading允许卸载已经加载的模块Forced module unloading允许强制卸载正在使用中的模块(比较危险)Module versioning support允许使用其他内核版本的模块(可能会出问题)Source checksum for all modules为所有的模块校验源码,如果你不是自己编写内核模块就不需要它Automatic kernel module loading让内核通过运行modprobe来自动加载所需要的模块,比如可以自动解决模块的依赖关系Block layer块设备层Enable the block layer块设备支持,使用硬盘/USB/SCSI设备者必选Support for Large Block Devices仅在使用大于2TB的块设备时需要Support for tracing block io actions块队列IO跟踪支持,它允许用户查看在一个块设备队列上发生的所有事件,可以通过blktrace 程序获得磁盘当前的详细统计数据Support for Large Single Files仅在可能使用大于2TB的文件时需要IO SchedulersIO调度器Anticipatory I/O scheduler适用于大多数环境,但不太合适数据库应用Deadline I/O scheduler通常与Anticipatory相当,但更简洁小巧,更适合于数据库应用CFQ I/O scheduler为所有进程分配等量的带宽,适合于桌面多任务及多媒体应用Default I/O scheduler默认IO调度器Processor type and features中央处理器(CPU)类型及特性Symmetric multi-processing support对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上.此时"Enhanced Real Time Clock Support"选项必须开启,"Advanced Power Management"选项必须关闭Subarchitecture Type处理器的子架构,大多数人都应当选择"PC-compatible"Processor family处理器系列,请按照你实际使用的CPU选择Generic x86 support通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选HPET Timer SupportHPET是替代8254芯片的新一代定时器,i686及以上级别的主板都支持,可以安全的选上Maximum number of CPUs支持的最大CPU数,每增加一个内核将增加8K体积SMT (Hyperthreading) scheduler support支持Intel的超线程(HT)技术Multi-core scheduler support针对多核CPU进行调度策略优化Preemption Model内核抢占模式No Forced Preemption (Server)适合服务器环境的禁止内核抢占V oluntary Kernel Preemption (Desktop)适合普通桌面环境的自愿内核抢占Preemptible Kernel (Low-Latency Desktop)适合运行实时程序的主动内核抢占Preempt The Big Kernel Lock可以抢占大内核锁,应用于实时要求高的场合,不适合服务器环境Machine Check Exception让CPU检测到系统故障时通知内核,以便内核采取相应的措施(如过热关机等)Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4每5秒检测一次这些cpu的非致命错误并纠正它们,同时记入日志check for P4 thermal throttling interrupt当P4的cpu过热时显示一条警告消息Enable VM86 support虚拟X86支持,在DOSEMU下运行16-bit程序或XFree86通过BIOS初始化某些显卡的时候才需要Toshiba Laptop supportToshiba笔记本模块支持Dell laptop supportDell笔记本模块支持Enable X86 board specific fixups for reboot修正某些旧x86主板的重起bug,这种主板基本绝种了/dev/cpu/microcode - Intel IA32 CPU microcode support使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU 有效/dev/cpu/*/msr - Model-specific register support在多cpu系统中让特权CPU访问x86的MSR寄存器/dev/cpu/*/cpuid - CPU information support能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)Firmware Drivers固件驱动程序BIOS Enhanced Disk Drive calls determine boot disk有些BIOS支持从某块特定的硬盘启动(如果BIOS不支持则可能无法启动),目前大多数BIOS 还不支持BIOS update support for DELL systems via sysfs仅适用于DELL机器Dell Systems Management Base Driver仅适用于DELL机器High Memory Support最高内存支持,总内存小于等于1G的选"off",大于4G的选"64G"Memory split如果你不是绝对清楚自己在做什么,不要改动这个选项Memory model一般选"Flat Memory",其他选项涉及内存热插拔64 bit Memory and IO resources使用64位的内存和IO资源Allocate 3rd-level pagetables from highmem在内存很多(大于4G)的机器上将用户空间的页表放到高位内存区,以节约宝贵的低端内存Math emulation数学协处理器仿真,486DX以上的cpu就不要选它了MTRR (Memory Type Range Register) support打开它可以提升PCI/AGP总线上的显卡2倍以上的速度,并且可以修正某些BIOS错误Boot from EFI supportEFI是一种可代替传统BIOS的技术(目前的Grub/LILO尚不能识别它),但是现在远未普及Enable kernel irq balancing让内核将irq中断平均分配给多个CPU以进行负载均衡,但是要配合irqbanlance守护进程才行Use register arguments使用"-mregparm=3"参数编译内核,将前3个参数以寄存器方式进行参数调用,可以生成更紧凑和高效的代码Enable seccomp to safely compute untrusted bytecode只有嵌入式系统可以不选Timer frequency内核时钟频率,桌面推荐"1000 HZ",服务器推荐"100 HZ"或"250 HZ"kexec system call提供kexec系统调用,可以不必重启而切换到另一个内核kernel crash dumps被kexec启动后产生内核崩溃转储Physical address where the kernel is loaded内核加载的物理地址,除非你知道自己在做什么,否则不要修改.在提供kexec系统调用的情况下可能要修改它Support for hot-pluggable CPUs对热插拔CPU提供支持Compat VDSO support如果Glibc版本大于等于2.3.3就不选,否则就选上Power management options电源管理选项Power Management support电源管理有APM和ACPI两种标准且不能同时使用.即使关闭该选项,X86上运行的Linux也会在空闲时发出HLT指令将CPU进入睡眠状态Legacy Power Management API传统的电源管理API,比如软关机和系统休眠等接口Power Management Debug Support仅供调试使用Driver model /sys/devices/.../power/state files内核帮助文档反对使用该选项,即将被废除ACPI (Advanced Configuration and Power Interface) Support必须运行acpid守护程序ACPI才能起作用.ACPI是为了取代APM而设计的,因此应该尽量使用ACPI而不是APMAC Adapter如果你的系统可以在AC和电池之间转换就可以选Battery通过/proc/acpi/battery向用户提供电池状态信息,用电池的笔记本可以选Button守护程序捕获Power,Sleep,Lid按钮事件,并根据/proc/acpi/event做相应的动作,软件控制的poweroff需要它Video仅对集成在主板上的显卡提供ACPI2.0支持,且不是所有集成显卡都支持Generic Hotkey统一的热键驱动,建议不选Fan允许通过用户层的程序来对系统风扇进行控制(开,关,查询状态),支持它的硬件并不多Dock支持由ACPI控制的集线器(docking stations)Processor让ACPI处理空闲状态,并使用ACPI C2和C3处理器状态在空闲时节省电能,同时它还被cpufreq的"Performance-state drivers"选项所依赖Thermal Zone系统温度过高时可以利用ACPI thermal zone及时调整工作状态以避免你的CPU被烧毁ASUS/Medion Laptop ExtrasASUS笔记本专用,以提供额外按钮的支持,用户可以通过/proc/acpi/asus来打开或者关闭LCD 的背光/调整亮度/定制LED的闪烁指示等功能IBM ThinkPad Laptop ExtrasIBM ThinkPad专用Toshiba Laptop ExtrasToshiba笔记本专用Disable ACPI for systems before Jan 1st this year输入四位数的年份,在该年的1月1日前不使用ACPI的功能("0"表示一直使用)Debug Statements详细的ACPI调试信息,不搞开发就别选Power Management Timer Support这个Timer在所有ACPI兼容的平台上都可用,且不会受PM功能的影响,建议总是启用它.如果你在kernel log中看到了'many lost ticks'那就必须启用它ACPI0004,PNP0A05 and PNP0A06 Container Driver支持内存和CPU的热插拔Smart Battery System支持依赖于I2C的"智能电池".这种电池非常老旧且罕见,还与当前的ACPI标准兼容性差APM (Advanced Power Management) BIOS SupportAPM在SMP机器上必须关闭,一般来说当前的笔记本都支持ACPI,所以应尽量关闭该该选项Ignore USER SUSPEND只有NEC Versa M系列的笔记本才需要选择这一项Enable PM at boot time系统启动时即启用APM,选上这个选项能让系统自动的进行电源管理,但常常导致启动时死机Make CPU Idle calls when idle系统空闲时调用空闲指令(halt),只有老式的CPU才需要选它,且对于SMP系统必须关闭Enable console blanking using APM在屏幕空白时关闭LCD背光,事实上对所有的笔记本都无效RTC stores time in GMT将硬件时钟应该设为格林威治时间,否则视为本地时间.建议你使用GMT,这样你无须为时区的改变而担心Allow interrupts during APM BIOS calls允许APM的BIOS调用时中断,IBM Thinkpad的一些新机器需要这项.如果休眠时挂机(包括睡下去就醒不来),可以试试它Use real mode APM BIOS call to power off此驱动为某些有Bug的BIOS准备,如果你的系统不能正常关机或关机时崩溃,可以试试它CPU Frequency scaling允许动态改变CPU主频,达到省电和降温的目的,必须同时启用下面的一种governor才行Enable CPUfreq debugging允许对CPUfreq进行调试CPU frequency translation statistics通过sysfs文件系统输出CPU频率变换的统计信息CPU frequency translation statistics details输出详细的CPU频率变换统计信息Default CPUFreq governor默认的CPU频率调节器'performance' governor'性能'优先,静态的将频率设置为cpu支持的最高频率'powersave' governor'节能'优先,静态的将频率设置为cpu支持的最低频率'userspace' governor for userspace frequency scaling既允许手动调整cpu频率,也允许用户空间的程序动态的调整cpu频率(需要额外的调频软件,比如cpufreqd)'ondemand' cpufreq policy governor'立即响应',周期性的考察CPU负载并自动的动态调整cpu频率(不需要额外的调频软件),适合台式机'conservative' cpufreq governor'保守',和'ondemand'相似,但是频率的升降是渐变式的(幅度不会很大),更适合用于笔记本/PDA/AMD64环境ACPI Processor P-States driver将ACPI2.0的处理器性能状态报告给CPUFreq processor drivers以决定如何调整频率,该选项依赖于ACPI->Processor{省略的部分请按照自己实际使用的CPU选择}/proc/acpi/processor/../performance interface内核帮助文档反对使用该选项,即将被废除Relaxed speedstep capability checks放松对系统的speedstep兼容性检查,仅在某些老旧的Intel系统上需要打开Bus options (PCI, PCMCIA, EISA, MCA, ISA)总线选项PCI supportPCI支持,如果使用了PCI或PCI Express设备就必选PCI access modePCI访问模式,强列建议选"Any"(系统将优先使用"MMConfig",然后使用"BIOS",最后使用"Direct"检测PCI设备)PCI Express supportPCI Express支持(目前主要用于显卡和千兆网卡)PCI Express Hotplug driver如果你的主板和设备都支持PCI Express热插拔就可以选上Use polling mechanism for hot-plug events对热插拔事件采用轮询机制,仅用于测试目的Root Port Advanced Error Reporting support由PCI Express AER驱动程序处理发送到Root Port的错误信息Message Signaled Interrupts (MSI and MSI-X)充许设备通过PCI总线写入内存堆栈产生一个中断而不是使用默认的IRQ中断,建议不选PCI Debugging将PCI调试信息输出到系统日志里Interrupts on hypertransport devices允许本地的hypertransport设备使用中断ISA support现在基本上没有ISA的设备了,如果你有就选吧MCA support微通道总线,老旧的IBM的台式机和笔记本上可能会有这种总线NatSemi SCx200 support在使用AMD Geode处理器的机器上才可能有PCCARD (PCMCIA/CardBus) supportPCMCIA卡(主要用于笔记本)支持Enable PCCARD debugging仅供调试16-bit PCMCIA support一些老的PCMCIA卡使用16位的CardBus32-bit CardBus support当前的PCMCIA卡基本上都是32位的CardBusCardBus yenta-compatible bridge support使用PCMCIA卡的基本上都需要选择这一项,子项请按照自己实际使用的PCMCIA卡选择{省略的部分请按照自己实际使用的PCMCIA卡选择}PCI Hotplug SupportPCI热插拔支持,如果你有这样的设备就到子项中去选吧Executable file formats可执行文件格式Kernel support for ELF binariesELF是开放平台下最常用的二进制文件格式,支持动态连接,支持不同的硬件平台.除非你知道自己在做什么,否则必选Kernel support for a.out and ECOFF binaries早期UNIX系统的可执行文件格式,目前已经被ELF格式取代Kernel support for MISC binaries允许插入二进制的封装层到内核中,使用Java,.NET,Python,Lisp等语言编写的程序时需要它Networking网络Networking options网络选项Network packet debugging在调试不合格的包时加上额外的附加信息,但在遇到Dos攻击时你可能会被日志淹没Packet socket这种Socket可以让应用程序(比如tcpdump,iptables)直接与网络设备通讯,而不通过内核中的其它中介协议Packet socket: mmapped IO让Packet socket驱动程序使用IO映射机制以使连接速度更快Unix domain sockets一种仅运行于本机上的效率高于TCP/IP的Socket,简称Unix socket.许多程序都使用它在操作系统内部进行进程间通信(IPC),比如X Window和syslogTransformation user configuration interface为IPsec(可在ip层加密)之类的工具提供XFRM用户配置接口支持Transformation sub policy supportXFRM子策略支持,仅供开发者使用PF_KEY sockets用于可信任的密钥管理程序和操作系统内核内部的密钥管理进行通信,IPsec依赖于它TCP/IP networkingTCP/IP协议当然要选IP: multicasting群组广播,似乎与网格计算有关,仅在使用MBONE的时候才需要IP: advanced router高级路由,如果想做一个路由器就选吧IP: policy routing策略路由IP: equal cost multipath用于路由的基于目的地址的负载均衡IP: verbose route monitoring显示冗余的路由监控信息IP: kernel level autoconfiguration在内核启动时自动配置ip地址/路由表等,需要从网络启动的无盘工作站才需要这个东西IP: tunnelingIP隧道,将一个IP报文封装在另一个IP报文内的技术IP: GRE tunnels over IP基于IP的GRE(通用路由封装)隧道IP: multicast routing多重传播路由IP: ARP daemon support这东西尚处于试验阶段就已经被废弃了IP: TCP syncookie support抵抗SYN flood攻击的好东西,要启用它必须同时启用/proc文件系统和"Sysctl support",然后在系统启动并挂载了/proc之后执行"echo 1 >/proc/sys/net/ipv4/tcp_syncookies"命令IP: AH transformationIPsec验证头(AH)实现了数据发送方的验证处理,可确保数据既对于未经验证的站点不可用也不能在路由过程中更改IP: ESP transformationIPsec封闭安全负载(ESP)实现了发送方的验证处理和数据加密处理,用以确保数据不会被拦截/查看或复制IP: IPComp transformationIPComp(IP静荷载压缩协议),用于支持IPsecIP: IPsec transport modeIPsec传输模式,常用于对等通信,用以提供内网安全.数据包经过了加密但IP头没有加密,因此任何标准设备或软件都可查看和使用IP头IP: IPsec tunnel modeIPsec隧道模式,用于提供外网安全(包括虚拟专用网络).整个数据包(数据头和负载)都已经过加密处理且分配有新的ESP头/IP头和验证尾,从而能够隐藏受保护站点的拓扑结构IP: IPsec BEET modeIPsec BEET模式INET: socket monitoring interfacesocket监视接口,一些Linux本地工具(如:包含ss的iproute2)需要使用它TCP: advanced congestion control高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了,内核会自动将默认的拥塞控制设为"Cubic"并将"Reno"作为候补IP: Virtual Server ConfigurationIP虚拟服务器允许你基于多台物理机器构建一台高性能的虚拟服务器,不玩集群就别选了The IPv6 protocol你要是需要IPv6就选吧NetLabel subsystem supportNetLabel子系统为诸如CIPSO与RIPSO之类能够在分组信息上添加标签的协议提供支持,如果你看不懂就别选了。
Linux内核的三种调度策略:1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务。
一旦占用cpu则一直运行。
一直运行直到有更高优先级任务到达或自己放弃3,SCHED_RR实时调度策略,时间片轮转。
当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。
放在队列尾保证了所有具有相同优先级的RR任务的调度公平Linux线程优先级设置首先,可以通过以下两个函数来获得线程可以设置的最高和最低优先级,函数中的策略即上述三种策略的宏定义:int sched_get_priority_max(int policy);int sched_get_priority_min(int policy);SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。
设置和获取优先级通过以下两个函数int pthread_attr_setschedparam(pthread_attr_t*attr,const struct sched_param *param);int pthread_attr_getschedparam(const pthread_attr_t*attr,struct sched_param *param); param.sched_priority = 51;//设置优先级系统创建线程时,默认的线程是SCHED_OTHER。
所以如果我们要改变线程的调度策略的话,可以通过下面的这个函数实现。
int pthread_attr_setschedpolicy(pthread_attr_t*attr,int policy);上面的param使用了下面的这个数据结构:struct sched_param{int __sched_priority;//所要设定的线程优先级};我们可以通过下面的测试程序来说明,我们自己使用的系统的支持的优先级:#include<stdio.h>#include<pthread.h>#include<sched.h>#include<assert.h>static int get_thread_policy(pthread_attr_t*attr){int policy;int rs =pthread_attr_getschedpolicy(attr,&policy);assert(rs==0);switch(policy){case SCHED_FIFO:printf("policy= SCHED_FIFO\n");break;case SCHED_RR:printf("policy= SCHED_RR");break;case SCHED_OTHER:printf("policy=SCHED_OTHER\n");break;default:printf("policy=UNKNOWN\n");break;}return policy;}static void show_thread_priority(pthread_attr_t*attr,int policy) {int priority = sched_get_priority_max(policy);assert(priority!=-1);printf("max_priority=%d\n",priority);priority= sched_get_priority_min(policy);assert(priority!=-1);printf("min_priority=%d\n",priority);}static int get_thread_priority(pthread_attr_t*attr){struct sched_param param;int rs =pthread_attr_getschedparam(attr,¶m); assert(rs==0);printf("priority=%d",param.__sched_priority);return param.__sched_priority;}static void set_thread_policy(pthread_attr_t*attr,int policy) {int rs =pthread_attr_setschedpolicy(attr,policy);assert(rs==0);get_thread_policy(attr);}int main(void){pthread_attr_t attr;struct sched_param sched;int rs;rs =pthread_attr_init(&attr);assert(rs==0);int policy = get_thread_policy(&attr);printf("Show current configuration of priority\n");show_thread_priority(&attr,policy);printf("show SCHED_FIFO of priority\n"); show_thread_priority(&attr,SCHED_FIFO);printf("show SCHED_RR of priority\n");show_thread_priority(&attr,SCHED_RR);printf("show priority of current thread\n");int priority = get_thread_priority(&attr);printf("Set thread policy\n");printf("set SCHED_FIFO policy\n");set_thread_policy(&attr,SCHED_FIFO);printf("set SCHED_RR policy\n");set_thread_policy(&attr,SCHED_RR);printf("Restore current policy\n");set_thread_policy(&attr,policy);rs =pthread_attr_destroy(&attr);assert(rs==0);return 0;}下面是测试程序的运行结果:policy=SCHED_OTHERShow current configuration of prioritymax_priority=0min_priority=0show SCHED_FIFO of prioritymax_priority=99min_priority=1show SCHED_RR of prioritymax_priority=99min_priority=1show priority of current threadpriority=0Set thread policyset SCHED_FIFO policypolicy= SCHED_FIFOset SCHED_RR policypolicy= SCHED_RRRestore current policypolicy=SCHED_OTHERLinux线程调度策略与优先级(二)上一篇文章介绍了Linux下的调度策略和优先级,在Ubuntu09.10上的一些特性,这里测试一下其中的两种特性,SCHED_OTHER和SCHED_RR,还有就是优先级的问题,是不是能够保证,高优先级的线程,就可以保证先运行。
线程优先级每个线程都有一个“优先级”,范围是0~31,0为最低优先级,31为最高优先级。
当系统决定哪个线程需要调度的时候,首先查看是否存在优先级为31的可调度线程,如果存在,就从中选择一个进行调度。
当该线程的时间片到达之后,系统查看是否存在另一个优先级为31的可调度线程,如果存在,就调度它。
只要有一个可调度的优先级为31的线程存在,那么系统绝对不会调度优先级为0~30的线程,这样会导致其他线程“饥饿”。
高优先级线程往往“打断”低优先级线程的执行。
比如,当一个优先级为15的线程正在运行,如果此时系统发现一个优先级比15高的线程可以调度,那么该高优先级线程会“打断”那个低优先级线程的执行,哪怕低优先级的时间片才过了一半。
另外,当系统引导的时候,系统创建一个特殊的线程,称为“zero page”(0页)线程,该线程是整个系统中唯一一个优先级为0(最低)的线程。
当系统没有任何线程需要执行的时候,该线程负责将系统中所有RAM页面清零(也就是资源回收)。
线程优先级有一个抽象层的概念。
由于一些历史的原因,微软并没有将线程调度程序的行为完全固定下来。
微软没有让应用程序充分利用调度程序的特性。
微软宣称这个调度程序的行为是变化,在编程的时候需要注意。
由这几点可见,你的应用程序可以有自己的调度特性。
Windows API充分反映了系统调度的一个抽象层。
如此,就不会直接与系统的调度程序通信,相反,可以调用API函数,根据系统的版本的不同转换这些参数。
这一层,就是线程优先级的抽象层。
下面详细叙述这个抽象层究竟有哪些内容。
对于进程而言,Windows有一个“优先级类”的概念。
这些优先级类作用与进程中的所有线程。
Windows 2000/XP/2003/Vista支持6个“优先级类”:1、Real-time:实时2、High:高3、Above normal:高于标准4、Normal:标准5、Below normal:低于标准6、Idle:空闲。
Linux内核线程优先级设置的方法介绍
个人理解,内核级线程和进程是一样的,前者与POSIX线程(pthread)有很大的区别。
因此,内核的进程调度策略和系统调用也适用于内核级线程。
调度策略有三种:
1.SCHED_NORMAL 非实时调度策略,默认情况下是100~139,由nice值决定;
2.SCHED_FIFO实时调度策略,先到先服务。
一旦占用cpu则一直运行。
一直运行直到有更高优先级任务到达或自己放弃
3.SCHED_RR实时调度策略,时间片轮转。
当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。
同样可以被高优先级抢占。
两种实时优先级范围在0至MAX_RT_PRIO-1之间,默认为0到99。
相关的系统调用(来自于LKD,不同内核可能有所不同):
nice()设置进程的nice值sched_setscheduler()设置进程的调度策略sched_getscheduler()获取进程的调度策略sched_setparam()设置进程的实时优先级sched_getparam()获取进程的实时优先级sched_get_priority_max()获取实时优先级的最大值sched_get_priority_min()获取实时优先级的最小值sched_rr_get_interval()获取进程的时间片值sched_setaffinity()设置进程的处理器的亲和力sched_getaffinity()获取进程的处理器的亲和力sched_yield()暂时让出处理器
设置时需要用到struct sched_param这个结构。
以下为我写的内核线程中的部分代码:代码如下:
struct sched_param param; param.sched_priority = 99; sched_setscheduler(current, SCHED_FIFO, ?m)//出错时返回-1。