持续创作,加速成长!这是我参与「掘金日新计划 · 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
保护临界区总结:
解决同步问题总结:
本文深入Linux内核源码,从核心源码入口讲起,详细对信号量、互斥量的内核代码讲解,其中对P-V操作实现逐行剖析,Linux内核并发控制原理的锁实现和原理在后续文章中一一讲解,本文深入浅出Linux中断控制的实现原理。