2015-09-15 7 views
2

Сохраняясь торжествами нового дизайна логотипа Stackoverflow, мне было любопытно, что должно было быть в точке sstk() в BSD и других UNIX-подобных операционных системах?Пример использования несуществующего системного вызова sstk()?

По интерфейсу ядра системы страниц руководств Linux вызовов, sstk(2) должен был:

... [изменить] размер области стека. Область стека также автоматически расширяется по мере необходимости. В VAX область текста и данных смежна в области P0, а секция стека находится в области P1 и растет вниз.

Однако, также в соответствии с инструкцией:

Этот вызов не поддерживается в 4.3BSD или 4.4BSD или Glibc или Linux или любой другой известной Unix-подобной системе. Некоторые системы имеют подпрограмму этого имени, которая возвращает ENOSYS.

Что можно заметить при просмотре glibc's sstk.c source

Мой вопрос, почему бы один хотите вручную изменить размер стека? sbrk() и друзья имеют смысл, но есть ли необходимость в ручном перераспределении стека размера в вашей программе вручную?

+4

Тот факт, что вызов не поддерживается никому неизвестным, предлагает, что на самом деле его не так много, по крайней мере, нет. Я бы предположил, что это имело больше смысла в те дни, когда оперативная память была драгоценна. В те дни вам также, возможно, не удавалось полагаться на размер стека, который автоматически увеличивается. Таким образом, вы можете, скажем, увеличить стек динамически в рамках глубоко рекурсивного алгоритма, а затем свернуть его обратно. –

+0

"* В соответствии с API ядра ядра Linux manpages ... *", которые man-страницы ядра?) – alk

+0

@JohnBollinger: Просто сделайте это ответом. – alk

ответ

1

Еще одна вероятная причина для явного увеличения стека с помощью syscall заключается в том, что вы можете получить чистую индикацию ошибки, если запрос слишком велик, в отличие от обычного метода обработки сбоев размещения стека (т. Е. Даже не попробовать , если какое-либо распределение не удастся, просто позвольте процессу сбой).

Трудно точно узнать, сколько пространства стека вам необходимо для выполнения какой-либо рекурсивной операции, но вы можете сделать разумное предположение и sstk(guess*10), чтобы быть уверенным.

+0

Это на самом деле имеет большой смысл. Полагаю, мы никогда не узнаем истинной причины его создания, но этот ответ кажется наиболее правдоподобным. – joshumax

2

Как я уже сказал в комментариях, тот факт, что вызов не поддерживается ни в одном из известных, где предполагает, что на самом деле для него нет особого смысла, по крайней мере, не более того.

Документов по linux.die.net приписывать наследие функции к BSD (хотя это, по-видимому, не поддерживается в современных BSD не больше, чем где-либо еще), и BSD прослеживает свою родословную к добросовестному AT & T Unix , Возможно, это имело смысл в те дни, когда оперативная память была драгоценна. В те дни вам также, возможно, не удавалось полагаться на размер стека, который автоматически увеличивается. Таким образом, вы можете, скажем, увеличить стек динамически в рамках глубоко рекурсивного алгоритма, а затем свернуть его обратно.