Özkaynak Kullanımın Sınırlanması
Önceki XXII. Oylum - Özkaynak Kullanımı ve Sınırlaması Sonraki
Özkaynak Kullanımın Sınırlanması
Bir sürecin özkaynak kullanımı için sınırlar belirtebilirsiniz. Süreç bir sınırı aşmaya çalışırsa bir sinyal alabilir ya da özkaynağa bağımlı bir sistem çağrısı başarısız olabilir. Her süreç kendi özkaynak sınır değerlerini kendini çalıştıran süreçten miras alır, ancak onları üst sürecinden bağımsız olarak değiştirebilir.
Bir özkaynağın her süreç için iki sınırı vardır:
mevcut sınır
Mevcut sınır sistemin aşılmasına izin vermediği sınırdır. "Sanal sınır" olarak da bilinir, çünkü bu sınırı sürecin kendisi belirler.
üst sınır
Bir sürecin mevcut sınır olarak belirleyebileceği değerin üst sınırıdır. "Kesin sınır" olarak da bilinir, çünkü sürecin bu sınırın etrafından dolanması mümkün değildir. Bir süreç mevcut sınırını bu değere kadar arttırabilirken, sadece sistem yöneticisi bu üst sınırı arttırabilir.
getrlimit, setrlimit, getrlimit64 ve setrlimit64 işlevleri ve bunlarla kullanılan semboller sys/resource.h başlık dosyasında bildirilmiştir.
int getrlimit
(int            özkaynak,
 struct rlimit *sınır)
işlev
özkaynak özkaynağının mevcut ve üst sınırlarını okur ve bunları *sınır içinde saklar.
İşlev başarılı olursa 0, aksi takdirde -1 ile döner. Olası tek errno hata durumu EFAULT'tur.
Kaynakların _FILE_OFFSET_BITS == 64 ile derlendiği 32 bitlik bir sistemde bu işlev aslında getrlimit64 işlevine denktir. Yani LFS arayüzü eski arayüzün yerine geçer.
int getrlimit64
(int              özkaynak,
 struct rlimit64 *sınır)
işlev
Bu işlev ikinci argümanın struct rlimit64 türünde olması dışında getrlimit işlevinin eşdeğeridir.
Kaynakların _FILE_OFFSET_BITS == 64 ile derlendiği 32 bitlik bir sistemde bu işlevin ismi getrlimit olur, böylece LFS arayüzü eski arayüzün yerine geçer.
int setrlimit
(int                  özkaynak,
 const struct rlimit *sınır)
işlev
özkaynak özkaynağının mevcut ve üst sınırlarını *sınır içindeki değerlere ayarlar.
İşlev başarılı olursa 0, aksi takdirde -1 ile döner. Bu işlev için tanımlanmış errno hata durumları:
EPERM
  • Süreç mevcut sınırı üst sınırın üstünde belirtmeyi denedi
  • Süreç üst sınırı arttırmayı denedi ama yetkisi yetersiz
Kaynakların _FILE_OFFSET_BITS == 64 ile derlendiği 32 bitlik bir sistemde bu işlev aslında setrlimit64 işlevine denktir. Yani LFS arayüzü eski arayüzün yerine geçer.
int setrlimit64
(int                    özkaynak,
 const struct rlimit64 *sınır)
işlev
Bu işlev ikinci argümanın struct rlimit64 türünde olması dışında setrlimit işlevinin eşdeğeridir.
Kaynakların _FILE_OFFSET_BITS == 64 ile derlendiği 32 bitlik bir sistemde bu işlevin ismi setrlimit olur, böylece LFS arayüzü eski arayüzün yerine geçer.
struct rlimit
veri türü
Bu yapı getrlimit işlevinde kullanıldığında sınır değerlerin alınmasını sağlar, setrlimit işlevinde kullanıldığında ise belli bir süreç ve özkaynak için sınır değerleri belirtir. İki üyesi vardır:
rlim_t rlim_cur
Mevcut sınır.
rlim_t rlim_max
Üst sınır.
getrlimit işlevi açısından yapı bir çıktı alanıdır; o anki değerleri alır. setrlimit işlevinde ise yeni değerleri belirtir.
LFS işlevleri için benzer bir tür sys/resource.h başlık dosyasında tanımlanmıştır.
struct rlimit64
veri türü
Bu yapı üyelerinin daha geniş aralıklara sahip olması dışında yukarıdaki rlimit yapısının karşılığıdır. İki üyesi vardır:
rlim64_t rlim_cur
rlimit.rlim_cur karşılığıdır, ama türü farklıdır.
rlim64_t rlim_max
rlimit.rlim_max karşılığıdır, ama türü farklıdır.
Bir sınır belirtilebilecek özkaynakların listesi aşağıda verilmiştir. Bellek ve dosyalarla ilgili sınırlar bayt cinsindendir.
RLIMIT_CPU
Sürecin kullanabileceği işlemci zamanının azami miktarı. Süreç bundan daha uzun süre çalışırsa, SIGXCPU sinyalini alacaktır. Değer saniye cinsindendir. Bkz. İşlemsel Hata Sinyalleri.
RLIMIT_FSIZE
Sürecin oluşturabileceği azami dosya boyutu. Daha büyük bir dosya yazma denemesi SIGXFSZ sinyaline sebep olur. Bkz. İşlemsel Hata Sinyalleri.
RLIMIT_DATA
Süreç için ayrılan azami veri belleği miktarı. Süreç bu miktardan daha büyük bellek ayırmaya çalışırsa bellek ayırma işlevi başarısız olur.
RLIMIT_STACK
Süreç için azami yığıt boyutu. Süreç yığıtını bundan fazlasına genişletmeye çaışırsa bir SIGSEGV sinyali alacaktır. Bkz. Yazılım Hatalarının Sinyalleri.
RLIMIT_CORE
Bu sürecin oluşturabileceği core dosyasının azami boyutu. Eğer süreç sonlanır ve bu boyuttan daha büyük bir core dosyası dökümlemeyi denerse core dosyası oluşmaz. Bu bakımdan, bu sınırı sıfıra indirerek core dosyalarının asla oluşmamasını sağlayabilirsiniz.
RLIMIT_RSS
Bu sürecin alabileceği fiziksel belleğin azami miktarı. Bu parametre sistemin zamanlayıcısı ve bellek ayırıcısı için bir kılavuzdur. Sistem, sürece ihtiyaç duyduğunda bundan daha fazla bellek verebilir.
RLIMIT_MEMLOCK
Fiziksel bellekte kilitlenebilecek belleğin azami miktarı (böylece bu bellek takaslanmayacaktır).
RLIMIT_NPROC
Aynı kullanıcı kimlikle oluşturulabilecek süreçlerin azami sayısı. Bu sınırı kendi kullanıcı kimliğiniz için aşmaya çalışırsanız, fork işlevi EAGAIN ile başarısız olacaktır. Bkz. Bir Sürecin Oluşturulması.
RLIMIT_NOFILE
RLIMIT_OFILE
Sürecin açabileceği dosyaların azami sayısı. Bundan daha fazla dosya açmaya çalışırsa, işlem EMFILE hata kodu ile başarısız olur. Bu sınır tüm sistemlerde desteklenmez; GNU ve 4.4 BSD böyledir.
RLIMIT_AS
Bu sürecin alabileceği toplam belleğin azami miktarı. Eğer süreç bunu aşan miktarı örneğin, brk, malloc, mmap veya sbrk ile ayırmaya çalışırsa işlev başarısız olur.
RLIM_NLIMITS
Farklı özkaynak sınırlarının sayısı. Geçerli özkaynak terimlerinin sayısı RLIM_NLIMITS değerinden küçük olmalıdır.
int RLIM_INFINITY
değişken
Bu sabit, setrlimit içinde sınır değer olarak belirtildiğinde "sonsuz" değerine karşılıktır.
Aşağıdaki tarihi işlevler şimdiye kadar bahsedilen işlevlerin yaptıklarını yaparlar. Bunların yerine yukarıda bahsedilen işlevlerin kullanılması daha iyi bir seçim olacaktır.
ulimit ve komut sembolleri ulimit.h başlık dosyasında bildirilmiştir.
int ulimit
(int komut, ...)
işlev
ulimit işlevi çağrıldığı süreç ile ilgili olarak komut ile belirtildiği gibi özkaynağın ya o anki mevcut sınırıyla döner ya da mevcut ve üst sınırını belirtir.
Bir sınır değeri döndürmek için komut argümanından başka argüman gerekmez. Bir sınırı belirtmek için ikinci bir argüman gerekir: long intsınır.
komut argümanında kullanılabilecek değerler ve belirttikleri işlemler:
GETFSIZE
Bir dosya boyutunun mevcut sınırını 512 baytlık birimler cinsinden döndürür.
SETFSIZE
Bir dosya boyutunun mevcut ve üst sınırını sınır * 512 bayta ayarlar.
Bazı sistemlerde başka komut değerleri de desteklenmektedir ama onlar GNU kütüphanesinde desteklenmemektedir.
Bir üst sınırı sadece sistem yöneticisi arttırabilir.
Bir sınır başarıyla alınmışsa işlevin dönüş değeri bu sınırın değeridir ve asla negatif değildir. Bir sınır başarıyla değiştirilmişse işlevin dönüş değeri sıfır olur. İşlev başarısız olduğunda -1 ile döner ve olası errno hata durumu şu olabilir:
EPERM
Süreç bir üst sınırı arttırmayı denedi ama yetkisi yetersiz
vlimit ve onunla ilgili özkaynak sembolleri sys/vlimit.h başlık dosyasında bildirilmiştir.
int vlimit
(int özkaynak,
 int sınır)
işlev
vlimit bir sürecin bir özkaynağı için mevcut sınırı değiştirir.
özkaynak şunlardan biri olabilir:
LIM_CPU
Azami işlemci zamanı. setrlimit için RLIMIT_CPU ile aynıdır.
LIM_FSIZE
Azami dosya boyutu. setrlimit için RLIMIT_FSIZE ile aynıdır.
LIM_DATA
Azami veri belleği. setrlimit için RLIMIT_DATA ile aynıdır.
LIM_STACK
Azami yığıt boyutu. setrlimit için RLIMIT_STACK ile aynıdır.
LIM_CORE
Azami core dosyası boyutu. setrlimit için RLIMIT_COR ile aynıdır.
LIM_MAXRSS
Azami fiziksel bellek. setrlimit için RLIMIT_RSS ile aynıdır.
İşlevin normal dönüş değeri sıfırdır, -1 dönüş değeri bir hata oluştuğunu gösterir. Bu işlev için tanımlanmış errno hata durumu:
EPERM
Süreç mevcut sınırı üst sınırın üzerine çıkarmaya çalıştı
Önceki Üst Ana Başlık Sonraki
Özkaynak Kullanımı Başlangıç Sürecin İşlemci Önceliği ve Zamanlama
Bir Linux Kitaplığı Sayfası