标签 Unix 下的文章
 2016-03-18T16:30:23.461000    |      应用编程    |     AilsonJack    |     暂无评论    |     3181 views
为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的CPU上,这样可以减少调度的开销和保护关键进程或线程。1、绑定进程到指定的CPULinux提供一个接口,可以将进程绑定到特定的CPU:#include <sched.h>int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *set);int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *set);参数:pid:进程的id号,如果pid为0,则表示本进程cpusetsize:set的大小set:运行进程的CPU,可以通过以下函数操作set:void CPU_ZERO(cpu_set_t *set); // Clears set, so that it contains no CPUs.void CPU_SET(int cpu, cpu_set_t *set); // Add CPU cpu to set.void CPU_CLR(int cpu, cpu_set_t *set); // Remove CPU cpu from set.int  CPU_ISSET(int cpu, cpu_set_t *set); // Test to see if CPU cpu is a member of set.int  CPU_COUNT(cpu_set_t * mask); //Return the number of CPUs in set.进程绑定到指定CPU的演示程序如下:测试:编译程序,之后运行,我编译出的文件名为a.out,执行下列命令,得到a.out的PID:ps -elf | grep a.out,之后输入命令:top  -p  进程ID,接着输入f,选择P选项(移到P处,按下空格),按ESC退出,具体过程如下:此时可以看到进程在cpu0 cpu1 cpu2 cpu3之间不停切换:2、绑定线程到指定的CPU不仅仅进程可以绑定到CPU,线程也可以。Linux提供一个接口,可以将线程绑定到特定的CPU:#include <pthread.h>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);该接口与进程绑定到CPU的接口的使用方法基本一致。当进程绑定到特定的CPU之后,线程还是可以绑定到其他的CPU的,没有冲突。示例代码如下:测试:编译程序,之后运行,我编译出的文件名为a.out,执行下列命令,得到a.out的PID:ps -elf | grep a.out,之后输入命令:top -H -p  进程ID,接着输入f,选择P选项(移到P处,按下空格)和nTH选项,按ESC退出,具体过程如下:可以看到主线程一直保持在cpu0,一个线程在cpu1 cpu2之间切换,另一个线程一直保持在cpu3:
Linux应用编程UnixAPUE 阅读全文»
 2016-02-26T09:22:02.259665    |      Linux问题集合    |     AilsonJack    |     暂无评论    |     2160 views
最近在学习Linux的应用程序开发,选的书籍当然是经典的《UNIX环境高级编程》,不过在写好第一个代码编译时却遇到了一些问题,比如报错:apue.h:没有那个文件或目录、undefined reference to 'err_quit'、undefined reference to 'err_sys',这里就给大家讲讲如何去解决它,不用谢我哦。  这里是我提供给大家的源代码文件以及所需的一些文件,请大家提前下载,链接:点此下载 ,密码:5nhq。使用gcc 1-1.c编译该代码时,报出"致命错误:apue.h:没有那个文件或目录",现在将书籍提供的apue.h放在同一目录时,再次编译,发现又报另外的错误:undefined reference to 'err_quit'undefined reference to 'err_sys'因为err_sys和err_quit是作者自己提供的函数,这里需要单独的源代码文件支持,我已经提供给大家了,大家下载即可。下面是完整的解决办法:将我提供大家的include文件夹拷贝到Linux系统中,这里我放在/home/AilsonJack/me/apue目录中:然后执行命令:vim /etc/profile,在profile文件的末尾添加如下内容,保存退出:#gcc找到头文件的路径C_INCLUDE_PATH=/usr/include/libxml2:/home/AilsonJack/me/apue/includeexport C_INCLUDE_PATH接着执行命令:source /etc/profile接下来,编译1-1.c文件:gcc 1-1.c,没有报错吧,执行./a.out  /home至此已经解决了编译第一个程序所出现的问题,剩下的就好好学习吧。
LinuxUnix问题集合APUE 阅读全文»
  • 1

  本站信息

目前本站共被浏览 165576 次
目前本站已经运行 3577 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号