linux 下进程和线程指定CPU运行
大概的介紹一下linux 的指定CPU運(yùn)行,包括進(jìn)程和線程,這個(gè)只是最基本的方法,看一下基本就會(huì)了,至于其他的進(jìn)程間通信和線程同步的話,這里暫不做任何介紹。
算了,還是比較整體的介紹一下如何去學(xué)習(xí)這個(gè)吧。
linux下的top命令是可以查看當(dāng)前的cpu的運(yùn)行狀態(tài),具體參數(shù)自己去查,這里只介紹與標(biāo)題相關(guān)的,按1可以查看系統(tǒng)有多少個(gè)CPU,以及每個(gè)CPU的運(yùn)行狀態(tài)。可是如何查看線程的CPU呢???top -Hp pid,pid就是你當(dāng)前程序的進(jìn)程號(hào),如果是多線程的話,是可以查看進(jìn)程內(nèi)所有線程的CPU和內(nèi)存使用情況。
pstree可以查看主次線程,同樣的pstree -p pid。可以查看進(jìn)程的線程情況。
taskset這個(gè)其實(shí)才是重點(diǎn),可以查看以及設(shè)置當(dāng)前進(jìn)程或線程運(yùn)行的CPU(設(shè)置親和力)。
taskset -pc pid,查看當(dāng)前進(jìn)程的cpu,當(dāng)然有的時(shí)候不只是一個(gè),taskset -pc cpu_num pid ,cpu_num就是設(shè)置的cpu。
這樣的話基本的命令和操作其實(shí)大家都知道了,接下來就是在代碼中完成這些操作,并通過命令去驗(yàn)證代碼的成功率。
進(jìn)程制定CPU運(yùn)行:
#include<stdlib.h> #include<stdio.h> #include<sys/types.h> #include<sys/sysinfo.h> #include<unistd.h> #define __USE_GNU #include<sched.h> #include<ctype.h> #include<string.h>int main(int argc, char* argv[]) {//sysconf獲取有幾個(gè)CPUint num = sysconf(_SC_NPROCESSORS_CONF);int created_thread = 0;int myid;int i;int j = 0;//原理其實(shí)很簡(jiǎn)單,就是通過cpu_set_t進(jìn)行位與操作cpu_set_t mask;cpu_set_t get;if (argc != 2){printf("usage : ./cpu num\n");exit(1);}myid = atoi(argv[1]);printf("system has %i processor(s). \n", num);//先進(jìn)行清空,然后設(shè)置掩碼CPU_ZERO(&mask);CPU_SET(myid, &mask);//設(shè)置進(jìn)程的親和力if (sched_setaffinity(0, sizeof(mask), &mask) == -1){printf("warning: could not set CPU affinity, continuing...\n");}while (1){CPU_ZERO(&get);//獲取當(dāng)前進(jìn)程的親和力if (sched_getaffinity(0, sizeof(get), &get) == -1){printf("warning: cound not get cpu affinity, continuing...\n");}for (i = 0; i < num; i++){if (CPU_ISSET(i, &get)){printf("this process %d is running processor : %d\n",getpid(), i);}}}return 0; }
#define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <sched.h>void *myfun(void *arg) {cpu_set_t mask;cpu_set_t get;char buf[256];int i;int j;//同樣的先去獲取CPU的個(gè)數(shù)int num = sysconf(_SC_NPROCESSORS_CONF);printf("system has %d processor(s)\n", num);for (i = 0; i < num; i++) {CPU_ZERO(&mask);CPU_SET(i, &mask);//這個(gè)其實(shí)和設(shè)置進(jìn)程的親和力基本是一樣的if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {fprintf(stderr, "set thread affinity failed\n");}CPU_ZERO(&get);if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {fprintf(stderr, "get thread affinity failed\n");}for (j = 0; j < num; j++) {if (CPU_ISSET(j, &get)) {printf("thread %d is running in processor %d\n", (int)pthread_self(), j);}}j = 0;while (j++ < 100000000) {memset(buf, 0, sizeof(buf));}}pthread_exit(NULL); }int main(int argc, char *argv[]) {pthread_t tid;if (pthread_create(&tid, NULL, (void *)myfun, NULL) != 0){fprintf(stderr, "thread create failed\n");return -1;}pthread_join(tid, NULL);return 0; }
總結(jié)
以上是生活随笔為你收集整理的linux 下进程和线程指定CPU运行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.什么是机器学习
- 下一篇: qt 利用 HTML 生成PDF文档,不