Linux 中断和内存同步

  1. 中断和中断处理.
    • 中断: 由于处理器和外设速度上的差异, 在两者协同工作时, 让硬件在需要时再向内核发出信号.
      • 特殊的电信号, 处理器接收到后, 交予OS来处理.
      • 随时可以发生.
      • 特定的中断与特定的设备相关联, 且内核知道这些信息.
      • 异常是同步中断, 产生时必须考虑与CPU 时钟同步.
    • 中断处理程序.
      • 特定的类型声明的C函数.
      • 上半部与下半部. 既要快速运行,又要完成尽可能多的工作量
        • 上半部: 在所有中断被禁止时, 只做严格优先的工作.
        • 下半部: 能被允许稍后完成的工作.
    • 使用中断的设备, 其相应的驱动程序需要注册中断处理程序.
      • 当一个中断处理程序在执行时,相应的中断线在所有处理器上都被屏蔽掉. 所以不会重入.
    • 中断上下文.
      • 由于没有后备进程, 所以不可以睡眠, 同时也不能调用可能睡眠的函数.
  • 内核同步方法
    1. 原子操作.
      • 两个原子操作不可能并发地访问同一变量.
    • 自旋锁.
      • 在短时间内进行轻量级加锁.
      • 线程在等待它重新可用时自旋, 这点特别浪费CPU时间, 所以自旋锁不应该被长时间持有.
      • 需要禁止本地中断, 来防止中断自旋.
      • 锁的是数据而不是代码, 保护的是临界区中的数据.
    • 读写自旋锁
      • 对数据的操作可以划分为读/写或消费者/生产者类别时.
      • 不能把读锁升级为写锁.
        • 语句:read_lock; write_lock.
          • 会导致死锁: 写锁不断自旋,等到读锁被释放,包括自己.
        • 当需要写操作时, 要在一开始就直接申请写锁.
      • 即使一个线程递归地获得同一读锁也是安全的.
      • 照顾读的锁.
        • 当读锁被持有时, 写操作为了互斥只能等待.
        • 多个读者很容易造成写者饥饿.
    • 信号量.
      • 睡眠锁, 会导致两次上下文切换.
      • 由于可能会睡眠, 需要维护等待队列以及唤醒的开销. 它只适合于锁会被长时间持有的情况.
      • 持有信号量时可以睡眠, 而自旋锁是不允许睡眠的.
      • 由于锁被争用时会睡眠, 所以只能在进程上下文中获取信号量. 因为在中断上下文种不能进行调度.
      • 持有信号量的代码可以被抢占.
      • 信号量可以同时允许任意数量的锁持有者.
        • 互斥信号量(只允许一个持有者), 计数信号量(>1).
      • 两个原子操作 P,V. down/up.
    • 读写信号量. 都是互斥信号量. 只对写者互斥.
      • downgrade_write: 将写锁降级为读锁.
    • 互斥体.
      • mutex. 更简单的睡眠锁.
      • 更多的限制: 在同一上下文上锁和解锁. 不允许递归地上锁和解锁. 当持有一个mutex时,进程不能退出.
      • 首选互斥体, 当不满足其某个限制时, 再选择信号量.
      • 中断上下文中只能使用自旋锁, 而在任务睡眠时只能使用互斥体.
    • 完成变量.
      • 简单的信号量的替代.
      • 过程: wait_for_completion + complete
    • 顺序锁.
      • 用于读写共享数据, 如序列计数器.
      • 锁的初值为0, 写锁使值变为奇数, 释放时变为偶数.
      • 在读取数据的前后, 序列号都会被读取, 若相同, 则说明读没有被写打断过, 或者读取值为偶数时, 也没有发生过写操作.
      • 对写者更有利: 只要没有写者, 就能获得写锁.
    • 禁止抢占.
      • 如果一个自旋锁被持有, 内核便不能进行抢占. 这是为了保持内核的抢占安全.
      • 抢占计数器 = 被持有锁的数量(preempt_enable的次数) - preempt_disable的调用次数.
    • 顺序和屏障.
      • CPU为了优化其传输管道,打乱了分配和提交指令的顺序.
      • 屏障: 指示编译器不要对给定点周围的指令序列进行重新排序.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1 临界区 1.1简介 在早期计算机系统中,只有一个任务进程在执行,并不存在资源的共享与竞争。随着技术和需求的飞速...
    Fly晴天里Fly阅读 9,007评论 2 13
  • 在Linux内核中,有很多同步机制。比较经典的有原子操作、spin_lock(忙等待的锁)、mutex(互斥锁)、...
    扎Zn了老Fe阅读 5,016评论 0 5
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,690评论 0 11
  • 引用自多线程编程指南应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题。两个线程同时修改同一资源有...
    Mitchell阅读 1,973评论 1 7
  • 春天到了,万物复苏,又到了荷尔蒙乱作祟的季节。。。 说人话! 春天到了,万物复苏,又到了适合恋爱的季节! 今天,小...
    酷听听书阅读 626评论 0 0