美文网首页
Linux内核学习008——进程管理(四)

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

作者: 若梦儿 | 来源:发表于2019-02-03 21:38 被阅读25次

    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.
    

    待补充。。。

    相关文章

      网友评论

          本文标题:Linux内核学习008——进程管理(四)

          本文链接:https://www.haomeiwen.com/subject/hlsusqtx.html