Uyku (sistem çağrısı) - Sleep (system call)

Bir bilgisayar programı (süreç, görev veya Konu ) Mayıs uyku, onu bir hareketsiz durum bir süre için. Sonunda bir aralığın sona ermesi zamanlayıcı veya bir makbuz sinyal veya kesmek programın yürütülmeye devam etmesine neden olur.

Kullanım

Tipik uyku sistem çağrısı parametre olarak bir süre değeri alır ve işlemin yürütmeye devam etmeden önce uyuması gereken minimum süreyi belirtir. Parametre tipik olarak saniyeleri belirtir, ancak bazı işletim sistemleri milisaniye veya mikrosaniye gibi daha hassas çözünürlük sağlar.

pencereler

Windows'ta Uyku() işlevi, uykuya geçecek milisaniye sayısının tek bir parametresini alır. Uyku() işlev dahildir kernel32.dll.[1]

Uyku() işlevi, mevcut zamanlayıcı çözünürlüğünden daha yüksek olmayan bir çözünürlüğe sahiptir, tipik olarak 16ms, ancak minimum 1ms'de, timeBeginPeriod () "medya zamanlayıcı" API ailesi. Daha yüksek hassasiyetler için, bir meşgul döngü bitmiş QueryPerformanceCounter ()olduğu gibi gnulib.[2]

Unix

Açık Unix benzeri ve diğeri POSIX işletim sistemleri, uyku() işlev, uyku saniye sayısının işaretsiz tamsayı türünde tek bir parametre sağlamak olarak adlandırılır.[3] Daha yüksek hassasiyetli bir versiyon, nanosleep () işlevi ve artık kullanımdan kaldırıldı uyu.[4] POSIX ayrıca genişletilmiş sürüm aracılığıyla saat kaynaklarını seçmeye izin verir clock_nanosleep ().[5]

Bir versiyonu clock_nanosleep () parçası olması önerildi C programlama dili, ancak reddedildi. Aynı teklifin UTC saat bölümü şuraya eklendi: C11.[6]

C örnekleri

İçinde Windows API:

Uyku(2 * 1000);  // 2 saniye uyu

Unix veya POSIX sistem çağrılarında:

uyku(2);       // 2 saniye uyu

Düşük seviyeli işlevsellik

Uyku, iş parçacığının veya sürecin kalan zaman diliminden vazgeçmesine ve Runnable Değil belirtilen süre için durum. Genellikle minimum süre için bir garanti varken, iş parçacığının belirtilen süre geçtikten hemen sonra veya hemen veya hatta hiç çalışmayacağına dair kesin bir garanti yoktur. Bu, programcının takdirine bağlıdır ve iş parçacığı önceliklerine ve uyuyan iş parçacığının yeniden çalışacağı zaman zamanlayıcı çözünürlükleri gibi uygulama ayrıntılarına bağlıdır. POSIX sistemlerinde, nano uyku ve ilgili sistem çağrıları sinyaller tarafından kesilebilir ve kalan uyku süresini döndürür. uyku Öte yandan kütüphane işlevi, alarm birçok eski sistemde syscall, bu nedenle yalnızca çalışır bir sinyal göndererek. Windows Uyku işlevi, sinyal yokluğu nedeniyle (iş parçacığı veya sonlandırılan işlemi dışında) kesintiye uğramaz, ancak ilgili SleepEx işlevi iş parçacığını uyarılabilir bir duruma getirmek için kullanılabilir ve iş parçacığı sırasında APC çağrılarının yapılmasına izin verir. Uyuyor. Ayrıca, bir iş parçacığı teknik olarak "kesintiye uğrayabilir", örn. işlem, farklı bir iş parçacığındaki bir istisna nedeniyle sona erer.

Kullanımlar

Biraz sistem programları hiçbir zaman yürütmeyi sonlandırmayan olay döngüsü, her döngünün başında uyuyacak ve bazı olayların onları uyandırmasını bekleyecek. Bir olay alındığında, program olaya hizmet eder, ardından bir sonraki bekleme döngüsünün başlangıcına döner.

Diğer programlar periyodik olarak anket belirli bir zaman aralığından sonra uyuyarak ve yürütmeye devam ederek olaylar için. Yürütme bir kez sürdürüldüğünde, program olayları veya durum değişikliklerini sorgular ve ardından uykudayken meydana gelenlere hizmet verir. Olaylara servis verdikten sonra, program sonraki zaman aralığı için tekrar uykuya geçer. Bazı türler kalp atışı olaylar veya hayatta kal sinyaller bu tür programlar tarafından üretilebilir.

uyku() Çalışan bir programın veya kodun yürütülmesini yavaşlatmak için işlev çağrısı kısa süreler için tekrar tekrar çağrılabilir. Bu şekilde kısma kodu, donanımın aşırı ısınmasının etkilerini azaltmak için kaba bir mekanizma sağlar[7] veya eski programlar için zamanlama sorunlarını hafifletmek. Yazılımın yürütme hızını kontrol etmek için döngü öykünmesinden (bir emülatör aracılığıyla) yararlanmaktan ziyade uyku ve çalışma durumlarını değiştirmenin dezavantajı, uyanıkken çok az zaman harcanırsa, çok fazla zaman harcandığında veya uykuda çok fazla zaman harcandığında etkileşimli yazılımın dikkate değer bir kekemelik kazanmasıdır. ikisinin bir kombinasyonu.[8]

Kesintisiz uyku

Kesintisiz uyku durumu, bir sinyali hemen işleme koymayan bir uyku durumudur. Yalnızca, bekletilen bir kaynağın kullanılabilir hale gelmesinin bir sonucu olarak veya bu bekleme sırasında bir zaman aşımı meydana geldikten sonra (uykuya alındığında belirtilmişse) uyanacaktır. Çoğunlukla disk veya ağ IO (giriş / çıkış) bekleyen aygıt sürücüleri tarafından kullanılır. Süreç kesintisiz olarak uyurken, uyku sırasında biriken sinyaller süreç sistem çağrısından veya tuzaktan döndüğünde fark edilecektir.

Unix benzeri sistemlerde 'ps -l"kod kullanır"D"bir sürecin kesintisiz uyku hali için.[9] Bu tür süreçler ile bile öldürülemez SIGKILL ve onlardan kurtulmanın tek karmaşık olmayan yolu sistemi yeniden başlatmaktır.[10][11]

Ayrıca bakınız

Referanslar

  1. ^ MSDN Kitaplığı Başvurusu - Uyku ()
  2. ^ "winapi - Windows eşdeğeri nanosleep var mı?". Yığın Taşması.
  3. ^ uyku (3p) – Linux Manuel
  4. ^ nano uyku (3p) – Linux Manuel
  5. ^ clock_nanosleep (3p) – Linux Manuel
  6. ^ Kuhn, Markus. "ISO C için modernize edilmiş API". www.cl.cam.ac.uk.
  7. ^ mion (2016-12-06). "BES - Windows 7 / XP / 2000 için Battle Encoder Shirase 1.6.3 (kararlı) ve 1.7.4". mion.faireal.net. Alındı 2017-02-09.
  8. ^ Marletta Angelo (2015-03-12). "CPULIMIT". GitHub. Alındı 2017-02-09.
  9. ^ "top (1) - Linux kılavuz sayfası". man7.org. 2016-12-12. Alındı 2017-02-09.
  10. ^ "Kesintisiz Uyku (D) Durumundaki İşlemler". Novell. 2009-02-21. Alındı 2017-02-09.
  11. ^ Fusco, John (2007-03-06). Linux Programcısının Araç Kutusu. Pearson Education. ISBN  9780132703048.