当前位置: 首页 > news >正文

嵌入式Day25--多任务并发

单任务:程序运行起来,只能处理一件事情
多任务:程序运行起来,可以同时处理多件事情

1.进程

什么是进程

进程:正在执行的程序,执行过程中需要消耗CPU和内存。进程是操作系统资源分配的最小单位。

程序:

  • 存放在硬盘的数据指令集合
  • 静态的
  • 程序运行起来时,可以创建出多个进程

进程:

  • 进程是一个正在执行的程序,在内存中执行指令
  • 进程是一个动态的过程,具备一定的生命周期
  • 进程可以实现并发(多任务)
  • 执行过程中需要消耗CPU和内存,多进程间存在资源竞争

创建进程

进程在被创建的时候,操作系统需要为其分配0-4G的虚拟内存空间。

进程的调度

宏观并行:从宏观角度,多个任务同时执行
微观串行:微观角度,多个任务按照一定顺序先后执行

CPU任务调度算法:

  • 时间片轮转法
  • 先来先服务,后来后服务
  • 优先级算法:高优先级先执行,低优先级后执行
  • 短作业优先算法

进程的状态

任何操作系统进程状态切换图:三态图

Linux操作系统进程状态切换:

Linux进程状态: 1.运行态(用户运行态、内核运行态) R 正在执行,且被CPU任务调度所执行的进程 2.就绪态 R 正在执行,没有CPU任务调度执行的进程(只缺少cpu) 3.可唤醒等待态 S 也称为睡眠态,阻塞等待资源的进程 4.不可唤醒等待态 D 不想被CPU任务调度所打断的进程任务可以设置为不可唤醒等待态 5.暂停态 T 被暂停执行的进程 6.僵尸态 Z 进程执行结束,空间没有被回收 7.结束态 X 进程执行结束,空间被回收

进程的退出和消亡:

进程执行结束,需要对进程对应的资源空间进行回收,否则,该进程进入僵尸态。

进程相关的命令

1. ps -aux 查看当前操作系统中的进程相关信息 USER PID(进程ID号) ps -aux | grep a.out | (管道) :将前面的命令的输出作为后面命令的输入 grep : 查找后面的字符串对应的信息 2. top 动态查看进程的相关参数:侧重于CPU和内存占有率 3. ps -ef 产看进程的父进程ID号 父进程:产生子进程的进程叫父进程 子进程:父进程产生的新进程称为该父进程的子进程 4. pstree 查看进程的族谱关系 pstree -sp PID 查看指定进程的族谱关系 5. kill 给进程发送一个信号 kill -信号的ID/信号名称 PID kill -9 PID ---》结束PID对应的进程 kill -19 PID ---》让进程进入到暂停态 kill -18 PID ---》让进程继续运行 6 .jobs 查看当前终端的后台进程及编号 7.fg 编号 将一个后台进程调到前台

进程相关函数

fork函数(创建进程)

pid_t fork(void); 功能:创建新进程 返回值: 成功:父进程中返回子进程的PID号 子进程中返回0 失败:-1

  • 子进程在创建时,完全拷贝父进程0-3G的虚拟内存空间,包括文本区,数据区,堆区,栈区
  • 拷贝内核空间中进程控制块(PCB)的部分内容,PID号不拷贝
  • 父进程和子进程用户空间独立,数据不能共享,要想共享数据,需要使用进程间通信的方法

//此处介绍两个函数 pid_t getpid(void); 功能:获取当前进程的PID号 pid_t getppid(void); 功能:获取当前进程的父进程的PID号(PPID)

进程的消亡

进程退出:

  • 在主函数中return;
  • exit(),库函数,直接结束一个进程,结束前会刷新缓冲区
  • _exit(), _Exit(),系统调用,直接结束一个进程,结束前不会刷新缓冲

回收进程空间:

僵尸进程:子进程结束后,父进程没有回收子进程的资源空间,此时,该子进程成为僵尸进程。

如何避免僵尸进程:

  • 子进程结束,由其父进程回收资源空间
  • 让子进程成为一个孤儿进程

孤儿进程 :父进程先结束,其父进程创建的子进程成为孤儿进程,将会被系统进程收养,结束时由系统进程回收。

比如:守护进程

进程空间回收策略:

  • 对于一直处于运行状态,不会结束的进程不需要回收
  • 进程在执行有结束的情况时回收

进程资源空间回收

wait函数

pid_t wait(int *wstatus); 功能:阻塞等待回收僵尸态进程 参数: wstatus:保存回收的子进程的退出状态 返回值: 成功:返回回收到的子进程的ID 失败:-1 WIFEXITED(wstatus) 是不是正常结束 WEXITSTATUS(wstatus) 使用这个宏去拿exit结束状态 WIFSIGNALED(wstatus) 是不是收到了信号而终止的 WTERMSIG(wstatus)如果是信号终止的,那么是几号信号。
#include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char **argv) { pid_t pid = fork(); if (pid > 0) { int wstatus; // pid_t wpid=wait(NULL); pid_t wpid = wait(&wstatus); printf("wpid is %d\n", wpid); if (WIFEXITED(wstatus)) { printf("child terminated normally,state is %d\n", WEXITSTATUS(wstatus)); } else if (WIFSIGNALED(wstatus)) { printf("child process was terminated by a signal,signum is %d\n", WTERMSIG(wstatus)); } while (1) { printf("Father pid is %d\n", getpid()); sleep(1); } } else if (0 == pid) { int num = 20; while (1) { if (0 == num--) { exit(1); } printf("Son pid is %d\n", getpid()); sleep(1); } } else { perror("fork error\n"); } return 0; }

waitpid函数

pid_t waitpid(pid_t pid, int *status, int options); 功能:回收指定进程的资源 和wait功能相似,比wait更灵活 参数: pid: <-1 回收指定进程组内的任意子进程 (-100.等待GID=100的进程组中的任意子进程) -1 回收任意子进程,组内外 0 回收和当前调用waitpid一个组的所有子进程,组内 > 0 回收指定ID的子进程 status 子进程退出时候的状态, 如果不关注退出状态用NULL; options 选项: 0 表示回收过程会阻塞等待 WNOHANG 表示非阻塞模式回收资源。 返回值: 成功 返回接收资源的子进程pid 失败 -1 设定为非阻塞且没有回收到子进程返回0 waitpid(0,&status,0) //默认阻塞 ==wait(&status); waitpid(0,&status,WNOHANG); // 非阻塞方式 注意:使用waitpid以非阻塞方式回收时,要搭配轮询方式实现。
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main(int argc, char **argv) { pid_t pid = fork(); if (pid > 0) { int wstatus; while (1) { pid_t wpid = waitpid(pid, &wstatus, WNOHANG); printf("wpid is %d\n", wpid); if (wpid > 0) { if (WIFEXITED(wstatus)) { printf("child terminated normally,state is %d\n", WEXITSTATUS(wstatus)); } else if (WIFSIGNALED(wstatus)) { printf("child process was terminated by a signal,signum is %d\n", WTERMSIG(wstatus)); } } printf("Father pid is %d\n", getpid()); sleep(1); } } else if (0 == pid) { int num = 5; while (1) { if (0 == num--) { exit(1); } printf("Son pid is %d\n", getpid()); sleep(1); } } else { perror("fork error\n"); } return 0; }

exec函数族

功能:在一个进程中执行另外一个文件 int execl(const char *path, const char *arg, ... /* (char *) NULL */); 功能:可以执行任意可执行文件 参数: path:要执行的文件的路径和名称 arg:执行该文件需要的参数 int execlp(const char *file, const char *arg, ... /* (char *) NULL */); 功能:执行环境变量保存的系统路径下的可执行文件 参数: file:需要执行的文件的名称 arg:执行该文件需要的参数 int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */); int execv(const char *path, char *const argv[]); 功能:可以执行任意可执行文件 参数: path:要执行的文件的路径和名称 argv:执行该文件需要的参数存放的指针数组 int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[], char *const envp[]); l : list-----》列表 "ls", "-l" v : vector---->容器(数组) p :path ----》路径 exec会自动从PATH环境变量所保存的路径下去寻找 e :env ----》环境变量 env : 查看系统中的环境变量 whereis 二进制/库 查看二进制。库对应的位置

exec原理:当执行exec时,系统将要执行的文件和进程中文本区的指令数据进行替换

#include "head.h" int main(int argc, char **argv) { printf("pid is %d\n",getpid()); //execl("./hello","./hello",NULL); //execl("/bin/ls","ls","-l",NULL); //execl("/bin/touch","touch","aaa",NULL); char* arg[]={"ls","-l",NULL}; //execv("/bin/ls",arg); //execvp("ls",arg); execlp("cp","cp","./hello.c","2.txt",NULL); //printf("after execl\n");//并没有执行 return 0; }
http://www.gsyq.cn/news/1476395.html

相关文章:

  • 效率直接起飞 AI论文写作软件测评:2026年最新推荐与对比
  • 2026年小苏打厂家推荐:食品级/工业级小苏打源头企业,高纯度与环保生产工艺深度解析 - 品牌企业推荐师(官方)
  • 为什么多算一次反而更快?深入 Blackwell 微架构,拆解 FlashAttention-4 的逆天优化
  • 实战指南:基于快马AI在CentOS7上一键部署企业级GitLab服务器
  • 从零认知到精准投放,CSDN AI数字营销实战指南,7步打通获客-转化-复购全链路
  • Python 爬虫实战:百度地图POI数据爬取与商圈分析
  • 避开SBAS手动选GCP的坑:用PS-InSAR的自动参考点提升形变监测精度
  • 2026年 广东平模厂家实力解析:激光/吸塑/印刷/包装/精密平模及EVA/亚克力/汽车内饰平模源头工厂甄选 - 品牌企业推荐师(官方)
  • HoRain云--Codex 安装与使用
  • Go 语言构建高性能 AI 推理网关:从并发模型到流量调度的完整架构
  • 准备阶段2:PCIE LTSSM 链路训练与状态机详解
  • 微信+CSDN AI账号绑定冲突实录(2024年Q2真实踩坑报告):超限绑定触发风控的5个致命信号
  • 基于BQ76PL536A的电动汽车BMS设计:主动均衡与高精度采样实战
  • SPT-AKI存档编辑器终极指南:如何快速配置服务器路径并高效管理游戏存档
  • CSDN AI营销GEO内容收录真相(2024Q3最新实测数据):从发布到进入RAG知识库仅需11.3小时?还是被永久过滤?大模型语义抓取机制首度解密
  • 智能安防监控革命:Frigate NVR 实战部署与优化指南
  • 准备阶段1:Synopsys PCIE控制器典型数据通路梳理
  • 2026年 玻璃门锁五金推荐榜单:浴室夹/玻璃门吸/指纹锁/门夹/配件品牌厂家深度测评与选购指南 - 品牌企业推荐师(官方)
  • 跳出 AI 流水线写作桎梏:okbiye 以全链路定制化重构毕业论文撰写新范式
  • 文字秒变3D模型:这款AI设计工具颠覆你的CAD体验
  • 东营连锁品牌黄金回收门店TOP6排行榜 - 余生黄金回收
  • 2026北京迷你仓公司权威认定:北京贴心存五项标准逐项验证 - 企业深度横评dyy6420
  • 避坑指南:STM32CubeMX配置低功耗STOP模式,唤醒后时钟跑飞了怎么办?
  • 2026年镀锌管材厂家推荐排行榜:镀锌无缝方管/镀锌方管/镀锌钢管/镀锌方矩管/镀锌带圆管/镀锌槽钢/镀锌角钢源头工厂专业实力与市场口碑深度解析 - 企业推荐官【官方】
  • TikTokDownload自动化Cookie管理系统:3大核心机制深度解析与架构设计
  • 2026卖家精灵优惠码最新汇总:KJDSYY72、KJDSYY78卖家精灵618大促可用 - 跨境电商卖家出海
  • Python+Snakemake构建单细胞RNA-seq分析流水线
  • 别再只测S21了!用IQVIEW/IQXEL实测Wi-Fi PA增益,这才是真·工程做法
  • 贝叶斯逆博弈与多模态融合在动态交互中的应用
  • Linux cgroup v2 资源控制实战:限制进程 CPU/内存/IO,systemd slice 管理