
多核并发
废言Pro
时间加努力
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
简析RCU机制
RCU(Read-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用。RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制读取数据的时候不对链表进行耗时的加锁操作。这样在同一时间可以有多个线程同时读取该链表,并且允许一个线程对链表进行修改(修改的时候,需要加锁)。RCU适用于需要频繁的读取数据,而相应修改数据并不多的情景,例如...转载 2020-04-23 09:48:40 · 606 阅读 · 0 评论 -
无锁队列的实现
关于无锁队列的实现,网上有很多文章,虽然本文可能和那些文章有所重复,但是我还是想以我自己的方式把这些文章中的重要的知识点串起来和大家讲一讲这个技术。下面开始正文。关于CAS等原子操作在开始说无锁队列之前,我们需要知道一个很重要的技术就是CAS操作——Compare & Set,或是 Compare & Swap,现在几乎所有的CPU指令都支持CAS的原子操作,X86下对应的...转载 2020-01-15 13:57:59 · 1439 阅读 · 1 评论 -
FRR的ATOMIC 利用GCC的实现
FRR的ATOMIC 利用GCC的实现,后续项目可以参考/* * Copyright (c) 2015-16 David Lamparter, for NetDEF, Inc. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee...原创 2019-11-16 11:25:14 · 514 阅读 · 0 评论 -
GCC 原子操作中 Acquire/Release/Consume/Relaxed 内存模型
原子操作在多线程开发中经常用到,比如在计数器,序列产生器等地方,这类情况下数据有并发的危险,但是用锁去保护又显得有些浪费,所以原子类型操作十分的方便。原子操作虽然用起来简单,但是其背景远比我们想象的要复杂。其主要在于现代计算系统过于的复杂:多处理器、多核处理器、处理器又有核心独有以及核心共享的多级缓存,在这种情况下,一个核心修改了某个变量,其他核心什么时候可见是一个十分严肃的问题。同时在极致最...原创 2019-11-16 11:24:26 · 3745 阅读 · 0 评论 -
atomic_fetch_add
atomic_fetch_add, atomic_fetch_add_explicit原子操作库 定义于头文件<stdatomic.h> C atomic_fetch_add(volatileA*obj, M arg); (1) (C11 起) C atomic_fetch_add_e...原创 2019-11-16 11:22:43 · 2884 阅读 · 0 评论 -
Multithreaded simple data type access and atomic variables
Table of contentsIntroductionHow atomic variables workAtomic variables size limitationsUse casesThe real thing…Time to see some actionPrecautionsConslusionIntroductionBACK TO TOCIn this ar...原创 2019-11-16 11:19:56 · 332 阅读 · 0 评论 -
无锁编程
锁的缺点锁定被迫交出时间片。锁定意味着阻塞,多个线程(进程)排队获取资源,无法充分发挥系统性能。锁定的阻塞无法通过fd进行通知,对性能有进一步的影响(理想的服务器模型是全局一处阻塞统一等待消息)。一些锁限制了必须使用线程的方式进行开发,而线程无法充分利用系统的内存。pthread库在特殊情况下可能产生饥饿的情况。无锁编程的思路加锁的根本起因是什么?资源竞争。解决...转载 2019-11-16 11:16:33 · 842 阅读 · 0 评论 -
RCU机制简单分析
简介RCU(Read-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用。RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制读取数据的时候不对链表进行耗时的加锁操作。这样在同一时间可以有多个线程同时读取该链表,并且允许一个线程对链表进行修改(修改的时候,需要加锁)。RCU适用于需要频繁的读取数据,而相应修改...转载 2019-10-16 21:02:52 · 551 阅读 · 0 评论 -
同步与互斥的基本原理
在本科学习过《操作系统》的同志们都知道,现代操作系统提供了一个并发控制环境,即系统中同时活动着的多个不同的进程,这些进程共享同一个CPU、内存或 I/O设备。特别是对于Linux这种世界上最先进的操作系统来说,其多任务、多用户、分时实时混合的性质决定了多个进程在某种程度上彼此依赖或相互制约的关系,这些关系我们叫“并发关系”,按其性质可以分为同步(synchronization)和互斥(mutual...转载 2018-12-21 16:55:50 · 4106 阅读 · 0 评论 -
NUMA架构的CPU – 你真的用好了么?
本文从NUMA的介绍引出常见的NUMA使用中的陷阱,继而讨论对于NUMA系统的优化方法和一些值得关注的方向。文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地址:http://cenalulu.github.io/linux/numa/NUMA简介这部分将简要介绍下NUMA架构的成因和具体原理,已经了解的读者可以直接跳到第二节。为什...转载 2017-11-07 23:55:22 · 630 阅读 · 0 评论 -
NUMA架构下的CPU拓扑
目前多核已经越来越普遍的使用,Linux对NUMA架构的支持也越来越完善。对于内存管理、多处理的负载均衡调度等进行了大量的优化工作。 NUMA相关的几个概念有node、socket、core和thread。Socket是一个物理上的概念,指的是主板上的cpu插槽。Node是一个逻辑上的概念,对应于socket。Core就是一个物理cpu,一个独立的硬件执行单元。Thread就是超线程的概念...转载 2017-11-07 23:47:44 · 1759 阅读 · 0 评论 -
Linux内核抢占实现机制分析
【摘要】本文详解了Linux内核抢占实现机制。首先介绍了内核抢占和用户抢占的概念和区别,接着分析了不可抢占内核的特点及实时系统中实现内核抢占的必要性。然后分析了禁止内核抢占的情况和内核抢占的时机,最后介绍了实现抢占内核所做的改动以及何时需要重新调度。【关键字】内核抢占,用户抢占,中断, 实时性,自旋锁,抢占时机,调度时机,schedule,preempt count1 、 内核抢占概述转载 2013-09-01 22:59:43 · 629 阅读 · 0 评论 -
关于SMP
对称式多处理器(Symmetric Multi-Processor),缩写为SMP,是一种计算机系统结构。多处理器结构有两种:对称 —— 多个处理器都是等价的,线程每次受调度运行时都可以动态选择在任何一个处理器上运行。非对称 —— 处理器的结构、能力、所处的部位、和作用都各不相同,不同的线程只能在特定的处理器上运行。如果一个软件可以在SMP结构的计算机上正常运行,就称为“SMP安全”转载 2013-07-23 09:34:53 · 1239 阅读 · 0 评论 -
内核同步与互斥的总结
前面讲了那么多内核同步与互斥的技术,现在我们就来做一个总结。我们可以随意使用前面所述的同步技术保护共享数据结构避免竞争条件。当然,系统性能可能随所选择同步原语种类的不同而有很大变化。通常情况下,内核开发者采用下述由经验得到的法则:把系统中的并发度保持在尽可能高的程度。系统中的并发度又取决于两个主要因素:(1)同时运转的I/O设备数(2)进行有效工作的CPU数为了使I转载 2013-07-23 09:32:37 · 839 阅读 · 0 评论 -
一些避免竞争条件的实例
人们总是期望内核开发者确定和解决由内核控制路径的交错执行所引起的同步问题。但是,避免竞争条件是一项艰巨的任务,因为这需要对内核的各个成分如何相互作用有一个清楚的理解。为了直观地认识内核内部到底是什么样子,需要提及前面博文中所定义同步技术的几种典型应用场景。1 引用计数器引用计数器广泛地用在内核中以避免由于资源的并发分配和释放而产生的竞争条件。引用计数器(reference counter)转载 2013-07-23 09:32:10 · 1626 阅读 · 0 评论 -
内核抢占
为了更好地理解内核代码是如何执行的,我们借用ULK-3中的思想,把内核看作必须满足两种请求的侍者:一种请求来自顾客,另一种请求来自数量有限的几个不同的老板。对不同的请求,侍者采用如下的策略:1. 老板提出请求时,如果侍者正空闲,则侍者开始为老板服务,这是空闲情况。2. 如果老板提出请求时侍者正在为顾客服务,那么侍者停止为顾客服务,开始为老板服务,这是高优先级抢占低优先级情况。3.转载 2013-06-04 20:08:32 · 731 阅读 · 0 评论 -
内核中的原子上下文
内核的一个基本原则就是:在中断或者说原子上下文中,内核不能访问用户空间,而且内核是不能睡眠的。也就是说在这种情况下,内核是不能调用有可能引起睡眠的任何函数。一般来讲原子上下文指的是在中断或软中断中,以及在持有自旋锁的时候。内核提供了四个宏来判断是否处于这几种情况里:#define in_irq() (hardirq_count()) //在处理硬中断中#d转载 2013-06-04 20:24:48 · 2688 阅读 · 0 评论 -
spinlock与linux内核调度的关系
一、自旋锁(spinlock)简介自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。二、信号量简介这里也介绍下信号量的概念,因为它的用法和自旋锁有相似的地方。Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其...转载 2013-06-04 20:33:17 · 1526 阅读 · 0 评论 -
深入分析Linux自旋锁
前言: 在复习休眠的过程中,我想验证自旋锁中不可休眠,所以编写了一个在自旋锁中休眠的模块。但是在我的ARMv7的单核CPU(TI的A8芯片)中测试的时候,不会锁死,并且自旋锁可以多次获取。实验现象和我对自旋锁和休眠的理解有出路。 我后来我将这个模块放到自己的PC上测试,成功锁死了,说明我的模块原理上没有问题。但是为什么在ARM上会这样呢???后来我将模块给了我的两个同事测转载 2013-07-15 09:13:44 · 604 阅读 · 0 评论 -
每CPU变量
include include 最好的同步技术是把设计不需要同步的临界资源放在首位,这是一种思维方法,因为每一种显式的同步原语都有不容忽视的性能开销。最简单也是最重要的同步技术包括把内核变量或数据结构声明为每CPU变量(per-cpu variable)。每CPU变量主要是数据结构的数组,系统的每个CPU对应数组的一个元素。一个CPU不应该访问与其他CPU对应的数组元素,另转载 2013-07-15 09:14:27 · 653 阅读 · 0 评论 -
原子操作
若干汇编语言指令都具有“读-修改-写”特点 —— 也就是说,它们访问存储器单元两次,第一次读原值,第二次写新值。假定运行在两个CPU上的两个内核控制路径试图通过执行非原子操作来同时“读-修改-写”同一存储器单元,如n++。首先,两个CPU都试图读同一单元,比如n=5。但是存储器仲裁器(对访问RAM芯片的操作进行串行化的硬件电路)插手,只允许其中的一个访问而让另一个延迟。然而,当第一个读操作转载 2013-07-15 09:14:44 · 713 阅读 · 0 评论 -
优化屏障和内存壁垒
当使用指令优化的编译器时,你千万不要认为指令会严格按它们在源代码中出现的顺序执行。例如,编译器可能重新安排汇编语言指令以使寄存器以最优的方式使用。此外,现代CPU通常并行地执行若干条指令,且可能重新安排内存访问。这种重新排序可以极大地加速程序的执行。然而,当处理同步时,必须避免指令重新排序。因为如果放在同步及原语之后的一条指令在同步原语本身之前执行,事情很快就会变得失控。所以,所有的同步技转载 2013-07-15 09:15:15 · 779 阅读 · 0 评论 -
自旋锁
加锁(locking)是一种广泛应用的同步技术。当内核控制路径必须访问共享数据结构或进入临界区时,就需要为自己获取一把“锁”。由锁机制保护的资源非常类似于限制于房间内的资源,当某人进入房间时,就把门锁上。如果内核控制路径希望访问资源,就试图获取钥匙“打开门”。当且仅当资源空闲时,它才能成功。然后,只要它还想使用这个资源,门就依然锁着。当内核控制路径释放了锁时,门就打开,另一个内核控制路径就可以进入转载 2013-07-15 09:16:37 · 549 阅读 · 0 评论 -
读写自旋锁
读/写自旋锁同样是在保护SMP体系下的共享数据结构而引入的,它的引入是为了增加内核的并发能力。只要内核控制路径没有对数据结构进行修改,读/写自旋锁就允许多个内核控制路径同时读同一数据结构。如果一个内核控制路径想对这个结构进行写操作,那么它必须首先获取读/写锁的写锁,写锁授权独占访问这个资源。这样设计的目的,即允许对数据结构并发读可以提高系统性能。下图显示有两个受读/写锁保护的临界区(CI和转载 2013-07-15 09:17:45 · 709 阅读 · 0 评论 -
顺序锁
当使用读/写自旋锁时,内核控制路径发出的执行read_lock或write_lock操作的请求具有相同的优先权:读者必须等待,直到写操作完成。同样地,写者也必须等待,直到读操作完成。Linux 2.6中引入了顺序锁(seqlock),它与读/写自旋锁非常相似,只是它为写者赋予了较高的优先级:事实上,即使在读者正在读的时候也允许写者继续运行。这种策略的好处是写者永远不会等待读(除非另外一个写转载 2013-07-23 09:21:40 · 670 阅读 · 0 评论 -
RCU机制
读-拷贝-更新(RCU)是为了保护在多数情况下被多个CPU读的数据结构而设计的另一种同步技术。RCU允许多个读者和写者并发执行(相对于只允许一个写者执行的顺序锁有了改进)。而且,RCU是不使用锁的,就是说,它不使用被所有CPU共享的锁或计数器,在这一点上与读/写自旋锁和顺序锁(由于高速缓存行窃用和失效而有很高的开销)相比RCU具有更大的优势。RCU是如何不使用共享数据结构而令人惊讶地实现多转载 2013-07-23 09:26:15 · 713 阅读 · 0 评论 -
信号量
信号量这个东西,从本质上说,它实现了一个加锁原语,即让等待者睡眠,直到等待的资源变为空闲。实际上,Linux提供两种信号量:- 内核信号量,由内核控制路径使用- System V IPC信号量,由用户态进程使用在本专题,我们集中讨论内核信号量,而IPC信号量将有专门的专题来讲。内核信号量类似于自旋锁,因为当锁关闭着时,它不允许内核控制路径继续进行。然而,当内核控制路径试转载 2013-07-23 09:27:10 · 664 阅读 · 0 评论 -
禁止本地中断
禁止本地CPU中断是确保一组内核语句被当作一个临界区处理的主要机制。这个机制的意义是:即使当硬件设备产生了一个IRQ信号时,中断禁止也让内核控制路径继续执行,因此,这就提供了一种有效的方式,确保内核控制路径中的一些中断处理程序能访问的数据结构也受到保护。1 、禁止本地中断然而,禁止本地中断并不保护运行在另一个CPU上的中断处理程序对该数据结构的并发访问,因此,在多处理器系统上,禁止本地中断转载 2013-07-23 09:31:29 · 1453 阅读 · 0 评论