linux内核就相当于不断对请求进行响应的服务器,这些请求可能来自CPU,可能来自发出中断的外部设备。我们将内核看作两种请求的侍者。

(1)老板提出请求,侍者如果空闲,为老板服务。(系统调用或异常)

(2)侍者正在无顾客服务时,老板提出请求,则转去为老板服务。(中断异常嵌套)

(3)侍者正为老板服务时,另一老板提出请求,此时转去为另一个老板服务,回头再给这个老板服务。(中断嵌套)

(4)老板可命令老板停止为当前客户服务,侍者完成老板请求之后,可能为新选中的顾客服务。(内核抢占)

内核抢占特点:一个内核态运行的进程,可以被执行内核函数期间被另一个进程取代。有关内核抢占参照本文:内核抢占

同步概念

      临界区是一段代码,进入临界区的内核控制路径必须全部执行这段代码,其他控制路径才能进入临界区。单核cpu可以通过简单的关闭中断、禁止内核抢占来进行保证临界区的互斥访问,多cpu就不行 了。

下列条件不需要同步:

(1)执行中断的内核路径不可能被可延迟或系统调用服务例程内核路径所中断,所以不需要同步;

(2)软中断和tasklet不能再同一个CPU上交替执行,所以仅这两者存在时,不需要同步;

(3)仅被一种tasklet访问的数据结构不需要同步。

同步原语

1.每CPU变量

最重要的同步技术就是把内核变量声明为每CPU变量,每CPU变量主要是数据结构的数组,系统每个CPU对应数组的一个元素。一个CPU不应该访问与其他CPU对应的数组元素。每个CPU可以随意修改自己的元素不用担心出现竞争条件。每CPU变量对来自异步函数(中断和可延迟函数)的访问不提供保护,在这种情况下需要提供另外的同步原语。内核抢占可导致每CPU变量产生竞争条件。

2.原子操作

这样的操作是芯片原子级的,执行这样的指令,中间不能中断,且避免其他的CPU访问同样的内存单元。这种原子操作,通过“锁定”内存总线实现,直到这条指令执行结束为止,其他处理器不能访问该内存单元。原子操作:

atom_read(v),atom_set,atom_add,atom_sub.....

3.优化和内存屏障

     当使用编译器的时候,编译器可能重新安排汇编语言指令以使寄存器以最优的方式执行。当处理同步时,必须避免指令重新排序。可通过设置内存屏障,确保原语之后的操作语句执行之前,原语操作之前的语句已经完成,这样保证汇编语句顺序执行。

4.自旋锁

     自旋锁是用来多处理环境中的一种特殊锁。如果内核路径发现锁是开着的,则可获取锁进入临界区。相反如果内核路径发现锁由另一个CPU上的控制路径所持有,则在周围“旋转”(其实,占着cpu死等,等到为止)。

自旋锁的循环指令表示“忙等”(这种忙等,是nop操作,经过linux优化了,说是节省能源)。注意,在忙等期间,内核抢占有效,就是等待的进程可能被其他进程替代。一般来说,由自旋锁所保护的每个临界区都是禁止内核抢占的。

spinlock_t含有的两个字段:

slock;自旋锁的状态,1表示未加锁

break_lock:表示有无等待该锁的进程

提供的操作:

spin_lock_init();//初始化一把锁

spin_lock();//循环试图获得自旋锁

spin_unlock();//释放锁

spin_unlock_wait();//等待锁

spin_is_locked();//判断锁释是否被持有

5.读写自旋锁

      读写锁是为了增加内核的并发能力。该锁的特点:读者进程可以同时多个进入临界区;写者只能一个进入临界区(有写者的时候,读者无法进入)。读者和写者具有相同的优先权。

读/写自旋锁是一个rwlock_t结构。有read_lock和write_lock。

6.顺序锁

     读/写自旋锁中,读者和写者具有相同的优先权。事实上,可以这样,即使读者在读的时候,也可以让写者继续进行,这种策略,写者永远不会等待。但是,读者需要对所读到的东西检查,检查是否有被某个写者修改,一旦发现被修改,要重新读取。

7.读-拷贝-创新(RCU)

写者要写的时候,拷贝一份出来写,然后拷回去。

8.信号量

信号量其实也是为了实现互斥和同步(无外乎就是一种P/V操作封装)。但是,信号量中的进程一旦发现资源不可用时,就将自己挂起进入睡眠状态,这不是一种忙等。

然后,使用该资源的进程使用结束后,唤醒正在等待的进程,ok,同步完毕。

linux提供两种信号量:(1)内核信号量,由内核控制路径控制;(2)System V IPC信号量,用户态进程使用。

9.信号量

     跟信号量是一样的,但是允许多个读者同时进入设计的,你懂的。

linux内核笔记-内核同步相关推荐

  1. linux内核自旋锁解释,LINUX内核笔记:自旋锁

    目录 1.自旋锁作用与基本使用方法? 与其他锁一样,自旋锁也用于保护临界区,但是自旋锁主要是用于在SMP上保护临界区.在SMP上,自旋锁最多只能被一个可执行线程持有,如果一个线程尝试获得一个被争用的自 ...

  2. Linux内核之内核同步(一)——内核同步基础

    内核同步缘起何处? 提到内核同步,这还要从操作系统的发展说起.操作系统在进程未出现之前,只是单任务在单处理器cpu上运行,只是系统资源利用率低,并不存在进程同步的问题.后来,随着操作系统的发展,多进程 ...

  3. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  4. Linux内核中的同步原语:自旋锁,信号量,互斥锁,读写信号量,顺序锁

    Linux内核中的同步原语 自旋锁,信号量,互斥锁,读写信号量,顺序锁 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. Linux 内核中的同步原 ...

  5. Linux内核笔记006 - 交换分区

    本文转自网络文章,内容均为非盈利,版权归原作者所有. 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除. 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com ...

  6. linux内核earlyprink,内核启动参数机制学习笔记

    前两天把内核关于内核启动参数的一些知识彻底地分析了一遍<Linux内核源码分析--内核启动命令行的传递过程(Linux-3.0 ARMv7)>,发现了一些以前没有注意的细节问题,这里总结如 ...

  7. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)进展同步更新

    本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 目前已经完成稿件. 2015年8月9日,china-pub开始上线预售: http://product.china-pub ...

  8. Linux 0.11内核分析02:系统启动

    目录 1. 内核镜像的构建 1.1 内核源码结构 1.1.1 boot 1.1.2 fs 1.1.3 include 1.1.4 init 1.1.5 kernel 1.1.6 lib 1.1.7 m ...

  9. 开源Linux 3.3内核首次融合Android代码

    最新3.3版本的 Linux 内核中包括一些 Google Android 代码.这对两个开源项目都有所帮助. Linux 内核项目主管李纳斯·托沃兹(Linus Torvalds)昨天公布最新版内核 ...

最新文章

  1. linux nexus能备份吗,nexus 从Window迁移至Linux
  2. A folder failed to be moved——Android SDK的安装问题解决方案
  3. goland远程调试Docker
  4. android光照传感器,详解 android 光线传感器 light sensor的使用
  5. dp线和hdmi区别_HDMI铜线与光纤线有啥区别?为什么铜线传播速度更快?看完涨知识...
  6. HDOJ 杭电1874-畅通工程(Floyd算法)
  7. css链接,列表,表格
  8. [CSS备忘] css3零散
  9. 苹果耳机无线真假测试软件,辨认苹果耳机真假,就这六步。
  10. javaWeb框架开发
  11. android 阅读器字体,Android字体设置及Roboto字体使用方法
  12. 解决IntelliJ IDEA Properties中Unused property提示
  13. 小米手机电池校正_华为小米等安卓福音:超实用手机电池校正 解决电池虚标不耐用!...
  14. RAID0的安装步骤
  15. android语音输入文字,盘点好用的语音输入APP,懒得打字的时候就说话吧!
  16. 【网络运维】小平头PingTow网络IP导入检测工具软件开发源代码分享
  17. Oracle DBA面试突击题
  18. php全选删除文件,一个简单的PHP全选删除数据
  19. Web——P2P应用
  20. 着被拍红的手,咯咯一

热门文章

  1. 比特协议是骗局吗_山寨币也玩收割,“BTG比特黄金”挖矿骗局大揭秘
  2. 在react项目中编写css,更好的在react项目中写css代码--emotion
  3. 智能云媒体服务器,智慧广电媒体解决方案
  4. realloc函_realloc(重新分配内存空间的函数)
  5. mysql分页查询关键_MySQL优化教程之超大分页查询
  6. linux ubuntu安装 mono,在 Ubuntu Server 上安装配置 Mono 生产环境
  7. SSM 整合 2:Java EE 开发环境的搭建(JDK 配置、Tomcat 安装、IDE 安装、IDE 集成 Tomcat、Spring 及其组件的下载)
  8. 5元素升级android6,升级你的app以支持高长宽比的新旗舰
  9. java存储键值结构_java-键值存储为主数据库
  10. com.sec.android.app.smartclipservice,EPR Aerospace News