Как стать автором
Обновить

Комментарии 18

Хабр, да что, чёрт возьми, с тобой такое происходит?!

Люди лайкают очередное "творение" AI. В данной статье бред написан, пусть он и переводной. Сколько-то народу его ещё и в закладки положили. Неужели на хабре совсем не осталось здравомыслящих?! Хабр тонет в генерируемом бреде.

Куча слов, скомпиллированных из трех основных статей, и даже ссылка на github Торвальдса. Всё призвано придать ЭТОМУ тексту легитимность.

Вот беру https://github.com/torvalds/linux/blob/master/kernel/pid.c
меняю

  • int pid_min = 1;

  • int pid_min = 0;

Даже RESERVED_PIDS не трогаю
Пересобираю. И знаете что происходит?

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 0 0.0 0.2 74744 15628 ? Ss 10:42 0:40 /usr/lib/systemd/systemd --switched-root

Если так дальше будет продолжаться, то очень скоро всё зарастёт этими псевдознаниями, которые на проверку ничего не стоят. Это как учебник по алгебре, написанный первоклашкой методом частичной, подходящей по контексту, копи-пасты из других учебников и кучи глав про то какая плохая Марьванна. Люди, а может это уже и не люди, лайкают. С этой потоковой генерацией правдоподобного шлака пора уже что-то делать.

Как думаете, зачем они компилируют подобные статьи?

А какой в таком ядре будет pid у idle-таска? Тоже 0?

В целом, я был бы рад, если бы вы подробнее расписали, в чем автор не прав, как именно распределяются pid, и при каких обстоятельствах он может быть 0 (почему-то же в том коде стоит = 1 вместо = 0).

Позволю себе с вам поспорить. init_task определён в init/init_task.c с

.thread_pid = &init_struct_pid,

А init_struct_pid определён в kernel/pid.c как

struct pid init_struct_pid = {
	.count		= REFCOUNT_INIT(1),
	.tasks		= {
		{ .first = NULL },
		{ .first = NULL },
		{ .first = NULL },
	},
	.level		= 0,
	.numbers	= { {
		.nr		= 0,
		.ns		= &init_pid_ns,
	}, }
};

Где nr — это и есть тот самый pid . Так что есть основания полагать, что автор статьи, таки прав.

С другой стороны, надо как-то объяснить и успех вашего эксперимента. Рискну предположить, что вам удалось собрать и запустить систему с двумя процессами с PID 0. А взлетела она потому что init_task исключён из нормальной планировки процессов и его никто не ищет по PID: в ядре он доступен по прямой ссылке, а в пространстве пользователя не доступен вообще.

А потом окажется, что всё это Матрица, а ты Жора Корнев.

Вот поэтому я всегда сначала листаю в комменты. Всегда. Пасиб тебе, добрый человек!

И зря. Добрый человек прав гораздо менее, чем эта переведенная статья.

То есть вы агрессивно сейчас утверждаете, что per-cpu idle task aka swapper, достаточно активно упоминаемого в исходниках ядра, не существует? Ну штош...

Я почему-то был уверен, что PID=0 не используется просто для избежания появления уязвимостей, подобно тому, как сейчас не используются нулевые указатели.

PID 0 ничуть не менее и не более уязвим, чем PID 1. Или PID 65535. Потому, что это всего лишь ID. Самое “страшное”, что с ним можно сделать — использовать в качестве индекса, но поскольку массивы в языках, на которых обычно пишут ОС, и так начинаются с 0, то никто никому ничего не сломает.

А нулевые указатели не используются только в пользовательских приложениях для универсальных ОС, где даже указатель со значением 0x00001234 (т.е. откровенно не 0) легко может привести к трапу. Защита памяти — это несколько больше, чем нулевой указатель. А нулевой указатель — это совсем не обязательно нулевые биты.

Для программ, работающих на голом железе, работа с нулевым указателем — нормальное явление.

В ОС FreeBSD процесс с номером 0 очень даже виден и принадлежит ядру операционной системы:

rz@butterfly:~ % ps auxww -p 0
USER PID %CPU %MEM VSZ  RSS TT  STAT STARTED      TIME COMMAND
root   0  0.0  0.0   0 1600  -  DLs  Thu02   101:15.85 [kernel]

А вот процесс idle имеет номер 11.

Подожду еще комментариев, вопрос уже принципиально интересный.
Не верю, что просто скомпилировав с pid_min=0 что-то хорошее получится. Не просто так он стартует один, и где-то на многопоточной конфигурации что-то еще всплывет.

Там как минимум отправка сигналов может отвалиться, 0 и -1 - зарезервированные значения PID для kill.

R в конце забыл

в Unix PID (идентификаторы процессов) начинаются именно с 0!

Ну то есть с 1))

К слову, в windows почти всё то же самое: процесс с PID 0 называется "Бездействие системы", делает что-то когда других процессов для выполнения нет и содержит по два потока на ядро процессора (но TID у каждого потока разный). Интересно, почему в линуксе у этих сделали потоков одинаковый TID?

В операционной системе Linux (и в большинстве UNIX-подобных систем) PID 0 обычно относится к процессу ядра, известному как swapper или sched (планировщик). Этот процесс является первым процессом, который запускается ядром во время инициализации системы, и его задача — управлять процессом планирования задач и свопингом.

Swapper не является настоящим процессом в обычном понимании; скорее, это часть кода ядра, которая выполняет своппинг и управляет планированием процессов. Он не имеет адресного пространства пользователя и никогда не выполняется на уровне пользователя. PID 0 используется также для представления глобального процесса (система в целом) при возвращениирезультатов некоторых системных вызовов.

Помимо PID 0, в Linux также существует процесс с PID 1, называемый init, который запускается непосредственно ядром и отвечает за запуск всех других пользовательских процессов в системе. В современных системах init может быть заменён другими системами инициализации, такими как systemd или Upstart.

Что такое PID 0

Это Packet ID в MPEG2 Transport Stream, зарезервированный для отправки секций таблицы PAT.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории