操作系統進程的概念:
計算機操作系統實質上就是一系列運行在內核和內核上的進程所組成,操作系統的各項功能也是由操作系統來組成的,內核進程和普通用戶進程的區別就在於二者的運行空間不同:
內核進程:運行在內核空間
用戶進程:運行在用防護空間
進程運行時會所需的數據和指令調入內存,此後,指令裝入cpu寄存器,由cpu根據指令調用內存中的數據進行操作。在這操作的過程中,如果發現需要對硬件進行操作,則會向內核提出申請(進程通過系統調用【syscall】向內核發起申請),進入內核模式,因為只有內核能操作硬件。 內核接受這個請求之後便會轉入內核模式,對應進程的指令此時就從cpu中退出執行,內核為其保留了狀態信息(進程id,進程名稱,執行到指令步驟),完成硬件操作之後,由內核模式退出至用戶模式繼續執行進程剩余指令,最終向用戶返回執行結果。
同時每個進程還有對應的cpu時間,當cpu時間耗盡時也會退出cpu執行,並保存現場,裝載其他的指令執行,待輪到這個指令執行的時候回復現場,接著上次執行的位置開始。
進程自己執行的時候是在內存中的,進程的描述信息放在內核中,內核為每個進程維護這一個內核數據結構(task structure)該數據結構保存了進程的相關信息,如:進程父id,進程id,進程名稱,執行到那條指令,使用內存信息等。進程具體執行的時候,內核會通過“任務結構:task structure”保存的狀態信息到內存中找到相應的指令(即上次保存現場退出後最後執行的指令 )載入到cpu重新開始執行,這過程也叫恢復現場。
只有當進程運行完畢以後,才會釋放對應的內存空間,內核維護的任務結構才會銷毀。
進程狀態:
[code]Sopped:處於停止狀態的進程 Ready:就緒,輪到該進程的時候能馬上到CPU上運行 Executing:運行中的進程
[code]Uninterruptible:不可中斷的睡眠狀態。如一個正在運行的進程,需要打開一個文件,此時會產生磁盤的IO請求,由於磁盤的IO速度較慢,此時進程會交出CPU,進入到睡眠狀態,一直等到文件打開完畢後,才會重新喚醒該進程,調度到CPU上繼續運行。若所需文件未打開,即使是手動調度到CPU上,該進程也不會運行。所以這種睡眠稱為不可中斷 Interruptible:可中斷的睡眠狀態。進程由於空閒而進入睡眠狀態,如數據庫進程,當執行完一個用戶的請求後,該進程處於空閒狀態,但數據庫進程又不能退出(數據庫進程以守護進程的模式運行)需要等待其他用戶的請求到達,從而進入睡眠狀態,當其他用戶的請求到達時被重新喚醒調度到CPU上運行,這種睡眠稱為可中斷睡眠 Zombie:僵屍進程,進程運行完畢之後內存空間並沒有釋放,並且已經弄不清到底占據了哪些內存空間。會造成內存洩露
在linux中,所有的進程都是init的子進程,而init進程是由內核負責生成,其他的所有進程都是由init負責生成
linux進程樹查看:
pstree:
[code][root@localhost 桌面]# pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─abrt-dbus───2*[{abrt-dbus}] ├─2*[abrt-watch-log] ├─abrtd ├─accounts-daemon───2*[{accounts-daemon}] ├─alsactl ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon} │ └─3*[{at-spi-bus-laun}] ├─at-spi2-registr───{at-spi2-registr} ├─atd ├─auditd─┬─audispd─┬─sedispatch │ │ └─{audispd} │ └─{auditd} ├─avahi-daemon───avahi-daemon ├─bluetoothd ├─caribou───2*[{caribou}] ├─chronyd ├─colord───2*[{colord}] ├─crond ├─cupsd ├─2*[dbus-daemon───{dbus-daemon}] ├─dbus-launch ├─dnsmasq───dnsmasq ├─evolution-calen───6*[{evolution-calen}] ├─evolution-sourc───2*[{evolution-sourc}] ├─firewalld───{firewalld} ├─gconfd-2 ├─gdm─┬─Xorg │ ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet───{abrt-applet} │ │ │ ├─gnome-settings-───4*[{gnome-settings-}] │ │ │ ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}] │ │ │ │ │ ├─ibus-engine-sim───2*[{ibus-engine-sim}] │ │ │ │ │ └─2*[{ibus-daemon}] │ │ │ │ └─7*[{gnome-shell}] │ │ │ ├─gnome-software───3*[{gnome-software}] │ │ │ ├─nautilus───4*[{nautilus}] │ │ │ ├─rhsm-icon───{rhsm-icon} │ │ │ ├─seapplet │ │ │ ├─ssh-agent │ │ │ ├─tracker-extract───13*[{tracker-extract}] │ │ │ ├─tracker-miner-a───{tracker-miner-a} │ │ │ ├─tracker-miner-f───3*[{tracker-miner-f}] │ │ │ ├─tracker-miner-u───{tracker-miner-u} │ │ │ └─3*[{gnome-session}] │ │ └─2*[{gdm-session-wor}] │ └─3*[{gdm}] ├─gnome-keyring-d───4*[{gnome-keyring-d}] ├─gnome-shell-cal───4*[{gnome-shell-cal}] ├─gnome-terminal-─┬─bash───pstree │ ├─gnome-pty-helpe │ └─3*[{gnome-terminal-}] ├─goa-daemon───3*[{goa-daemon}] ├─goa-identity-se───2*[{goa-identity-se}] ├─gsd-printer───{gsd-printer} ├─gssproxy───5*[{gssproxy}] ├─gvfs-afc-volume───2*[{gvfs-afc-volume}] ├─gvfs-goa-volume───{gvfs-goa-volume} ├─gvfs-gphoto2-vo───{gvfs-gphoto2-vo} ├─gvfs-mtp-volume───{gvfs-mtp-volume} ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}] ├─gvfsd───{gvfsd} ├─gvfsd-fuse───4*[{gvfsd-fuse}] ├─gvfsd-trash───2*[{gvfsd-trash}] ├─ibus-x11───2*[{ibus-x11}] ├─ksmtuned───sleep ├─libvirtd───15*[{libvirtd}] ├─lsmd ├─lvmetad ├─master─┬─pickup │ └─qmgr ├─mission-control───2*[{mission-control}] ├─packagekitd───2*[{packagekitd}] ├─polkitd───5*[{polkitd}] ├─pulseaudio───2*[{pulseaudio}] ├─rhnsd ├─rhsmcertd ├─rngd ├─rsyslogd───2*[{rsyslogd}] ├─rtkit-daemon───2*[{rtkit-daemon}] ├─smartd ├─sshd ├─systemd-hostnam ├─systemd-journal ├─systemd-localed ├─systemd-logind ├─systemd-udevd ├─tracker-store───7*[{tracker-store}] ├─tuned───4*[{tuned}] ├─udisksd───4*[{udisksd}] ├─upowerd───2*[{upowerd}] ├─vmtoolsd───{vmtoolsd} ├─vmtoolsd └─wpa_supplicant 從上面的進程樹中可以看出,進程之間是有主從關系的linux進程是有優先級的,優先級的取值范圍是0-139,數字越小優先級越高,140個優先級之中,用戶可控的是100-139,而從0-99是內核調整操控的,高的優先級進程可以獲得更多的cpu運行時間,更優先的運行機會。
進程的NICE值(調節進程的nice值來調整進程的優先級)
[code] NICE值:-20-19來對應100-139,NICE值越小優先級越高 普通用戶只能調大自己進程的NICE值,即調低進程的優先級,root用戶可以隨意調整 每個進程都有一個PID,process id ,進程ID 每個進程的相關信息都保存在/proc目錄,在這個目錄下會有一個與進程id相同的目錄,用來保存這個進程的相關信息: [root@localhost 桌面]# ls -l /proc/ 總用量 0 dr-xr-xr-x. 9 root root 0 5月 20 11:30 1 dr-xr-xr-x. 9 root root 0 5月 20 11:30 10 dr-xr-xr-x. 9 root root 0 5月 20 11:30 100 dr-xr-xr-x. 9 root root 0 5月 20 11:31 1000 dr-xr-xr-x. 9 root root 0 5月 20 11:31 1001 dr-xr-xr-x. 9 rtkit rtkit 0 5月 20 11:31 1003 dr-xr-xr-x. 9 root root 0 5月 20 11:31 1006 dr-xr-xr-x. 9 root root 0 5月 20 11:30 101 dr-xr-xr-x. 9 root root 0 5月 20 11:31 1011 dr-xr-xr-x. 9 avahi avahi 0 5月 20 11:31 1013 dr-xr-xr-x. 9 root root 0 5月 20 11:31 1015 dr-xr-xr-x. 9 root root 0 5月 20 11:31 1016 dr-xr-xr-x. 9 dbus dbus 0 5月 20 11:31 1017 dr-xr-xr-x. 9 root root 0 5月 20 11:30 102 dr-xr-xr-x. 9 root root 0 5月 20 11:30 103 dr-xr-xr-x. 9 avahi avahi 0 5月 20 11:32 1032 dr-xr-xr-x. 9 root root 0 5月 20 11:30 104 dr-xr-xr-x. 9 root root 0 5月 20 11:30 105 dr-xr-xr-x. 9 root root 0 5月 20 11:31 1057 dr-xr-xr-x. 9 root root 0 5月 20 11:31 1058 dr-xr-xr-x. 9 root root 0 5月 20 11:30 106 dr-xr-xr-x. 9 root root 0 5月 20 11:31 1067 dr-xr-xr-x. 9 polkitd polkitd 0 5月 20 11:31 1069 dr-xr-xr-x. 9 root root 0 5月 20 11:30 107 dr-xr-xr-x. 9 root root 0 5月 20 11:30 108 dr-xr-xr-x. 9 root root 0 5月 20 11:30 109 dr-xr-xr-x. 9 root root 0 5月 20 11:30 11 dr-xr-xr-x. 9 root root 0 5月 20 11:30 110 dr-xr-xr-x. 9 root root 0 5月 20 11:30 111 dr-xr-xr-x. 9 root root 0 5月 20 11:30 112 dr-xr-xr-x. 9 root root 0 5月 20 11:30 113 ......進入上述的目錄之一:
[code][root@localhost 桌面]# ls /proc/1270 attr clear_refs cpuset fd limits mem net oom_score projid_map setgroups statm timers autogroup cmdline cwd fdinfo loginuid mountinfo ns oom_score_adj root smaps status uid_map auxv comm environ gid_map map_files mounts numa_maps pagemap sched stack syscall wchan cgroup coredump_filter exe io maps mountstats oom_adj personality sessionid stat task需要注意的是這個目錄中的信息並不是實際存在於磁盤上的信息,他們是內核信息的映射,相當於一種狀態信息。
2.內存相關信息
[code]保存於/proc/meminfo [root@localhost 桌面]# cat /proc/meminfo MemTotal: 1868660 kB MemFree: 716996 kB MemAvailable: 1044368 kB Buffers: 1304 kB Cached: 423836 kB SwapCached: 0 kB Active: 475076 kB Inactive: 309012 kB Active(anon): 359780 kB Inactive(anon): 9888 kB Active(file): 115296 kB Inactive(file): 299124 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 358968 kB Mapped: 108548 kB Shmem: 10720 kB Slab: 106844 kB SReclaimable: 51152 kB SUnreclaim: 55692 kB KernelStack: 12416 kB PageTables: 23972 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 3031476 kB Committed_AS: 2364568 kB VmallocTotal: 34359738367 kB VmallocUsed: 173160 kB VmallocChunk: 34359561060 kB HardwareCorrupted: 0 kB AnonHugePages: 110592 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 104320 kB DirectMap2M: 1992704 kB DirectMap1G: 0 kB3.cpu信息
[code]保存於/proc/cpuinfo [root@localhost 桌面]# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 60 model name : Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz stepping : 3 microcode : 0x1e cpu MHz : 2401.000 cache size : 6144 KB physical id : 0 siblings : 1 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm ida arat epb pln pts dtherm fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt bogomips : 4802.00 clflush size : 64 cache_alignment : 64 address sizes : 42 bits physical, 48 bits virtual power management: