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

Linux内核36-内核同步之禁止中断

今天,我们了解一下内核同步的最后一种方法,关闭中断。这是一种简单粗暴的方式,但行之有效。 1 禁止中断 作为嵌入式软件开发人员,对于禁止中断肯定不陌生。...同样,Linux也不会放弃禁止中断这么好的同步机制。它保证内核控制路径可以继续执行,其访问的数据结构不会被中断处理程序破坏。...所以,在多核系统中,内核数据结构的保护一般是禁止中断搭配自旋锁一起使用。...当内核代码进入临界代码段时,通过清除eflags寄存器中的IF标志实现禁止中断,从而保护临界代码段。但是,当内核离开临界代码段的时候,内核是否该恢复之前的IF标志呢?还是不做任何处理?...但是,事情不会那么简单,有时候,内核需要只禁止可延时函数,而不禁止中断。那怎么实现呢?

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

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

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

1.3K20

对atbus的小数据包的优化

/s 165K/s Linux+本地回环+ipv6+动态缓冲区(ptmalloc) 1 8-16384字节 95%/100% 5.6MB/28MB 484MB/s 82.6K/s Linux+本地回环+...280MB 96MB/s 12K/s Linux+跨机器转发+ipv4 2(仅一个连接压力测试) 4KB 13%/100% 280MB 92MB/s 23K/s Linux+跨机器转发+ipv4 2(...1.59GB/s 102K/s Linux+共享内存 3(仅一个连接压力测试) 8KB 36%/70% 280MB 1.27GB/s 163K/s Linux+共享内存 3(仅一个连接压力测试) 4KB...40%/73% 280MB 1.30MB/s 333K/s Linux+共享内存 3(仅一个连接压力测试) 2KB 43%/93% 280MB 1.08GB/s 556K/s Linux+共享内存 3...当然如果真要搞到2M的连接数,连内核底层的tcp窗口的缓冲区也得改。这个缓冲区默认情况都远大于4K。 最后加的一个东西就是:write队列什么时候合包?

6.8K20

Linux启动引导参数grub

因为当控制台进入休眠之后,所有内核的消息就都看不见了(包括串口与VGA)。开启此参数有助于调试系统在休眠/唤醒中发生的故障。...[HIBERNATION] noresume 禁用内核休眠到硬盘功能(CONFIG_HIBERNATION),也就是不从先前的休眠状态中恢复(即使该状态已经被保存在了硬盘的swap分区上),并且清楚先前已经保存的休眠状态...nocompress 表示禁止休眠镜像进行压缩/解压。...poll 从根本上禁用休眠功能(也就是禁止进入C-states状态),可以略微提升一些CPU性能,但是却需要多消耗许多电力,得不偿失。不推荐使用。...LIBATA [LIBATA] libata.noacpi 在libata驱动休眠/唤醒过程中禁止使用ACPI。主要用于解决某些有缺陷的BIOS导致的 硬盘假死问题。

9.1K20

【Android休眠】之Android休眠机制

二、Android休眠 休眠内核的核心工作,而Android是基于Linux内核的,所以Android休眠内核有着千丝万缕的联系;由于Android的特殊应用场景:移动设备,所以Android休眠内核又有着特别的需求...1、联系: Android设备停止使用,系统没有什么事情可做,进入休眠状态的功能最终是由内核去实现的;每一类硬件都有自己的驱动,具体的驱动决定怎么进入休眠以及处于何种层次的休眠。.../sys/power/pm_async:状态切换开关,允许/禁止User空间对设备进行异步的suspend和resume操作。.../sys/power/pm_freeze_timeout:系统在执行休眠动作的时候要冻结(freeze)用户控件的进程和内核空间的允许冻结的内核线程,执行这些操作要耗时间吧?...2、Android设备连着adb线到其他设备的情况下,设备是不会进入休眠模式的。 3、有休眠操作就有唤醒,就需要唤醒源。唤醒源有很多种,在内核注册,比如常用的Power按键。

4.1K20

【Android休眠】之Android休眠机制

二、Android休眠 休眠内核的核心工作,而Android是基于Linux内核的,所以Android休眠内核有着千丝万缕的联系;由于Android的特殊应用场景:移动设备,所以Android休眠内核又有着特别的需求...1、联系: Android设备停止使用,系统没有什么事情可做,进入休眠状态的功能最终是由内核去实现的;每一类硬件都有自己的驱动,具体的驱动决定怎么进入休眠以及处于何种层次的休眠。.../sys/power/pm_async:状态切换开关,允许/禁止User空间对设备进行异步的suspend和resume操作。.../sys/power/pm_freeze_timeout:系统在执行休眠动作的时候要冻结(freeze)用户控件的进程和内核空间的允许冻结的内核线程,执行这些操作要耗时间吧?...2、Android设备连着adb线到其他设备的情况下,设备是不会进入休眠模式的。 3、有休眠操作就有唤醒,就需要唤醒源。唤醒源有很多种,在内核注册,比如常用的Power按键。

1.9K20

面试官让你讲讲Linux内核的竞争与并发,你该如何回答?

内核中的并发和竞争简介   在早期的 Linux内核中,并发的来源相对较少。...自旋锁会自动禁止抢占,也就说当线程A得到锁以后会暂时禁止内核抢占。如果线程A在持有锁期间进入了休眠状态,那么线程A会自动放弃CPU使用权。...线程B开始运行,线程B也想要获取锁,但是此时锁被A线程持有,而且内核抢占还被禁止了!线程B无法被调度岀去,那么线程A就无法运行,锁也就无法释放死锁发生了!   ...信号量具有以下特点: 因为信号量可以使等待资源线程进入休眠状态,因此适用于那些占用资源比较久的场合。 因此信号量不能用于中断中,因为信号量会引起休眠,中断不能休眠。...Linux内核中几平所有的信号量均用于互斥。

71230

Linux内核24-内核同步理解

当然了,Linux内核不可能这么简单: 不论是抢占式内核还是非抢占式内核,进程都有可能放弃CPU的使用权而休眠等待某些资源。我们称这类进程切换是有计划的进程切换。...这个值分为3部分,也就是说可能有3种情况导致该值大于0: 内核正在执行中断服务例程(ISR); 延时函数被禁止(当内核执行软中断或tasklet时总是使能状态); 内核抢占被禁止。...通过上面的规则可以看出,内核只有在执行异常处理程序(尤其是系统调用)的时候才能够被抢占,而且内核抢占也没有被禁止。所以,CPU必须使能中断,内核抢占才能被执行。...基于这个原因,Linux2.6内核允许用户在编译内核代码的时候,通过配置,可以使能和禁止内核抢占。 4 什么时候需要同步技术? 我们先了解一下内核进程的竞态条件和临界区的概念。...或所有CPU 自旋锁 忙等待 所有CPU 信号量 阻塞等待(休眠) 所有CPU Seqlock 根据计数器进行加锁 所有CPU 中断禁止 禁止响应中断 本地CPU 软中断禁止 禁止处理可延时函数 本地CPU

1K20

Linux设备驱动程序(五)——并发和竞态

它不能休眠,事实上,它不能因为任何原因放弃处理器,除了服务中断以外(某些情况下此时也不能放弃处理器)。 只要内核代码拥有自旋锁,在相关处理器上的抢占就会被禁止。...甚至在单处理器系统上,也必须以同样的方式禁止抢占以避免竞态。 在用户空间和内核空间之间复制数据就是个明显的例子:在复制继续前,必需的用户空间页也许需要从磁盘上交换进入,而这个操作明显需要休眠。...最后,spin_lock_bh 在获得锁之前禁止软件中断,但是会让硬件中断保持打开。...如果我们拥有信号量和自旋锁的组合,则必须首先获得信号量;在拥有自旋锁时调用 down(可导致休眠)是个严重的错误的。 3、细粒度锁和粗粒度锁的对比 现代的内核可包含数千个锁,每个锁保护一个小的资源。...stuff = find_the_stuff(args...); do_something_with(stuff); rcu_read_unlock(); rcu_read_lock 调用非常快,它会禁止内核抢占

23731

FreeRTOS(十六):低功耗 Tickless 模式

根据Cortex-M 内核的SCR(系统控制)寄存器可以选择使用立即休眠还是退出时休眠,当 SCR 寄存器的 SLEEPONEXIT(bit1)位为 0 的时候使用立即休眠,当为 1 的时候使用退出时休眠...● 退出休眠模式 如果使用 WFI 指令进入休眠模式的话那么任意一个中断都会将 MCU 从休眠模式中唤醒,如果使用 WFE 指令进入休眠模式的话那么当有事件发生的话就会退出休眠模式,比如配置一个 EXIT...当 STM32F103 处于休眠模式的时候 Cortex-M3 内核停止运行,但是其他外设运行正常,比如 NVIC、SRAM 等。...2、停止(Stop)模式 停止模式基于 Cortex-M3 的深度休眠模式与外设时钟门控,在此模式下 1.2V 域的所有时钟都会停止,PLL、HSI 和 HSE RC 振荡器会被禁止,但是内部 SRAM...待机模式是基于 Cortex-M3 的深度睡眠模式的,其中调压器被禁止。1.2V 域断电,PLL、HSI 振荡器和 HSE 振荡器也被关闭。

3K20

Linux内核37-内核数据的同步访问

2 如何选择自旋锁、信号量和禁止中断 不幸的是,访问内核数据结构的形式远远比上面的示例复杂多了,迫使内核开发者不得不启动信号量、自旋锁和中断禁止这些锁原语。...但需要注意的一点是,无论何时,内核控制路径请求一个自旋锁(包括读写锁,seqlock和RCU)时,都会禁止局部中断或者软中断,从而禁止内核抢占。...禁止中断 自旋锁 异常处理程序+可延时函数 禁止软中断 自旋锁 中断处理程序+可延时函数 禁止中断 自旋锁 中断处理程序+可延时函数+异常处理程序 禁止中断 自旋锁 在了解这些不同的内核控制路径访问的数据结构应该如何保护之前...即使是开启内核抢占,也不会产生问题。如果持有信号量的进程被抢占,新进程会尝试申请信号量。但是,这时候申请信号量肯定失败,从而新进程进入休眠,等待旧进程释放信号量。...为了方便处理多核系统中这种局部中断禁止和自旋锁结合在一起使用的情况,Linux提供了一些宏,如下表所示。单核系统中,这些宏只能禁止中断或者禁止内核抢占。

87620

【Linux 内核】调度器 ⑥ ( task_woken 函数 | set_cpus_allowed 函数 | rq_online 函数 | rq_offline 函数 )

函数 ( 唤醒阻塞进程 ) 二、set_cpus_allowed 函数 ( 修改进程在 CPU 中的亲和力 ) 三、rq_online 函数 ( 启动执行队列 ) 四、rq_offline 函数 ( 禁止执行队列...) Linux 内核源码 linux-5.6.18\kernel\sched\sched.h 中 , 定义的 struct sched_class 调度类结构体 , 就是 " 调度器 " 对应的类 ;...一、task_woken 函数 ( 唤醒阻塞进程 ) ---- sched_class 调度类结构体 中的 task_woken 函数指针 , 指向一个函数 , 调用该函数 , 可以将 休眠或阻塞中的...void (*rq_online)(struct rq *rq); 源码路径 : linux-5.6.18\kernel\sched\sched.h#1737 ; 四、rq_offline 函数 ( 禁止执行队列...)---- sched_class 调度类结构体 中的 rq_offline 函数指针 , 指向一个函数 , 调用该函数 , 可以 禁止 执行队列 ; 进程 是一个 调度实体 ; 执行队列 是一个 红黑树

34620

zephyr笔记 2.1.2 线程的调度

锁定调度程序对于可抢占线程来说是一种更有效的方法来禁止抢占,而不是将其优先级改为负值。 2.7 线程休眠 一个线程可以调用k_sleep() 来延迟一段指定的时间再处理。...在线程休眠期间,放弃CPU以允许其他就绪线程执行。 一旦经过指定的延迟时间,线程就会就绪,并可以被再次调度。 休眠线程可以使用k_wakeup()由另一个线程提前唤醒。...这种技术有时可用于让辅助线程发信号通知睡眠线程发生了某些事情,而不需要线程定义内核同步对象,例如信号量。 唤醒未睡眠的线程是允许的,但不起作用。...当所需延迟太短而不能保证调度程序上下文从当前线程切换到另一个线程,然后再返回时,通常使用忙等待来代替线程休眠。 3 建议用法 使用协作线程进行设备驱动程序和其他性能关键型工作。...使用协作线程来实现互斥,而不需要内核对象,例如互斥锁。 使用抢占式线程优先处理时间敏感的事务,而非时间不敏感的事务。

1.3K20

linux内核设计与实现

task_struct的sleep_avg变量,默认为10ms,休眠时增加该值(休眠时长),运行时减少该值 动态计算时间片 进程创建时,父子进程平分时间片。...系统调用上下文 current指针指向引发当前调用的进程 执行系统调用时处于进程上下文 进程上下文中,内核可以休眠(调用阻塞或schedule)并可以被抢占 4....,提供能够禁止中断系统或屏蔽中断线的功能 相关代码在, 中 中断控制的根源是提供同步,通过禁止中断,确保中断程序不会抢占当前代码,也可以禁止内核抢占 禁止和激活当前处理器中断:local_irq_disable...,local_irq_enable 禁止(屏蔽)指定中断线: disable_irq,disable_irq_nosync,enable_irq,synchronize_irq 获取中断系统状态:asm...),在使用锁之前,要禁止本地中断,否则会导致死锁 2.3 读写自旋锁 锁用途可以明确分为读锁和写锁。

2.8K52

Linux内核35-Completion机制

1 Completion机制的工作原理 内核编程中的一个常见模式就是在当前进程中,再去启动另外一个活动,比如创建新的内核线程或用户进程、向已存在的进程发起请求、再或者操作某些硬件。...当然了,第二种情况可以使用其它指令,禁止down()和up()函数的并发执行。但是,这样的话,又增加了新的负荷。所以,并不是一个特别好的选择。...这个函数会调用spin_lock_irqsave()函数,请求completion等待队列的保护自旋锁,增加done的值,唤醒等待队列中的休眠进程中的一个,最后调用spin_unlock_irqrestore...这个函数会检查done的值:如果大于0,函数执行终止,因为另一个CPU上已经执行了complete()函数;否则,这个函数添加当前进程到等待队列的队尾,并使进程进入休眠,将其进程状态设为TASK_UNINTERRUPTIBLE...completion机制的一个典型应用就是,在模块exit的时候,终止内核线程。在一些典型的例子中,驱动程序的内部工作是在内核线程中使用while(1)循环中实现的。

61310
领券