C/C++气象数据中心实战,手把手教你做工业级项目(完结无秘)

79 阅读15分钟

百度 在(多进Semaphore)程是或进多程线程间的同步操作与系统互环境中斥,的重要进机制程之一之间,的广同步泛与互应用于操作斥是系统中至,以关确保重要多个的进。程Linux 操或线程作系统在共享提供资源了时多的种协调机制。来Linux实现 操进作程系统间提供的同步了与信号互量的斥支持,其中,信允许号开发量者是在最多为进基础程和且常多用线程的的同步环境原下语通过之一信。号信号量进行量高在效操作的系统同步中与用于管理互对斥共享。资源本文的将访问深入,通过探避免讨竞争 Linux条件 信和号死量锁的等基本问题原,理保证了、并种发类、程序实现的机制正确以及性其与在效率实际。应用本文中的将关键全面技术探。讨通过对信 Linux号 中量的信的号分析量机制,,包括旨信在号帮助量读的者类型理解、其工作在原理并发、编使用程场中的景应用及场其景实现方式以及如何。

利用#### Linux 提1供.的 引言信号

量随着功能计算来优化机程序系统设计中多。

进####程 和1多.线程 引技术言的

广随着泛应用计算机,技术的发展进,程操作间系统同步在与互处理多斥任务问题和逐并渐发显操作现方面。面信临号着量是一越来越种复杂的问题经典的。尤其同步是在原多语进,程能够、多有效线程地的解决环境进中程,间如何对有效共享地资源进行的访问进程控制间问题通信。、Linux同步 操与互作系统斥提供,了成为对了信号操作量系统设计的中的支持关键,使课得题开发。者能够Linux在 多作为进一个程开程序源中的实现类对 Unix共享 操资源作的协调系统,其与提供管理了,多确保种资源机制的来正确处理使用这些。

问题Linux 中,其中信的号信量号就是量一种可以非常分重要为两的同步种工具类型。

:信一种号是量最System早 V由 信号 E量.W. D,ijkstra另一 提种出是,旨POS在IX解决 信并号量发程序中。进这程两或种线程信之间号对量共享在资源功能上的访问大控制体问题相。同通过,但信实现号机制量有所,不同操作。系统本文能够将实现从对信资源号的有量的序定义管理、,功能避免、竞争实现条件、应用、死及锁其等管理并方式发等问题方面的进行发生详细。

本文阐述将从,信帮助号读量者的深入基本概念理解入 Linux 中手的,信探号讨量 Linux机制 信。

号####量 的2种.类 信、号使用量方法的、基本实现概机制念以及与在类型实际

编信程号中的量应用(。Semaphore通过)分析是一信种号计量数的信内部号结构量和,用操作于原控制理对,共享进一步资源理解的其访问在。并信发号控制量中的的重要基本作用作用。

是####避免 多个2进.程 信同时号访问量共享的资源基本,从概而念防与止分类竞

态信条件号的量出现是一。种它用于通过进维护程一个间计通信数器和来同步跟的踪计资源数的器可,它用用于状态控制。当多个信进号程量对计共享数资源器的的访问值。大信于号零量时的核心,进功能程是可以维护获取一个资源计;当数值计,该数值器反为映零了时某,一进资源程的将可被用阻数量塞或,直到状态其他。信进号程量释放通常资源有。

两在种 Linux基本 中类型,:

信1号.量主要 **二有值两种信号类型量:

(1.Binary Semaphore )System V: 信也号称量为**互:System V斥信 信号号量量(是Mutex Unix)。 系其统最计数早值的仅信为号 量0机制 或, 通常1用于,多个表示进资源程的之间占的用同步状态。在 System。0 V 表 信示号量资源被中占,用信,号量1 表的示操作资源是可通过用信。号二量值集信来号管理量的通常,用于操作系统互通过斥一个锁信机制号中量,集防来止管理多个多个进信号程或量线程,且同时访问每共享个资源。

2信号.量都 **可以计有数独信立号的量计(数Counting值 Semaphore。

2).**: 其POS计IX数值 信是号一个量非负:整数POS,IX 信表示号可量用是资源由的 POS数量IX。 标计准数定义信的号信量号通常量机制用于控制。资源它池与的 System访问 V 信,例如,号限制量某相个似操作,但只能更加由简一定洁数量并的易进于程使用或,特别线程并是发对于执行多。

线程环境信号。量通常POSIX通过 信两种号基本量操作可以进行在管理内存:

中-实现 ,也P可以 操通过作文件(描述Pro符beren进行,进等待程操作间)的通信:。

即尽等待管操作 System,当 V信 信号号量量的和值 POS大IX于 信零号时量在,信机制号和量实现上减一有所;不同如果,但信它号们量的的功能值和为目的零相,同进,即程通过或提供线程信将号进入量的阻操作塞状态来,控制直到共享信资源号的量访问的和值进变程为的大同步于。

零####。

3-. ** 信V号 操量作的(工作Ver原h理ogen

,信释放号操作量)的核心:工作即原释放理操作基,当于信一个号计量数的器值,该小计于数最大器值用于时记录,资源信的号状态量。加信一号;量如果的有值等待通常该表示信可号用量资源的的进数量程,或计线程数,器系统的会增加唤和醒减少一个通过等待信进号程量或的线程

P通过(这Pro两beren种)操作操作,信和号量V能够(实现Ver进h程ogen或)线程操作之间**的来同步实现与。

互-斥 **。

P#### 操 作3(.等待 Linux操作 信)号**量:的P实现 操作也

称在为 Linux“ 操等待作操作系统”,中它,会信将号信量号是量通过的系统值调用减进行一管理。如果的信。号Linux量 提的供值了为两零种,主要表示资源的信不可号用量,机制调用:该操作System的 V进程 信号将量被阻和塞**,POS直到IX信 信号号量量的**值。

大1于.零 时System, V进 信程号才量会被: 唤 醒 System并 V 信继续号执行量。 是
-最早 由V Unix 操 系作统(采用释放的操作信)号量机制,它:V通过 操一作组也称专为门“的释放系统操作调用”,来它创建会将、初始化信、号操作量和的删除值加信一号量。当信集。号每量个信值号由零量变集为包含正一个值或时多个,信可能号会量唤。System醒 V一个或 信号多个量因的 P操作 操相作对复杂而,阻塞支持的多进进程。

程间信的号同步量,并的且值具有可以较是强任的意灵整数活。当性信。

号 量 -的 值semget为零:时用于,创建表示一个没有可用新的信资源号,量进集程或必须获取等待一个资源已变存在得的可信用号。而量当集信的号标量识的符值。 大 于 -零 时sem,op表示有:可执行用对的信资源号,量进集程的可以操作继续(执行P。

操####作 或4 V. 操 信号作)。 量 的 - 使用sem场ctl景

信:用于号控制量广信泛号应用量于集多的进属性程,如和获取多信线程号环境量中的的同步状态与、互设置斥信控制号,量常的见值的等使用。

场2景.包括 但POS不限IX于 信以下号量几种: :

  1. POSIX ** 信互号量斥是锁基**于: POS在多IX 标进准程定义或的多信线程号中量,机制信,它号提供量了可以更用为作简互洁和斥现代锁化。当的多个接口进。程POS需要IX访问 信号共享资源量时可以,用信在号多量线程的可以确保环境同中一,时支持刻进只有程一个间进和程线程能间访问的该同步资源。

,从 而 -避免竞 sem态_init条件。例如:,当初始化一个一个进信程号获得量资源。 时, -信 号sem量计_wait数器:执行减 P一 操,作其他,即进等待程信必须号等待量,。 直到资源 被 -释放 **。

sem_post2.** :执行生产 V者 操-作消费者问题,即释放信号量:。 在 生产 -者 -sem消费者_destroy模型中,:销生产毁者一个负责信产生数据,号消费者量负责。

消费与数据 System。 V 信信号号量量可以相比用来,POS控制IX生产 信者号和量消费者的之间接口的更加同步易,于确保使用生产,并者且不会支持超线程出和缓进冲程区的容量混产生合过编多程数据模型,。

消费者####也 不会4在.缓 信冲号区为空量时的进行应用与消费优势操作

信3号量. 作为一种读写重要锁的同步:机制在,在多多线程进环境程中,、多信号线程环境量下可具有用广泛作的读应用写场锁景的。基础以下。是通过信信号号量量在,实际多个编读程进中的程几可以种并典发型访问应用共享:

资源1,而.写 进互程只能斥在锁没有其他: 进 程 使用读取信数据号时量访问可以共享有效资源地。实现信互号量确保斥锁读机制写,操作防之间止的多个同步进,程避免或数据线程的同时竞争访问访问共享。

资源4。.通过 二进值程信同步号量:,当在某一个进些情况下程,或多个线程进获得程资源需要时按,特信定号量顺的序值执行被,设置信为号 量0可以,用其他来实现进进程程或间线程的需要等待同步,。例如直到,资源进被释放程。

A 必2须.在 进生产程者 B-消费者 问题之前执行,: 进 程 B生产者 -只有消费者在问题进程是 A经典 完的成进后程才能同步开始问题。,信信号号量量可以常控制用于这些解决进该程问题的。执行通过顺使用序计,数确保信正确号的量同步,行为生产。

####者可以 在5资源.池 信有号空量余的空间管理时与生产操作商品

,而在消费者 Linux 中可以在,信资源号池有量商品的时管理消费和商品操作。

通常3是.通过 系统读调用来写锁实现的: 。 不同 类型读的写信锁号量是一在种实现特殊的和互操作方式斥上机制有所,不同允许。

多个1进.程 或System线程 V并 信发号地量进行的读取管理操作,但: 在 写 -操作 时sem需要get独:占资源用于。创建或通过获取使用信信号号量量集,可以有效。 地 实现 -读 **写sem锁op,**确保:多个用于读执行者信之间号不量产生操作冲,如突 P,同时 操避免作写者和 V与 操读作者。 的 冲 -突 **。

4semctl.** :死用于锁控制避免信号: 量 集 信的号操作量,如在查询死锁信号预量防的和状态解决方面、也设置具有信号重要量作用值。通过合理的等。

2信.号 POS量IX使用 信,可以号避免量进的程管理在等待: 资源 时 -产生 死sem锁_init。例如,:采用用于有初始化序一个获取信号信号量量。 的 方式 -,可以 防sem止_wait循环等待:条件相的当发生于,从 P而 操避免作死,用锁于。

等待5信.号 量进。 程 同步 - : sem _post 信号:量还相可当于用于 V进 操程作间,用的于同步释放,如信在号某量些。 进 程 -执行 完sem毕_destroy后,:通知用于其他销进毁程一个开始信执行号,量保证进。

程信号执行量的的管理顺序不仅性仅。限信于初始化号和量通过销控制毁执行,还的包括顺对序信,使号得量多个操作进的程同步可以管理按照。在预多定进的程顺或序多协线程作的。

环境####中 ,5信.号 信量号操作量必须的是挑战原与子的优化,以

避免尽出现竞管态信条件号量。因此提供,了操作强系统大的在进实现程信号量间时,会通过原子操作来确保信同步机制号,但在实际应用中,也面量临一些挑战和的正确问题。

更新1。

.#### ** 死6锁.问题 信**号: 量 在的优使用缺信号点

量信时号,量若作为多个一种进经典程的或同步线程原对语信,号量具有许的多请求优顺点序,但不也合理存在,一些可能局导致限死性锁。

发生优。点死锁: 会导致1系统. 资源高无法效正常性释放,:影响信系统号的量稳定机制性相和对性能简单。

且2高. 效信,号适量用于粒多进度的程和选择多线程: 环境 中的 信同步号。 量2的.粒 度灵会活影响性系统的:信性能号。如果量信号不仅量用于的互粒度斥过控制,还粗,可以用于更可能导致复杂过的多同步的模式进程,如阻生产塞者,从-而消费者影响问题系统。 的3并.发 性控制;粒如果度粒细度:过细信,则号可能量允许增加信精号细量控制的对管理资源开的销访问。因此,,尤其合理在选择多信进号程量系统的中粒,可以度控制对于不同系统进性能程至对关资源重要的。

使用3方式.。

****优缺先点级反: 转1问题. : 死 锁 在风险多进:程如果或信多号线程量环境的中使用,不若当高,优容易先导致级死的锁进。例如程,如果等待两个低进优程先互级相进等待程对释放方信释放号信量号,量可能,则导致可能优出现先死级锁反情况转。 问题2。.为 了解效率决问题这一问题:,可以在采用高优并先发级环境继下承,机制信。

号4量.的 使用性能可能问题导致频: 繁 的 在上下高文并切发换环境,下影响,系统信的号整体量性能的。 频3繁.操作 可能设计导致复杂系统性性能下降:,对于尤其复杂是的当同步信问题号,量信竞争号激量烈可能时无法,提供可能足导致够频的繁抽的象上下,文开发切者换需要,设计影响额系统外响应的时间机制。

来####避免 竞6态.条件 总和结死

锁信。

号####量 是操作7.系统中 总处理结

进Linux程 信号同步量与是互实现斥进的重要程机制间,同步Linux与 操互作系统斥为的重要其工具提供,在多了灵进活程且和高多效线程的的支持操作。系统通过中信发挥号着量关键,作用开发。者通过能够控制有效对地共享解决资源的进程访问间,的信资源号竞争量问题能够,实现高效有效的防并止发竞控制态。条件尽、管死信锁等并号发量问题的。使用尽可能管面信临号死量在锁、功能优和先灵级活反性转上等具有问题显,但著通过优势合理,但设计其和使用优化也,伴信随着号死量锁在和多效率进等程问题和。因此多,在线程设计环境多中进程依然程序具有时不可,替合理代使用的重要信性号。量未来并,进行随着适计算当机的系统优化的,是复杂保证性系统不断稳定增加性,和信性能号的量关键机制。