嵌入式培训之系统编程(四)进程

news2025/5/25 18:24:14

一、进程的基本概念

(一)定义

         进程是一个程序执行的过程(也可以说是正在运行的程序),会去分配内存资

源,cpu的调度,它是并发的

(二)PCB块

1、PCB是一个结构体(对应的结构体为task_struct),全名是process control block

(进程控制块)/print circuit board;

2、一个程序运行就有对应的一块pcb块,它记录着运行程序的所有信息和状态

3、pcb中包含着:

PID—进程标识符(区分进程用的是ID号)
chdir—当前工作路径
umask 0002--合适的权限
fds—进程打开的文件列表
signal—信号相关设置 处理异步io:
用户id,组id:记录谁运行的,与权限有关
进程资源的上限(ulimit -a,显示资源上限);

(三)进程和程序的区别

1、程序是静态的,存储在硬盘中代码,数据的集合;

2、进程是动态,程序执行的过程,包括进程的创建、调度、消亡;

        .c ----> a.out-----> process(pid)

3、(1)程序是永存,进程是暂时的

      (2)进程有程序状态的变化,程序没有

      (3)进程可以并发,程序无并发

      (4)进程与进程会存在竞争计算机的资源

      (5)一个程序可以运行多次,变成多个进程;一个进程可以运行一个或多个程序

(四)内存空间

1、内存空间示意图:

2、其中内存分布图(重点):虚拟内存/虚拟地址

(1)code(代码段):只读特性

(2)data(数据段):可读可写;装全局变量、静态变量(带初值)(bss:未初

                                        始化变量)

(3)heap(堆区):可读可写;动态内存空间,程序员使用malloc申请

(4)Map/share(映射/共享区):只读;外部代码共享过来

(5)Stack 8M(栈):可读可写;最大不超过8M

3、虚拟地址空间共4G:0~ 3G,是进程的空间,3G~4G是内核的空间

4、虚拟内存/地址 :透明、隔离、权限

5、映射表

(1)映射表将虚拟内存的地址转换为物理内存的地址;

(2)映射表通常由页表(Page Table)组成,它记录了虚拟地址到物理地址的映射关

        系;

(3)一个页面大小通常为4k(4036字节);

注:MMU:物理地址转为内存地址。

(五)进程的状态

1、基本操作系统三个操作状态:就绪→执行态→阻塞(等待,睡眠);

     就绪状态:进程已经准备好执行,所有的资源都已分配,只等待CPU时间执行

2、linux中的状态:运行态,睡眠态,僵尸,暂停态;

  Linux进程状态及转换关系:

(六)进程的分类

1、交互式进程

2、批处理进程 (shell脚本)(批量执行一次命令)

3、 守护进程(程序走起来不需要输入,eg:杀毒类软件、启动输入法)

(七)进程的作用

1、并发性:允许多个进程同时运行,提高了CPU利用率和系统响应速度;

2、稳定性:如果一个进程发生错误,通常不会影响到其他进程,这提高了系统的稳定

                    性;

(八)进程的调度

1、调度器通过调度策略来决定哪个进程先运行;

2、内核主要功能之一就是完成进程调度, 硬件,bios,io,文件系统,驱动;

3、调度算法:other(常规默认的),idle,rr,fifo

                        先来先服务   短任务优先   优先级    时间片轮转

4、扩展

(1)分时操作系统:Linux、Windows(尽量在规定时间内完成)

(2)实时操作系统:rt_thread ucos(规定时间内必须完成)

5、进程上下文切换:就是值指调度器要切换CPU给另一个进程的时候,要保存当前进

      程的状态,然后加载打开一个新的进程这样的一个过程。

6、宏观并行:在一个时间段多个任务和进程是同时进行的

7、微观串行:在一个时间点只能一条一条指令执行

二、进程相关命令

1、ps aux

 主要看进程号、进程状态

查看进程相关信息:(PROCESS STATE CODES)
(1)就绪态、运行态 —— R
(2)睡眠态、等待态
        可唤醒等待态 ——S
        不可唤醒等待态 ——D
(3)停止态 ——T
(4)僵尸态 ——Z

(5)结束态

2、top

根据CPU占用率查看进程相关信息(3秒刷一下)
PR NI 表示优先级
数字越小代表优先级越高

3、kill和killall

    发送一个信号

kill -2 PID 15

(其中PID为接受者,终端为发送者)
发送信号+PID对应的进程,默认接收者关闭

killall -9 进程名(强制关闭)
发送信号 进程名对应的所有进程
killall a.out

三、进程相关函数

(一)fork函数

1、函数原型:pid_t fork();

2、特点:

(1)一次调用,会返回两次;

(2)子进程先运行和是父进程先进程,顺序不确定;

(3)变量不共享(虚拟隔离机制);

(4)子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同(子的id比父大)。

3、功能:

(1)通过该函数可以从当前进程中克隆一个同名新进程

(2)克隆的进程称为子进程,原有的进程称为 父进程;

(3)子进程是父进程的完全拷贝;

(4)子进程的执行过程是从fork函数之后执行;

(5)子进程与父进程具有相同的代码逻辑。

4、返回值:int 类型的数字;

(1)在父进程中:成功 返回值是子进程的pid号 >0 

                               失败 返回-1;

(2)在子进程中:成功 返回值 0

                               失败 无

面试问题:

1、一次fork生成几个进程?他们之间的关系是什么样的?

       答: 一次fork生成两个进程,父子关系。

2、如果两次fork同时前后执行,会生成几个进程?他们之间的关系如何表示,有多少个子进程,有没有孙进程?
       答:会生成三个进程,父进程,子进程和孙进程。

5、注:左边是父进程,右边为子进程(代码段完全一样,起始地方不同)

6、运行代码示例:

(二)getpid函数

1、函数原型:pid_t getpid(void);

2、功能:获得调用该函数进程的pid

3、参数:缺省

4、返回值:进程的pid

(三)getppid函数

1、函数原型:pid_t getppid(void);

2、功能:获得调用该函数进程的父进程pid号

3、参数:缺省

4、返回值:返回父进程id号

(四)示例

1、代码:

2、运行结果:

注:子进程与父进程谁先消亡是随机的,谁跑得快谁先消亡

(1)子进程先消亡:

(2)父进程先消亡:

3、应用场合:

(1)一个进程希望复制自己,使父子进程同时执行同的代码段。网络服务中会比较多

         见。

(2)一个进程需要执行一个不同的程序。fork+exec

4、扩展命令:

(1)ps aux | grep xxx(xxx为pid号)查找pid号在哪

(2)pstree  显示进程树状关系图

         petree -p 显示pid号的树状图

(五)父子进程的关系

1、子进程是父进程的副本,子进程获得父进程数据段,堆、栈正文段共享;

2、区别:

(1)fork的返回值 父的是大于0,子是等于0;

(2)pid不同 子相对于父至少要加个1;

(六)写时复制

1、定义:写时复制是计算机编程里的一种优化策略。它的核心思想在于,进行数据修

改操作时,并非马上复制整个数据对象,而是要等到真正需要修改数据的那个时刻才执

行复制操作。这样做能够避免不必要的数据复制,进而提升系统性能,提高资源利用

率。

2、优点:提高效率、创建子进程速度快、开的空间少、回收速度快。

四、进程的终止(8种情况)

1、主动退出

(1)main 中 return

(2)exit(), c库函数,会执行io库的清理工作,关闭所有的流,以及所有打开的文

        件。已经清理函数(atexit);(函数一调,进程结束,再退之前释放该释放的资

        源)

(3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。(单调函数,进程

        结束,但清理的相对较少)

(4) 主线程退出

(5)主线程调用pthread_exit

2、异常终止

(6)abort(),该函数禁止应用层调用,发生严重错误系统调用;

(7)signal   kill pid   有权限的发送信号(内存访问错误则发送信号结束)

(8)最后一个线程被pthread_cancle(线程属于进程的一部分,进程里面无线程会退

        出)

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

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

相关文章

天文数据处理:基于CUDA的射电望远镜图像实时去噪算法(开源FAST望远镜数据处理代码解析)

一、射电天文数据处理的挑战与CUDA加速的必要性 作为全球最大的单口径射电望远镜,中国天眼(FAST)每秒产生38GB原始观测数据,经预处理后生成数千万张图像。这些数据中蕴含的脉冲星、中性氢等天体信号常被高斯白噪声、射频干扰&…

VS编码访问Mysql数据库

安装 MySQL Connector/C 的开发包 libmysqlcppconn-dev是 MySQL Connector/C 的开发包,它的主要用途是让 C 开发者能够方便地在应用程序中与 MySQL 数据库进行交互。它提供了以下功能: 数据库连接:通过标准的 C 接口连接到 MySQL 数据库。S…

一周学会Pandas2 Python数据处理与分析-Pandas2数据合并与对比-pd.merge():数据库风格合并

锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili pd.merge():数据库风格合并 **核心功能**:基于列值(类似 SQL JOIN)合…

CodeBuddy 实现图片转素描手绘工具

本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 前言 最近在社交媒体上,各种素描风格的图片火得一塌糊涂,身边不少朋友都在分享自己的 “素描照”,看着那些黑白线条勾勒出的独特韵味&a…

3.8.2 利用RDD计算总分与平均分

在本次实战中,我们利用Spark的RDD完成了成绩文件的总分与平均分计算任务。首先,准备了包含学生成绩的文件并上传至HDFS。接着,通过交互式方式逐步实现了成绩的读取、解析、总分计算与平均分计算,并最终输出结果。此外,…

29-FreeRTOS事件标志组

一、概述 事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。与信号量不同的是,它可以实现一对多,多对多的同步。 即一个任务可以等待多个事件的发生&#xff1…

「EMD/EEMD/VMD 信号分解方法 ——ECG信号处理-第十四课」2025年5月23日

一、引言 上一节,我们介绍了希尔伯特黄变换(HHT)及其经验模态分解(EMD)的相关内容,这一节,我们继续拓展EMD分解技术,补充介绍集合经验模态分解(Ensemble Empirical Mode …

二叉树层序遍历6

INT_MIN的用法&#xff1a; INT_MIN是C/C 中的一个宏常量 &#xff0c;在 <limits.h> &#xff08;C 中也可使用 <climits> &#xff09;头文件中定义&#xff0c;代表 int 类型能表示的最小整数值 。其用法主要体现在以下方面&#xff1a; 1.初始化变量 …

【论文精读】2023 AAAI--FastRealVSR现实世界视频超分辨率(RealWorld VSR)

文章目录 一、摘要二、Method2.1 现象&#xff08;问题&#xff09;--对应文中隐状态的分析&#xff08;Analysis of Hidden State&#xff09;2.2 怎么解决 --对应文中Framework2.2.1 整体流程&#xff1a;2.2.2 HSA模块怎么工作&#xff1f;2.2.2.1 隐藏状态池2.2.2.2 选择性…

IPython 常用魔法命令

文章目录 IPython 魔法命令&#xff08;Magic Commands&#xff09;一、系统与文件操作1. %ls2. %cd​​和%pwd3. %%writefile​​4. %run 二、性能分析与计时1. %timeit2. %prun​​3. ​​%%timeit 三、代码处理与交互1. %load2. ​​%edit3. ​​%store 四、调试与诊断2. ​…

Java虚拟机 - 程序计数器和虚拟机栈

运行时数据结构 Java运行时数据区程序计数器为什么需要程序计数器执行流程虚拟机栈虚拟机栈作用虚拟机栈核心结构运行机制 Java运行时数据区 首先介绍Java运行时数据之前&#xff0c;我们要了解&#xff0c;对于计算机来说&#xff0c;内存是非常重要的资源&#xff0c;因为内…

新能源汽车产业链图谱分析

1. 产业定义 新能源汽车是指采用非常规的车用燃料作为动力来源&#xff0c;综合车辆的动力控制和驱动方面的先进技术&#xff0c;形成的具有新技术、新结构、技术原理先进的汽车。 新能源车包括四大类型&#xff1a;混合动力电动汽车&#xff08;HEV&#xff09;、纯电动汽车…

如何在PyCharm2025中设置conda的多个Python版本

前言 体验的最新版本的PyCharm(Community)2025.1.1&#xff0c;发现和以前的版本有所不同。特别是使用Anaconda中的多个版本的Python的时候。 关于基于Anaconda中多个Python版本的使用&#xff0c;以及对应的Pycharm&#xff08;2023版&#xff09;的使用&#xff0c;可以参考…

maven快速上手

之前我们项目如果要用到其他额外的jar包&#xff0c;需要自己去官网下载并且导入。但是有maven后&#xff0c;直接在maven的pom.xml文件里用代码配置即可&#xff0c;配置好后maven会自动帮我们联网下载并且会自动导入该jar包 在右边的maven中&#xff0c;我们可以看到下载安装…

cplex12.9 安装教程以及下载

cplex 感觉不是很好找&#xff0c;尤其是教育版&#xff0c;我这里提供一个版本&#xff0c;在下面的图可以看到&#xff0c;不仅可以配置matlab&#xff0c;也可以配置vs,现在拿vs2017来测试一下&#xff0c;具体文件的文件有需要的可以复制下面的链接获取 我用网盘分享了「c…

甘特图实例 dhtmlxGantt.js

本文介绍了如何使用dhtmlxGantt库创建一个基础的甘特图示例&#xff0c;并对其进行汉化和自定义配置。首先&#xff0c;通过引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特图。接着&#xff0c;通过设置gantt.i18n.setLocale("cn")实现核心文本的汉化&#xff0…

视频剪辑 VEGAS - 配置视频片段保持原长宽比

VEGAS 配置视频片段保持原长宽比 右击视频片段 -> 选择【开关】 -> 勾选【保持长宽比】 右击视频片段 -> 点击【属性】 -> 弹出【属性】窗口 点击【媒体】 -> 选择【像素宽高比】为【1,0000&#xff08;方形&#xff09;】

力扣 54 .螺旋矩阵

文章目录 题目介绍题解 题目介绍 题解 代码如下&#xff1a; class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res new ArrayList<>();if (matrix.length 0){return res;}int l 0, r matrix[0].length - 1, t 0, b…

四、【API 开发篇 (上)】:使用 Django REST Framework 构建项目与模块 CRUD API

【API 开发篇 】&#xff1a;使用 Django REST Framework 构建项目与模块 CRUD API 前言为什么选择 Django REST Framework (DRF)&#xff1f;第一步&#xff1a;创建 Serializers (序列化器)第二步&#xff1a;创建 ViewSets (视图集)第三步&#xff1a;配置 URLs (路由)第四步…

ARM笔记-ARM伪指令及编程基础

第四章 ARM伪指令及编程基础 4.1 伪指令概述 4.1.1 伪指令定义 人们设计了一些专门用于指导汇编器进行汇编工作的指令&#xff0c;由于这些指令不形成机器码指令&#xff0c;它们只是在汇编器进行汇编工作的过程中起作用&#xff0c;所以被叫做伪指令。 4.1.2 伪指令特征 …