实时进程
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 }
以上是关于实时进程的主要内容,如果未能解决你的问题,请参考以下文章
LINUX PID 1和SYSTEMD PID 0 是内核的一部分,主要用于内进换页,内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程(代码片段
Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段