当前位置: 首页 > news >正文

贵州城乡建设厅施工员报名网站好多钱网站

贵州城乡建设厅施工员报名网站,好多钱网站,网站如果不备案吗,邢台企业做网站费用Linux调度器 Linux内核调度器是负责决定哪个进程在何时执行的组件。它管理着CPU资源的分配和任务的调度#xff0c;以确保系统资源的合理利用和任务的高效执行。Linux内核中常见的调度器有多种#xff0c;包括经典的O(1)调度器、CFS#xff08;Completely Fair Scheduler以确保系统资源的合理利用和任务的高效执行。Linux内核中常见的调度器有多种包括经典的O(1)调度器、CFSCompletely Fair Scheduler调度器等。这些调度器根据不同的策略和算法来进行任务切换如时间片轮转、优先级抢占等以满足不同场景下的性能要求和公平性需求。通过合理配置和选择适当的调度策略可以提高系统吞吐量、响应时间并实现更好地负载均衡和公平竞争。 调度Linux内核调度器中的调度是指决定哪个进程将获得CPU时间片来执行任务。调度器根据一定的策略和算法从就绪队列中选择一个最合适的进程使其在给定的时间间隔内运行。这个过程称为上下文切换其中保存当前进程的上下文信息并加载即将执行的进程的上下文信息。不同调度器使用不同的算法和策略来确定进程执行顺序如时间片轮转、优先级抢占等。目标是提高系统整体性能、资源利用率和用户体验同时保证公平性和响应性。 Linux内核调度器的主要作用是合理地分配CPU时间片给就绪状态的进程以实现以下几个目标 公平性调度器通过公平地分配CPU时间片给就绪进程确保每个进程都有机会执行避免某个进程长期占用CPU而导致其他进程无法获得执行机会。 高性能调度器根据不同的调度策略如CFS、Real-Time等和优先级动态地选择最适合的进程来运行以提高系统整体的性能和吞吐量。 响应性调度器及时响应用户或系统事件尽可能减少任务切换的延迟提供良好的交互性能和实时响应。 资源利用率调度器根据不同的负载情况和系统资源状况动态地分配CPU时间片给不同的进程最大限度地利用CPU资源并避免资源浪费。 能耗管理一些先进的调度算法还可以考虑节能策略在需要时降低CPU频率或将其置于休眠状态以降低功耗和延长电池寿命。 kernel/sched/sched.h kernel/sched/sched.h 是 Linux 内核中的一个头文件它定义了与调度器相关的数据结构、函数和宏。该文件是内核调度子系统的一部分其中包含了调度器实现的相关信息。 具体来说sched.h 文件中定义了以下内容 调度策略和优先级定义了不同的调度策略如CFS、实时调度等以及进程的优先级相关信息。 调度器数据结构包括用于表示进程控制块task_struct、运行队列runqueue等数据结构。 调度算法和函数包括实现不同调度策略所使用的具体算法和相关函数如CFS调度算法、优先级计算函数等。 宏定义和辅助函数提供了一些辅助性宏和函数用于在调度过程中进行状态转换、时间计算等操作。 可以在内核源代码中使用其中定义的数据类型、函数和宏来实现对进程调度的操作和管理。 struct sched_class 是 Linux 内核中用于描述调度器类别的结构体。它定义了每种调度策略如 CFS、实时调度等的相关操作和属性。 在内核源码中struct sched_class 结构体通常会有多个实例每个实例对应一个特定的调度策略。不同的调度策略有不同的名称和实现方式但它们都需要遵循 struct sched_class 结构体所定义的接口。 struct sched_class {// 指向下一个 sched_class 结构体的指针用于形成链表结构const struct sched_class *next;// 将一个进程添加到运行队列中即调度器将该进程调度到 CPU 上执行void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);// 将一个进程从运行队列中移除即调度器取消对该进程的调度void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);// 检查调度器是否应该抢占当前进程void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int flags);// 选取下一个要运行的进程即进行进程调度struct task_struct *(*pick_next_task) (struct rq *rq);// 当前进程时间片结束时调用的回调函数void (*put_prev_task) (struct rq *rq, struct task_struct *prev);// 获取进程的优先级int (*get_priority) (struct task_struct *p);// 设置进程的优先级void (*set_curr_task_priority) (struct rq *rq, struct task_struct *p, int prio);// 检查进程是否具有实时调度策略bool (*task_has_rt_policy)(struct task_struct *p);// 检查进程是否具有分时调度策略bool (*task_has_dl_policy)(struct task_struct *p);// 检查进程是否具有负载平衡调度策略bool (*task_can_attach)(struct task_struct *p);// 进行运行队列的初始化void (*set_cpus_allowed)(struct task_struct *p, const struct cpumask *new_mask);// 从当前运行队列中移除一个进程void (*rq_online)(struct rq *rq);// 将一个进程添加到当前运行队列中void (*rq_offline)(struct rq *rq);// 将进程迁移至另一个 CPU 的运行队列中int (*task_waking)(struct task_struct *p, unsigned int state);// 在进程状态改变时调用的回调函数void (*task_change_group)(struct task_struct *p, int type);// 在进程 CPU 绑定发生变化时调用的回调函数void (*task_set_group)(struct task_struct *p);// 获取当前正在运行的进程struct task_struct *(*get_rr_interval)(struct rq *rq, struct task_struct *task); }; 调度类 常见的调度类 实时调度类Real-Time Scheduling Class用于实时任务具有最高优先级并且可以通过固定时间片或基于优先级的抢占来进行调度。 实时负载均衡调度类Real-Time Load Balancer Scheduling Class用于负载均衡操作以确保系统中的实时任务得到合理分配和调度。 实时限制调度类Real-Time Throttle Scheduling Class用于限制实时任务的执行资源以避免其他重要任务被过多耗费。 CFSCompletely Fair Scheduler调度类用于普通进程的抢占式多任务调度。CFS通过红黑树来组织运行队列并为每个进程分配时间片以平等分享CPU资源。 Idle空闲调度类用于处理空闲CPU时间在没有可执行任务需要运行时将CPU置于休眠状态以节省能源。 停机调度类Stop Scheduling Class如前面提到的用于处理被标记为停机状态的进程这些进程不再参与正常的调度过程。 实时调度类 实时调度类是操作系统中用于处理具有严格时间约束的实时任务的一种调度类。在大多数现代操作系统中通常会提供多个不同的实时调度类以满足不同类型和需求的实时任务。 常见的实时调度类包括 SCHED_FIFO使用先进先出FIFO调度策略根据优先级确定任务执行顺序。具有较高优先级的任务将一直执行直到它们自愿放弃CPU资源。SCHED_RR使用轮转Round-Robin调度策略在相同优先级任务之间进行时间片轮转。每个任务都有一个固定时间片来执行如果时间片耗尽则会被放回队列等待下次轮转。SCHED_DEADLINE基于最后期限Deadline的调度策略允许开发者为每个任务指定绝对截止日期并确保在截止日期之前完成任务。这种调度类主要用于周期性实时任务。 实时负载均衡调度类 实时负载均衡调度类是一种用于在实时系统中分配任务和资源的调度算法。其目标是确保实时任务在多个处理器或核心上平衡地分布以提高系统的性能和可靠性。 这些调度类通常考虑以下因素 实时任务的优先级根据任务的紧急程度和重要性确定优先级顺序。处理器或核心的负载状况监测各个处理器或核心的负载情况包括当前执行的任务数量和运行时间等。任务之间的依赖关系考虑到实时任务之间可能存在的依赖关系确保满足这些依赖关系以避免延迟。 一些常见的实时负载均衡调度算法包括 4. 最小负载优先Least Load First选择最空闲的处理器或核心来分配新任务。 5. 最短剩余时间优先Shortest Remaining Time Next选择剩余执行时间最短的任务进行调度以最小化响应时间。 6. 周期性负载均衡Periodic Load Balancing周期性地检查处理器或核心之间的负载并重新分配任务以保持平衡。 实时限制调度类 实时限制调度类是一种用于在实时系统中管理和控制任务执行速率的调度算法。该调度类主要用于限制任务的执行频率以确保系统资源的合理利用和任务的可靠性。 实时限制调度类通常考虑以下因素 任务的执行时间监测每个任务的执行时间包括开始时间和结束时间。任务之间的时间间隔确定每个任务之间需要保持的最小时间间隔。系统负载情况根据系统当前负载情况动态调整任务的执行速率。 基本原理是通过控制每个任务之间的最小时间间隔或执行次数来限制其执行速率。这可以防止某些耗时较长或资源占用较高的任务对系统产生过大影响从而提高系统稳定性和可靠性。 CFS调度类 CFS调度类是一个在Linux内核中用于多任务调度的算法。它旨在以公平和高效的方式分配CPU时间片给各个运行的进程。 CFS通过使用红黑树数据结构来管理进程并基于进程的虚拟运行时间vruntime进行排序。每个进程都被赋予一个虚拟运行时间该时间反映了该进程应该获得的CPU时间片相对于其他进程的优先级。较短虚拟运行时间的进程会被放在红黑树的前面有更高的优先级可以获得更多的CPU执行时间。 CFS实现了完全公平性即尽可能地使每个任务能够以相等或接近相等的比例共享CPU资源。这意味着没有任务会因为其他任务长期占用CPU而被饿死starvation。CFS会动态地计算每个进程应获得的虚拟运行时间并将其作为参考来确定下一个要运行的进程。 Idle调度类 当CPU上没有任何活动进程需要运行时操作系统会将CPU分配给Idle调度类来处理。Idle调度类不涉及实际的任务调度或时间片分配而是让CPU处于空闲状态以降低功耗和热量产生。 当没有活动进程需要运行时内核会让CPU进入Idle状态并等待下一个事件发生。这个事件可以是外部中断、硬件触发或其他需要处理的事件。一旦有新的活动任务到达或者有其他需要处理的事件发生内核就会切换到适当的调度类来管理CPU资源。 Idle调度类通常被认为是“什么都不做”的调度类别在确保系统资源利用率和效能的同时节省了功耗。 停机调度类 用于处理处于停机状态的进程。当一个进程暂时不需要运行时它可以被切换到停机调度类来节省CPU资源。 停机调度类是Completely Fair SchedulerCFS的一部分。当一个进程被切换到停机调度类后它将不会被调度执行直到满足某些条件使其重新激活。 常见的触发条件包括等待某个事件的发生、等待输入/输出操作完成或等待其他进程的信号。当这些条件满足时进程将从停机状态恢复并转移到适当的调度类以进行执行。 通过将闲置或暂时不需要执行任务的进程切换到停机调度类系统可以有效地管理CPU资源并避免浪费计算能力。 优先级 Linux 内核中的优先级通常是指进程或线程的调度优先级也称为 Nice 值。在 Linux 中Nice 值的范围是 -20 到 19其中 -20 表示最高优先级而 19 表示最低优先级。 Nice 值越小进程的调度优先级越高越容易获得 CPU 时间片。例如Nice 值为 -20 的进程会比 Nice 值为 19 的进程更容易获得 CPU 时间片。内核使用 Nice 值来决定哪个进程应该运行以及每个进程应该获得多长时间的 CPU 时间片。 除了 Nice 值之外Linux 还支持实时调度类和普通调度类等不同类型的调度策略。实时调度类通常用于需要快速响应的任务如音频处理、运动控制等领域而普通调度类则用于普通的计算任务如文本处理、编译等。 task_struct结构体 task_struct 是 Linux 内核中用于表示进程或线程的数据结构含了许多字段来存储与进程相关的信息例如进程状态、调度信息、内存管理、文件描述符等。 在 task_struct 结构体中通常有三个成员变量用于表示进程的优先级。它们分别是 prio表示进程的静态优先级即进程在创建时分配给它的优先级。在 Linux 中进程的静态优先级的范围是 100最高优先级到 139最低优先级。 rt_priority表示实时优先级。对于实时进程它的优先级可以高于普通进程的 prio 值。实时优先级的范围是 0最高优先级到 99最低优先级。 normal_prio表示动态优先级也称为当前优先级。动态优先级是根据进程的历史行为和负载情况等动态调整的优先级。动态优先级的范围是 100最高优先级到 139最低优先级。 在 Linux 中进程的调度策略可以是 SCHED_NORMAL、SCHED_FIFO 或 SCHED_RR 等。对于 SCHED_NORMAL 调度策略的进程动态优先级等于静态优先级对于 SCHED_FIFO 和 SCHED_RR 调度策略的实时进程动态优先级等于实时优先级。 抱歉我之前给出的路径不正确。在 Linux 内核中进程的优先级定义可以在以下路径下找到include/linux/sched/prio.h。 在该头文件中定义了进程的静态优先级的范围、实时优先级的范围以及其他与优先级相关的常量和宏。 #define MAX_USER_RT_PRIO 100 #define MAX_RT_PRIO MAX_USER_RT_PRIO #define MAX_PRIO (MAX_RT_PRIO NICE_WIDTH) #define DEFAULT_PRIO (MAX_RT_PRIO NICE_WIDTH / 2)MAX_USER_RT_PRIO 定义了实时优先级中用户可用的最大优先级其值为 100。MAX_RT_PRIO 定义了实时优先级中的最大优先级其值等于 MAX_USER_RT_PRIO。NICE_WIDTH 是一个宏定义在 Linux 内核中表示可调整的优先级范围。在这里没有给出具体定义但通常是一个较小的正整数。MAX_PRIO 定义了进程可以具有的最大优先级。它由 MAX_RT_PRIO 和 NICE_WIDTH 相加得到。DEFAULT_PRIO 定义了默认进程优先级。它通过将 MAX_RT_PRIO 和 NICE_WIDTH / 2 相加得到。 这些常量用于确定进程或线程在调度器中的相对优先级。实时优先级Real-Time Priority用于处理时间关键任务而普通进程则根据静态优先级和动态调整因子如 NICE 值来进行调度。 调度策略 调度策略是操作系统用来决定哪个进程或线程应该在给定时间片内运行的算法。不同的调度策略可以根据不同的需求和目标进行选择。 以下是一些常见的调度策略 SCHED_OTHERCFS调度器标准的时间片轮转调度算法。 SCHED_FIFO实时先进先出按照优先级进行调度直到任务完成或者被更高优先级任务抢占。 SCHED_RR实时轮转按照优先级进行调度每个任务都有一个固定的时间片来执行超过时间片后被放到队列尾部继续等待。 SCHED_BATCH批处理为了提高系统整体性能而设计的调度策略在CPU空闲时运行批处理任务。 SCHED_IDLE空闲只有当没有其他可运行任务时才会运行该任务。 这些常量可以通过使用sched_setscheduler()和sched_getscheduler()等系统调用函数来设置和获取进程或线程的调度策略。 多处理器系统 Linux内核中有几种常见的多处理器调度策略 对称多处理SMP调度在对称多处理系统中每个处理器核心都可以独立地运行任务。Linux使用完全公平调度CFS算法来均衡负载并按照优先级进行任务分配。 实时多处理RT-MP调度实时多处理调度针对具有严格时间限制和实时需求的应用程序。它提供了精确的响应时间保证并通过确定性调度算法将任务分配给不同的处理器核心。 CPU集群调度CPU集群指的是一组紧密连接的处理器核心可以共享缓存和其他资源。Linux通过自适应层次调度算法将任务动态地分配到合适的CPU集群中以最大程度地利用共享资源。 CFS 调度器 CFS是Linux内核中默认的进程调度器引入于Linux 2.6.23版本。CFS调度器旨在提供公平、高效和可扩展的进程调度。 CFS调度器使用红黑树数据结构来维护任务队列并通过动态地分配时间片给每个任务来实现公平性。它以时间片称为虚拟运行时间的方式对任务进行量化较长时间未被执行的任务将获得更多的虚拟运行时间。 在Linux内核中根据任务的权重值也称为nice值和调度策略可以计算出任务的运行时间。 在CFSCompletely Fair Scheduler调度器中任务的权重值由其nice值决定通过对比不同任务的权重值CFS会分配合理的CPU时间片给每个任务。其中较高权重较低nice值的任务将获得更多的CPU时间片用于执行。 在每个sched_latency周期内CFS会动态地根据任务的权重来计算各个任务应该获得的运行时间。这种计算方式被称为虚拟运行时间virtual runtime它反映了每个任务相对于其他任务应该占有CPU资源的比例。 通过不断更新和调整虚拟运行时间CFS能够实现公平而均衡的任务调度并尽量保证所有进程都能获得合理的CPU执行时间。这种机制使得低优先级或高负载情况下的进程仍然能够被适当地执行并防止某些进程长期霸占CPU资源。 是的Linux 内核通过抽象出调度类 struct sched_class 来封装具有共性特征的调度算法并在实例化各个调度器时根据具体的调度算法来实现。 struct sched_class 定义了一组函数指针这些函数指针对应了调度算法中的各个操作。通过这些函数指针可以实现对进程的调度、挂起、恢复等操作。 在 Linux 内核中每个调度器都会定义自己的 struct sched_class 实例并根据具体的调度算法来实现这些函数指针。CFS完全公平调度器就定义了自己的 struct sched_class 实例并实现了对应的函数指针来实现公平调度算法。 当内核需要进行进程调度时会根据进程的调度策略选择相应的调度器并调用该调度器的 struct sched_class 实例中相应的函数指针进行操作。 在调度核心代码 kernel/sched/core.c 中通过 task-sched_class-xxx_func 的方式来执行具体的调度函数这可以看作是一种类似于 C 中的多态机制。 在 Linux 内核中struct task_struct 是描述进程或线程的数据结构它包含了许多与进程相关的信息其中之一就是调度器的指针 sched_class。 当需要对任务进行调度时内核会根据任务的调度器指针 sched_class 来查找对应的调度类并使用其中的函数指针来完成具体的调度操作。这种方式实现了一种类似于多态的效果即不同的任务可以使用不同的调度算法而调度器的函数指针则根据具体的调度器类型来指向对应的函数。 通过这种方式Linux 内核可以根据任务的调度器类型来调用相应的调度函数实现了灵活的调度策略并且能够方便地扩展和切换不同的调度器。这种设计使得内核的调度器模块具有良好的可扩展性和可维护性。 rq/cfs_rq/task_struct/task_group/sched_entity 结构体 task_struct是Linux内核中表示进程或线程的数据结构。它包含了进程的各种属性和状态信息如进程ID、调度策略、优先级等。 rq运行队列runqueue是一个用于存储可运行进程的队列。每个CPU核心都有一个运行队列其中包含了在该核心上等待执行的任务。 task_group任务组是一组相关联的进程通常由一个父进程和其所有子进程组成。它们共享资源限制和调度策略并通过signal_struct来进行统一管理。 sched_entity调度实体是用于跟踪和管理每个进程/线程在调度器中的状态和属性的数据结构。它包含了诸如运行时间、虚拟运行时间、权重值等信息并与其他数据结构相互关联以进行调度决策。 cfs_rqCFSCompletely Fair Scheduler队列是用于实现公平调度的数据结构。每个CPU核心都有一个CFS队列负责管理可运行的进程集合。 struct task_struct 结构体 struct task_struct {volatile long state; // 进程状态运行、等待等void *stack; // 进程堆栈指针atomic_t usage; // 引用计数unsigned int flags; // 进程标志位unsigned int ptrace; // ptrace标志struct llist_node wake_entry; // 等待队列节点int on_cpu; // 当前运行进程所在的 CPU 编号int on_rq; // 是否在运行队列上int prio; // 动态优先级用于调度算法int static_prio; // 静态优先级用于调度算法的基准值int normal_prio; // 平均动态优先级考虑了任务执行历史和时间片轮转unsigned int rt_priority; // 实时进程优先级#ifdef CONFIG_SCHED_DEBUGunsigned long sleep_avg;unsigned long long timestamp, last_ran; #endifstruct sched_class *sched_class;struct sched_entity se;struct sched_rt_entity rt;#ifndef CONFIG_PREEMPT_NOTIFIERS// ... #endif// ... }; struct task_group 结构体 struct task_group {/* 该组的父组 */struct task_group *parent;/* 与该组关联的 cgroup */struct cgroup_subsys_state css;#ifdef CONFIG_CGROUP_CPUACCT/** cpuacct 和 cpu 变量需要在同一个缓存行上因为它们在频繁访问和更新时使用。** 不要将这两个变量分开否则可能会导致不同 CPU 上的伪共享。*/struct task_group_cpuacct cpuacct; #endif#ifdef CONFIG_CGROUP_CPUSET// ... #endif#ifdef CONFIG_FAIR_GROUP_SCHED/* 调度策略相关字段 */struct sched_entity **se; /* 指向每个调度实体结构体sched_entity的指针数组 */// .../* 这些字段用于统计信息和负载均衡操作 */unsigned long load_last_balance; /* 上次平衡时的负载值 */u64 load_prev_update; /* 上次更新平均负载时间戳 */unsigned long aggregated_load_avg; /* 平均聚合负载值 */int nr_running; /* 组内正在运行任务数量 */atomic_long_t util_avg[CPU_STAT_NSTATES]; /* CPU 利用率统计信息 */// ... #endif// ...}; struct sched_entity 结构体 struct sched_entity {struct load_weight load; // 进程的负载权重struct rb_node run_node; // 在运行队列中以红黑树形式组织的节点unsigned int on_rq; // 标志位指示进程是否在运行队列中u64 exec_start; // 进程最近一次执行开始时间戳u64 sum_exec_runtime; // 总执行时间包括所有CPU核心u64 vruntime; // 进程虚拟运行时间Fair调度算法使用 #ifdef CONFIG_SCHED_DEBUGu64 prev_sum_exec_runtime; // 上一个统计周期内的总执行时间 #endif#ifndef CONFIG_64BITunsigned int __pad; #endifstruct sched_statistics statistics; // 调度统计信息#ifdef CONFIG_FAIR_GROUP_SCHEDstruct sched_entity *parent; // 父进程的调度实体指针任务组 #endif#ifdef CONFIG_UCLAMP_TASKstruct uclamp_se clamp[UCLAMP_CNT]; // 进程对应每个UCLAMP档案级别的约束值 #endif#ifdef CONFIG_SCHED_WALT /* ... */ #endif }; 实际运行时间runtime和一个虚拟运行时间vruntime 在CFS调度器中没有固定的时间片概念。相反它使用了实际运行时间和虚拟运行时间来进行任务排序和选择调度。 实际运行时间是指任务在CPU上真正执行的时间。每当任务被选中并分配给CPU时它会累积实际运行时间。 虚拟运行时间是一个相对概念它取决于任务在CFS队列中的位置以及其他相关因素。具体而言虚拟运行时间与进程优先级有关。高优先级的任务会获得更多的虚拟运行时间在排序和选择调度时更容易被选中。 计算虚拟运行时间涉及到一些复杂的算法和数据结构主要目标是使各个任务能够公平地竞争CPU资源。通过动态调整虚拟运行时间CFS调度器可以保持系统的负载均衡并提供对不同优先级任务的适当响应。 每个任务都有一个实际运行时间runtime和一个虚拟运行时间vruntime。这两个参数用于计算任务的优先级和选择下一个要执行的任务。 实际运行时间runtime表示任务在CPU上真正执行的时间。每当任务被选中并分配给CPU时它会累积实际运行时间。通过记录实际运行时间CFS可以了解每个任务在过去多长时间内使用了CPU资源。 虚拟运行时间vruntime是一个相对概念用于衡量任务的优先级。较高优先级的任务会获得更多的虚拟运行时间从而在排序和选择调度时更容易被选中。虚拟运行时间与进程优先级有关并根据一定的算法进行动态调整。 CFS调度器使用vruntime来进行任务排序和选择调度。它根据每个任务的vruntime值来确定下一个要执行的最合适的任务。通过比较不同任务之间的vruntime值CFS可以保持系统负载均衡并确保按照其优先级公平地分配CPU资源。 CFS完全公平调度器的主要流程调用 初始化在系统启动时初始化 CFS 调度器相关数据结构和参数。 进程创建当一个新进程被创建时为其分配调度实体 struct sched_entity并初始化相关属性。 进程插入调度队列通过调用 enqueue_task_fair() 函数将进程插入 CFS 调度队列中并更新调度信息。 选择下一个运行进程在每个时钟中断时调用 pick_next_task_fair() 函数选择下一个应该运行的进程。 上下文切换如果选定的进程与当前正在运行的进程不同则进行上下文切换将 CPU 分配给新的进程。 时间片耗尽当当前运行进程的时间片耗尽时调用 put_prev_task_fair() 函数更新运行进程的虚拟运行时间并重新插入调度队列。 进程退出或挂起当一个进程退出或被挂起时调用 dequeue_task_fair() 函数将其从调度队列中移除。 时钟中断处理在每个时钟中断处理程序中调用 task_tick_fair() 函数更新当前运行进程的虚拟运行时间并检查是否需要进行调度决策。 负载均衡定期进行负载均衡调用相关的负载均衡函数如 load_balance()以确保各个 CPU 上的任务分布均衡。 循环调度重复执行步骤 4-9不断选择下一个运行进程并进行调度以实现公平的 CPU 时间片分配。 虚拟运行时间是通过以下公式计算得出的 虚拟运行时间 实际运行时间 * NICE_0_LOAD / 该任务的权重 时钟中断事件 CFS 调度器的 tick 是一个时钟中断事件它用于触发调度器进行调度决策。在 Linux 内核中CFS 调度器通过时钟中断来进行时间片的分配和进程的切换。 每当一个 tick 发生时内核会调用相关的时钟中断处理程序。在 CFS 调度器中这个处理程序主要做两件事情 更新当前运行进程的虚拟运行时间通过调用 task_tick_fair() 函数更新当前运行进程的虚拟运行时间。这个虚拟运行时间的增加可以理解为当前进程消耗了一个时间片time slice的时间。 进行调度决策在更新了虚拟运行时间之后时钟中断处理程序会检查是否需要进行调度决策。这个决策是通过调用 check_preempt_curr() 函数来完成的。该函数会比较当前运行进程与其他就绪队列中的进程的优先级如果有更高优先级的进程等待运行则会触发上下文切换将 CPU 分配给新的进程。 通过这样的方式CFS 调度器能够在每个 tick 中根据进程的虚拟运行时间和优先级进行调度决策以确保公平地分配 CPU 时间片。这种基于时钟中断的调度机制使得 CFS 能够动态地根据进程的运行情况进行调度以实现更好的系统性能和响应性。 以下是CFS调度tick时钟中断事件的基本流程 定时器触发操作系统设置一个定时器在每个时钟周期结束时触发中断。这个定时器一般以毫秒或微秒为单位。 中断处理程序执行当定时器触发时CPU会暂停当前正在执行的任务并跳转到预先注册的中断处理程序tick handler。 更新任务信息在tick handler中首先需要更新运行状态、统计信息和优先级等相关数据结构。这些数据结构包括进程控制块PCB、红黑树等。 进程选取在CFS调度算法中选择下一个最公平的进程来运行是关键步骤。该算法通过维护一棵红黑树来实现公平性。 进程切换如果需要进行进程切换即切换到新选取的进程执行则进行上下文切换操作。这涉及保存当前进程的寄存器状态并恢复待执行进程的寄存器状态。 执行新进程完成上下文切换后CPU开始执行新选取的进程该进程会继续运行一段时间或直到下一个时钟中断。 继续定时器tick handler结束后操作系统重新设置定时器并恢复之前被中断的任务。CPU继续执行被恢复的任务直到下一个tick事件触发。 参考推荐Linux内核源码分析教程
http://www.zqtcl.cn/news/127294/

相关文章:

  • 格子三合一交友婚恋网站模板网站后台用什么
  • 网站运营与管理期末考试数字营销经典案例
  • 官方网站英语门户网站策划书
  • 建国外网站需要多少钱做网站的底图尺寸多大
  • wordpress页面更新发布失败seo网络优化是做什么的
  • 百度收录多的是哪些网站网站本科报考官网
  • 成都管理咨询公司排名seo策略怎么写举例
  • 建设网站的难点动漫设计属于什么专业
  • 辽阳做网站的公司大型营销型网站制作
  • 已有域名怎么建设网站wordpress数据主机名
  • 网站设计的公司蒙特注册成立公司的基本流程
  • 成交型网站山西网络营销
  • 做网站必须在工信部备案吗网站开发英语
  • 门户网站模板图片建设厅网站初始数据入库
  • 甘肃三北防护林建设局网站阿里企业邮箱app
  • 沃尔沃公司网站建设公司建网站费用
  • 新网站怎么发外链公司做网站 要准备哪些素材
  • 建站域名英雄联盟网页制作素材
  • 手机网站 微信网站 区别布吉做网站
  • 网站建设层级图微信小程序怎么制作网页
  • 服务器上的网站怎么做301中小企业网站制作报价
  • 做网站需要用什么技术制作静态网站制作
  • drupal网站开发盐城网站建设费用
  • 采票网站刷流水做任务网站建设方案及预算
  • 传奇网站模块下载天蝎做网站建网站
  • 收录网站的二级域名wordpress虚拟币接口
  • 论坛建站烟台工程建设信息网站
  • 南京有哪些做网站的公司网站开发兼职团队
  • 网站建设优化外包免费客户管理软件哪个好用
  • 网上购物最便宜的网站微信官方网站服务中心