隨想錄(在x86 linux上模擬多核cpu運行),x86linux
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
搞過嵌入式開發的朋友都知道無論在實際環境還是在fpga上調試代碼是一件非常辛苦,同時吃力不討好的事情。一方面晶片的片上資源少,另外一方面就是除了軟體之外你還要處理各種意外的硬體事故。好一點的公司可能還會提供虛擬機器來調試,但很多時候虛擬機器的穩定性也是一個問題。搞過skyeye的朋友應該比較有體會。
其實,如果調試驅動代碼或者cpu boot代碼,那麼毫無疑問應該在實際環境上開發。但是如果開發的代碼只是c的內容,其實在x86上模擬就可以了。x86的調試環境極其穩定,而且支援的功能也很多,另外x86對單核、多核的支援也是非常的好,這是很多開發板無法比擬的。
打個比方,在實際環境上調試多核是一件很累的事情。但是在x86上,尤其是多核x86上,你只需要起兩個thread,分別綁定到不同的cpu就可以了。就是這麼簡單。下面給出一份簡單的linux thread綁定代碼。編譯的方法是gcc start.c -g -o start -lpthread即可。原來的代碼地址在這。
#define _GNU_SOURCE#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#define handle_error_en(en, msg) \ do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)intmain(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 4 */ CPU_ZERO(&cpuset); for (j = 0; j < 4; j++) CPU_SET(j, &cpuset); s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset); 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 < CPU_SETSIZE; j++) if (CPU_ISSET(j, &cpuset)) printf(" CPU %d\n", j); exit(EXIT_SUCCESS);}
怎麼看有沒有綁定成功呢?你可以添加一段while(1); 代碼。然後輸入top命令,按下1,看看對應的cpu有沒有使用率達到100%就可以了。
linux單進程怎實現多核cpu多線程分配?
"程式本身不可修改,現在的問題就是如何將此程式多線程化以達到效果"
---- 如果不能修改程式本身,怎麼變成多線程程式??? 樓主還是先去搞搞清楚進程、線程的基本概念吧。
想玩Linux系統,問雙核與單核CPU在該系統下運行優缺點在哪 ?怎取捨 ?
核心多少跟作業系統有什麼關係?
現在是個作業系統就支援多核心的。一般都是至少支援 4-8 個。
你要是有台多路伺服器還可以說說,單核雙核有什麼可比較的?