首页
学习
活动
专区
工具
TVP
发布

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

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

5.1K10

深入理解Linux内核之内核抢占

Linux 那什么是抢占式内核呢?...而对于服务器来说,它就对吞吐量要求较高,希望获得更多的cpu时间,而交互性或者低延迟都是次要的,所以被设计成不可抢占式内核。 下图给出抢占式内核调度情况: ? 下图给出抢占式内核调度情况: ?...(CONFIG_PREEMPTION=y)cond_resched宏的_cond_resched为空,并没有主动判断重新调度的功能,只有抢占式内核才会调用_cond_resched来执行主动检查可抢占性...7.总结 本文讲解了内核抢占的方方面面,抢占式内核主要用于服务器等对吞吐量要求较高的场景,而抢占式内核主要用于嵌入式设备和桌面等对响应要求较高的场景。...最后,我们又分析了抢占式内核如何进行低延迟处理已经自愿抢占式内核如何实现自愿式抢占

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

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

1 抢占式和可抢占式内核 为了简化问题,我使用嵌入式实时系统uC/OS作为例子 首先要指出的是,uC/OS只有内核态,没有用户态,这和Linux不一样 多任务系统中, 内核负责管理各个任务, 或者说为每个任务分配...抢占式内核是由任务主动放弃CPU的使用权 抢占式调度法也称作合作型多任务, 各个任务彼此合作共享一个CPU....抢占式内核的优点有 中断响应快(与抢占式内核比较); 允许使用不可重入函数; 几乎不需要使用信号量保护共享数据, 运行的任务占有CPU,不必担心被别的任务抢占。...抢占式内核的缺点有 任务响应时间慢。...内核抢占和用户层进程被其他进程抢占是两个不同的概念, 内核抢占主要是从实时系统中引入的, 在实时系统中的确也能提高系统的响应速度, 但也不是在所有情况下都是最优的,因为抢占也需要调度和同步开销,在某些情况下甚至要关闭内核抢占

5K30

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

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

pick_next_task全局的pick_next_task函数会从按照优先级遍历所有调度器类的pick_next_task函数, 去查找最优的那个进程, 当然因为大多数情况下, 系统中全是CFS调度的实时进程..., 因而linux内核也有一些优化的策略 一般情况下选择红黑树中的最左进程left作为最优进程完成调度, 如果选出的进程正好是cfs_rq->skip需要跳过调度的那个进程, 则可能需要再检查红黑树的次左进程...关于place_entity函数, 我们之前在讲解CFS队列操作的时候已经讲的很详细了 参见linux进程管理与调度之CFS入队出队操作 设想一下子如果休眠进程的vruntime保持不变,...而其他运行进程的 vruntime一直在推进, 那么等到休眠进程终于唤醒的时候, 它的vruntime比别人小很多, 会使它获得长时间抢占CPU的优势, 其他进程就要饿死了....vruntime值,以cfs_rq->min_vruntime值为基础,给予一定的补偿,但不能补偿太多.这样由于休眠进程在唤醒时或者新进程创建完成后会获得vruntime的补偿,所以它在醒来和创建后有能力抢占

2.5K31

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 协作与抢占

这便涉及到有关调度的两个理念:协作式调度与抢占式调度。 协作式和抢占式这两个理念解释起来很简单:协作式调度依靠被调度方主动弃权;抢占式调度则依靠调度器强制将被调度方被动中断。...这一保守体现在抢占对很多运行时所需的条件进行了判断,这也理所当然是因为运行时优先级更高,不应该轻易发生抢占,但与此同时由于又需要对用户态代码进行抢占,于是先作出一次不需要抢占的判断(快速路径),确定不能抢占时返回并继续调度...这个方法处理了两种抢占情况,一是抢占阻塞在系统调用上的 P,二是抢占运行时间过长的 G。其中抢占运行时间过长的 G 这一方式还会出现在垃圾回收需要进入 STW 时。...P 抢占 我们先来看抢占阻塞在系统调用上的 G 这种情况。...这种异步抢占的本质是:抢占 P。

2.1K20

无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

玩转企业集群运维管理系列(十二):Keepalived 双主、抢占模式及脑裂问题详解

抢占模式 Nginx+keepalived实战 简单点说抢占模式就是,当master宕机后,backup 接管服务。...实际生产中是,当原先的master恢复后,状态变为backup,不接管服务,这是非抢占模式。 重点:抢占式俩节点state必须为bakcup,且必须配置nopreempt。...总结:抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。...state backup priority 70 nopreempt .... } 不抢占是配置在优先级高的机器上面,同时状态要是backup,即集群内部要想实现不抢占,...谁优先级高配置一个不抢占参数nopreempt(因为优先级高的会抢占VIP)。每次抢占就需要发生切换和漂移,来回切换漂移影响业务访问,服务要中断!!!!

19410

玩转企业集群运维管理系列(十二):Keepalived 双主、抢占模式及脑裂问题详解

抢占模式 Nginx+keepalived实战 简单点说抢占模式就是,当master宕机后,backup 接管服务。...实际生产中是,当原先的master恢复后,状态变为backup,不接管服务,这是非抢占模式。 重点:抢占式俩节点state必须为bakcup,且必须配置nopreempt。...总结:抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。...state backup priority 70 nopreempt .... } 不抢占是配置在优先级高的机器上面,同时状态要是backup,即集群内部要想实现不抢占,...谁优先级高配置一个不抢占参数nopreempt(因为优先级高的会抢占VIP)。每次抢占就需要发生切换和漂移,来回切换漂移影响业务访问,服务要中断!!!!

29910

Linux编程(阻塞和阻塞IO)

Linux设备驱动中的阻塞和阻塞I/0,简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。...阻塞操作:在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直到可以进行操作。...阻塞应用程序通常使用select系统调用查询是否可以对设备进行无阻塞的访问最终会引发设备驱动中 poll 函数执行。...: char buf; fd = open("/dev/ttyS1",O_RDWR|O_NONBLOCK); //O_NONBLOCK 阻塞标识 ..... while(read(fd,&buf,1)...阻塞I/O的操作在应用层通常会用到select()和poll()系统调用查询是否可对设备进行无阻塞访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被调用。

5.4K20

Docker、宝塔,Linux一键部署Django应用

热心群友开发的桌面面板程序,简直会成为 Windows 部署 Python Web 应用的神器 然而,用于部署 Django 的服务器,更多的还是 Linux 操作系统的。...而Linux系统的管理,由于欠缺合适的图形操作,一直以来都是命令大神们的游戏场。对于计算机小白来说,如此多的终端命令,终究是难以入手。 Django 在Linux 下的部署同样如此。...Django常规部署步骤 在 Django 项目代码存在于 Linux系统的服务器上之后,我们还需要进入如此的步骤,才能完成 Django 项目的部署。...安装系统依赖库 部分 Linux 版本还是自带的Python2,所以得安装 Python3、PIP3以及各种系统的依赖软件。...所以,有没有其他的方案,即是通过Linux原生进行部署,又很简单方便,还得稳定。 答案是有的。 懒人方案 MrDoc 交流群的热心群友、管理员——亖,基于上述痛点,便编写了一个一键部署的脚本。

1.3K20

linux阻塞与阻塞(connect连接超时)

阻塞connect详情介绍可以参见文章:https://blog.csdn.net/qq_41453285/article/details/89890429 一、阻塞connect概述 man手册...解析文档,阻塞connect如何使用: ①当我们将sock设置为阻塞之后,使用connect去连接服务端,即使服务端开启了,connect系统调用也不会连接成功,connect而是以失败告终,并返回错误...,进一步来等待阻塞connect客户端与服务端建立完整地连接,在等待的过程中,如果阻塞connect建立成功了,客户端的sock_fd就会变成可写的(这个在本人的IO复用文章中介绍过,见下图) ④当阻塞...在有些系统(比如Linux)上返回-1,而在有些系统上(比如源自伯克利的UNIX)返回0 这些问题没有一个统一的解决办法 三、编码演示案例 #include #include <stdlib.h...于是在后面的select中等待阻塞connect建立成功并且客户端fd变为可写的。

5.9K10
领券