首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

线程的调度方式——抢占、非抢占

在一个进程里,线程的调度有抢占或者非抢占的模式。...在抢占模式下,操作系统负责分配CPU时间给各个进程,一旦当前的进程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。...在非抢占的调度模式下,每个线程可以需要CPU多少时间就占用CPU多少时间。在这种调度方式下,可能一个执行时间很长的线程使得其他所有需要CPU的线程”饿死”。...非抢占的调度策略在线程运行优先级一般时用到,而对于高优先级的线程调度则多采用抢占的调度策略。如果你不确定系统采用的是那种调度策略,假设抢占的调度策略不可用是比较安全的。

5.6K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    无MMU抢占操作系统的抢占工作原理

    本文就来从底层开始,详细讲述抢占操作系统(大多数RTOS)的抢占原理。...包含: 线程基础原理 线程之间抢占 中断抢占线程 中断抢占中断 strongerHuang 1 运行多个线程 1.单核“单线程” 严格来说,单核处理器一次只能执行一条指令,也就是说只能“单线程”。...V0, V1, V0 # a、b值相加,结果保存到寄存器V0中 SW V0, -32496(GP) # 寄存器V0的值存储在RAM中(变量c所在的位置) 你会发现上面执行了4个动作,但是抢占操作系统可以在任何时候抢占另一个线程...假如在这过程中有其他线程抢占了,其他线程同样抢占了当前线程V0、 V1,如果不对V0、 V1进行保存,那么下次回来执行当前线程,结果就会出错。...strongerHuang 2 线程的堆栈 上面说的抢占位置,到底在哪里,每个线程保存在哪个寄存器值中?这就是线程的堆栈的内容。

    1.1K20

    Swoole 4.4 协程抢占调度器详解

    抢占调度 我们在今年年初就计划实现Swoole的抢占调度,以满足实现有些场景下的不均衡调度带来的问题。我们中间经历了几个版本,在这里和大家分享一下开发过程中的动机和解决办法。 ?...后来我们使用PHP的ticks机制,也就是在PHP代码编译期间,注入ticks指令,可以执行相应的函数,我们可以在这些函数中检测处理协程的时间,达到抢占的效果,但是这里有一个问题,PHP的declare...左边一侧是没有抢占调度,右侧是开了抢占调度,可以发现,左侧总是会有偶尔超时情况,而经过优化之后,没有一个超时的请求,请求响应时间非常平滑,提升了服务的稳定性。 ?...可以从上图看出,由于抢占调度的加入,去除了请求耗时高的毛刺,使得平均请求时间变得更加平滑,稳定。...想要做抢占调度,对于PHP来说,有两个途径 单线程的PHP的执行流,通过执行指令做文章,可以在PHP执行流程中注入逻辑,以检查执行时间,再加上Swoole的协程能力,可以在不同的协程中切换,以达到抢占

    91820

    Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十)

    1 非抢占和可抢占内核 为了简化问题,我使用嵌入实时系统uC/OS作为例子 首先要指出的是,uC/OS只有内核态,没有用户态,这和Linux不一样 多任务系统中, 内核负责管理各个任务, 或者说为每个任务分配...非抢占内核是由任务主动放弃CPU的使用权 非抢占调度法也称作合作型多任务, 各个任务彼此合作共享一个CPU....非抢占内核的缺点有 任务响应时间慢。...CPU 1.2 抢占内核 使用抢占内核可以保证系统响应时间....抢占内核如下图所示 ? 抢占内核的优点有 使用抢占内核,最高优先级的任务什么时候可以执行,可以得到CPU的使用权是可知的。使用抢占内核使得任务级响应时间得以最优化。

    5.4K30

    从源码剖析Go语言基于信号抢占调度

    这一次来讲讲基于信号抢占调度。 介绍 在 Go 的 1.14 版本之前抢占试调度都是基于协作的,需要自己主动的让出执行,但是这样是无法处理一些无法被抢占的边缘情况。...例如:for 循环或者垃圾回收长时间占用线程,这些问题中的一部分直到 1.14 才被基于信号的抢占调度解决。...在 Go 1.14 之后引入了基于信号的抢占调度,从上面的图可以看到 Proc0 这一栏中密密麻麻都是 goroutines 在切换时的调用情况,不会再出现 goroutines 一旦执行开始,只能等执行结束这种情况...sigaction 函数在 Linux 下会调用系统调用函数 sys_signal 以及 sys_rt_sigaction 实现安装信号。...Reference Linux用户抢占和内核抢占详解 https://blog.csdn.net/gatieme/article/details/51872618 sysmon 后台监控线程做了什么 https

    59220

    Linux唤醒抢占----Linux进程的管理与调度(二十三)

    唤醒抢占 当在try_to_wake_up/wake_up_process和wake_up_new_task中唤醒进程时, 内核使用全局check_preempt_curr看看是否进程可以抢占当前进程可以抢占当前运行的进程...新唤醒的进程不必一定由完全公平调度器处理, 如果新进程是一个实时进程, 则会立即请求调度, 因为实时进程优先极高, 实时进程总会抢占CFS进程. 2 Linux进程的睡眠 在Linux中,仅等待CPU时间的进程称为就绪进程.... */ 3 linux进程的唤醒 当在try_to_wake_up/wake_up_process和wake_up_new_task中唤醒进程时, 内核使用全局check_preempt_curr看看是否进程可以抢占当前进程可以抢占当前运行的进程...kernel/fork.c, line 1755 3.4 check_preempt_curr wake_up_new_task中唤醒进程时, 内核使用全局check_preempt_curr看看是否进程可以抢占当前进程可以抢占当前运行的进程...内核的例子 5.1 一个最基本的例子 在Linux操作系统中, 内核的稳定性至关重要, 为了避免在Linux操作系统内核中出现无效唤醒问题, Linux内核在需要进程睡眠的时候应该使用类似如下的操作:

    3.9K30

    从源码剖析Go语言基于信号抢占调度

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/485 本文使用的go的源码15.7 这一次来讲讲基于信号抢占调度。...例如:for 循环或者垃圾回收长时间占用线程,这些问题中的一部分直到 1.14 才被基于信号的抢占调度解决。...Go 1.14 以上 trace 分析 [image-20210327152443777] 在 Go 1.14 之后引入了基于信号的抢占调度,从上面的图可以看到 Proc0 这一栏中密密麻麻都是 goroutines...} 下面我们看一下 setsig 函数,这个函数是在 runtime/os_linux.go文件里面: setsig func setsig(i uint32, fn uintptr) { var sa...sigaction 函数在 Linux 下会调用系统调用函数 sys_signal 以及 sys_rt_sigaction 实现安装信号。

    1.1K80

    60秒问答:抢占多任务处理 vs 协作多任务处理

    翻译: 协程 现在已经是抢占调度。 不回出现因为gcc和死循环造成调度上死锁或者延迟。 查看维基百科 协程是协作多任务的,而线程典型是抢占多任务的。...【多线程是多核】 协程超过线程的好处是它们可以用于硬性实时的语境(在协程之间的切换不需要涉及任何系统调用或任何阻塞调用) 抢占多任务处理是计算机操作系统中,一种实现多任务处理的方式, 相对于 协作多任务处理而言...协作环境下,下一个进程被调度的前提是当前进程主动放弃时间片; 抢占环境下,操作系统完全决定 进程调度方案,操作系统可以剥夺耗时长的进程的时间片,提供给其它进程。...查看 操作系统 17 | 调度(下):抢占调度是如何发生的?...自定义: GO TRACE 剖析 GO1.14 异步抢占调度 https://www.freesion.com/article/83321440036/ 大神文章:深度解密Go语言之基于信号的抢占调度

    2K30

    深度解密Go语言之基于信号的抢占调度

    demo-1 示意图 由于 Go 1.14 实现了基于信号的抢占调度,这些执行无限循环的 goroutine 会被调度器“拿下”,P 就会空出来。...如果没有调用函数,肯定不会被抢占。 有些虽然也调用了函数,但其实不会插入检测指令,这个时候也不会被抢占。...像前面的两个 demo,不可能有机会在函数扩栈检测期间主动放弃 CPU 使用权,从而完成抢占,因为没有函数调用。具体的过程后面有机会再写一篇文章详细讲,本文主要看基于信号的抢占调度如何实现。...,返回的 newpc 表示安全的抢占地址。...于是我们可以看到,信号处理器程序 sighandler 只是将一个异步抢占函数给“安插”进来了,而真正的抢占过程则是在 asyncPreempt 函数中完成。

    3.1K10

    【STM32H7】第13章 任务调度—抢占,时间片和合作

    mod=viewthread&tid=99514 第13章 任务调度—抢占,时间片和合作 本章教程为大家将介绍ThreadX操作系统支持的任务调度方式:抢占,时间片和合作(轮询),这部分算是...实际应用主要是抢占调度和时间片调度,合作(轮询)调度用到的很少。...抢占调度 每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞的API函数,比如tx_thread_sleep。...下面我们主要了解一下抢占调度器和时间片调度器。 13.3 抢占调度器 13.3.1 抢占调度器基本概念 在实际的应用中,不同的任务需要不同的响应时间。...总的来说,学习抢占调度要掌握的最关键一点是:每个任务都被分配了不同的优先级,抢占调度器会获得就绪列表中优先级最高的任务,并运行这个任务。

    1.2K20

    Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )

    文章目录 一、禁止 / 开启内核抢占 与 方法保护临界区 二、编译器优化屏障 三、preempt_disable 禁止内核抢占 源码 四、preempt_enable 开启内核抢占 源码 一、禁止 /...开启内核抢占 与 方法保护临界区 ---- 如果要使用 " 内存屏障 " , 如 : 禁止 内核 抢占 " 方法保护临界区 " : 首先 , 声明 preempt_disable(); 宏 , 表示下面的代码就是...抢占 ; preempt_disable(); 与 preempt_enable(); 之间的代码 , 就是 " 方法保护临界区 " 代码 , 这样可以 阻止编译器重排指令 , 在 禁止 内核抢占...\compiler-gcc.h#20 三、preempt_disable 禁止内核抢占 源码 ---- 在 Linux 内核源码 linux-5.6.18\include\linux\preempt.h...-5.6.18\include\linux\preempt.h#169 四、preempt_enable 开启内核抢占 源码 ---- 在 Linux 内核源码 linux-5.6.18\include

    1.6K20

    Linux CFS调度器之唤醒抢占--Linux进程的管理与调度(三十)

    pick_next_task全局的pick_next_task函数会从按照优先级遍历所有调度器类的pick_next_task函数, 去查找最优的那个进程, 当然因为大多数情况下, 系统中全是CFS调度的非实时进程, 因而linux...关于place_entity函数, 我们之前在讲解CFS队列操作的时候已经讲的很详细了 参见linux进程管理与调度之CFS入队出队操作 设想一下子如果休眠进程的vruntime保持不变,...而其他运行进程的 vruntime一直在推进, 那么等到休眠进程终于唤醒的时候, 它的vruntime比别人小很多, 会使它获得长时间抢占CPU的优势, 其他进程就要饿死了....vruntime值,以cfs_rq->min_vruntime值为基础,给予一定的补偿,但不能补偿太多.这样由于休眠进程在唤醒时或者新进程创建完成后会获得vruntime的补偿,所以它在醒来和创建后有能力抢占...CPU是大概率事件,这也是CFS调度算法的本意,即保证交互进程的响应速度,因为交互进程等待用户输入会频繁休眠 但是这样子也会有一个问题, 我们是以某个cfs就绪队列的min_vruntime值为基础来设定的

    2.6K31

    Go 协作与抢占

    这便涉及到有关调度的两个理念:协作调度与抢占调度。 协作抢占这两个理念解释起来很简单:协作调度依靠被调度方主动弃权;抢占调度则依靠调度器强制将被调度方被动中断。...== 0) 当垃圾回收器需要停止所有用户 Goroutine 时 抢占调度 从上面提到的两种协作调度逻辑我们可以看出,这种需要用户代码来主动配合的调度方式存在一些致命的缺陷:一个没有主动放弃执行权...在 Go 运行时实现抢占调度同样也可以使用类似的方式,通过向线程发送系统信号的方式来中断 M 的执行,进而达到抢占的目的。...这个方法处理了两种抢占情况,一是抢占阻塞在系统调用上的 P,二是抢占运行时间过长的 G。其中抢占运行时间过长的 G 这一方还会出现在垃圾回收需要进入 STW 时。...运行时需要执行垃圾回收时,协作调度能够保证具备函数调用的用户 Goroutine 正常停止;抢占调度则能避免由于死循环导致的任意时间的垃圾回收延迟。

    2.1K20

    【STM32F429】第13章 任务调度—抢占,时间片和合作

    mod=viewthread&tid=99514 第13章 任务调度—抢占,时间片和合作 本章教程为大家将介绍ThreadX操作系统支持的任务调度方式:抢占,时间片和合作(轮询),这部分算是...实际应用主要是抢占调度和时间片调度,合作(轮询)调度用到的很少。...抢占调度 每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞的API函数,比如tx_thread_sleep。...下面我们主要了解一下抢占调度器和时间片调度器。 13.3 抢占调度器 13.3.1 抢占调度器基本概念 在实际的应用中,不同的任务需要不同的响应时间。...总的来说,学习抢占调度要掌握的最关键一点是:每个任务都被分配了不同的优先级,抢占调度器会获得就绪列表中优先级最高的任务,并运行这个任务。

    41030

    Linux 内核】调度器 ① ( 调度器概念 | 调度器目的 | 调度器主要工作 | 调度器位置 | 进程优先级 | 抢占调度器 | Linux 进程状态 | Linux 内核进程状态 )

    文章目录 一、调度器 0、调度器概念 1、调度器目的 2、调度器主要工作 3、调度器位置 4、进程优先级 5、抢占调度器 二、Linux 内核进程状态 API 简介 三、Linux 进程状态 一、调度器...其数值越小 , 优先级越高rt_priority 实时优先级字段 值总为 0 , 没有意义字段 值为 1 ~ 99 , 其数值越大 , 优先级越高字段 值总为 0 , 没有意义 5、抢占调度器..." 抢占调度器 " 概念 : 如果 " 调度器 " 支持 " 就绪状态 " 与 " 运行状态 " 之间可以相互转换 , 则该调度器称为 " 抢占调度器 " ; 二、Linux 内核进程状态 API...不可中断睡眠状态 __TASK_STOPPED 进程停止状态 EXIT_ZOMBIE 僵尸状态 上面的 5 种状态是 Linux 内核中定义的状态 , 详细细节参考 【Linux 内核】进程管理...( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE ) 博客 ; 三、Linux 进程状态

    5.6K20

    从零手写操作系统之RVOS抢占多任务实现-06

    从零手写操作系统之RVOS抢占多任务实现-06 本系列参考: 学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春 整理而来,主要作为xv6操作系统学习的一个前置基础。...-03 RISC-V 学习篇之特权架构下的中断异常处理 从零手写操作系统之RVOS外设中断实现-04 从零手写操作系统之RVOS硬件定时器-05 ---- 多任务系统的分类 抢占多任务的设计 和协作多任务实现思路类似...但是本节抢占多任务的实现中,我们已经改变了switch_to函数的工作逻辑,改为mret配合mepc实现任务切换执行。.... */ void task_yield() ---- 软件中断 为了在抢占多任务的实现中兼容协作多任务,这就需要引出软件中断: 为什么需要使用软件中断来实现对协作多任务的兼容呢?...; //return_pc += 4; } return return_pc; } switch_to函数实现复用抢占多任务更改后的版本。

    35640
    领券