随笔分类 -  Linux同步

BIO与NIO、AIO的区别
摘要:IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待 阅读全文

posted @ 2018-02-22 22:19 AlanTu 阅读(390) 评论(0) 推荐(0) 编辑

网络编程中的read,write函数
摘要:关于TCP/IP协议,建议参考Richard Stevens的《TCP/IP Illustrated,vol1》(TCP/IP详解卷1)。 关于第二层面,依然建议Richard Stevens的《Unix network proggramming,vol1》(Unix网络编程卷1),这两本书公认是U 阅读全文

posted @ 2018-02-22 19:43 AlanTu 阅读(804) 评论(0) 推荐(0) 编辑

系统调用
摘要:Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。系统调用实际上是内核中的一些C函数,它们都以sys开头的,如sys_mkdir()。它们通过一个指令int 0x80(软中断)把控制权交给内核,即进入特权级执行。int 0x80指令会使“执行”跳转到系统调用在内核中定义的入口地址 阅读全文

posted @ 2018-02-22 19:40 AlanTu 阅读(295) 评论(0) 推荐(0) 编辑

内核同步机制
摘要:内核中用于临界区保护下的互斥机制,它包括自旋锁、原子操作和信号量,三者保证了对临界资源访问的互斥型。 1.1 内核中的互斥机制 1.1.1 自旋锁 自旋锁用在多个CPU系统中。当一个线程在一个CPU上正使用资源,而另一个线程在另一个CPU上正忙等待这个资源的时候,就会用到自旋锁来保护临界资源。在单处 阅读全文

posted @ 2018-02-22 19:33 AlanTu 阅读(395) 评论(0) 推荐(0) 编辑

Linux内核中锁机制之RCU、大内核锁
摘要:在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL)。文章的最后对《大话Linux内核中锁机制》系列博文进行了总结,并提出关于目前Linux内核中提供的锁机制的一些基本使用观点。 十、R 阅读全文

posted @ 2018-02-22 16:37 AlanTu 阅读(4525) 评论(0) 推荐(0) 编辑

Linux内核中锁机制之完成量、互斥量
摘要:在上一篇博文中笔者分析了关于信号量、读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题。 八、完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等待另一个执行单元完成某事后方可执行,它是一种轻量级机制。事实上,它即是为了完成进程间的同步而设计的, 阅读全文

posted @ 2018-02-22 16:36 AlanTu 阅读(1279) 评论(0) 推荐(0) 编辑

Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁
摘要:在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障、读写自旋锁以及顺序锁的相关内容。下面首先讨论内存屏障的相关内容。 三、内存屏障 不知读者是是否记得在笔者讨论自旋锁的禁止或使能的时候,提到过一个内存屏障函数。OK,接下来,笔者将讨论内存屏障的具体细节内 阅读全文

posted @ 2018-02-22 16:35 AlanTu 阅读(2423) 评论(0) 推荐(0) 编辑

Linux内核中锁机制之信号量、读写信号量
摘要:在上一篇博文中笔者分析了关于内存屏障、读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量、读写信号量的内容。 六、信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程才能执行临界区的代码;不同的是获取不到信号量时,进程不会原地打转而是进入休眠等待状态。它的定义是in 阅读全文

posted @ 2018-02-22 16:35 AlanTu 阅读(580) 评论(0) 推荐(0) 编辑

Linux内核中锁机制之原子操作、自旋锁
摘要:很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态。这其中包括了我们所熟知的SMP系统,多核间的相互竞争资源,单CPU之间的相互竞争,中断和进程间的相互抢占等诸多问题。 通常情况下,如图1所 阅读全文

posted @ 2018-02-22 16:34 AlanTu 阅读(2419) 评论(0) 推荐(0) 编辑

Linux内核同步 - sleepable RCU的实现
摘要:一、前言 由于曾经在Linux2.6.23上工作了多年,我对这个版本还是非常有感情的(抛开感情因素,本来应该选择longterm的2.6.32版本来分析的,^_^),本文主要就是描述Linux2.6.23内核版本中对RCU有哪些修正。所谓修正主要包括两个部分,一部分是bug fixed,一部分是新增 阅读全文

posted @ 2018-02-13 22:15 AlanTu 阅读(929) 评论(0) 推荐(0) 编辑

Linux内核同步 - RCU synchronize原理分析
摘要:RCU(Read-Copy Update)是Linux内核比较成熟的新型读写锁,具有较高的读写并发性能,常常用在需要互斥的性能关键路径。在kernel中,rcu有tiny rcu和tree rcu两种实现,tiny rcu更加简洁,通常用在小型嵌入式系统中,tree rcu则被广泛使用在了serve 阅读全文

posted @ 2018-02-13 22:12 AlanTu 阅读(2967) 评论(0) 推荐(0) 编辑

Linux内核同步 - classic RCU的实现
摘要:一、前言 无论你愿意或者不愿意,linux kernel的版本总是不断的向前推进,做为一个热衷于专研内核的工程师,最大的痛苦莫过于此:当你熟悉了一个版本的内核之后,内核已经推进到一个新的版本,你曾经熟悉的内容可能会变得陌生(这里主要说的是该模块的内部实现,实际上,内核中的每一个子系统都是会尽量保持接 阅读全文

posted @ 2018-02-13 22:05 AlanTu 阅读(433) 评论(0) 推荐(0) 编辑

Linux内核同步 - RCU基础
摘要:一、前言 关于RCU的文档包括两份,一份讲基本的原理(也就是本文了),一份讲linux kernel中的实现。第二章描述了为何有RCU这种同步机制,特别是在cpu core数目不断递增的今天,一个性能更好的同步机制是如何解决问题的,当然,再好的工具都有其适用场景,本章也给出了RCU的一些应用限制。第 阅读全文

posted @ 2018-02-13 22:04 AlanTu 阅读(361) 评论(0) 推荐(0) 编辑

Linux内核同步 - Seqlock
摘要:一、前言 普通的spin lock对待reader和writer是一视同仁,RW spin lock给reader赋予了更高的优先级,那么有没有让writer优先的锁的机制呢?答案就是seqlock。本文主要描述linux kernel 4.0中的seqlock的机制,首先是seqlock的工作原理 阅读全文

posted @ 2018-02-13 22:01 AlanTu 阅读(458) 评论(0) 推荐(0) 编辑

Linux内核同步 - Read/Write spin lock
摘要:一、为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已。spin lock严格的限制只有一个thread可以进入临界区,但是实际中,有些对共享资源的访问可以严格区分读和写的,这时候,其实多个读 阅读全文

posted @ 2018-02-13 22:00 AlanTu 阅读(379) 评论(0) 推荐(0) 编辑

Linux内核同步 - spin_lock
摘要:一、前言 在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机制,但是现在中断上下文也参和进来,那些可以导致睡眠的lock就不能使用了,这时候,可以考虑使用spi 阅读全文

posted @ 2018-02-13 21:56 AlanTu 阅读(9066) 评论(0) 推荐(1) 编辑

Linux内核同步 - memory barrier
摘要:一、前言 我记得以前上学的时候大家经常说的一个词汇叫做所见即所得,有些编程工具是所见即所得的,给程序员带来极大的方便。对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最后CPU运行的结果呢?很遗憾,不是,我们的“所见”和最后的执行结果隔着: 1、编译器 2、CPU取指 阅读全文

posted @ 2018-02-13 21:54 AlanTu 阅读(449) 评论(0) 推荐(0) 编辑

Linux内核同步 - Per-CPU变量
摘要:一、源由:为何引入Per-CPU变量? 1、lock bus带来的性能问题 在ARM平台上,ARMv6之前,SWP和SWPB指令被用来支持对shared memory的访问: SWP <Rt>, <Rt2>, [<Rn>] Rn中保存了SWP指令要操作的内存地址,通过该指令可以将Rn指定的内存数据加 阅读全文

posted @ 2018-02-13 21:53 AlanTu 阅读(907) 评论(0) 推荐(0) 编辑

Linux内核同步 - 原子操作
摘要:一、源由 我们的程序逻辑经常遇到这样的操作序列: 1、读一个位于memory中的变量的值到寄存器中 2、修改该变量的值(也就是修改寄存器中的值) 3、将寄存器中的数值写回memory中的变量值 如果这个操作序列是串行化的操作(在一个thread中串行执行),那么一切OK,然而,世界总是不能如你所愿。 阅读全文

posted @ 2018-02-13 21:52 AlanTu 阅读(1742) 评论(0) 推荐(0) 编辑

导航