【精通内核】Linux内核互斥量代码详解与总结

437 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

前言

📫作者简介小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

📫热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长

🏆InfoQ签约作者、CSDN专家博主/后端领域优质创作者/内容合伙人、阿里云专家/签约博主、51CTO专家🏆

🔥如果此文还不错的话,还请👍关注 、点赞 、收藏三连支持👍一下博主~


本文导读

本文深入Linux内核源码,其中对P-V操作实现逐行剖析,Linux内核并发控制原理的锁实现和原理在后续文章中一一讲解,本文深入浅出Linux中断控制的实现原理,从核心源码入口讲起,详细对信号量、互斥量的内核代码讲解。

Linux内核互斥量代码详解

互斥量就是特殊版本的信号量,即 count 为1时的特殊信号量,互斥量就是特殊的信号量

我们可以看到先定义一个struct semaphor 类型定义为 mutex_t的变量

mutex_init 其实传入的type和name都没用,直接是通过初始化信号量为1来代替,mutex_destroy则为初始化信号量-99。

    // 将struct semaphor 类型定义为 mutex_t 
    typedef struct semaphore mutex_t;
    
    // mutex_init 其实传入的type和name都没用,直接是通过初始化信号量为1来代替
    #define mutex_init(lock, type, name)	sema_init(lock,1)
            
    // mutex_destroy则为初始化信号量-99
    #define mutex_destroy(lock)	sema_init(lock,-99)

    // 上锁调用的是信号量的down操作
    #define mutex_lock(lock, num)	down(lock)
    
    // trylock 调用的是down_trylock,这里不再讲解。这里的trylock 就是非阻塞的lock,获取到锁,返回0,否则返回1
    #define mutex_trylock(lock)	(down_trylock(lock)?0:1)
            
    // 解锁直接调用up操作
    #define mutex_unlock(lock)	up(lock)

有上述代码可以看到,上锁调用的是信号量的down操作,trylock 调用的是down_trylock,这里不再讲解。这里的trylock 就是非阻塞的lock,获取到锁,返回0,否则返回1,解锁直接调用up操作

小结

Thread call有Pthread_mutex_init、Pthread_mutex_destroy、Pthread_mutex_lock、Pthread_mutex_trylock、Pthread_mutex_unlock

保护临界区总结:

image.png

解决同步问题总结:

image.png

本文深入Linux内核源码,从核心源码入口讲起,详细对信号量、互斥量的内核代码讲解,其中对P-V操作实现逐行剖析,Linux内核并发控制原理的锁实现和原理在后续文章中一一讲解,本文深入浅出Linux中断控制的实现原理。