
C语言
文章平均质量分 67
mosquitouu
学习学习
展开
-
关于《C陷阱和缺陷》中的(*(void(*)())0)()表达式的一点解析
如《C陷阱和缺陷》书中所说,表达式(*(void(*)())0)()功能主要用于模拟在计算机启动时,作为硬件调用首地址为0的子程序的C语句。 { (* { (void(*)()) } 0) } () 对于第一次看到这个表达式的人,都会有无从下手的感觉。但通过对书中所阐述的解释,终于一点一点理解了这个表达式。 解析如下: 1.指向函数指针的定义为:(type) (*Func...原创 2017-02-22 20:39:36 · 2064 阅读 · 0 评论 -
gcc inline理解
只测试过Ubuntu gcc,其他未测试。 1、inline 函数 在Ubuntu 16.04.2 LTS 上gcc无法编译通过,显示undefined reference to `print',print是定义的 inline函数。 inline在gcc中实际情况是: a.对于同一个文件来说,inline函数相对于extern函数是建议编译器内联展开; b.编译器一定会为该inline原创 2017-06-02 15:32:54 · 1684 阅读 · 1 评论 -
内核信号量--来自深入理解Linux内核
信号量 Linux提供两种信号量: 内核信号量,由内核控制路径使用; System V IPC信号量,由用户态进程使用; 内核信号量 1、内核信号量类似于自旋锁,当锁关闭时,不允许内核控制路径继续前进; 2、当内核控制路径想要获取内核信号量所保护的资源时,若资源被占用,则当前进程被挂起,等待; 3、当资源释放时,选择一个或多个等待该资源的进程唤醒,继续执行; 4、只有可以睡眠的函数才能过获...原创 2019-06-25 08:34:26 · 335 阅读 · 0 评论 -
Linux中的原子访问--来自深入理解Linux内核一书
80x86指令: 进行0次或1次对齐内存访问的汇编指令是原子的;(如short地址必须是2的倍数、int的地址必须是4的倍数等) 读-修改-写之间没有其他处理器占用内存总线,则此序列操作是原子的; 操作码前缀是lock字节(0xf0)的“读-修改-写”汇编语言指令即使在多处理器系统中也是原子的。lock前缀在实际运行过程中,由控制单元检查,并当检查到该前缀时,将“锁定”内存总线,直到指令执行...翻译 2019-06-22 15:20:44 · 233 阅读 · 0 评论 -
gcc内嵌汇编&&结合linux源码分析--来自深入理解Linux内核一书
ASM格式:__asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify); 指令集、输出、输入、修改部分; 例如:linux中atomic64_read函数,如下: static inline long long atomic64_read(const atomic64_t *v) { reg...原创 2019-06-22 15:43:07 · 197 阅读 · 0 评论 -
Linux中spinlock--来自深入理解Linux内核一书
linux spinlock实现分析原创 2019-06-22 23:19:14 · 422 阅读 · 0 评论 -
读写自旋锁--来自深入理解Linux内核一书
linux读写自旋锁实现机制分析原创 2019-06-23 22:12:54 · 786 阅读 · 0 评论 -
RCU--(read--copy--update)--来自深入理解Linux内核
读–拷贝–更新与读–修改–写 读–修改–写需要访问两次存储器,分别为读原值和写新值,在多处理器情况下,对同一个数据结构的此串操作,若不进行同步操作,可会会导致最终结果错误。 RCU 为保护在多数情况下被多个CPU读的数据结构而设计的另一种同步技术。 RCU允许多个读者和写者并发执行,且不使用锁,即不使用被所有CPU共享的锁或计数器,在这一点上与R/W锁或顺序锁相比较,RCU更具有优势。 RCU如何...原创 2019-06-24 08:15:25 · 743 阅读 · 0 评论 -
读/写信号量--来自深入理解Linux内核
读写信号量类似与读写自旋锁,区别是读写信号量再次变为打开之前,等待进程挂起而不是自旋。 结构 并发读信号,写者互斥访问。内核按照严格FIFO顺序处理等待读写信号量的所有进程。如果读者或写者进程发现信号量关闭,这些进程就被插入到信号量等待队列链表的末尾。 ...原创 2019-06-30 16:05:23 · 580 阅读 · 0 评论