Temel Zamanlama İşlevleri
Önceki Sürecin İşlemci Önceliği ve Zamanlama Sonraki
Temel Zamanlama İşlevleri
Bu bölümdeki işlevler, mutlak önceliği ve bir sürecin zamanlama kuralını ayarlamakta kullanılan GNU C kütüphanesindeki işlevlerdir.
Taşınabilirlik Bilgisi
Bu işlevlere sahip sistemlerde _POSIX_PRIORITY_SCHEDULING makrosu unistd.h başlık dosyasında tanımlanmıştır.
Zamanlama kurallarının geleneksel zamanlama ile ilgili olduğu durumda zamanlamanın daha hassas ayarlanabileceği işlevleri Geleneksel Zamanlama bölümünde bulabilirsiniz.
Bu işlevlerin yapısı ve isimlendirilmesi bakımından denenecek çok fazla birşey yoktur. Bunlar POSIX.1b tarafından tanımlanmış olduğundan bu kılavuzda bahsedilen kavramlarla uyuşmamaları normaldir. Çünkü GNU C kütüphanesinin kullanıldığı sistemlerdeki gerçekleme POSIX yapısı ile ilgili kavramsallaştırmanın tersidir. POSIX şeması birincil zamanlama parametresinin zamanlama kuralları olduğunu ve öncelik değerinin (varsa), zamanlama kurallarının bir parametresi olduğunu kabul eder. Gerçeklemede ise ister istemez, öncelik değeri kraldır ve zamanlama kuralları, eğer varsa, önceliği etkileyen ince bir ayardır.
Bu bölümdeki semboller sched.h başlık dosyasında bildirilmiştir.
struct sched_param
veri türü
Bu yapı bir mutlak önceliği tanımlar.
int ssched_priority
mutlak öncelik değeri
int sched_setscheduler
(pid_t                     pid,
 int                       kural,
 const struct sched_param *öncelik)
işlev
Bu işlev bir sürecin hem mutlak önceliğini hem de zamanlama kuralını ayarlar.
Süreç kimliği pid olan sürecin ya da pid olarak sıfır verildiğinde çağrıldığı sürecin mutlak önceliğini öncelik ile, zamanlama kuralını kural ile belirtilen değere ayarlar. Eğer kural negatifse işlev mevcut zamanlama kuralını değiştirmez.
İşlevin kural argümanında belirtilebilecek değerler şunlardır:
SCHED_OTHER
Geleneksel zamanlama
SCHED_FIFO
İlk gelen alır
SCHED_RR
Döner turnuva
İşlev başarılıysa 0 ile döner. -1 ile dönmüşse bir hata oluşmuştur. Bu durumda errno değişkeni şu hata durumlarından birini içerir:
EPERM
  • Çağıran süreç CAP_SYS_NICE yetkisine sahip değil ve kural değeri SCHED_OTHER değil (ya da değeri negatif ve mevcut kural SCHED_OTHER değil).
  • Çağıran süreç CAP_SYS_NICE yetkisine sahip değil ve sahibi hedef sürecin sahibi değil. Yani çağıran sürecin etkin kullanıcı kimliği pid süreç kimlikli sürecin ne etkin ne de gerçek kullanıcı kimliğidir.
ESRCH
pid sıfırdan farklı olduğu halde pid süreç kimlikli bir süreç yok.
EINVAL
  • kural mevcut bir zamanlama kuralını ifade etmiyor.
  • *öncelik ile belirtilen mutlak öncelik kural zamanlama kuralı için (ya da kural negatifse mevcut zamanlama kuralı için) geçerli aralığın dışında ya da öncelik bir boş gösterici. Geçerli aralığın ne olduğunu sched_get_priority_max ve sched_get_priority_min işlevleri ile öğrenebilirsiniz.
  • pid negatif.
int sched_getscheduler
(pid_t pid)
işlev
Süreç kimliği pid olan sürecin ya da pid olarak sıfır verildiğinde çağrıldığı sürece atanmış zamanlama kuralını döndürür.
İşlevin normal dönüş değeri zamanlama kuralıdır. Olası değerler için sched_setscheduler işlevine bakınız.
İşlev başarısız olursa -1 döner ve errno değişkenine şu hata durumlarından biri atanır:
ESRCH
pid sıfırdan farklı ve böyle bir süreç yok.
EINVAL
pid negatif.
Bu işlevin sched_setscheduler işlevinin tam karşılığı olmadığına dikkat edin, sched_setscheduler işlevi hem zamanlama kuralını hem de mutlak önceliği belirlemek için kullanılabilirken bu işlev sadece zamanlama kuralını döndürür. Mutlak önceliği öğrenmek için sched_getparam işlevini kullanabilirsiniz.
int sched_setparam
(pid_t                     pid,
 const struct sched_param *öncelik)
işlev
Bu işlev sürecin mutlak önceliğini değiştirmekte kullanılır.
İşlevselliği kural = -1 olduğunda sched_setscheduler işlevindeki ile aynıdır.
int sched_getparam
(pid_t                     pid,
 const struct sched_param *öncelik)
işlev
Bu işlev sürecin mutlak önceliği ile döner.
pid, mutlak önceliği öğrenilmek istenen sürecin süreç kimliğidir.
öncelik ise sürecin mutlak önceliğini içeren yapıya bir göstericidir.
Başarı durumunda işlevin dönüş değeri 0'dır. Aksi takdirde -1 döner ve errno değişkenine şu değerler biri atanır:
ESRCH
pid sıfırdan farklı ve böyle bir süreç yok.
EINVAL
pid negatif.
int sched_get_priority_min
(int *kural)
işlev
Bu işlev kural zamanlama kuralı için bir sürecin alabileceği en düşük mutlak öncelik değeri ile döner.
Linux'ta, SCHED_OTHER için 0 diğerleri için 1'dir.
Başarı durumunda işlevin dönüş değeri 0'dır. Aksi takdirde -1 döner ve errno değişkenine şu değerler biri atanır:
EINVAL
kural mevcut bir zamanlama kuralı değil.
int sched_get_priority_max
(int *kural)
işlev
Bu işlev kural zamanlama kuralı için bir sürecin alabileceği en yüksek mutlak öncelik değeri ile döner.
Linux'ta, SCHED_OTHER için 0 diğerleri için 99'dur.
Başarı durumunda işlevin dönüş değeri 0'dır. Aksi takdirde -1 döner ve errno değişkenine şu değerler biri atanır:
EINVAL
kural mevcut bir zamanlama kuralı değil.
int sched_rr_get_interval
(pid_t            pid,
 struct timespec *süre)
işlev
Bu işlev turnuva zamanlama kuralı kullanıldığında pid kimlikli sürecin işlemciyi kullanabileceği süreyi döndürür.
Sonuç süre ile döner.
Linux çekirdeği için turnuva zaman dilimi daima 150 mikrosaniyedir ve pid değerinin gerçek bir süreç kimliği olması bile gerekmez.
Başarı durumunda işlevin dönüş değeri 0'dır. Aksi takdirde, imkansız olsa bile -1 dönebilir. Ancak errno değişkenine atanmak üzere belirlenmiş bu işleve özgü özel bir hata durumu yoktur.
int sched_yield
(void)
işlev
Bu işlev, sürecin işlemci üzerindeki haklarından vazgeçilmesini sağlar.
Teknik olarak, sched_yield işlevi sürecin hemen tekrar çalışmaya hazır duruma (işlev çağrıldığında çalışmakta olmanın tersine) gelmesine sebep olur. Yani, sürecin mutlak önceliği sıfırdan farklıysa, mutlak öncelikleri mutlak önceliği ile aynı olan süreçlerin bulunduğu süreç listesinin kuyruğuna çalışmaya hazır süreç olarak eklenip sırasının gelmesini bekler. Mutlak önceliği sıfırsa bu işlem daha karmaşıklaşır, ancak işlemcinin başka bir sürece bırakılması yine de gerçekleşir.
Eğer mutlak öncelik bakımından eşdeğerde başka bir süreç yoksa bu işlev hiçbir şey yapmaz.
İşlevi içeren süreç açısından süreç, başka bir sürecin ne yaptığı ya da ne kadar hızlı çalıştığının farkında değildir, işlev bu bakımdan işlevsizdir.
Başarı durumunda işlevin dönüş değeri 0'dır. Aksi takdirde, imkansız olsa bile -1 dönebilir. Ancak errno değişkenine atanmak üzere belirlenmiş bu işleve özgü özel bir hata durumu yoktur.
Önceki Üst Ana Başlık Sonraki
Anlık Zamanlama Başlangıç Geleneksel Zamanlama
Bir Linux Kitaplığı Sayfası