GNU/Linux >> Belajar Linux >  >> Linux

Apa yang dilakukan ulimit -s unlimited?

Saat Anda memanggil suatu fungsi, "ruang nama" baru dialokasikan di tumpukan. Begitulah fungsi dapat memiliki variabel lokal. Saat fungsi memanggil fungsi, yang pada gilirannya memanggil fungsi, kami terus mengalokasikan lebih banyak ruang di tumpukan untuk mempertahankan hierarki ruang nama yang dalam ini.

Untuk mengekang program yang menggunakan ruang tumpukan dalam jumlah besar, batasan biasanya diterapkan melalui ulimit -s . Jika kami menghapus batas itu melalui ulimit -s unlimited , program kami akan dapat terus melahap RAM untuk tumpukan yang terus tumbuh sampai akhirnya sistem kehabisan memori seluruhnya.

int eat_stack_space(void) { return eat_stack_space(); }
// If we compile this with no optimization and run it, our computer could crash.

Biasanya, menggunakan satu ton ruang tumpukan tidak disengaja atau merupakan gejala rekursi yang sangat dalam yang mungkin seharusnya tidak terlalu bergantung pada tumpukan. Dengan demikian batas tumpukan.

Dampak terhadap kinerja kecil tetapi memang ada. Menggunakan time perintah, saya menemukan bahwa menghilangkan batas tumpukan meningkatkan kinerja beberapa sepersekian detik (setidaknya pada Ubuntu 64bit).


ulimit -s unlimited biarkan tumpukan tumbuh tanpa batas.

Hal ini dapat mencegah program Anda mogok jika Anda menulis program dengan rekursi, terutama jika program Anda bukan rekursif ekor (penyusun dapat "mengoptimalkannya"), dan kedalaman rekursi besar.


ukuran tumpukan bisa memang menjadi tidak terbatas. _STK_LIM adalah default , _STK_LIM_MAX adalah sesuatu yang berbeda untuk setiap arsitektur, seperti yang dapat dilihat dari include/asm-generic/resource.h :

/*
 * RLIMIT_STACK default maximum - some architectures override it:
 */
#ifndef _STK_LIM_MAX
# define _STK_LIM_MAX           RLIM_INFINITY
#endif

Seperti dapat dilihat dari contoh ini, nilai generik tidak terbatas, di mana RLIM_INFINITY adalah, sekali lagi, dalam kasus umum didefinisikan sebagai:

/*
 * SuS says limits have to be unsigned.
 * Which makes a ton more sense anyway.
 *
 * Some architectures override this (for compatibility reasons):
 */
#ifndef RLIM_INFINITY
# define RLIM_INFINITY          (~0UL)
#endif

Jadi saya kira jawaban sebenarnya adalah - ukuran tumpukan BISA dibatasi oleh beberapa arsitektur, maka pelacakan tumpukan tidak terbatas akan berarti apa pun _STK_LIM_MAX didefinisikan, dan jika tak terhingga - tak terhingga. Untuk detail tentang apa artinya menyetelnya menjadi tidak terbatas dan apa implikasinya, lihat jawaban lain, ini jauh lebih baik daripada jawaban saya.


Linux
  1. Apa itu NGINX? Bagaimana cara kerjanya?

  2. Apa Artinya “–” (tanda hubung ganda)?

  3. Apa yang Dilakukan "lc_all=c"?

  1. Apa yang Digema $? Mengerjakan??

  2. Apa yang poll() lakukan dengan batas waktu 0?

  3. Apa sebenarnya yang dilakukan init?

  1. Apa?

  2. Apa itu Exec 3?

  3. Apa yang dihasilkan pwd?