Linux内核学习008——进程管理(四)

Linux内核学习007——进程管理(四)

进程家族树

Unix系统的进程之间存在一个明显的继承关系,所有的进程都是PID为1的init进程的后代。内核在系统启动的最后阶段启动init进程,然后init进程读取系统的初始化脚本并执行其他的相关程序,最终完成系统启动的整个过程。

在Linux系统中有三个特殊的进程,idle进程(PID=0),init进程(PID=1)和kthreadd(PID=2)。

idle进程由系统创建,运行在内核态,其PID=0。idle前身是系统创建的第一个进程,也是唯一一个没有通过fork()产生的进程。

init进程由idle通过kernel_thread创建,在内核空间完成初始化后,加载init程序(运行在用户空间)。Linux中的所有运行在用户空间的进程都是由init创建并运行的,在系统启动完成后,init将变为守护进程监视其他进程并负责处理孤儿进程(进程还未结束其父进程就已经结束的进程)。

kthread进程由idle通过kernel_thread()创建,并始终运行在内核空间,负责所有内核线程的调度和管理。kthread进程负责管理和调度其他内核线程,所有的内核线程都直接或间接以kthread为父进程。

我们利用ps和pstree来观察一下CentOS6.10系统上的进程。

在终端执行ps -e得到以下结果:

  ps -e
  # 输出如下:
  PID TTY          TIME CMD
     1 ?        00:00:01 init
     2 ?        00:00:00 kthreadd
     3 ?        00:00:00 migration/0
     4 ?        00:00:00 ksoftirqd/0
     5 ?        00:00:00 stopper/0
     6 ?        00:00:00 watchdog/0
     7 ?        00:00:00 migration/1
     8 ?        00:00:00 stopper/1
     9 ?        00:00:00 ksoftirqd/1
    10 ?        00:00:00 watchdog/1
    11 ?        00:00:00 migration/2
    12 ?        00:00:00 stopper/2
    13 ?        00:00:00 ksoftirqd/2
    14 ?        00:00:00 watchdog/2
    15 ?        00:00:00 migration/3
    16 ?        00:00:00 stopper/3
    17 ?        00:00:00 ksoftirqd/3
    18 ?        00:00:00 watchdog/3
    19 ?        00:00:03 events/0
    20 ?        00:00:00 events/1
    21 ?        00:00:00 events/2
    22 ?        00:00:00 events/3
    23 ?        00:00:00 events/0
    24 ?        00:00:00 events/1
    25 ?        00:00:00 events/2
    26 ?        00:00:00 events/3
    27 ?        00:00:00 events_long/0
    28 ?        00:00:00 events_long/1
    29 ?        00:00:00 events_long/2
    30 ?        00:00:00 events_long/3
    31 ?        00:00:00 events_power_ef
    32 ?        00:00:00 events_power_ef
    33 ?        00:00:00 events_power_ef
    34 ?        00:00:00 events_power_ef
    35 ?        00:00:00 cgroup
    36 ?        00:00:00 khelper
    37 ?        00:00:00 netns
    38 ?        00:00:00 async/mgr
    39 ?        00:00:00 pm
    40 ?        00:00:00 sync_supers
    41 ?        00:00:00 bdi-default
    42 ?        00:00:00 kintegrityd/0
    43 ?        00:00:00 kintegrityd/1
    44 ?        00:00:00 kintegrityd/2
    45 ?        00:00:00 kintegrityd/3
    46 ?        00:00:00 kblockd/0
    47 ?        00:00:00 kblockd/1
    48 ?        00:00:00 kblockd/2
    49 ?        00:00:00 kblockd/3
    50 ?        00:00:00 kacpid
    51 ?        00:00:00 kacpi_notify
    52 ?        00:00:00 kacpi_hotplug
    53 ?        00:00:00 ata_aux
    54 ?        00:00:00 ata_sff/0
    55 ?        00:00:00 ata_sff/1
    56 ?        00:00:00 ata_sff/2
    57 ?        00:00:00 ata_sff/3
    58 ?        00:00:00 ksuspend_usbd
    59 ?        00:00:00 khubd
    60 ?        00:00:00 kseriod
    61 ?        00:00:00 md/0
    62 ?        00:00:00 md/1
    63 ?        00:00:00 md/2
    64 ?        00:00:00 md/3
    65 ?        00:00:00 md_misc/0
    66 ?        00:00:00 md_misc/1
    67 ?        00:00:00 md_misc/2
    68 ?        00:00:00 md_misc/3
    69 ?        00:00:00 linkwatch
    72 ?        00:00:00 khungtaskd
    73 ?        00:00:00 lru-add-drain/0
    74 ?        00:00:00 lru-add-drain/1
    75 ?        00:00:00 lru-add-drain/2
    76 ?        00:00:00 lru-add-drain/3
    77 ?        00:00:00 kswapd0
    78 ?        00:00:00 ksmd
    79 ?        00:00:00 khugepaged
    80 ?        00:00:00 aio/0
    81 ?        00:00:00 aio/1
    82 ?        00:00:00 aio/2
    83 ?        00:00:00 aio/3
    84 ?        00:00:00 crypto/0
    85 ?        00:00:00 crypto/1
    86 ?        00:00:00 crypto/2
    87 ?        00:00:00 crypto/3
    94 ?        00:00:00 kthrotld/0
    95 ?        00:00:00 kthrotld/1
    96 ?        00:00:00 kthrotld/2
    97 ?        00:00:00 kthrotld/3
    98 ?        00:00:00 pciehpd
   100 ?        00:00:00 kpsmoused
   101 ?        00:00:00 usbhid_resumer
   102 ?        00:00:00 deferwq
   135 ?        00:00:00 kdmremove
   136 ?        00:00:00 kstriped
   316 ?        00:00:00 scsi_eh_0
   317 ?        00:00:00 scsi_eh_1
   403 ?        00:00:00 mpt_poll_0
   404 ?        00:00:00 mpt/0
   405 ?        00:00:00 scsi_eh_2
   464 ?        00:00:00 kdmflush
   466 ?        00:00:00 kdmflush
   532 ?        00:00:00 jbd2/dm-0-8
   533 ?        00:00:00 ext4-dio-unwrit
   639 ?        00:00:00 udevd
   806 ?        00:00:00 vmmemctl
  1241 ?        00:00:00 kdmflush
  1287 ?        00:00:00 jbd2/sda1-8
  1288 ?        00:00:00 ext4-dio-unwrit
  1289 ?        00:00:00 jbd2/dm-2-8
  1290 ?        00:00:00 ext4-dio-unwrit
  1312 ?        00:00:00 flush-253:0
  1343 ?        00:00:00 kauditd
  1402 ?        00:00:00 ib_addr
  1407 ?        00:00:00 infiniband/0
  1408 ?        00:00:00 infiniband/1
  1409 ?        00:00:00 infiniband/2
  1410 ?        00:00:00 infiniband/3
  1419 ?        00:00:00 ib_mcast
  1424 ?        00:00:00 iw_cm_wq
  1429 ?        00:00:00 ib_cm/0
  1430 ?        00:00:00 ib_cm/1
  1431 ?        00:00:00 ib_cm/2
  1432 ?        00:00:00 ib_cm/3
  1437 ?        00:00:00 rdma_cm
  1458 ?        00:00:00 ipoib_flush
  1651 ?        00:00:00 auditd
  1685 ?        00:00:00 rsyslogd
  1719 ?        00:00:00 irqbalance
  1744 ?        00:00:00 rpcbind
  1764 ?        00:00:00 dbus-daemon
  1779 ?        00:00:00 NetworkManager
  1786 ?        00:00:00 modem-manager
  1802 ?        00:00:00 rpc.statd
  1840 ?        00:00:00 cupsd
  1843 ?        00:00:00 wpa_supplicant
  1875 ?        00:00:00 acpid
  1887 ?        00:00:00 hald
  1888 ?        00:00:00 hald-runner
  1930 ?        00:00:00 hald-addon-inpu
  1953 ?        00:00:00 hald-addon-acpi
  1962 ?        00:00:00 automount
  2127 ?        00:00:00 sshd
  2138 ?        00:00:00 ntpd
  2225 ?        00:00:00 master
  2236 ?        00:00:00 pickup
  2237 ?        00:00:00 qmgr
  2243 ?        00:00:06 vmtoolsd
  2296 ?        00:00:00 abrtd
  2330 ?        00:00:00 ksmtuned
  2343 ?        00:00:00 crond
  2358 ?        00:00:00 atd
  2375 ?        00:00:00 libvirtd
  2491 ?        00:00:00 dnsmasq
  2493 ?        00:00:00 certmonger
  2521 ?        00:00:00 gdm-binary
  2528 tty2     00:00:00 mingetty
  2530 tty3     00:00:00 mingetty
  2532 tty4     00:00:00 mingetty
  2534 tty5     00:00:00 mingetty
  2536 tty6     00:00:00 mingetty
  2544 ?        00:00:00 udevd
  2545 ?        00:00:00 udevd
  2589 ?        00:00:00 gdm-simple-slav
  2594 tty1     00:00:09 Xorg
  2648 ?        00:00:00 console-kit-dae
  2718 ?        00:00:00 dbus-launch
  2724 ?        00:00:00 devkit-power-da
  2767 ?        00:00:00 polkitd
  2776 ?        00:00:00 rtkit-daemon
  2783 ?        00:00:00 gdm-session-wor
  2793 ?        00:00:00 gnome-keyring-d
  2803 ?        00:00:00 gnome-session
  2811 ?        00:00:00 dbus-launch
  2812 ?        00:00:00 dbus-daemon
  2887 ?        00:00:00 gconfd-2
  2891 ?        00:00:00 gnome-settings-
  2901 ?        00:00:00 gvfsd
  2906 ?        00:00:00 seahorse-daemon
  2908 ?        00:00:00 metacity
  2912 ?        00:00:07 pulseaudio
  2913 ?        00:00:00 gnome-panel
  2924 ?        00:00:00 gconf-helper
  2926 ?        00:00:01 nautilus
  2932 ?        00:00:00 bonobo-activati
  2937 ?        00:00:00 wnck-applet
  2940 ?        00:00:00 trashapplet
  2942 ?        00:00:00 gvfs-gdu-volume
  2944 ?        00:00:00 udisks-daemon
  2945 ?        00:00:00 udisks-daemon
  2951 ?        00:00:00 gvfsd-trash
  2954 ?        00:00:00 nm-applet
  2955 ?        00:00:05 vmtoolsd
  2956 ?        00:00:00 restorecond
  2957 ?        00:00:00 polkit-gnome-au
  2960 ?        00:00:00 gvfs-afc-volume
  2961 ?        00:00:00 gnome-volume-co
  2967 ?        00:00:00 abrt-applet
  2968 ?        00:00:00 python
  2970 ?        00:00:00 im-settings-dae
  2993 ?        00:00:00 gnome-power-man
  3012 ?        00:00:00 bluetooth-apple
  3019 ?        00:00:00 gpk-update-icon
  3039 ?        00:00:00 gdu-notificatio
  3058 ?        00:00:00 gnome-screensav
  3131 ?        00:00:00 gvfs-gphoto2-vo
  3145 ?        00:00:00 gconf-im-settin
  3154 ?        00:00:00 gnote
  3156 ?        00:00:00 clock-applet
  3158 ?        00:00:00 gdm-user-switch
  3160 ?        00:00:00 notification-ar
  3183 ?        00:00:00 gvfsd-metadata
  3189 ?        00:00:00 gvfsd-burn
  3197 ?        00:00:02 gnome-terminal
  3198 ?        00:00:00 gnome-pty-helpe
  3224 ?        00:00:00 dhclient
  3344 pts/1    00:00:00 bash
  3775 ?        00:00:00 flush-253:2
  3810 ?        00:00:00 packagekitd
  3834 ?        00:00:00 anacron
  4011 ?        00:00:00 sleep
  4012 pts/1    00:00:00 ps
  4013 pts/1    00:00:00 xsel

pstree能够帮助我们展示进程树,更直观地观察进程间的关系。

观察用户空间进程树:pstree 1

pstree 1
# 输出如下:
init-+-NetworkManager-+-dhclient
     |                `-{NetworkManager}
     |-abrtd
     |-acpid
     |-anacron
     |-atd
     |-auditd---{auditd}
     |-automount---4*[{automount}]
     |-bonobo-activati---{bonobo-activat}
     |-certmonger
     |-clock-applet
     |-console-kit-dae---63*[{console-kit-da}]
     |-crond
     |-cupsd
     |-2*[dbus-daemon---{dbus-daemon}]
     |-2*[dbus-launch]
     |-devkit-power-da
     |-dnsmasq
     |-gconf-im-settin
     |-gconfd-2
     |-gdm-binary-+-gdm-simple-slav-+-Xorg---4*[{Xorg}]
     |            |                 |-gdm-session-wor-+-gnome-session-+-abrt-applet
     |            |                 |                 |               |-bluetooth-apple
     |            |                 |                 |               |-gdu-notificatio
     |            |                 |                 |               |-gnome-panel
     |            |                 |                 |               |-gnome-power-man
     |            |                 |                 |               |-gnome-volume-co
     |            |                 |                 |               |-gpk-update-icon
     |            |                 |                 |               |-metacity---{metacity}
     |            |                 |                 |               |-nautilus
     |            |                 |                 |               |-nm-applet
     |            |                 |                 |               |-polkit-gnome-au
     |            |                 |                 |               |-python
     |            |                 |                 |               |-restorecond
     |            |                 |                 |               `-{gnome-session}
     |            |                 |                 `-{gdm-session-wo}
     |            |                 `-{gdm-simple-sla}
     |            `-{gdm-binary}
     |-gdm-user-switch
     |-gnome-keyring-d---2*[{gnome-keyring-}]
     |-gnome-screensav
     |-gnome-settings----{gnome-settings}
     |-gnome-terminal-+-bash---man---sh---sh---less
     |                |-bash-+-pstree
     |                |      `-xsel
     |                |-gnome-pty-helpe
     |                `-{gnome-terminal}
     |-gnote
     |-gvfs-afc-volume---{gvfs-afc-volum}
     |-gvfs-gdu-volume
     |-gvfs-gphoto2-vo
     |-gvfsd
     |-gvfsd-burn
     |-gvfsd-metadata
     |-gvfsd-trash
     |-hald-+-hald-runner-+-hald-addon-acpi
     |      |             `-hald-addon-inpu
     |      `-{hald}
     |-im-settings-dae
     |-irqbalance
     |-ksmtuned---sleep
     |-libvirtd---10*[{libvirtd}]
     |-master-+-pickup
     |        `-qmgr
     |-5*[mingetty]
     |-modem-manager
     |-notification-ar
     |-ntpd
     |-polkitd
     |-pulseaudio-+-gconf-helper
     |            `-2*[{pulseaudio}]
     |-rpc.statd
     |-rpcbind
     |-rsyslogd---3*[{rsyslogd}]
     |-rtkit-daemon---2*[{rtkit-daemon}]
     |-seahorse-daemon
     |-sshd
     |-trashapplet
     |-udevd---2*[udevd]
     |-udisks-daemon-+-udisks-daemon
     |               `-{udisks-daemon}
     |-vmtoolsd---{vmtoolsd}
     |-vmtoolsd
     |-wnck-applet
     `-wpa_supplicant

观察内核空间进程树:pstree 2

pstree 2
# 输出如下:
kthreadd-+-aio/0
         |-aio/1
         |-aio/2
         |-aio/3
         |-async/mgr
         |-ata_aux
         |-ata_sff/0
         |-ata_sff/1
         |-ata_sff/2
         |-ata_sff/3
         |-bdi-default
         |-cgroup
         |-crypto/0
         |-crypto/1
         |-crypto/2
         |-crypto/3
         |-deferwq
         |-2*[events/0]
         |-2*[events/1]
         |-2*[events/2]
         |-2*[events/3]
         |-events_long/0
         |-events_long/1
         |-events_long/2
         |-events_long/3
         |-4*[events_power_ef]
         |-3*[ext4-dio-unwrit]
         |-flush-253:0
         |-flush-253:2
         |-ib_addr
         |-ib_cm/0
         |-ib_cm/1
         |-ib_cm/2
         |-ib_cm/3
         |-ib_mcast
         |-infiniband/0
         |-infiniband/1
         |-infiniband/2
         |-infiniband/3
         |-ipoib_flush
         |-iw_cm_wq
         |-jbd2/dm-0-8
         |-jbd2/dm-2-8
         |-jbd2/sda1-8
         |-kacpi_hotplug
         |-kacpi_notify
         |-kacpid
         |-kauditd
         |-kblockd/0
         |-kblockd/1
         |-kblockd/2
         |-kblockd/3
         |-3*[kdmflush]
         |-kdmremove
         |-khelper
         |-khubd
         |-khugepaged
         |-khungtaskd
         |-kintegrityd/0
         |-kintegrityd/1
         |-kintegrityd/2
         |-kintegrityd/3
         |-kpsmoused
         |-kseriod
         |-ksmd
         |-ksoftirqd/0
         |-ksoftirqd/1
         |-ksoftirqd/2
         |-ksoftirqd/3
         |-kstriped
         |-ksuspend_usbd
         |-kswapd0
         |-kthrotld/0
         |-kthrotld/1
         |-kthrotld/2
         |-kthrotld/3
         |-linkwatch
         |-lru-add-drain/0
         |-lru-add-drain/1
         |-lru-add-drain/2
         |-lru-add-drain/3
         |-md/0
         |-md/1
         |-md/2
         |-md/3
         |-md_misc/0
         |-md_misc/1
         |-md_misc/2
         |-md_misc/3
         |-migration/0
         |-migration/1
         |-migration/2
         |-migration/3
         |-mpt/0
         |-mpt_poll_0
         |-netns
         |-pciehpd
         |-pm
         |-rdma_cm
         |-scsi_eh_0
         |-scsi_eh_1
         |-scsi_eh_2
         |-stopper/0
         |-stopper/1
         |-stopper/2
         |-stopper/3
         |-sync_supers
         |-usbhid_resumer
         |-vmmemctl
         |-watchdog/0
         |-watchdog/1
         |-watchdog/2
         `-watchdog/3

init进程

我们可以在CentOS的/sbin目录下发现init的可执行文件,通过rpm -qf init查询出其所属的软件包为upstart-0.6.5-17.el6.x86_64。

接着,通过rpm info upstart查询其相关信息,得到以下结果:

Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: mirrors.nju.edu.cn
 * epel: mirrors.aliyun.com
 * extras: mirrors.163.com
 * updates: mirrors.163.com
Installed Packages
Name        : upstart
Arch        : x86_64
Version     : 0.6.5
Release     : 17.el6
Size        : 554 k
Repo        : installed
From repo   : anaconda-CentOS-201806291108.x86_64
Summary     : An event-driven init system
URL         : http://upstart.ubuntu.com
License     : GPLv2 and LGPLv2+
Description : Upstart is an event-based replacement for the /sbin/init daemon
            : which handles starting of tasks and services during boot, stopping
            : them during shutdown and supervising them while the system is
            : running.

待补充。。。

猜你喜欢

转载自blog.csdn.net/weixin_34218579/article/details/86821381