雙核心CPU大殺器,讓你的Linux進程跑得更快!
在使用Linux系統時,我們經常會遇到一些CPU密集型任務,如資料處理、編譯程式等,這些任務需要大量的運算資源來完成。然而,如果我們的系統硬體配置較低,就會導致任務執行速度緩慢,嚴重影響我們的工作效率。針對這個問題,本文將介紹一種名為「CPU綁定」的技術,它可以將進程綁定到特定的CPU核心上,從而提高進程的執行效率。
#對於普通的應用,作業系統的預設調度機制是沒有問題的。但是,當某個進程需要較高的運行效率時,就有必要考慮將其綁定到單獨的核上運行,以減小由於在不同的核上調度造成的開銷。
把某個行程/執行緒綁定到特定的cpu核上後,該行程就會一直在此核上運行,不會再被作業系統調度到其他核上。但綁定的這個核上還是可能會被調度運行其他應用程式的。
作業系統對多核心cpu的調度
目前windows和linux都支援對多核心cpu進行調度管理。
軟體開發在多核心環境下的核心是多執行緒開發。這個多線程不僅代表了軟體實作上多線程,要求在硬體上也採用多線程技術。
多核心作業系統的關注點在於進程的分配和調度。進程的分配將進程分配到合理的物理核上,因為不同的核心在共享性和歷史運行情況都是不同的。有的物理核能夠共享二級cache,而有的卻是獨立的。如果將有資料共享的程序分配給有共享二級cache的核上,將大大提升效能;反之,就有可能影響效能。
進程排程會涉及即時性、負載平衡等問題,目前研究的熱門議題主要集中在以下方面:
- 程式的平行開發設計
- 多進程的時間相關性
- 任務的分配和調度
- 快取的錯誤共享
- 一致性存取問題
- 進程間通訊
- 多處理器核內部資源競爭
多行程和多執行緒在cpu核上執行時情況如下:
每個 CPU 核運行一個進程的時候,由於每個進程的資源都獨立,所以 CPU 核心之間切換的時候無需考慮上下文
每個 CPU 核運行一個執行緒的時候,有時執行緒之間需要共享資源,所以這些資源必須從 CPU 的一個核心被複製到另一個核心,這會造成額外的開銷
綁定程序到cpu核上運行
查看cpu有幾個核
使用cat /proc/cpuinfo查看cpu訊息,以下兩個訊息:
processor,指明第幾個cpu處理器
cpu cores,指明每個處理器的核心數
也可以使用系統呼叫sysconf來取得cpu核心數:
#include int sysconf(_SC_NPROCESSORS_CONF);/* 返回系统可以使用的核数,但是其值会包括系统中禁用的核的数目,因 此该值并不代表当前系统中可用的核数 */ int sysconf(_SC_NPROCESSORS_ONLN);/* 返回值真正的代表了系统当前可用的核数 */ /* 以下两个函数与上述类似 */ #include int get_nprocs_conf (void);/* 可用核数 */ int get_nprocs (void);/* 真正的反映了当前可用核数 */
我使用的是虛擬機,有2個處理器,每個處理器只有一個核,等於一個處理器兩個核心。
使用taskset指令
#取得進程pid
-> % ps PID TTY TIME CMD 2683 pts/1 00:00:00 zsh 2726 pts/1 00:00:00 dgram_servr 2930 pts/1 00:00:00 ps
查看進程目前運行在哪個cpu上
-> % taskset -p 2726 pid 2726's current affinity mask: 3
顯示的十進位數字3轉換為2進位為最低兩個是1,每個1對應一個cpu,所以行程運行在2個cpu上。
指定進程運行在cpu1上
-> % taskset -pc 1 2726 pid 2726's current affinity list: 0,1 pid 2726's new affinity list: 1
注意,cpu的標號是從0開始的,所以cpu1表示第二個cpu(第一個cpu的標號是0)。
至此,就把應用程式綁定到了cpu1上運行,查看如下:
-> % taskset -p 2726 pid 2726's current affinity mask: 2
啟動程式時綁定cpu
#启动时绑定到第二个cpu -> % taskset -c 1 ./dgram_servr& [1] 3011 #查看确认绑定情况 -> % taskset -p 3011 pid 3011's current affinity mask: 2
使用sched_setaffinity系統呼叫
#sched_setaffinity可以將某個行程綁定到一個特定的CPU。
#define _GNU_SOURCE /* See feature_test_macros(7) */ #include /* 设置进程号为pid的进程运行在mask所设定的CPU上 * 第二个参数cpusetsize是mask所指定的数的长度 * 通常设定为sizeof(cpu_set_t) * 如果pid的值为0,则表示指定的是当前进程 */ int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask); int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);/* 获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中 */
實例
#include #include #include #include #include #define __USE_GNU #include #include #include #include #define THREAD_MAX_NUM 200 //1个CPU内的最多进程数 int num=0; //cpu中核数 void* threadFun(void* arg) //arg 传递线程标号(自己定义) { cpu_set_t mask; //CPU核的集合 cpu_set_t get; //获取在集合中的CPU int *a = (int *)arg; int i; printf("the thread is:%d\n",*a); //显示是第几个线程 CPU_ZERO(&mask); //置空 CPU_SET(*a,&mask); //设置亲和力值 if (sched_setaffinity(0, sizeof(mask), &mask) == -1)//设置线程CPU亲和力 { printf("warning: could not set CPU affinity, continuing...\n"); } CPU_ZERO(&get); if (sched_getaffinity(0, sizeof(get), &get) == -1)//获取线程CPU亲和力 { printf("warning: cound not get thread affinity, continuing...\n"); } for (i = 0; i if (CPU_ISSET(i, &get))//判断线程与哪个CPU有亲和力 { printf("this thread %d is running processor : %d\n", i,i); } } return NULL; } int main(int argc, char* argv[]) { int tid[THREAD_MAX_NUM]; int i; pthread_t thread[THREAD_MAX_NUM]; num = sysconf(_SC_NPROCESSORS_CONF); //获取核数 if (num > THREAD_MAX_NUM) { printf("num of cores[%d] is bigger than THREAD_MAX_NUM[%d]!\n", num, THREAD_MAX_NUM); return -1; } printf("system has %i processor(s). \n", num); for(i=0;ifor(i=0; ireturn 0; }
運行結果
-> % ./a.out system has 2 processor(s). the thread is:0 the thread is:1 this thread 0 is running processor : 0 this thread 1 is running processor : 1
綁定執行緒到cpu核上執行
綁定執行緒到cpu核上使用pthread_setaffinity_np函數,其原型定義如下:
#define _GNU_SOURCE /* See feature_test_macros(7) */ #include int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset); int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset); Compile and link with -pthread.
各參數的意義與sched_setaffinity相似。
實例
#define _GNU_SOURCE #include #include #include #include #define handle_error_en(en, msg) \ do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { int s, j; cpu_set_t cpuset; pthread_t thread; thread = pthread_self(); /* Set affinity mask to include CPUs 0 to 7 */ CPU_ZERO(&cpuset); for (j = 0; j if (s != 0) handle_error_en(s, "pthread_setaffinity_np"); /* Check the actual affinity mask assigned to the thread */ s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset); if (s != 0) handle_error_en(s, "pthread_getaffinity_np"); printf("Set returned by pthread_getaffinity_np() contained:\n"); for (j = 0; j if (CPU_ISSET(j, &cpuset)) printf(" CPU %d\n", j); exit(EXIT_SUCCESS); }
運行結果
-> % ./a.out Set returned by pthread_getaffinity_np() contained: CPU 0 CPU 1
透過本文的介紹,我們了解如何使用CPU綁定技術將進程綁定到特定的CPU核心,從而顯著提高了進程的執行效率。在實際應用中,我們可以根據不同的場景和需求來選擇合適的CPU綁定方案,以達到最佳的效能提升效果。希望本文能幫助讀者更能理解並應用CPU綁定技術,並在Linux系統的使用過程中取得更高的工作效率。
以上是雙核心CPU大殺器,讓你的Linux進程跑得更快!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Windowsispreferredfordesktopcomputingandgamingdueto:1)ITVASTSOFTSOFTWAREANDGAMELIBRARY,2)用戶友好型和customizableInterface,3)廣泛的hardwarecompatibility,and4)PerformanceOptimizationCapities,demalloPtimizationCapities,DespitesomeSomeSomeSomeSourceOmeSourceOmeSourceource-HeaevyAndupDateupdate-uperated。

多年來,Linux軟件分佈依賴於DEB和RPM等本地格式,並深深地根深蒂固。 但是,Flatpak和Snap已經出現,有望成為應用程序包裝的通用方法。 本文考試

Linux和Windows在處理設備驅動程序上的差異主要體現在驅動管理的靈活性和開發環境上。 1.Linux採用模塊化設計,驅動可以動態加載和卸載,開發者需深入理解內核機制。 2.Windows依賴微軟生態,驅動需通過WDK開發並簽名認證,開發相對複雜但保證了系統的穩定性和安全性。

Linux和Windows的安全模型各有優勢。 Linux提供靈活性和可定制性,通過用戶權限、文件系統權限和SELinux/AppArmor實現安全。 Windows則注重用戶友好性,依賴WindowsDefender、UAC、防火牆和BitLocker保障安全。

Linux和Windows在硬件兼容性上不同:Windows有廣泛的驅動程序支持,Linux依賴社區和廠商。解決Linux兼容性問題可通過手動編譯驅動,如克隆RTL8188EU驅動倉庫、編譯和安裝;Windows用戶需管理驅動程序以優化性能。

Linux和Windows在虛擬化支持上的主要區別在於:1)Linux提供KVM和Xen,性能和靈活性突出,適合高定制環境;2)Windows通過Hyper-V支持虛擬化,界面友好,與Microsoft生態系統緊密集成,適合依賴Microsoft軟件的企業。

Linux系統管理員的主要任務包括系統監控與性能調優、用戶管理、軟件包管理、安全管理與備份、故障排查與解決、性能優化與最佳實踐。 1.使用top、htop等工具監控系統性能,並進行調優。 2.通過useradd等命令管理用戶賬戶和權限。 3.利用apt、yum管理軟件包,確保系統更新和安全。 4.配置防火牆、監控日誌、進行數據備份以確保系統安全。 5.通過日誌分析和工具使用進行故障排查和解決。 6.優化內核參數和應用配置,遵循最佳實踐提升系統性能和穩定性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver CS6
視覺化網頁開發工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!