嵌入式学习——Linux高级编程复习(进程)——day39

news2024/10/6 22:22:48

1. 进程

        进程是计算机科学中的一个核心概念,它是操作系统进行资源分配和调度的基本单位,代表了一个正在执行中的程序实例。当一个程序被加载到内存并开始执行时,它就变成了一个进程。

        1. 程序:存放在外存中的一段代码的集合

        2. 进程:是一个程序动态执行的过程,包括创建、调度和消亡

2. 进程的创建(创建了一片虚拟内存空间、多个进程共用同一片虚拟内存空间,进程空间在实际的物理地址是独立的)

2.1 进程被执行后,操作系统开辟进程空间,并分为如下区域

        1. 文本段

        2. 数据段

        3. 系统数据段——堆区、栈区

        4. 内核(PCB(进程控制块)存在于操作系统内核中。它是内核用来管理和控制进程的关键数据结构)

补充:PCB块概念

        进程控制块(PCB,Process Control Block)是操作系统中用于描述和控制进程状态和属性的一个重要数据结构。每个活动的进程在操作系统中都有一个对应的PCB,它是进程存在的唯一标识。PCB包含了操作系统管理和调度进程所需的所有关键信息,其具体内容可能因操作系统的设计而异,但通常包括以下基本信息:

  1. 进程标识符(PID):唯一标识每个进程的编号。
  2. 进程状态:当前进程的状态,如就绪、运行、阻塞等
  3. 程序计数器(PC):保存进程下一条将要执行的指令的地址。
  4. 处理器状态寄存器:包括通用寄存器、指令寄存器等,用于保存进程执行时的上下文信息。
  5. 内存管理信息:如基址、界限寄存器值、页表指针等,用于内存访问和管理。
  6. 文件描述符表或打开文件列表:记录了进程当前打开的文件及其状态。
  7. 进程优先级:决定进程调度的优先级。
  8. CPU调度信息:如进程的调度队列指针、时间片剩余量等。
  9. 记账信息:如进程创建时间、CPU使用时间等统计信息。
  10. I/O状态信息:包括I/O请求队列、已完成和待处理的I/O操作等。
  11. 信号处理信息:与进程相关的信号处理规则和屏蔽位。

2.2 内存映射

        1. 进程空间是独立的(物理地址), 进程是操作系统资源分配的最小单元

        2. 所有进程所使用的虚拟地址空间都为同一空间(虚拟地址)

        3. 每个进程运行起来后,操作系统都会分配一个内存空间(虚拟地址)

3. 进程调度

3.1 运行方式

        宏观并行,微观串行

        1.宏观:大角度 用户 
        2.微观:小角度 CPU 

3.2 进程状态(进程在调度过程中频繁保存现场恢复现场,使得进程拥有了一些不同的状态)

    1.就绪态、运行态    R
    2.可唤醒等待态        S(sleep、scanf)        睡眠态
    3.不可唤醒等待态     D(加载驱动)        
    4.暂停态                    T                
    5.僵尸态                    Z(代码运行完了,空间还在,需要回收空间)        
    6.结束态                    X(空间被回收的一瞬间)

3.3 进程调度算法(完成从一个进程切换到下一个进程去执行相应的任务)

        1.先来先执行,后来后执行
        2.高优先级调度算法
        3.时间片轮转调度算法:CPU在一个任务中执行的一小段时间成为一个时间片
        4.多级队列反馈调度算法
        5.负载均衡调度算法

4. 进程相关命令

4.1 top

        根据CPU占用率查看进程信息、PID:进程ID号、PPID:父进程ID号 、q退出

4.2 ps -ef

        查看所有进程信息(当前时刻)

4.3 pstree

        查看进程关系(关系树、类似于族谱)

4.4 ps -aux (ps -aux | less)

        查看进程状态信息

4.5 kill

        kill     -9  进程PID(9强制关闭)
        killall -9  进程名 (杀死所有与进程名相关的进程)
        killall -9  bash(关闭所有)

5. 进程相关函数接口

5.1 fork

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.2 getpid

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.3 getppid

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.4 exit

        1. 定义

        2. 功能

                让进程结束(刷新缓冲区)

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.5 _exit

        1. 定义

        2. 功能

                立即结束调用该函数的进程(不刷新缓冲区)

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.6 wait(阻塞回收) 

        1. 定义

        2. 功能

                阻塞回收子进程空间(随机回收)

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

                wait具有阻塞功能


                WIFEXITED(wstatus)——1正常退出、0异常退出
                检测子进程是否正常退出
                
                WEXITSTATUS(wstatus)——返回子进程的ID号
                检测子进程退出的值
        
                WIFSIGNALED(wstatus)——1子进程被信号杀死、0子进程没被信号杀死
                检测子进程是否被信号杀死
        
                WTERMSIG(wstatus)——返回杀死进程的信号数
                检测子进程被几号信号杀死

5.7  waitpid(非阻塞回收)

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.8 getenv

        1. 定义

        2. 功能

                获得环境变量name对应的数值

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.9  setenv

        1. 定义

        2. 功能

                添加或者修改环境变量的值

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.10 system 

        1. 定义

        2. 功能

                加载一条shell命令

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6. exec函数族

        利用进程空间执行另一段代码

        用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),
子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的
用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建
新进程,所以调用exec前后该进程的id并未改变。

      l:执行另一段代码参数以列表形式传递
      v:执行另一段代码参数以指针数组形式传递
      p:执行另一段代码文件在系统环境变量PATH对应的路径下查找
      e:执行另一段代码,更新环境变量

6.1 execl

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6.2 execlp

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6.3 execle

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6.4 execv

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6.5 execvp

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6.6 execvpe

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

7. 进程消亡

7.1 僵尸进程

        进程代码执行结束,空间没有被回收

        当子进程(child process)先于父进程(parent process)退出,但是父进程没有调用wait/waitpid回收子进程的资源,则子进程变成僵尸进程。

7.2 如何避免产生僵尸进程

        1.让父进程先结束,子进程会成为孤儿进程,被系统进程收养,子进程结束系统进程
          回收子进程空间
        2.子进程结束,父进程回收子进程空间,即可避免产生僵尸进程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1806965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML标签 label for 还是 htmlFor

文章目录 问题结论更多 问题 HTML标签: label 的属性 for 还是 htmlFor? MDN文档:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label 结论 for 和 htmlFor 都可以使用,都是对的。在部分情况中,只能…

window wsl2的ubuntu如何配置代理获取docker image

最近两天,docker pull一直下不来docker image, 研究了下可以通过代理pull, 我的是window电脑下的linux子系统wsl2, 装的是ubuntu跑docker. # 创建/etc/systemd/system/docker.service.d路径 sudo mkdir -p /etc/systemd/system/docker.service.d # 创建 http-proxy…

C++设计模式-中介者模式,游戏对象之间的碰撞检测

运行在VS2022,x86,Debug下。 31. 中介者模式 中介者模式允许对象之间通过一个中介者对象进行交互,而不是直接相互引用。可以减少对象之间的直接耦合,同时集中化管理复杂的交互。应用:如在游戏开发中,可以使…

BERT+PET方式数据处理

基于BERTPET方式数据预处理介绍 BERTPET方式数据预处理🐾 本项目中对数据部分的预处理步骤如下: 查看项目数据集编写Config类项目文件配置代码编写数据处理相关代码 1 查看项目数据集🐾 数据存放位置:/Users/***/PycharmProjects/llm/prom…

Innodb Buffer Pool缓存机制(四)预读与Mysql改进的LRU策略

一、什么是预读 InnoDB提供了预读(read ahead)。所谓预读,就是InnoDB认为执行当前的请求可能之后会读取某些页面,就预先把它们加载到Buffer Pool中。根据触发方式的不同,预读又可以细分为下边两种: 1.1 线性预读 InnoDB提供了一…

Rust-02-变量与可变性

在Rust中,变量和可变性是两个重要的概念。 变量:变量是用于存储数据的标识符。在Rust中,变量需要声明其类型,例如: let x: i32 5; // 声明一个名为x的变量,类型为i32(整数)&#…

ApiJson快速入门

前言 最近在正式迭代中插入了一个大屏演示项目,因为后端开发人员任务都安排满了,而演示项目逻辑比较简单,大多是直接查表就能搞定,所以只能想办法让前端直接和数据库交互,增加开发速度。在找工具时发现了ApiJson。尝试…

私有云和多云管理平台 | Cloudpods v3.11.4 正式发布

本次 3.11.4 更新亮点为:系统镜像引入社区镜像,用户可以一键导入各主流开源操作系统镜像,方便用户上手使用。持续迭代共享 LVM,支持快照,主备机等特性,修复迁移删除镜像缓存等 BUG。 功能优化 【费用】费…

大众汽车裁员加速,38万元遣散费起步

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 几周前,大众汽车宣布了一项新的裁员计划。 一、裁员行动与额外福利并行 大众汽车近期在裁员行动上取得了显著进展,其遣散…

html接口响应断言

接口响应值除类json格式,还有html格式 断言步骤 第一步:替换空格replace 原本返回的格式和网页内容一致,每行前面有很多空格,需要去除这些空格 第二步:分割split 因为行与行之前有回车符,所以把回车符替换掉,返回值为数组 数组不能直接打印数组,需要格式转换 第三…

基于实验的电动汽车动力电池SOC

前言 本文为笔者在学习《基于MATLAB的新能源汽车仿真》过程中学习笔记,所涉及的表格数据和公式均为书籍里的。仿真数据是网上找的恒电流放电数据。本文仅作为笔者的入门学习记录。 一、分析动力电池SOC估算方法 SOC是指动力电池按照规定放电条件可以释放的容量占…

国标GB/T 28181详解:校时流程详细说明

目录 一、定义 二、作用 1. 时间同步性 2. 事件记录的准确性 3. 跨平台、跨设备协作 4. 降低时间误差 5. 安全性提升 三、基本要求 四、命令流程 五、协议接口 六、校时效果 1、未校时的情况 2、校时后的效果 七、参考 一、定义 GB28181协议要求所有的监控设…

多种策略提升线上 tensorflow 模型推理速度

前言 本文以最常见的模型 Bi-LSTM-CRF 为例,总结了在实际工作中能有效提升在 CPU/GPU 上的推理速度的若干方法,包括优化模型结构,优化超参数,使用 onnx 框架等。当然如果你有充足的 GPU ,结合以上方法提升推理速度的效…

Edge浏览器视频画中画可拉动进度条插件Separate Window

平时看一些视频的时候,一般需要编辑一些其他的东西,于是开启画中画,但是画中画没有进度条,需要大幅度的倒退前进得回到原视频,很麻烦。这里推荐插件Separate Window,可实现画中画进度条拉动和播放sudu的调节…

商城项目【尚品汇】08异步编排

文章目录 1.线程的创建方式1.1继承Thread类,重写run方法1.2实现Runnable接口,重写run方法。1.3实现Callable接口,重新call方法1.4以上三种总结1.5使用线程池创建线程1.5.1线程池创建线程的方式1.5.2线程池的七大参数含义1.5.3线程池的工作流程…

LLVM Cpu0 新后端5 静态重定位 动态重定位

想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章: LLVM 后端实践笔记 代码在这里(还没来得及准备,先用网盘暂存一下): 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

springboot集成uid-generator生成分布式id

一、简介 uid-generator是由百度技术部开发,GitHub地址 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器 Snowflake算法 Snowflake算法描述:指定机器 & 同一时刻 & 某一并发序列,是唯一的。据此可生成一个64 bits的唯一ID&#x…

【Linux】信号(二)

上一章节我们进行了信号产生的讲解。 本节将围绕信号保存展开。 目录 信号保存:信号的一些概念:关于信号保存的接口:sigset_t的解释:对应的操作接口:sigprocmask:sigpending:代码实践&#xf…

Macbook M芯片JDK的安装

Macbook M芯片JDK的安装 下载 搜索zulu; 进入这个网址 https://www.azul.com/downloads/#zulu 进入页面后向下滑动 选择对应选项 然后点击Download进行下载。 选择.dmg格式的安装包,点击。 安装 下载完成后,到下载目录,双击…

日进2000,我怎么做到的

昨天遇到一个有意思的项目,让我一天进账2000,一个字:爽。 这几天接洽了一位新客户,主要诉求就是优化系统,基于LNMP的系统优化。正好这个领域我比较熟悉,以前都是在公司做项目,也不怎么涉猎系统优…