实时进程

Posted spontanous

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实时进程相关的知识,希望对你有一定的参考价值。

一.  基本概念

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
", i);
21        else printf("cpu %d is unset
", 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 }

以上是关于实时进程的主要内容,如果未能解决你的问题,请参考以下文章

代码片段:Shell脚本实现重复执行和多进程

永远观察实时数据的片段

实时数据中的 Observables 更新在片段中不起作用

检索数据未出现在 ListView 的片段中

LINUX PID 1和SYSTEMD PID 0 是内核的一部分,主要用于内进换页,内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程(代码片段

Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段