Конечно молодец и все хорошо ) думаю создание этой статьи помогло тебе самому разобраться в системе. но для начинающих я бы все таки рекомандавал того же Робачевского.
Сколько ни читаю статей про процессы в UNIX, никак не мог понять зачем при fork()'е копируется весь родительский процесс, ведь это так неэкономично. Если "тяжелому" процессу нужно породить "легкий", зачем нужно копировать себя в своей тяжелости?
>Сколько ни читаю статей про процессы в UNIX, никак не мог понять зачем при fork()'е копируется весь родительский процесс, ведь это так неэкономично. Если "тяжелому" процессу нужно породить "легкий", заче нужно копировать себя в своей тяжелости?
В системах, соответствующих SVR4 код и данные процесса загружаются в память только при необходимости. То есть при выполнении fork() в памяти оказывается код только нового процесса и той функции старого, в которой выполняется exec()
Почитал я про copy-on-write, как понял, при fork()'е передается поинтер на область памяти родителя, а копируется он только тогда когда нужно делать write (exec()). Но это все-равно идиотизмъ! :) Я не могу понять логики. Почему бы не создать процесс "просто", без дурацкого fork-exec? :)
> Но это все-равно идиотизмъ! :) Я не могу понять логики. Почему бы не создать процесс "просто", без дурацкого fork-exec? :)
видимо, потому что тут руководствовались алгебраической красотой дизайна -- форк и екзек это ортогональные операции которые позволяют процессам жить полноценной жизнью. А оверхед несущественен на процессорах с MMU
> 2.Процесс нельзя убить даже TERMом если он находится в Uninterruptible sleep
Видимо, s/TERM/KILL/. От TERM'а любой процесс убежать может.
Отсюда вопрос: а что с ними делать-то?? А то вот было у меня: прицепил cifs, потом сервер исчез... все процессы, что туда смотрели, повесились в disk sleep. Есть ли способ убрать такой нехороший процесс?
Ну да, в мане по vfork написано, что для таких случаев оно и придумывалось. Там же сказано, что на полноценных архитектурах этот выпендрёж просто не нужен и fork ничуть не хуже.
> Самая тяжелая операция при форке -- пометить страницы для COW.
"...so the __only__ penalty incurred by fork() is the time and memory required to duplicate the parent's page tables..."
Действительно, самая тяжёлая операция. Но это не то, из-за чего придумывался vfork :) Всё равно его не рекомендуется использовать. Или fork, или posix_spawn.
Придумывался он до изобретения COW, действительно. Но в "современных операционках" разница между fork и vfork _существенна_: разница в скорости составляет многие разы, иногда сотни и тысячи раз.
Если из многогигабайтного процесса надо много раз запустить новый легкий процесс, использование vfork очень даже оправданно.
А posix_spawn -- ADVANCED REALTIME экзотика и используется совсем не для этого; ее придумали в первую очередь для того, чтобы запускать процессы в системах, не поддерживающих страничный механизм.
> SIGSTOP >Остановить >Сигнал отправляется всем процессам текущей группы при нажатии пользователем клавиш <CTRL>+<Z>. Получение сигнала вызывает останов выполнения процесса.
Придираюсь, конечно... При нажатии <CTRL>+<Z> посылается SIGTSTP, а не SIGSTOP.