一.  基本概念

1.  CPU亲和力

简述: CPU的亲和力(affinity)是指进程与cpu之间的绑定关系, 是一种调度特性, 分为软亲合力与硬亲和力

(1)  软亲和力

  一个进程会一直被调度在同一个处理器上, 除非在负载极不均衡的情况下可以考虑处理器之间的迁移

(2)  硬亲和力

  将一个进程直接绑定在指定的处理器上

一般主机的CPU的最大值为1024( 0-1023), 而常见的系统为0-3号的处理器, 即4个处理器

相关的API函数:

1 #define _GNU_SOURCE
2  #include <sched.h>
3 int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask); //设置进程亲和力
4 int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask); //获得cpu的亲和力

2.  实时系统

简述: 若一个系统仅限于"操作时限", 即请求和响应之间最少且必须执行的次数, 称该系统为实时系统, 分为硬件实时系统与软件实时系统

(1)  硬件实时系统

  硬实时系统不仅要求任务执行无误, 而且还要做到准时也就是说在一到达规定的时间, 任务必须完成, 否则会给系统带来灾难性的后果

(2)  软件实时系统

  软实时系统它是指系统的目的是为了使各个任务尽快的执行, 而不要求限定的某一个任务在多长时间内完成, 也就是该系统超过规定时间对系统不会产生很大的影响, 系统依然可以运行

更加详细的解释可参考https://www.cnblogs.com/CodeWorkerLiMing/p/11508899.html

3.  实时进程

简述:  相对与非实时进程, 实时进程具有优先级, 通过系统的调用, 可在执行非实时进程的非临界区状态下, 先调用优先级较高的进程

对与主机可采用top命令查看系统进程的运行情况

二.  实例

1.  要求

  创建多个子进程, 选择其中的一个或者多个进程运行在指定的cpu上, 观察运行情况

2.  相关的API函数

1 #define _GNU_SOURCE
2  #include <sched.h>
3
4  void CPU_ZERO(cpu_set_t *set);    //清空操作
5
6  void CPU_SET(int cpu, cpu_set_t *set);    //将CPU设置为set
7  void CPU_CLR(int cpu, cpu_set_t *set);    //将CPU移除set
8  int  CPU_ISSET(int cpu, cpu_set_t *set);  //测试cpu是否set

3.  代码

 1 #define _GNU_SOURCE
 2 #include<stdio.h>
 3 #include <stdlib.h>
 4 #include <time.h>
 5 #include <sched.h>
 6 #include <sys/types.h>
 7 #include <unistd.h>
 8
 9
10
11 int main(){
12     cpu_set_t set;
13     size_t size;
14
15     CPU_ZERO(&set);  //清空cpu的set
16
17     int ret = sched_getaffinity(0, sizeof(size), &set);
18     for(int i = 0; i < CPU_SETSIZE; i++){
19        int cpu = CPU_ISSET(i, &set);    //测试cpu是否set
20        if(cpu != 0) printf("cpu %d is set\n", i);
21        else printf("cpu %d is unset\n", i);
22     }
23
24    CPU_CLR(0, &set);  //移除0号cpu的set
25    ret = sched_setaffinity(0, sizeof(size), &set);
26
27    //创建10个子进程
28
29    int pid, k;
30    for(int i = 0; i < 10; i++){
31       pid = fork();
32       k = i;
33       if(pid == 0) break;
34    }
35
36    //将6号子进程运行在0号cpu上
37    if(pid == 0 && k == 6){
38       CPU_ZERO(&set);
39       CPU_SET(0, &set);
40       sched_setaffinity(0, sizeof(size), &set);
41    }
42
43    while(1){
44        sleep(10);
45    }
46
47     return 0;
48 }
02-12 18:20