1. 程式人生 > 實用技巧 >652【畢設課設】基於微控制器糧倉溫溼度檢測控制系統設計

652【畢設課設】基於微控制器糧倉溫溼度檢測控制系統設計

簡介

什麼是程序(Process)

  • 程序是一個在系統中執行的程式
  • 程序是已啟動的可執行程式的執行例項,程序有以下組成部分:
    • 已分配記憶體的地址空間
    • 安全屬性,包括所有權憑據和特權
    • 程序程式碼的一個或多個執行執行緒
    • 程序狀態

程式:二進位制檔案,靜態,如/bin/date,/usr/sbin/httpd,/usr/sbin/sshd

程序:是程式執行的過程,動態,有生命週期及執行狀態

程序型別

守護程序:在系統引導過程中啟動的程序,跟終端無關的程序

前臺程序:跟終端相關,通過終端啟動的程序

程序的生命週期

父程序複製自己的地址空間(fork)建立一個新的(子)程序結構。每個新程序分配一個唯一的程序ID(PID),滿足跟蹤安全性之需。PID和父程序ID(PPID)是子程序環境的元素,任何程序都可以建立子程序,所有程序都是第一個系統程序的後代:

centos5/6:init
centos7: systemd

程序狀態

在多工處理作業系統中,每個CPU(或核心)在一個時間點上只能處理一個程序。在程序執行時,它對CPU時間和資源分配的要求會不斷變化,從而為程序分配一個狀態,它隨著環境要求而改變。

  • R執行狀態(runing): 表明程序要麼在執行中要麼在執行佇列裡,並不意味著程序一定在執行中。
  • S睡眠狀態(sleeping):意味著程序在等待事件的完成(這裡的睡眠有時候也叫做可中斷睡眠)
  • D磁碟睡眠狀態(Disk sleep): 有時候也叫做不可中斷睡眠,在這個狀態的程序通常會等待IO的結束
  • T停止狀態(stopped):可以通過傳送SIGSTOP訊號給程序來停止(T)程序。這個被暫停的程序可以通過傳送SIGCNT訊號讓程序繼續執行。
  • Z殭屍狀態(zombie):通知父程序回收所有的資源
  • X死亡狀態(dead):這個狀態只是一個返回狀態,你不會在任務列表裡看到這個狀態。

程序檢測

ps

靜態檢視程序,注意: ps -aux 不同於ps aux

常用組合:aux
u:以使用者為中心組織程序狀態資訊顯示
a:與終端相關的程序;
x:與終端無關的程序;
[root@SER2 ~]# ps -uax
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
使用者 程序ID CPU佔用 記憶體佔用
VSZ:Virtual memory SiZe 虛擬記憶體集
RSS:ReSident Size 常駐記憶體集———其他的都可以放入交換記憶體中
STAT:程序狀態
R:running
S:interruptable sleeping
D:uninterruptable sleeping
T:stopped
Z:zombie
  +:前臺程序
  l:多執行緒程序
  N:低優先順序程序
  <:高優先順序程序
  s:session leader
START:啟動時間
TIME:執行佔據cpu的累積時長
COMMAND:由哪個命令來啟動的相關程序
常用組合:ps -ef
-e:顯示所有程序
-f:顯示完整格式程式資訊
常用組合:ps -eFH
-F:顯示完成格式的程序資訊
-H:以程序層級格式顯示程序相關資訊
常用組合:eo,axo
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
-axo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wcha n:14,comm
ni:nice值
pri:priority,優先順序
psr:processor,CPU
rtprio:實時優先順序
[root@SER2 ~]# ps aux |less
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.3  0.3 125208  3688 ?        Ss   21:19   0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2  0.0  0.0      0     0 ?        S    21:19   0:00 [kthreadd]
USER 執行程序的使用者
PID 程序ID
%CPU CPU佔用率
%MEM 記憶體佔用率
VSZ 佔用虛擬記憶體
RSS 佔用實際記憶體 駐留記憶體
TTY 程式執行的終端
STAT 程序狀態 man ps(/STATE)
  R 執行
  S 可中斷睡眠 Sleep
  D 不可中斷睡眠
  T 停止的程序
  Z 殭屍程序
  X 死掉的程序
  Ss s程序的領導者,父程序
  S< <優先順序較高的程序
  SN N優先順序較低的程序
  R+ +表示是前臺的程序組
  Sl 以執行緒的方式執行
START 程序的啟動時間
TIME 程序佔用CPU的總時間
COMMAND 程序檔案,程序名
[root@SER2 ~]# ps aux --sort %cpu |less # 按照CPU使用率排序
[root@SER2 ~]# ps aux --sort -%cpu |less
[root@SER2 ~]# ps aux --sort rss |less
[root@SER2 ~]# ps aux --sort -rss |less
[root@xwz ~]# yum -y install httpd
[root@xwz ~]# systemctl start httpd
[root@xwz ~]# ps auxf |grep httpd # 按照父子程序層級顯示
root 29276 0.0 0.0 112724 988 pts/1 S+ 14:25 0:00 \_grep --color=auto httpd
root 29267 0.2 0.2 230408 5192 ? Ss 14:24 0:00/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00 \_/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00 \_/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00 \_/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00 \_/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00 \_/usr/sbin/httpd -DFOREGROUND
[root@xwz ~]# ps -ef # 精簡顯示

自定義顯示欄位

[root@xwz ~]# ps axo user,pid,ppid,%mem,%cpu,command --sort -%cpu |less

檢視指定程序的PID

[root@xwz ~]# cat /run/sshd.pid
[root@xwz ~]# ps aux |grep sshd
[root@xwz ~]# pgrep -l sshd
[root@xwz ~]# pidof sshd

檢視程序樹

[root@xwz ~]# pstree

top

[root@xwz ~]# top
[root@xwz ~]# top -d 1 # 一秒鐘重新整理一次
[root@xwz ~]# top -d 1 -p 6995 # 檢視指定PID
[root@xwz ~]# top -d 1 -p 6995,1 # 檢視多個PID程序
[root@xwz ~]# top -d 1 -u apache # 檢視指定使用者的程序
[root@xwz ~]# top -d 1 -b -n 2 > top.txt # 將2次top資訊寫入到檔案

第1行:系統時間、執行時間、登入終端數、系統負載(三個數值分別為1分鐘、5分鐘、15分鐘內的平均值,數值越小意味著負載越低)。
第2行:程序總數、執行中的程序數、睡眠中的程序數、停止的程序數、僵死的程序數。
第3行:使用者佔用資源百分比、系統核心佔用資源百分比、改變過優先順序的程序資源百分比、空閒的資源百分比等。
第4行:實體記憶體總量、記憶體使用量、記憶體空閒量、作為核心快取的記憶體量。
第5行:虛擬記憶體總量、虛擬記憶體使用量、虛擬記憶體空閒量、已被提前載入的記憶體量。
程序資訊
h|? 幫助
M 按記憶體的使用排序
P 按CPU使用排序
N 以PID的大小排序
R 對排序進行反轉
f 自定義顯示欄位
1 顯示所有CPU的負載
k 輸入訊號
< 向前
> 向後
z 彩色
W 儲存top環境設定 ~/.toprc

程序控制

使用訊號控制程序

[root@xwz ~]# kill -l # 列出所有支援的訊號
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
編號 訊號名 作用
1 SIGHUP 重新載入配置
2 SIGINT 鍵盤中斷^C
3 SIGQUIT 鍵盤退出
9 SIGKILL 強制終止
15 SIGTERM 終止(正常結束),預設訊號
18 SIGCONT 繼續
19 SIGSTOP 停止
20 SIGTSTP 暫停^Z
[root@localhost ~]# ps aux | grep sshd
root        929  0.0  0.4 105996  4080 ?        Ss   21:19   0:00 /usr/sbin/sshd -D
root       1077  0.0  0.5 148316  5376 ?        Ss   21:22   0:00 sshd: root@pts/0
root       1132  0.0  0.0 112676   980 pts/0    R+   21:35   0:00 grep --color=auto sshd
[root@xwz ~]# kill -1 929 # 重新載入配置檔案

案例1:訊號測試1和15

[root@xwz ~]# ps aux |grep crond
root 7004 0.0 0.0 126284 1704 ? Ss 9月09 0:01 /usr/sbin/crond-n
root 32021 0.0 0.0 112728 988 pts/1 S+ 19:06 0:00 grep --color=auto crond
[root@xwz ~]# kill -1 7004
[root@xwz ~]# ps aux |grep crond
root 7004 0.0 0.0 126284 1704 ? Ss 9月09 0:01 /usr/sbin/crond-n
root 32023 0.0 0.0 112728 984 pts/1 S+ 19:06 0:00 grep --color=auto crond
[root@xwz ~]# kill 7004
[root@xwz ~]# systemctl start crond
[root@xwz ~]# ps aux |grep crond
root 32031 11.2 0.0 126284 1692 ? Ss 19:07 0:00/usr/sbin/crond -n
root 32033 0.0 0.0 112724 984 pts/1 S+ 19:07 0:00 grep --color=auto crond

案例2:訊號測試9和15

[root@xwz ~]# touch file1 file2
[root@xwz ~]# tty
/dev/pts/1
[root@xwz ~]# vim file1
[root@xwz ~]# tty
/dev/pts/2
[root@xwz ~]# vim file2
[root@xwz ~]# ps aux |grep vim
root 32072 0.2 0.2 151532 5064 pts/1 S+ 19:09 0:00 vim file1
root 32127 0.1 0.2 151532 5080 pts/2 S+ 19:09 0:00 vim file2
root 32176 0.0 0.0 112728 988 pts/3 S+ 19:09 0:00 grep --
color=auto vim
[root@xwz ~]# kill 32072
[root@xwz ~]# kill -9 32127
[root@xwz ~]# killall vim # 殺死所有vim程序

案例3:訊號測試18和19

[root@xwz ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ss 14:24 0:01/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
root 32229 0.0 0.0 112724 988 pts/3 S+ 19:14 0:00 grep --color=auto httpd
[root@xwz ~]# kill -19 29267
[root@xwz ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ts 14:24 0:01/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
root 32231 0.0 0.0 112724 984 pts/3 S+ 19:15 0:00 grep --color=auto httpd
[root@xwz ~]# kill -18 29267
[root@xwz ~]# ps aux |grep httpd
root 29267 0.0 0.2 230408 5192 ? Ss 14:24 0:01/usr/sbin/httpd -DFOREGROUND
apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00/usr/sbin/httpd -DFOREGROUND
root 32233 0.0 0.0 112724 984 pts/3 S+ 19:15 0:00 grep --color=auto httpd

案例4:踢出遠端登入使用者

[root@localhost ~]# w
 21:42:22 up 22 min,  3 users,  load average: 0.00, 0.01, 0.01
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      21:20   20:22   0.12s  0.08s less
root     pts/0    192.168.219.1    21:22   30.00s  0.01s  0.01s -bash
root     pts/1    192.168.219.1    21:42    2.00s  0.00s  0.00s w
[root@xwz ~]# pkill -u centos
[root@xwz ~]# pkill -t pts/2 # 終止pts/2上所有程序,並不會使pts/2立刻斷開連線
[root@xwz ~]# pkill -9 -t pts/2 # 終止pts/2上所有程序,並結束pts/2,立刻斷開連線

程序優先順序 nice

Linux程序排程及多工

每個CPU(或CPU核心)在一個時間點上只能處理一個程序,通過時間片技術,Linux實際能夠執行的程序
(和執行緒數)可以超出實際可用的CPU及核心數量。Linux核心程序排程程式將多個程序在CPU核心上快速
切換,從而給使用者多個程序在同時執行的假象。

相對優先順序nice

由於不是每個程序都與其他程序同樣重要,可告知程序排程程式為不同的程序使用不同的排程策略。常
規系統上執行的大多數程序所使用的的排程策略為SCHED_OTHER(也稱為SCHED_NORMAL),但還有其他
一些排程策略用於不同的目的。SCHED_OTHER排程策略執行的程序的相對優先順序稱為程序的nice值,
可以有40種不同級別的nice值。
程序優先順序 0-99:實時優先順序,數字越小,優先順序越低 1
00-139:靜態優先順序,數字越小,優先順序越高
Nice值:-20,19

nice值越高表示優先順序越低,例如+19,該程序容易將CPU使用量讓給其他程序。
nice值越低表示優先順序越高,例如-20,該程序更不傾向於讓出CPU

檢視程序的nice級別

  • 1.使用top檢視nice級別
    NI:實際nice級別
    PR:將nice級別顯示為對映到更大優先順序佇列,-20對映到0,+19對映到39

  • 2.使用ps檢視nice級別

    [root@xwz ~]# ps axo pid,command,nice --sort=nice
    [root@xwz ~]# ps axo pid,command,nice,cls --sort=-nice
    

啟動具有不同nice級別的程序

啟動程序時,通常會繼承父程序的nice級別,預設為0

[root@xwz ~]# nice -n -5 sleep 6000 &
[root@xwz ~]# ps axo command,pid,nice |grep sleep
[root@xwz ~]# nice -n -20 systemctl start httpd
[root@xwz ~]# ps axo pid,command,nice,cls |grep httpd
10146 /usr/sbin/httpd -DFOREGROUN 0 TS
10161 /usr/sbin/httpd -DFOREGROUN 0 TS
10162 /usr/sbin/httpd -DFOREGROUN 0 TS
10163 /usr/sbin/httpd -DFOREGROUN 0 TS
10164 /usr/sbin/httpd -DFOREGROUN 0 TS
10165 /usr/sbin/httpd -DFOREGROUN 0 TS
10167 grep --color=auto httpd 0 TS

更改現有程序的nice級別

  • 1.使用top更改nice級別
    r 調整程序的優先順序(Nice Level) (-20高) - - - 0 - - - (19低)
  • 2.使用shell更改nice級別

[root@xwz ~]# sleep 7000 &
[2] 10267
[root@xwz ~]# renice -20 10267
10267 (程序 ID) 舊優先順序為 0,新優先順序為 -20


# 作業控制 jobs

作業控制是一個命令列功能,允許一個shell例項來執行和管理多個命令
如果沒有作業控制,父程序fork()一個子程序後,將sleeping,直到子程序退出
使用作業控制,可以選擇性暫停,恢復,以及非同步執行命令,讓shell可以在子程序執行期間返回接受其
他命令

foreground :前臺程序是在終端中執行的命令,該終端為程序的 控制終端 。前臺程序接受鍵盤產生的
輸入和訊號,並允許從終端讀取或寫入到終端。

background :後臺程序沒有控制終端 ,它不需要終端的互動。

[root@xwz ~]# sleep 3000 & # 執行程式(時),讓其在後臺執行
[3] 10367
[root@xwz ~]# sleep 4000 # ^Z,將前臺的程式掛起(暫停)到後臺
[root@xwz ~]# ps aux |grep sleep
root 10367 0.0 0.0 107952 620 pts/1 S 09:57 0:00 sleep 3000
root 10376 0.0 0.0 107952 616 pts/1 T 09:57 0:00 sleep 4000
[root@xwz ~]# jobs # 檢視後臺作業
[1]- 執行中 sleep 3000 &
[2]+ 已停止 sleep 4000
[root@xwz ~]# bg %2 # 讓作業2在後臺執行
[2]+ sleep 4000 &
[root@xwz ~]# jobs
[1]- 執行中 sleep 3000 &
[2]+ 執行中 sleep 4000 &
[root@xwz ~]# fg %1 # 將作業1調回到前臺
sleep 3000
^Z
[1]+ 已停止 sleep 3000
[root@xwz ~]# kill %1 # 終止作業1
[1]+ 已停止 sleep 3000
[root@xwz ~]# jobs
[1]+ 已終止 sleep 3000
[2]- 執行中 sleep 4000 &


## 管理遠端主機

[root@xwz ~]# yum install -y screen
[root@xwz ~]# screen -S ping
[detached from 24528.ping]
[root@xwz ~]# screen -r
[detached from 24528.ping]
[root@xwz ~]# screen -list
There is a screen on:
24528.ping (Detached)
1 Socket in /var/run/screen/S-root.