Linux内核34-读/写信号量

简介: Linux内核34-读/写信号量

每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。


1 读/写信号量的工作原理


读/写信号量和读/写自旋锁类似,不同的地方是进程在等待读/写信号量的时候处于挂起状态,而在等待读/写自旋锁的时候是处于忙等待,也就是自旋的状态中。

那也就是说,读/写信号量同读/写自旋锁一样,对于读操作,多个内核控制路径可以并发请求一个读写信号量;而对于写操作,每个内核控制路径必须独占访问受保护的资源。因此,对于读/写信号量来说,写操作的时候,既不可以进行读操作,也不可以进行写操作。读/写信号量提高了内核中的并发数量,也同时提高了系统的整体性能。

内核严格按照先进先出(FIFO)的原则处理等待读/写信号量的进程。读进程或者写进程一旦请求信号量失败,就被写到信号量等待队列的队尾。当信号量被释放后,队列中的第一个进程先被执行,因为它先被唤醒。如果唤醒的是一个写进程,那么队列中其它进程继续休眠。如果唤醒的是一个读进程,写进程之前的所有读进程都会被唤醒获得信号量;但是写进程之后的读进程继续休眠。


2 读/写信号量的数据结构


读/写信号量使用数据结构rw_semaphore表示,其成员为:

  • count
    一个32位的整形数,被分割成两个16位的计数器。高16位的计数器以2的补码形式表示非等待写进程和等待内核控制路径的数量,低16位表示非等待读进程和非等待写进程的总数。
  • wait_list
    等待进程的列表。每个元素是一个rwsem_waiter数据结构,包含指向休眠进程描述符的指针和一个标志,这个标志表明进程申请信号量是要读取还是写入。
  • wait_lock
  • 自旋锁,用来保护等待队列和rw_semaphore数据结构。


3 读/写信号量的有关API


初始化函数为 init_rwsem(),用其可以初始化一个rw_semaphore数据结构,将count设为0,wait_lock自旋锁设为未使用,wait_list设为空列表。

down_read()down_write()函数分别用来请求读信号量和写信号量。同理,up_read()up_write()函数分别用来释放读信号量和写信号量。down_read_trylock()down_write_trylock()函数分别与down_read()down_write()函数类似,只是当信号量忙的时候不会阻塞进程。最后,还有一个重要的函数,downgrade_write(),用于写进程使用完写信号量之后,自动将其转换成一个读信号量。这些函数的实现与普通信号量的实现极其类似,所以,在此,我们就不再详细描述其实现过程了。

相关文章
|
12天前
|
安全 Linux 编译器
探索Linux内核的奥秘:从零构建操作系统####
本文旨在通过深入浅出的方式,带领读者踏上一段从零开始构建简化版Linux操作系统的旅程。我们将避开复杂的技术细节,以通俗易懂的语言,逐步揭开Linux内核的神秘面纱,探讨其工作原理、核心组件及如何通过实践加深理解。这既是一次对操作系统原理的深刻洞察,也是一场激发创新思维与实践能力的冒险。 ####
|
1天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
15 4
|
2天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
5天前
|
缓存 Linux
揭秘Linux内核:探索CPU拓扑结构
【10月更文挑战第26天】
19 1
|
5天前
|
缓存 运维 Linux
深入探索Linux内核:CPU拓扑结构探测
【10月更文挑战第18天】在现代计算机系统中,CPU的拓扑结构对性能优化和资源管理至关重要。了解CPU的核心、线程、NUMA节点等信息,可以帮助开发者和系统管理员更好地调优应用程序和系统配置。本文将深入探讨如何在Linux内核中探测CPU拓扑结构,介绍相关工具和方法。
8 0
|
14天前
|
网络协议 Linux 调度
深入探索Linux操作系统的心脏:内核与系统调用####
本文旨在揭开Linux操作系统中最为核心的部分——内核与系统调用的神秘面纱,通过生动形象的语言和比喻,让读者仿佛踏上了一段奇妙的旅程,从宏观到微观,逐步深入了解这两个关键组件如何协同工作,支撑起整个操作系统的运行。不同于传统的技术解析,本文将以故事化的方式,带领读者领略Linux内核的精妙设计与系统调用的魅力所在,即便是对技术细节不甚了解的读者也能轻松享受这次知识之旅。 ####
|
11天前
|
缓存 算法 安全
深入理解Linux操作系统的心脏:内核与系统调用####
【10月更文挑战第20天】 本文将带你探索Linux操作系统的核心——其强大的内核和高效的系统调用机制。通过深入浅出的解释,我们将揭示这些技术是如何协同工作以支撑起整个系统的运行,同时也会触及一些常见的误解和背后的哲学思想。无论你是开发者、系统管理员还是普通用户,了解这些基础知识都将有助于你更好地利用Linux的强大功能。 ####
21 1
|
11天前
|
缓存 编解码 监控
深入探索Linux内核调度机制的奥秘###
【10月更文挑战第19天】 本文旨在以通俗易懂的语言,深入浅出地剖析Linux操作系统内核中的进程调度机制,揭示其背后的设计哲学与实现策略。我们将从基础概念入手,逐步揭开Linux调度策略的神秘面纱,探讨其如何高效、公平地管理系统资源,以及这些机制对系统性能和用户体验的影响。通过本文,您将获得关于Linux调度机制的全新视角,理解其在日常计算中扮演的关键角色。 ###
36 1
|
19天前
|
网络协议 Linux 芯片
Linux 内核 6.11 RC6 发布!
【10月更文挑战第12天】
86 0
Linux 内核 6.11 RC6 发布!
|
2天前
|
缓存 算法 Linux
Linux内核中的内存管理机制深度剖析####
【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
6 0