What is PID 0?
What is the very first PID (Process IDentifier) running on your (Unix-like) operating system? Well, as any professor will answer to you, it is theinit process that runs on PID number one.
Then comes systemd, so, at least in many Linux distributions, the correct answer is it is the systemd process that runs on PID number one.
Unless you discover there could be also a pid 0!
Linux
TL;DR: in Linux it seems there is no PID0 process, so you can quickly get back to your life (or read more on).
% uname -s -r -v
Linux 6.2.0-33-generic #33-Ubuntu SMP PREEMPT_DYNAMIC Tue Sep 5 14:49:19 UTC 2023
% ps -p 0
error: process ID out of range
% ps -p 1
PID TTY TIME CMD
1 ? 00:00:01 systemd
% pstree
systemd─┬─ModemManager───3*[{ModemManager}]
├─NetworkManager───3*[{NetworkManager}]
├─accounts-daemon───3*[{accounts-daemon}]
It is interesting to use
pstree that has the ability to display parents and child of a given pid.
% pstree -p 0
?()-+-kthreadd(2)-+-UVM Tools Event Queue(682)
| |-UVM deferred release queue(663)
| |-UVM global queue(662)
| |-acpi_thermal_pm(88)
| |-ata_sff(77)
| |-blkcg_punt_bio(74)
| |-charger_manager(111)
| |-cpuhp/0(19)
| |-cpuhp/1(20)
| |-cpuhp/2(26)
| |-cpuhp/3(32)
| |-cpuhp/4(38)
| |-cpuhp/5(44)
| |-cpuhp/6(50)
...
| `-zswap-shrink(106)
`-systemd(1)-+-ModemManager(1095)-+-{ModemManager}(1106)
So as you can see, effectively there is a kind of process 0 that is the parent even of
systemd.
FreeBSD
On FreeBSD there is a pid 0 process!% uname -s -r -v
FreeBSD 13.2-RELEASE-p3 FreeBSD 13.2-RELEASE-p3 GENERIC
% ps -p 0
PID TT STAT TIME COMMAND
0 - DLs 0:00.63 [kernel]
% pstree
-+= 00001 root /sbin/init
|--= 00441 root dhclient: system.syslog (dhclient)
|--= 00444 root dhclient: em0 [priv] (dhclient)
|--= 00522 _dhcp dhclient: em0 (dhclient)
|--= 00528 root /sbin/devd
Interesting, isn’t it? While the system is effectively reporting
init as the process parent of every other process in the system (see pstree output), there is effectively a process with PID 0 name [kernel].
The status of the process, DLs means that the process is locked (L) on waiting for disk (D) and is a leader (s).
More information can be obtained asking about threads:
% ps -p 0 -c -H
PID TT STAT TIME COMMAND
0 - DLs 0:20.93 kernel/swapper
0 - DLs 0:00.00 kernel/softirq_0
0 - DLs 0:00.05 kernel/if_io_tqg_0
0 - DLs 0:01.65 kernel/if_config_tqg_0
0 - DLs 0:00.00 kernel/linuxkpi_irq_wq
0 - DLs 0:00.00 kernel/aiod_kick taskq
0 - DLs 0:00.00 kernel/inm_free taskq
0 - DLs 0:00.00 kernel/thread taskq
0 - DLs 0:00.00 kernel/kqueue_ctx taskq
0 - DLs 0:00.00 kernel/in6m_free taskq
0 - DLs 0:00.00 kernel/pci_hp taskq
0 - DLs 0:00.00 kernel/linuxkpi_short_wq_0
0 - DLs 0:00.00 kernel/linuxkpi_short_wq_1
0 - DLs 0:00.00 kernel/linuxkpi_short_wq_2
0 - DLs 0:00.00 kernel/linuxkpi_short_wq_3
0 - DLs 0:00.00 kernel/linuxkpi_long_wq_0
0 - DLs 0:00.00 kernel/linuxkpi_long_wq_1
0 - DLs 0:00.00 kernel/linuxkpi_long_wq_2
0 - DLs 0:00.00 kernel/linuxkpi_long_wq_3
0 - DLs 0:00.00 kernel/firmware taskq
0 - DLs 0:00.00 kernel/crypto
0 - DLs 0:00.00 kernel/acpi_task_0
0 - DLs 0:00.00 kernel/acpi_task_1
0 - DLs 0:00.00 kernel/acpi_task_2
0 - DLs 0:00.00 kernel/CAM taskq
So the pid
0 is low-level stuff (what a definition!), meaning it is the kernel running.