AMRv8 mimarisindeki A64 için, özel işlemleri desteklemek üzere aşağıdaki özel talimatlar sağlanmıştır.
Öyleyse neden kol özel talimatı ekliyor? Bu, esas olarak çok çekirdekli durumda kilit rekabeti sorununu çözmek içindir.
Yazılım düzeyinde, paylaşılan kaynaklara erişim için bir kilit ayarlanır. Yalnızca kilidi alabilen programlar paylaşılan kaynaklara erişebilir ve kilidi almayan programlar paylaşılan kaynaklara erişemez.
Kilidi alan program, erişim tamamlandıktan sonra kilidi açmalıdır, böylece diğer programlar kilit için rekabet edebilir ve paylaşılan kaynaklara erişebilir.
Sözde kod aşağıdaki gibidir:
// Kilidi alın get_lock: ldr w1, cmp w1, # 1 b.ne get_lock mov w1, # 1 str w1, // Paylaşılan kaynaklara erişmeye başlayın ... // Paylaşılan kaynaklara erişimi sonlandırın kilit açma: mov w1, # 0 str w1 ,Okuma kilidi sıfır değilse, bu, mevcut kilidin diğer programlar tarafından kullanıldığı anlamına gelir, bu nedenle, kilidi alamazsanız, diğerlerinin kilidi açmasını beklemeniz gerekir. Kilidin değeri 0 ise, kilidin diğer programlar tarafından işgal edilmediği anlamına gelir, ardından kilidi 1 olarak ayarlayın ve ardından paylaşılan kaynağa erişin. Erişim tamamlandıktan sonra kilidi 0 olarak ayarlayın ve kilidi açın.
Kilidi alan program, tek çekirdekli olduğunda nispeten iyi çalışabilir, çünkü aynı zamanda sadece bir program çalıştırılabilir ve rekabet yoktur.
İşletim sistemini kullandıktan sonra, işletim sistemi uygulamaları planladığından, bu programın da olası sorunları olabilir. Kilit durumunu okuduktan sonra A uygulamasının değerinin 0 olduğunu varsayarsak, bu, mevcut kilidin diğer programlar tarafından kullanılmadığı anlamına gelir.Kilidi kilitlemek istediğinde, işletim sistemi programları ve B uygulaması çalıştırılır. Program B ayrıca kilit durumunu okur ve değerin 0 olduğunu bulur, bu da geçerli kilidin diğer programlar tarafından kullanılmadığını gösterir ve ardından paylaşılan kaynaklara erişmek için kilidi kilitler. Bu sırada, işletim sistemi yeniden programlama gerçekleştirir, A uygulaması çalıştırır, kilidi kilitler ve ardından paylaşılan kaynağa erişir. Bu sırada, paylaşılan kaynaklara aynı anda erişen iki uygulama ortaya çıktı ve kilidin rolü engellendi.
Yürütme süreci aşağıdaki tabloda gösterilmektedir:
Prosedür A
Mevcut uygulama
Prosedür B
ldr w1,
Kazanılmış kilit durumu 0
Prosedür A
Prosedür B
ldr w1,
Kazanılmış kilit durumu 0
Prosedür B
str w1,
Kilitli, kilit durumu 1
Prosedür B
Paylaşılan kaynaklara erişim
b.ne get_lock
Kilit durumu 1, ancak A bilmiyor
Prosedür A
str w1,
Kilitli
Prosedür A
Paylaşılan kaynaklara erişim
Prosedür A
Bu sorunu çözmek için, kilit elde edildiğinde kesinti korumalı olabilir.Şu anda, işletim sistemi programlanamaz, bu da yukarıdaki sorunları önler. Sözde kod aşağıdaki gibidir:
get_lock: // kesmeyi kapat bl mask_int ldr w1, cmp w1, # 1 b.ne get_lock mov w1, # 1 str w1, // Kesmeyi aç bl open_int // Paylaşılan kaynaklara eriş ... unlock: mov w1, # 0 str w1,Bu şekilde, yukarıda bahsedilen sorunlardan kaçınılabilir, ancak kilit elde edildiği sürece, kesinti kapatılır ve kesintiye sistemin gerçek zamanlı yanıtını etkileyen kesinti açılır.
Tek bir çekirdek olması durumunda, kesmeyi kapatarak işletim sisteminin programlamasını da durdurabilirsiniz. Ancak çok çekirdekli olması durumunda, her bir CPU paralel olarak çalıştırılır, bu nedenle şu anda yukarıda açıklanan, eşzamanlı olarak kilit durumunu alan iki program olacaktır ve şu anda kesintileri yasaklayarak hiçbir etkisi yoktur.
Çoklu çekirdek durumunda kilit çekişmesi sorununu çözmek için, kol özel bir işlem başlattı ve ilgili talimatları ekledi.
Münhasır işlemin özü, kilidi korumak için bir durum makinesi kullanmaktır Durum makinesinin iki durumu vardır, açık durum ve özel durum. Kilidi başarılı bir şekilde kilitlemek için, durum özel durumdan açık duruma geçirilmelidir ve diğer tüm durumlar başarısız olur.
Özel işlemleri desteklemek için, LDXR ve STXR talimatları A64'e eklenmiştir.
A32 ve T32 altında LDREX ve STREX talimatları da destek için eklenir.
LDXR talimatı, durumu açık durumdan özel duruma geçirir ve STXR komutu, durumu özel durumdan açık duruma geçirir Bu, mağaza özel işleminin başarılı olduğu anlamına gelir.
STXR talimatı ile sıradan STR talimatı arasındaki fark, talimatın, mağaza özelinin başarılı olup olmadığını gösteren bir dönüş değerine sahip olmasıdır. Başarılıysa, ws 0, başarısız, ws 1'dir.
Özel bir işlem talimatı olduğunda, önceki kilit edinme programı aşağıdaki gibi olur:
// Kilit alın get_lock: ldxr w1, cmp w1, # 1 b.ne get_lock // mov w1, # 1 stxr w2, w1, cbnz w2, get_lock'u kilitlemeyi deneyin // Kaynaklara erişin ... unlock: mov w1, # 0 str w1,Stxr talimatı ile, kilidin durumunu değiştirmeyi deneyin.Değişiklik başarılı olursa, w20 olur. Bu durumda, kilidi almış olduğunuz ve ardından paylaşılan kaynağa erişebileceğiniz anlamına gelir. Değişiklik başarısız olursa, w21'dir ve bu, diğer programların şu anda kilidi aldığını ve paylaşılan kaynağa erişemediğini ve kilidi almaya geri döndüğünü gösterir.