Pull to refresh

Comments 37

> Системный вызов fork создает точную копию исходного процесса

Хотелось бы уточнить, что Linux ядро не создает точную копию процесса, т.к. это накладно и глупо.
Вместо этого используется механизм copy-on-write. Т.е. создается просто дубликат таблиц адресного пространства
родителя, копирование происходит, только если процесс начинает менять данные. Но тут есть еще одна хитрость.
Сразу после fork() потомок получает более высокий приоритет, чем родитель и соответственно новая программа
успевает начать выполняться раньше :)
Не знал таких тонкостей, спасибо.
Временами это успевает попортить кровь при написании скриптов.
Ну так нужно намертво усвоить, что никакой гарантии порядка выполнения многопоточных приложений нет, если специально их не синхронизировать.
Знаете, когда пишешь какую-нибудь дребедень для разового использования не всегда приходит в голову, что ты пишешь «многопоточное приложение без специальной синхронизации». Чаще всего думаешь «ща по-быстрому костыль приделаю». Первые пару раз я сильно удивлялся, что некоторые команды в скрипте отрабатывают не последовательно, потом стал осмотрительнее.
> Сразу после fork() потомок получает более высокий приоритет, чем родитель и соответственно новая программа успевает начать выполняться раньше

Вообщето это не совсем так. Кто запускается после fork — parent or child завист от параметра заданного в

/proc/sys/kernel/sched_child_runs_first

Когда-то давным давно первым запускался child, затем в 2.2 поменяли на parent, затем в 2.6 поменяли на child но добавили опцию в /proc. В 2.6.32 по-умолчанию поменяли обратно на parent-first :)

Почему же parent-first лучше? Дело в том что child обычно сразу же вызывает exec что убивает кеши процессора. А если parent продолжает выполнение, то используются текущие кеши и производительность повышается.

А еще в linux есть vfork — оптимизированная версия fork которая не копирует таблицы адресов. Хотя она не posix и не рекомендуется к использованию.
Забыл добавить что эту и другую увлекательную информацию вы можете почерпнуть из великолепной книги Керриска «The Linux Programming Interface»
Статья из книжки линугз для школоты.
Данная статья написана по лекции, прослушенной в университете. Сам преподаватель расхваливал книгу Эндрю Таненбаумана «Современные операционные системы». Возможно лекции сплошняком брались оттуда, не проверял. Но если это так, тогда www.nrjetix.com/fileadmin/doc/publications/Lectures/Lecture13.pdf тоже копипаст.
>Данная статья написана по лекции, прослушенной в университете

перешлите инвайт преподу.
Лучше Танненбауму. Он оценит
А вы еще одногрупникам предложите написать каждому по статье на хабр «что я смог понять и запомнить из последней лекции в универе».
Чего уж там мелочиться.
90% не смогут ничего написать. А что Вы кстати написали содержательного за последнее время?
«Можешь не писать ху*ни, в которой не разбираешься — не пиши».
Мне пока вполне удается следдовать этому принципу.
А где выкопать все лекции??? Это бесценно
На мой взгляд, даже если копипаст, всё равно спасибо автору, ибо это тот вопрос, который был не ясен мне.
Всегда пожалуйста. Только не ожидал я такой реации на то, что если я взял что-то за основу и честно в этом признался, то человека обязательно надо зачмырить. Я и не знал, что большинство людей здесь родились со знаниями в IT.
Есть странный парадокс, люди которые что-то знают, начинают считать что другие это знают тоже, и когда кто-то решает для других объяснить это толковым языком, начинают за это чмырить.
Более странный парадокс, что Вы одобряете копипасту. В данном случае Танненбаум -> Лектор -> Студент -> Хабр.
По правилам Хабра все же публиковаться должен авторский контент, а не реферат.

> 90% не смогут ничего написать. А что Вы кстати написали содержательного за последнее время?

Вы тоже ничего не написали сами, только пересказали лекцию, и даже не имеете представления, что первоисточник Таненбаум. От себя или из других источников абсолютно ничего не добавлено.

Еще более печально, что на группу студентов (по Вашим оценкам) только один-два могут вразумительно рассказать, что было на лекции. И опять же, судя по Вашим оценкам, — это потолок способностей 100%.
Отвечаю на то, что адресовано лично мне.

Копипасту не одобряю. Но это именно то, что было нужно мне. И хотелось бы найти весь курс лекций (кто подскажет где?)
Книга Эндрю Таненбаум «Современные операционные системы»
Я бы попросил не путать реферат и копипаст.
То, что реферат производное произведение, не значит, что оно не авторское. Другое дело, что ссылки на источники должны быть.
У современных студентов в большинстве случаев оно не авторское. И речь вовсе не об этом.
Запрещён правилами полный копипаст. Тут явно не он, а скорее грубый рерайт, что правилами, вроде бы, не запрещено, а народ топик поддерживает, намекая, что содержание интересно, но карму опустил, намекая что топик-ссылка был бы уместнее. Саморегуляция :)
а вам, простите, религия не позволяет читать что-то, написанное толковым языком, пока его нет на главной хабра?
Вот что полезного в этой статье?
Лично для вас, обнаружившего в ней толковый язык?
Вот какие можно сделать из статьи для себя выводы поо пунктам:
Что такое такое «фоновый процесс aka daemon»?
Откуда они берутся в системе?
Как помянутый cron может запускать другие процессы?
Насколько точна фраза «Процесс может посылать сигналы только членам своей группы процессов»? И как это согласуется с действительностью, данной нам в ощущениях?

Все претензии — за «Карузо в исполнении Рабиновича»
плохо лежавшее не является спизженным
Очень здорово написать про fork и забыть про exec, без которого механизм порождения дочернего процесса бессмысленен чуть менее, чем полностью.
+1
К тому же вызов sys_clone поудачнее будет, т.к. позволят родителю иметь общую память с ребёнком…
Если уж на то пошло — fork() как таковой и не используется — только clone() (это если я еще что-то помню после универа)
Для тредов — clone. Для создания процесса из нового бинарника — vfork(). fork() — только в случаях, когда нужен fork().
clone универсален (поведение задается флагами) и, например, в glibc эмулирует fork: glibc-20090518/nptl/sysdeps/unix/sysv/linux/i386/fork.c

#define ARCH_FORK() \
INLINE_SYSCALL (clone, 5, \
CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0, \
NULL, NULL, &THREAD_SELF->tid)
Sign up to leave a comment.

Articles