linux sched_setscheduler函数解析

合集下载

linux 线程调度

linux 线程调度

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, &param);pthread_create(xxx , &attr , xxx , xxx);pthread_attr_destroy(&attr);本文来自CSDN博客,转载请标明出处:内核线程、轻量级进程、用户线程和LinuxThreads库(2010-04-22 10:20:07)转载标签:杂谈内核线程内核线程只运行在内核态,不受用户态上下文的拖累。

schedule()函数

schedule()函数

schedule()函数schedule()函数是操作系统中的一个重要函数,用于调度进程,使之按照一定的顺序运行。

本文将对schedule()函数进行详细的介绍,包括其概念、功能、使用方法等方面。

在操作系统中,进程是计算机中最基本的执行单位。

每个进程都有自己的执行顺序,如何调度进程是操作系统的一个重要任务。

这时就需要用到schedule()函数,它能够将CPU资源分配给各个进程,并使它们按照一定的顺序执行。

schedule()函数的主要功能是将多个进程进行调度。

在切换到某个进程时,它需要执行相应的操作,包括保存当前进程的状态,然后加载要运行的进程的状态等等。

这样才能确保进程能够正常运行,保证系统的稳定性和高效性。

schedule()函数通常包含在操作系统的内核中,用户程序无法直接调用它。

通常,用户程序通过系统调用来向内核发出请求,然后由内核调用schedule()函数进行进程的调度。

在Linux系统中,schedule()函数是由内核进行管理的。

内核通过调用schedule()函数,按照某种算法来决定下一个要执行的进程。

这个算法通常是根据进程的优先级来进行调度。

当多个进程具有相同的优先级时,会采用一些其他的算法来进行调度,例如轮转法、多级反馈队列等等。

schedule()函数基本上是由内核驱动的。

当一个进程无法继续执行时,内核会启动调度程序,并从就绪队列中选择一个新的进程。

一旦一个新的进程被选中,内核会进行进程的切换,将当前进程的状态保存下来,然后加载要运行的进程的状态,并将控制权转移到新的进程中。

需要注意的是,schedule()函数的实现原理是高度依赖于具体的操作系统。

因此,在不同的操作系统中,schedule()函数的实现原理可能会有所不同。

五、总结。

linux内核之进程优先级

linux内核之进程优先级

Linux内核之进程优先级作者:harvey wang邮箱:harvey.perfect@新浪博客地址:/harveyperfect,有关于减肥和学习英语相关的博文,欢迎交流注:本文参考的内核代码版本为3.3.5在进程控制块定义中,如下,每个进程有4个优先级成员变量,往往给初学者造成一些困惑。

下面分实时进程和普通进程看看他们都用了哪些优先级?struct task_struct{ 删除了无关的成员变量int prio, static_prio, normal_prio;unsigned int rt_priority;}实时进程的优先级在调用函数sched_setscheduler()设置实时进程优先级时,最终调用了下面的函数其中进程的rt_priority 就等于配置给进程的优先级,而进程的normal_prio=MAX_RT_PRIO-1 - p->rt_priority; p->prio =p->normal_prio; 即prio和normal_prio都与rt_priority成反比。

我们知道,在调度时使用了prio,其数值0对应最高优先级,99为最低实时优先级。

Prio 和normal_prio 数值越大优先级越小,而rt_priority的数值越大优先级越大。

这就是为什么有人说实时进程优先级数值越小优先级越高,也有人说实时进程优先级数值越大优先级越高的原因。

另外,实时进程只是用了四个优先级变量中的三个(prio、normal_prio和rt_priority),而没有使用static_prio。

普通进程在调用接口set_user_nice()设置普通进程的优先级时,读者可以自己顺着函数set_user_nice()查看下面的关系。

p->static_prio = NICE_TO_PRIO(nice);p->prio = effective_prio(p); 即p->prio = p->static_prio;p->normal_prio = p->static_prio 参见函数effective_prio(p);结论是:非实时进程的static_prio、prio和normal_prio 一直保持相同。

Linux进程状态解析之R、S、D、T、Z、X

Linux进程状态解析之R、S、D、T、Z、X

Linux进程状态解析之R、S、D、T、Z、XLinux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。

众所周知,现在的分时操作系统能够在一个CPU上运行多个程序,让这些程序表面上看起来是在同时运行的。

linux就是这样的一个操作系统。

在linux系统中,每个被运行的程序实例对应一个或多个进程。

linux内核需要对这些进程进行管理,以使它们在系统中“同时”运行。

linux内核对进程的这种管理分两个方面:进程状态管理,和进程调度。

本文主要介绍进程状态管理,进程调度见《linux进程调度浅析》。

Linux进程状态:R (TASK_RUNNING),可执行状态。

只有在该状态的进程才可能在CPU上运行。

而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。

进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。

只要可执行队列不为空,其对应的CPU就不能偷懒,就要执行其中某个进程。

一般称此时的CPU“忙碌”。

对应的,CPU“空闲”就是指其对应的可执行队列为空,以致于CPU无事可做。

有人问,为什么死循环程序会导致CPU占用高呢?因为死循环程序基本上总是处于TASK_RUNNING状态(进程处于可执行队列中)。

除非一些非常极端情况(比如系统内存严重紧缺,导致进程的某些需要使用的页面被换出,并且在页面需要换入时又无法分配到内存……),否则这个进程不会睡眠。

所以 CPU的可执行队列总是不为空(至少有这么个进程存在),CPU也就不会“空闲”。

LINUX进程调度机制及其堆栈切换分析

LINUX进程调度机制及其堆栈切换分析
goto repeat_schedule;
}
sched_data->curr = next;
task_set_cpu(next, this_cpu);
if (unlikely(prev == next)) {
/* We won't go through the normal tail, so do this by hand */
asmlinkage void call_do_IRQ(void);
__asm__(
"\n" __ALIGN_STR"\n"
"common_interrupt:\n\t"
SAVE_ALL
"call_do_IRQ:\n\t"
"calldo_IRQ "\n\t"
"jmp ret_from_intr\n");
__asm__(
"\n"
“IRQ_0xYY_interrupt:\n\t"
"pushl $"#nr"-256\n\t" \
"jmp common_interrupt");
上述代码中的YY代表外部中断0-254的16进制值(其中系统调用0x80除外,它是由系统另外单独初始化的)。根据上述代码可以看出所有的外部中断都是统一进入common_interrup的地方进行处理的。同样该段由gcc预处理出来的代码如下:
上述代码的主要作用就是通过SAVE_ALL宏将CPU的当前寄存器内容入栈。SAVE_ALL宏的定义如下:
#define SAVE_ALL \
"cld\n\t" \

linux 调用schedule函数 例子

linux 调用schedule函数 例子

linux 调用schedule函数例子Linux 调用 schedule 函数的例子在 Linux 内核中,schedule 函数是用于进行进程调度的重要函数。

它负责决定下一个要运行的进程,并切换到该进程的上下文。

下面是一个调用 schedule 函数的简单例子:```c#include <linux/sched.h>int main(void) {struct task_struct *next_task;// 调用 schedule 函数,选择下一个要运行的进程next_task = schedule();// 打印进程的 PIDprintk("Next scheduled task's PID: %d\n", next_task->pid);return 0;}```在上述例子中,我们首先包含了 `<linux/sched.h>` 头文件,该头文件包含了schedule 函数的声明。

然后,我们声明了一个指向 `task_struct` 结构体的指针`next_task`,它将用于保存调度函数返回的下一个进程。

接下来,我们调用了 schedule 函数,并将返回值赋给 `next_task`。

由于这是一个简单的示例,我们并没有传递任何参数给 schedule 函数,实际上,在实际的进程调度中,schedule 函数会根据一系列的调度策略和优先级来选择下一个要运行的进程。

最后,我们使用 printk 函数打印了下一个调度的进程的 PID。

需要注意的是,上述代码只是一个示例,无法在用户空间中直接运行。

在Linux 内核中调用 schedule 函数需要在合适的上下文中进行,通常在内核模块或调度程序的其他部分中执行。

通过了解 schedule 函数的用法及其在进程调度中的作用,我们可以更好地理解Linux 内核中的调度机制,并更好地进行系统性能优化和调试。

Linux内核分析之调度算法

Linux内核分析之调度算法

Linux内核分析之调度算法inux调度算法在2.6.32中采用调度类实现模块式的调度方式。

这样,能够很好的加入新的调度算法。

linux调度器是以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选择调度算法。

这种模块化结构被称为调度器类,他允许多种不同哦可动态添加的调度算法并存,调度属于自己范畴的进程。

每个调度器都有一个优先级,调度代码会按照优先级遍历调度类,拥有一个可执行进程的最高优先级的调度器类胜出,去选择下面要执行的那个程序。

linux上主要有两大类调度算法,CFS(完全公平调度算法)和实时调度算法。

宏SCHED_NOMAL主要用于CFS调度,而SCHED_FIFO和SCHED_RR主要用于实时调度。

如下面的宏定义:1./*2.* Scheduling policies3.*/4./*支援Real-Time Task的排程,包括有SCHED_FIFO與SCHED_RR.5.*/6.7./*(也稱為SCHED_OTHER): 主要用以排程8.一般目的的Task.*/9.#define SCHED_NORMAL 010.#define SCHED_FIFO 111./*task預設的Time Slice長度為100 msecs*/12.#define SCHED_RR 213./*主要用以讓Task可以延長執行的時間14.(Time Slice),減少被中斷發生Task Context-Switch15.的次數.藉此可以提高Cache的利用率16.(每次Context-Switch都會導致Cache-Flush). 比17.較適合用在固定週期執行的Batch Jobs任18.務主機上,而不適合用在需要使用者互19.動的產品(會由於Task切換的延遲,而20.感覺到系統效能不佳或是反應太慢).*/21.#define SCHED_BATCH 322./* SCHED_ISO: reserved but not implemented yet */23./*為系統中的Idle Task排程.*/24.#define SCHED_IDLE 5linux调度算法实现的高层数据结构主要有运行实体、调度类、运行队列,下面我们主要看看这几个数据结构的字段和意义。

Linux2.6调度优先级与时间片算法[技巧]

Linux2.6调度优先级与时间片算法[技巧]

linux调度过程中调度优先级与时间片算法对象设计与描述:动态优先级的计算主要由 effect_prio() 函数完成,该函数实现相当简单,从中可见非实时进程的优先级仅决定于静态优先级(static_prio)和进程的sleep_avg 值两个因素,而实时进程的优先级实际上是在setscheduler() 中设置的(详见"调度系统的实时性能",以下仅考虑非实时进程),且一经设定就不再改变。

unsigned long sleep_avg进程的平均等待时间,单位是纳秒(nanosecond),在0 ~ NS_MAX_SLEEP_AVG范围内。

它的实质是进程等待时间和运行时间的差值。

当进程处于等待或者睡眠状态时,该值变大;当进程运行时,该值变小。

上本次休眠时间 sleep_time 就达到了如果不是从TASK_UNINTERRUPTIBLE 休眠中被唤醒的(p->activated!=-1)sleep_avg 是进程的"平均"等待时间,recalc_task_prio() 计算了等待时间,如果不是从 TASK_UNINTERRUPTIBLE 休眠中被唤醒的(p->activated!=-1)系统引入了一个interactive_credit 的进程属性(见"改进后的task_struct"),用来表征该进程是否是交互式进程:只要interactive_credit 超过了CREDIT_LIMIT 的阀值(HIGH_CREDIT()返回真),该进程就被认为是交互式进程。

进程本次运行的时间 run_time交互式进程的 run_time 小于实际运行时间,sleep_avg 越大,则 run_time 减小得越多,因此被切换下来的进程最后计算所得的 sleep_avg 也就越大,动态优先级也随之变大。

交互式进程可以借此获得更多被执行的机会。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

linux sched_setscheduler函数解析
sched_setscheduler函数是一个Linux系统调用函数,用于修改进程的调度策略和优先级。

函数原型为:
```c
int sched_setscheduler(pid_t pid, int policy, const struct
sched_param *param);
```
参数说明:
- pid:要修改调度策略和优先级的进程ID。

如果pid为0,则表示修改当前进程。

- policy:要设置的调度策略。

可以取以下值:
- SCHED_OTHER:普通进程调度策略,即默认策略。

这是一个非实时调度策略,由时间片轮转算法控制。

- SCHED_FIFO:先进先出调度策略。

使用FIFO调度策略的进程优先级比其他普通进程高。

- SCHED_RR:轮转调度策略。

与FIFO策略类似,但进程会在使用完时间片后轮转到等待队列的末尾。

- SCHED_BATCH:批处理调度策略。

适合批处理作业,将进程聚集在一起批量执行。

- SCHED_IDLE:空闲调度策略。

只有在没有其他优先级较高的进程运行时,才会执行该进程。

- SCHED_DEADLINE:截止时间调度策略。

用于实时系统,根据任务的截止时间进行调度。

- param:一个指向sched_param结构体的指针,用于设置进程
的优先级和其他调度参数。

sched_param结构体包含一个int类型的成员sched_priority,表示进程的优先级。

函数返回值为0表示成功,返回-1表示失败并设置errno。

sched_setscheduler函数用于修改进程的调度策略和优先级。

在修改调度策略之前,需要获得相应的权限。

调用该函数后,进程会立即按照新的调度策略和优先级进行调度。

注意事项:
- 一些调度策略(如SCHED_FIFO和SCHED_RR)需要root
权限,因此需要以root用户身份运行程序或具有相应的权限。

- 修改调度策略和优先级可能会影响系统的整体性能和稳定性,需要谨慎使用。

相关文档
最新文档