.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_TW.rst :Translator: 胡皓文 Hu Haowen <src.res@email.cn> ======== CPU è² è¼‰ ======== Linux通éŽ``/proc/stat``å’Œ``/proc/uptime``導出å„種信æ¯ï¼Œç”¨æˆ¶ç©ºé–“工具 如top(1)使用這些信æ¯è¨ˆç®—系統花費在æŸå€‹ç‰¹å®šç‹€æ…‹çš„å¹³å‡æ™‚間。 例如: $ iostat Linux 2.6.18.3-exp (linmac) 02/20/2007 avg-cpu: %user %nice %system %iowait %steal %idle 10.01 0.00 2.92 5.44 0.00 81.63 ... 這裡系統èªçˆ²åœ¨é»˜èªæŽ¡æ¨£å‘¨æœŸå…§æœ‰10.01%的時間工作在用戶空間,2.92%的時 間用在系統空間,總體上有81.63%的時間是空閒的。 大多數情æ³ä¸‹``/proc/stat``çš„ä¿¡æ¯å¹¾ä¹ŽçœŸå¯¦åæ˜ äº†ç³»çµ±ä¿¡æ¯ï¼Œç„¶è€Œï¼Œç”±æ–¼å…§ æ ¸æŽ¡é›†é€™äº›æ•¸æ“šçš„æ–¹å¼/時間的特點,有時這些信æ¯æ ¹æœ¬ä¸å¯é 。 那麼這些信æ¯æ˜¯å¦‚何被æœé›†çš„呢?æ¯ç•¶æ™‚é–“ä¸æ–·è§¸ç™¼æ™‚ï¼Œå…§æ ¸æŸ¥çœ‹æ¤åˆ»é‹è¡Œçš„ é€²ç¨‹é¡žåž‹ï¼Œä¸¦å¢žåŠ èˆ‡æ¤é¡žåž‹/狀態進程å°æ‡‰çš„計數器的值。這種方法的å•é¡Œæ˜¯ 在兩次時間ä¸æ–·ä¹‹é–“ç³»çµ±ï¼ˆé€²ç¨‹ï¼‰èƒ½å¤ åœ¨å¤šç¨®ç‹€æ…‹ä¹‹é–“åˆ‡æ›å¤šæ¬¡ï¼Œè€Œè¨ˆæ•¸å™¨åª å¢žåŠ æœ€å¾Œä¸€ç¨®ç‹€æ…‹ä¸‹çš„è¨ˆæ•¸ã€‚ 舉例 --- å‡è¨ç³»çµ±æœ‰ä¸€å€‹é€²ç¨‹ä»¥å¦‚下方å¼å‘¨æœŸæ€§åœ°å 用cpu:: 兩個時é˜ä¸æ–·ä¹‹é–“的時間線 |-----------------------| ^ ^ |_ 開始é‹è¡Œ | |_ 開始ç¡çœ (很快會被喚醒) 在上é¢çš„情æ³ä¸‹ï¼Œæ ¹æ“š``/proc/stat``çš„ä¿¡æ¯ï¼ˆç”±æ–¼ç•¶ç³»çµ±è™•æ–¼ç©ºé–’狀態時, 時間ä¸æ–·ç¶“å¸¸æœƒç™¼ç”Ÿï¼‰ç³»çµ±çš„è² è¼‰å°‡æœƒæ˜¯0 å¤§å®¶èƒ½å¤ æƒ³åƒå…§æ ¸çš„這種行爲會發生在許多情æ³ä¸‹ï¼Œé€™å°‡å°Žè‡´``/proc/stat`` ä¸å˜åœ¨ç›¸ç•¶å¤æ€ªçš„ä¿¡æ¯:: /* gcc -o hog smallhog.c */ #include <time.h> #include <limits.h> #include <signal.h> #include <sys/time.h> #define HIST 10 static volatile sig_atomic_t stop; static void sighandler (int signr) { (void) signr; stop = 1; } static unsigned long hog (unsigned long niters) { stop = 0; while (!stop && --niters); return niters; } int main (void) { int i; struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 1 }, .it_value = { .tv_sec = 0, .tv_usec = 1 } }; sigset_t set; unsigned long v[HIST]; double tmp = 0.0; unsigned long n; signal (SIGALRM, &sighandler); setitimer (ITIMER_REAL, &it, NULL); hog (ULONG_MAX); for (i = 0; i < HIST; ++i) v[i] = ULONG_MAX - hog (ULONG_MAX); for (i = 0; i < HIST; ++i) tmp += v[i]; tmp /= HIST; n = tmp - (tmp / 3.0); sigemptyset (&set); sigaddset (&set, SIGALRM); for (;;) { hog (n); sigwait (&set, &i); } return 0; } åƒè€ƒ --- - https://lore.kernel.org/r/loom.20070212T063225-663@post.gmane.org - Documentation/filesystems/proc.rst (1.8) è¬è¬ --- Con Kolivas, Pavel Machek