目录

1.内核同步机制的引入

2.并发执行的原因

3.竞争条件

4.临界区

5.并发执行中共享变量V加操作

6.原子操作

7.共享队列和加锁

8.确定保护对象

9.死锁与死锁的避免

10.参考资料与思考题


1.内核同步机制的引入

如果把内核看做不断地对各种请求进行响应的服务器的话,那么正在CPU上执行的进程发出中断请求
的外部设备等相当于客户,正如服务器一直要响应客户的请求一样,内核也随时响应进程中断系统调用
等的请求.我们之所以这么比喻是需要强调内核中的各个任务并不是严格按照顺序依次执行的,而是相互
交错执行的.对于所有的内核任务而言,内核中的很多数据都是共享资源,这就像高速公路供给有很多车辆
行驶一样,对这些共享资源的访问,必须遵守一定的访问规则,否则就会造成对共享资源的破坏,就如同
不遵守交替规则会造成撞车一样.

2.并发执行的原因

1.中断中断几乎可以在任何时刻异步发生,也可能随时打断正在执行的代码;
2.内核抢占当内核具有抢占性的时候,内核中的任务就可能被另一个任务抢占;
3.睡眠在内核中执行的进程可能会睡眠,这将唤醒调度程序导致调度一个新的进程执行;
4.对称多处理器两个或多个处理器可以同时执行代码,这时就可能造成并发,问题是系统中还有没有其他的并发源.

3.竞争条件

竞争条件:
Race Condition.
在并发执行的过程中,会产生竞争,在这里我们就给出竞争的条件.
当以下两个条件同时发生的时候,竞争就发生:
(1)至少两个可执行上下文并行执行:一种是真正的并行,比如说两个系统调用在不同的处理器上执行;另一种是其中一个上下文能够随意地抢占另一个,比如说一个中断抢占系统调用;
(2)可执行上下文对共享变量执行读写操作.问题:
为什么这些竞争条件会导致各种难以调试的错误?竞争条件导致的错误的示例(释放资源的示例):
在大多数情况下,释放资源的函数只释放一次资源,然而在上图所示,
counter的初值为2,A线程将counter的值改成1的时候,B线程抢占了A,
counter的值又被减了一次,减为0,然后B线程就调用释放资源的函数去释放资源,
然后线程A恢复执行,因为此时counter的值为0了,线程A也释放了资源,于是出现
一个资源被释放两次的情况.问题:
如何解决这样的问题?

4.临界区

所谓临界区就是访问或操作共享的代码段,多个内核任务并发访问同一个资源通常是
不安全的,为了避免对临界区进行并发访问,编程者必须保证临界区代码被原子执行,
也就是说代码在执行期间不可以被打断,就如同整个临界区是一个不可分割的指令一样,
如图:
A进程进入临界区以后,B试图进入的时候就被阻塞,只有当A离开临界区以后,B才能
进入.问题:
在释放资源的那个例子中,临界区是什么?如何保护临界区?
1.使得临界区的操作能够原子地进行;
2.进入临界区以后禁止抢占,比如通过中断,禁止下半部分处理,或者禁止线程的抢占等;
3.串行地访问临界区,比如使用自旋锁,互斥锁,只允许一个内核访问临界区.

5.并发执行中共享变量V加操作

多个CPU和内存通过总线互联,在任一时刻,只能有一个总线设备.
比如说CPU或DM控制器访问该从设备,在这个场景中该从设备就是RAM芯片,因此
来自两个CPU上的读内存的操作被串行执行,分别获得同样的旧值,比如说0,
完成修改之后两个CPU都想进行写操作,把修改的值写到内存,但是硬件的(??争抢)限制
使得CPU的写回同样必须是串行化的,因此CPU首先获得了访问权,进行写回的动作,
随后CPU2完成写回动作,在这种情况下CPU1对内存的修改就被CPU2覆盖了,
此时执行结果就是错误的.本来加两次结果应该为2,但这里就成1了.在多处理器的SM系统中,为了提供原子操作,不同的CPU体系结构提供了不同的技术.
例如在x86,当执行加有lock前置位的指令的时候,这个前置位就用于锁定系统总线,
使得前面的错误就不会发生.问题:
在ARM平台上采用什么指令?

6.原子操作

推荐阅读1

推荐阅读2

对于由多个内核任务进行共享的变量,对变量的装载修改和存储必须原子地进行,不能分割.
于是内核提供了一个特殊的类型--原子类型atomic_t.
typedef struct{int counter;
}atomic;

7.共享队列和加锁

当共享资源是一个复杂的数据结构的时候,竞争状态往往会使得数据结构遭到破坏,对于这种情况怎么处理
呢?
锁机制是可以避免禁止状态的.
正如锁和门一样,门后的房间可以想象成一个临界区,在给定时间内,房间里只能有一个内核存在,当一个
任务进入房间以后,它会锁住房门,当它结束对共享数据的操作以后,就会走出房间,打开门锁.
如图A和B试图同时进入房间,当一个任务进去以后,就必须加锁,出来以后打开锁.任何要访问队列的代码首先都要占着相应的锁,这样的话,该锁就能阻塞来自其他内核中的并发访问.
比如说任务1试图锁定队列,那么它成功获得锁之后才能访问队列,若此时也有任务2也要访问共享的
队列,那么可能的情况就如上图.

8.确定保护对象

9.死锁与死锁的避免

10.参考资料与思考题

【linux内核分析与应用-陈莉君】内核同步概述相关推荐

  1. 【linux内核分析与应用-陈莉君】动手实践-编写一个文件系统

    目录  0.一些链接 1.一些数据结构 2.编写一个文件系统的过程 3.用到的一些数据结构及函数的原型 3.1 struct file_system_type-文件系统类型 3.2 register_ ...

  2. 【Linux内核分析与应用-陈莉君老师】动手实践-把虚拟内存转换成物理地址

    目录 1.地址转换 2.Linux4级页表 3.64位线性地址 4.实际观察寻页的过程  1.地址转换 进程中不直接对物理地址直接操作,CPU在运行时指定的地址需要经过内存管理单元MMU 转换后才能访 ...

  3. 【linux内核分析与应用-陈莉君】Linux内存管理机制

    目录                   1.内存层次 2.虚拟内存实现机制 3.进程的虚拟地址空间和地址空间布局 4.如何用数据结构描述进程的用户空间 5.mm_struct 6.vm_area_s ...

  4. 【linux内核分析与应用-陈莉君】进程的一生

    目录 1.进程与线程 2.TASK_STRUCT结构的统一性与多样性 3.进程API的实现 4.do_fork()的代码流程 5.进程的生命周期 1.进程与线程 2.TASK_STRUCT结构的统一性 ...

  5. 《Linux内核完全剖析-基于0.12内核》书评之陈莉君

    <Linux内核完全剖析-基于0.12内核>书评之陈莉君 <Linux内核完全剖析-基于0.12内核>一书出版之后,机械工业出版社编辑希望我就此书抽空写一个书评.在我拿到这本书 ...

  6. Linux Malloc分析-从用户空间到内核空间

    Linux Malloc分析-从用户空间到内核空间 本文介绍malloc的实现及其malloc在进行堆扩展操作,并分析了虚拟地址到物理地址是如何实现映射关系. ordeder原创,原文链接: http ...

  7. Linux Malloc分析-从用户空间到内核空间【转】

    转自:http://blog.csdn.net/ordeder/article/details/41654509 版权声明:本文为博主(http://blog.csdn.net/ordeder)原创文 ...

  8. linux内核调用( )为进程创建虚存区_Linux内核分析-总结篇(九)

    本次内容作为Linux内核的总结内容,主要涉及对Linux系统的总体的一些理解,同时将之前的一些总结贴出来作为大家的一个索引,希望笔者一样的菜鸟有一些帮助和入门的作用.从一个初学者的角度对Linux有 ...

  9. [网易云课堂]Linux内核分析(九)—— 课程总结

    付何山+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000; 导读:本文分为两个部分 ...

  10. 陈莉君: 台湾開源人年会之Linux内核之旅(附演讲PPT及讲解)

    本文转载自"Linux内核之旅"公众号 今年是第一次参加COSCUP 开源人年会,到底与大家分享些什么,与社区大牛BOB沟通后,他建议我就分享自己这20年来的Linux内核之旅. ...

最新文章

  1. tar命令-压缩,解压缩文件
  2. Microbit-高温报警系统
  3. 接口 500_python接口的自我修炼之路
  4. 【软件工程】数据流图初探
  5. 将python中的小数直接进位的函数_python保留小数位的三种实现方法
  6. jinja Whitespace Control
  7. mysql分组取每组前几条记录(排序)
  8. 标准模板库 STL—— set 列传
  9. VS2008内嵌水晶报表翻页BUG修正方法
  10. 学界 | Ian Goodfellow最新论文:是猫还是狗?不光神经网络识别不了,你也能被忽悠...
  11. imagecreatefromjpeg():gd-jpeg:JPEG
  12. python考试题目及答案-python考试题库
  13. std::ifstream实例
  14. RK3568触摸屏驱动调试总结
  15. shell脚本一步完成多层ssh跳转时的文件传输:Multi-layer scp
  16. 基于Java的客户管理系统的设计与实现
  17. 机器学习实战之支持向量机
  18. LeetCode 675. 为高尔夫比赛砍树
  19. 电磁兼容与电路保护技术探析
  20. 违章查询源码 php,全国车辆违章查询数据使用(PHP)

热门文章

  1. 修改服务器bi,修改 FineBI 配置参数
  2. Fedora 9在用VMware 5.5、6.5虚拟机安装和硬盘安装中遇见的几点问题
  3. html基础、h5c3高级c3动画 、 JavaScript初高级、css预处理器和git 部分面试题
  4. Xcel 测试版使用手册
  5. 计算机31进制表,74ls290构成31进制计数器电路图文详解
  6. 同步时序逻辑电路功能分析之同步五进制加法计数器
  7. php ipa 版本定制,自建IOS企业包ipa包 下载服务
  8. 微信小程序接收后台返回的文件流并打开
  9. win10删除多余账户_Win10系统如何删除账户?Win10系统删除账户的方法
  10. 常用单片机模块(四)