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

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

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

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

无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 线程的堆栈 上面说的抢占位置,到底在哪里,每个线程保存在哪个寄存器值中?这就是线程的堆栈的内容。

1K20

Swoole 4.4 协程抢占调度器详解

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

81620

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

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

5.1K30

从源码剖析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

53820

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.6K30

从源码剖析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 实现安装信号。

95880

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

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

1.7K30

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

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

2.6K10

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.5K31

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

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

1.1K20

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.3K20

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 抢占调度器基本概念 在实际的应用中,不同的任务需要不同的响应时间。...总的来说,学习抢占调度要掌握的最关键一点是:每个任务都被分配了不同的优先级,抢占调度器会获得就绪列表中优先级最高的任务,并运行这个任务。

36230

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.4K20

RTOS内功修炼记(二)—— 优先级抢占调度到底是怎么回事?

内容导读: 本文从任务如何切换开始讲起,引出RTOS内核中的就绪列表、优先级表,一层一层为你揭开RTOS内核优先级抢占调度方法的神秘面纱,只有对内核的深入了解,才能创造出更好的应用。...优先级抢占调度 5.1. 调度规则 理解了上面的三节内容,再来看优先级抢占调度,简直就是水到渠成。...优先级抢占调度器可是六亲不认的,才不管任务当前状态是什么,反正就是永远寻找调度列表中最高优先级的任务。...③ 「RTOS内核所谓的优先级抢占调度规则就是永远从就绪队列中找出最高优先级的任务来运行」。...当然,有了优先级抢占调度规则,才勉强撑起来了一个RTOS内核的肉体,什么时候进行调度,才是一个RTOS内核的灵魂,接下来的文章与大家再会。

2.2K11
领券