Yazar | Kod yazan basketbol topu salağı
Baş Editör | Guo Rui
Linux öğrenirken kesinlikle kilitlerle ilgili her türlü bilgiyle karşılaşacağım Bazen biraz öğrendim ve yarım kova suda kılıçlar hakkında konuşabileceğimi hissediyorum ve aniden yeni bir bilgi noktası beliriyor. Yeni bilgi noktaları için zaman olduğunda, bu da tuhaftır. MCU'nun çıplak metal kodunu üniversitede yazmaya başladım.İşletim sisteminde kilidin ne olduğunu anlamadım.MCU'dan gömülü Linux'a kadar çok görevli bir sistem de var. Anlamayanlar Baidu'ya kontrol etmesini öneriyor.
Eşzamanlılık ve yarış koşulları nelerdir?
İlk Linux çekirdeğinde, nispeten az sayıda eşzamanlı kaynak vardı. Çekirdek simetrik çok işlemcili (SMP) sistemleri desteklemez ve eşzamanlılık sorunlarının tek nedeni kesintilerdir.
İşlemcilerde giderek daha fazla CPU çekirdeği olması, sistemin olaylara hızlı bir şekilde yanıt vermesini gerektirir. Modern donanım ve uygulamaların ihtiyaçlarını karşılamak için Linux çekirdeği, aynı anda daha fazla şeyin yapılabileceği noktaya kadar geliştirilmiştir. Bu evrim, daha fazla ölçeklenebilirlik getirdi. Ancak, bu aynı zamanda çekirdek programlama görevini büyük ölçüde karmaşıklaştırır. Aygıt sürücüsü programcıları artık tasarımlarında eşzamanlılığı en başından dikkate almalı ve eşzamanlılık sorunlarını derinlemesine anlamalı ve bu tür sorunlarla başa çıkmak için çekirdek tarafından sağlanan araçları kullanmalıdır.
Yukarıdakileri bitirdikten sonra konuya girin. Eşzamanlılık, birden fazla yürütme görevinin aynı anda ve paralel olarak yürütüldüğü anlamına gelir; yarış, kelimenin tam anlamıyla rekabet anlamına gelir ve eşzamanlı yürütme birimleri, paylaşılan kaynaklara (donanım kaynakları ve yazılım global değişkenleri, statik değişkenler, vb.) Erişirken yarış koşullarına yatkındır.
Örneğin, bir karakter aygıtının hatası: Bir sanal karakter aygıt sürücüsü için, bir yürütme birimi A'nın ona 300 karakter'a 'yazdığını ve başka bir yürütme birimi B'nin ona 300 karakter' b 'yazdığını ve üçüncüsünün Her yürütme birimi tüm karakterleri okur. A ve B sıralı ve seri olarak çalıştırılırsa, C okunurken hata olmaz, ancak A ve B aynı anda çalıştırılırsa sonuç beklenmedik olur.
Yarış koşulları
Yarış çözümü
Yarış koşulunu çözmenin yolu, paylaşılan kaynaklara özel erişim sağlamaktır. Paylaşılan kaynaklara erişen kod alanı denir Kritik Bölüm Kritik alan karşılıklı dışlama mekanizması ile korunmalıdır. Linux aygıt sürücülerindeki ortak karşılıklı dışlama mekanizmaları aşağıdaki yöntemleri içerir: kesme koruması, atomik işlemler, döndürme kilitleri ve semaforlar.
Çoğu okuyucu, bu senaryonun en iyi şekilde önleneceği konusunda hemfikirdir.
Bu nedenle, spinlock'lar için geçerli olan temel kural, herhangi bir kodun
bir spinlock tutarken atomik olmalıdır. Uyuyamaz; aslında, toservice dışında herhangi bir nedenle işlemciyi bırakamaz
keser (ve bazen o zaman bile).
Yukarıdaki çıkmaza dair derin bir anlayışınız yoksa, bu İngilizce hakkında dikkatlice yorum yapabilirsiniz.
Kilitlenme
Geliştirme sırasında dikkatli olmadığınız zaman kilitlenme sorunu ile karşılaşılabilir SMP sisteminde, bir CPU kilitlendiğinde, tıpkı lastiği delinmiş bir araba gibi çalışmaya devam edebilen başka CPU'lar vardır. Teorik olarak, hala çalışabilir, yani hızlı sürülmezse veya hızlı sürülürse, asılması kolay olacaktır.
Çok süreçli programlama kilitlenmeye neden olur
Aşağıdaki dört durum kilitlenmeye neden olacaktır:
Spesifik kullanım sahnesi daha karmaşık olacaktır ve gerçek duruma göre analiz edilmesi gerekir.
Tek iş parçacığı kilitlenmeye neden oluyor
Tek iş parçacığının neden olduğu kilitlenme genellikle (copy_from_user (), copy_to_ser () ve kmalloc ()) gibi engelleme işlevinin çağrılmasından kaynaklanır. Sistem planlaması, engellemeden sonra gerçekleştirilir ve önceki edinme, programlama işlemi sırasında çağrılabilir. Kilidin işlevi, bu kaçınılmaz olarak kilitlenmeye yol açacaktır.
Diğeri ise, döndürme kilidi işlevinin, kilidi serbest bırakmadan aynı döndürme kilidi için geçerli olmasıdır Bu tür düşük seviyeli sorunlar, döndürme kilidine de neden olabilir.
Muteksler, döndürme kilitleri ve semaforlar arasındaki fark nedir?
Mutex ve mutex benim anlayışıma göre aynıdır ve farklı adlandırılırlar.
Genel olarak konuşursak, karşılıklı dışlamayı başaran tüm senkronizasyon mekanizmalarına değer olabilir. Dar anlamda, muteksin belirli ikili kilit mekanizmasına atıfta bulunur. Karşılıklı dışlama kilitlerinin rolü karşılıklı dışlamadır, kritik bölümü (kritik bölüm) korumak için karşılıklı dışlama kullanılır. Sözde kritik bölüm, kodun bir bölümüdür.İki iş parçacığı aynı anda çalışırsa, sorunlar olabilir, bu nedenle korumak için karşılıklı dışlama kilitlerine ihtiyaç vardır.
Semafor Daha gelişmiş bir senkronizasyon mekanizmasıdır, mutex (karşılıklı dışlama kilidi) öyle diyebilirsin semafor (semafor) Değerin yalnızca 0/1 olduğu özel bir durum. Semafor, yalnızca iş parçacıkları arasında karşılıklı dışlama değil, daha karmaşık senkronizasyon elde etmek için daha fazla değer alanına sahip olabilir.
Döndürme kilidi Bir Mutex Bunu başarmanın yolu bu, genel muteks kilidi ile karşılaştırıldığında, bekleme süresi boyunca cpu'yu bırakacak. Spinlock Cpu her zaman meşgul olacak şekilde sürekli olarak döngüye girer ve kilidin durumunu test eder. Döndürme kilitleri ve semaforlara kıyasla, kilit uygulaması başarısız olursa, döndürme kilidi sorgulamaya devam edecek, uygulama iş parçacığı uykuya geçmeyecek, semafor ve muteks kilit uygulaması başarısız olursa, iş parçacığı uykuya geçecektir. Serbest bırakıldıktan sonra uyku ipliği uyanacaktır.
Senkronizasyon kilidi Özel bir şey yok gibi görünüyor, tüm senkronizasyon kilitlerinin semaforlar gibi senkronizasyon kilitleri olarak adlandırılabileceğini anlayabilirsiniz. Son olarak, bu isimlerin boynuzlarına girmeyin, bu şeylerin arkasındaki prensipleri anlamak daha önemlidir, isimler hakkında söylenecek bir şey yoktur. Bunlar farklı dillerde ve platformlarda farklı adlandırılabilir, ama aslında özü budur.
Yarış koşullarından kaynaklanan sorunlar nasıl çözülür?
Yukarıda yarış koşullarının nedenlerini, olanları ve çözümlerini inceledik.Aşağıda ortak çözümleri tek tek analiz ediyoruz.
Maskeyi kes
Yani, tek bir CPU'da yarış koşullarından kaçınmanın basit bir yolu, kritik bölüme girmeden önce sistem kesintisini korumaktır. Linux'un asenkron I / O, süreç zamanlaması ve diğer pek çok şey kesintilere dayandığından, kritik bölümdeki kodu mümkün olan en kısa sürede çalıştırmalıyız, yani kritik bölümdeki kod mümkün olduğunca küçük olmalıdır.
Linux çekirdeği aşağıdaki özel yöntemleri sağlar:
Local_irq_disable (); // Kalkan kesintisi Local_irq_enable (); // Kesmeyi aç Local_irq_save (flags); // Kesintileri yasaklayın ve mevcut cpu kesinti bit bilgilerini kaydedinAtomik işlem
Atomik işlemler, yürütme sırasında başka bir kod tarafından kesintiye uğratılmayacak işlemleri ifade eder.
Linux çekirdeği, çekirdekte atomik işlemleri gerçekleştirmek için bir dizi işlev sağlar.Bu işlemler, biri tamsayı atomik işlemler ve diğeri bit atomik işlemler olmak üzere iki türe ayrılır ve bunların tümü temel CPU'nun atomik işlemlerinin uygulanmasına dayanır. Bu işlevler, CPU mimarisiyle yakından ilgilidir.
1. Tamsayı atomik işlemler
2. Bit atomik işlem
Döndürme kilidi
Döndürme kilitleri, kritik kaynaklara karşılıklı olarak münhasır erişimin bir yoludur.
Döndürme kilidini elde etmek için, belirli bir CPU üzerinde çalışan kodun önce atomik bir işlemi gerçekleştirmesi gerekir.Bu işlem, belirli bir bellek değişkenini test eder ve ayarlar.Atomik bir işlem olduğu için, diğer yürütme birimlerinin işlem tamamlanmadan bu belleğe erişmesi imkansızdır. Değişken. Test sonucu serbest olduğunu gösterirse, program döndürme kilidini alır ve çalışmaya devam eder. Test sonucu kilidin hala meşgul olduğunu gösterirse, program bu "test ve ayarla" işlemini küçük bir döngüde tekrarlayacaktır, bu sözde Meslekten olmayanın terimleriyle "dönüş", "yerinde döndürmektir".
Linux çekirdeğindeki döndürme kilitleriyle ilgili ana işlemler şunlardır:
Kritik bölüm kodunu çalıştırdığımızda kesintiye uğramadığımızdan emin olmak için bizi etkileyen döndürme kilidi aşağıdaki içeriğe sahiptir.
Kullanım önlemleri:
Okuma-yazma döndürme kilidi
Döndürme kilidinde birden çok birimin eşzamanlı okuma işlemine izin verilememesi sorununu çözmek için, eşzamanlı yazma işlemlerine izin vermeyen, ancak eşzamanlı okuma işlemlerine izin veren bir okuma-yazma döndürme kilidi türetilir.
Linux çekirdeğindeki döndürme kilitlerini okuma ve yazma ile ilgili ana işlemler şunlardır:
Sıra kilidi
Sıralı kilit, okuma-yazma kilidinin bir optimizasyonudur Sıralı kilit kullanılırsa, yazma yürütme birimi, yazma yürütme biriminin tamamlanmasını beklemeden sıra kilidi tarafından korunan paylaşılan kaynağa yazdığında okuma yürütme birimi okumaya devam edebilir. Yürütme biriminin, okuma yürütme biriminin yazma işlemini tamamlamasını beklemesi gerekmez.
Sıra kilidi tarafından korunan paylaşılan kaynak bir işaretçi içermez, çünkü işaretçi yazma yürütme biriminde geçersiz kılınabilir, ancak okuma yürütme birimi bu zamanda işaretçiye erişirse, hata yapacaktır.
Linux çekirdeğindeki sıralı kilitlerle ilgili ana işlemler şunlardır:
RCU (okuma-kopyalama-güncelleme)
RCU, okuma-yazma kilidinin yüksek performanslı bir versiyonu olarak kabul edilebilir.Okuma-yazma kilidiyle karşılaştırıldığında, RCU'nun avantajı, çoklu okuma yürütme birimlerinin aynı anda korunan verilere erişmesine izin vermesi ve aynı anda birden çok okuma yürütme birimi ve birden çok yazma yürütme birimine izin vermesidir. Korunan verilere erişim.
RCU okuma-yazma kilidini değiştiremez.
Linux çekirdeğindeki RCU ile ilgili ana işlemler şunlardır:
RCU'da daha birçok işlem var, İnternet'e başvurabilirsiniz.
sinyal
Semaforlar tarafından kritik bölgeleri korumak için kullanılan yaygın yöntem, döndürme kilitlerine benzer, ancak fark, semafor elde edilemediğinde, işlemin yerinde dönmeyeceği, ancak uyku bekleme durumuna girmesidir.
Linux çekirdeğindeki semaforlarla ilgili işlemler esas olarak şunları içerir:
Not: Semafor başlangıçta 0 olduğunda, senkronizasyon için kullanılabilir.
Senkronizasyon için tamamlama
Yani, Linux'taki senkronizasyon mekanizması. Linux çekirdeğinde Tamamlama ile ilgili işlemler esas olarak şunları içerir:
Semafor oku ve yaz
Döndürme kilitleri ile okuma-yazma döndürme kilitleri arasındaki ilişkiye benzer şekilde, Linux çekirdeğindeki semaforları okuma ve yazma ile ilgili işlemler esas olarak şunları içerir:
Mutex
Karşılıklı dışlama işlemlerini gerçekleştirmek için kullanılan Linux çekirdeğindeki muteks ile ilgili ana işlemler şunlardır:
Yazar: Bir basketbol fanatiği için kod yazma, gömülü basketbol gibi gömülü basketbol geliştirmede on yıldan fazla deneyim, STC51 mikro denetleyicisi, AVR, STM32'nin başlangıcından mevcut ARM'e, başından günümüze çıplak metal gömülü Linux ve Android'e kadar Sistem, birçok proje yaptım ve birçok büyük ve küçük çukurlara adım attım.Teknoloji alışverişi yapmak ve birlikte gelişmek ve ilerlemek için daha fazla yerleşik arkadaşla tanışmayı umuyorum.
Feragatname: Bu makale yazar tarafından sunulmuştur ve telif hakkı kendisine aittir. Kapak resmi haricinde, makaledeki tüm resimler orijinal yazar tarafından yayınlanmıştır ve CSDN bunun için herhangi bir sorumluluk kabul etmez.