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

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

目录

一、进程的含义

二、进程和程序的区别

三、进程的作用

四、进程的状态

五、进程的调度与上下文切换

六、查询进程相关命令

七、fork()函数

八、getpid()和getppid()函数

九、面试题解析:

十、应用场合及测试


一、进程的含义

进程指正在运行的程序,它是一个程序执行的过程,会分配内存资源和接受 CPU 的调度。系统通过 PCB 块(进程控制块,如 task_struct 结构体)来控制进程,其中包含 PID(进程标识符)、cwd(当前工作路径)、用户 ID、组 ID 等信息,还记录了进程打开的文件列表、信号相关设置以及进程资源的上限等。

二、进程和程序的区别

1. 程序是静态的,存储在硬盘中代码和数据的集合;进程是动态的,是程序执行的过程,包括进程的创建、调度、消亡。
◦ 例如,一个编译好的可执行文件就是程序,而运行这个可执行文件产生的活动就是进程。
2. 程序是永存的,进程是暂时的。
◦ 程序可以长期保存在存储介质中,而进程会随着任务的完成或异常终止而结束。
3. 进程有程序状态的变化,程序没有。
◦ 进程在运行过程中其状态会在就绪、执行、阻塞等之间切换,而程序不存在这种状态变化。
4. 进程可以并发,程序无并发。
◦ 多个进程可以在同一时间内同时执行不同的任务,而程序本身不具备并发执行的能力。
5. 进程与进程会存在竞争计算机的资源,一个程序可以运行多次,变成多个进程,一个进程也可以运行一个或多个程序。

三、进程的作用

进程的主要作用是实现多任务,提高系统效率。通过并发(同一时刻同时完成多个任务)和并行(真正同时执行多个任务)来充分利用系统资源,提高系统的处理能力。
例如,在一个多任务操作系统中,用户可以同时运行浏览器浏览网页、听音乐和处理文档,这就是进程并发的体现。

四、进程的状态

基本操作系统中,进程有 3 个状态:就绪态、执行态、阻塞态。
在 Linux 中,进程的状态有运行态、睡眠态、僵死状态(特有)、暂停状态。

五、进程的调度与上下文切换

内核的主要功能之一是完成进程调度,涉及硬件、BIOS、IO、文件系统、驱动等。调度算法包括 RR(轮转调度)、FIFO(先进先出调度)等。
进程调度在宏观上看起来是并行的,但在微观上是串行的。

六、查询进程相关命令

1. ps aux:不会动态刷新,可查看进程的相关信息,包括进程状态(如就绪态、运行态用 R 表示,可唤醒等待态用 S 表示,不可唤醒等待态用 D 表示,停止态用 T 表示,僵尸态用 Z 表示等)。
2. top:类似任务管理器,可以动态刷新,能根据 CPU 占用率查看进程相关信息。
3. kill和killall:用于发送信号来控制进程。
◦ 例如,kill -2 PID发送特定信号给指定 PID 的进程,killall -9 进程名发送信号给指定进程名对应的所有进程。

七、fork()函数

1.fork()是一个系统调用函数,一次调用会在父进程和子进程中分别返回。子进程和父进程的执行顺序不确定,且变量不共享。子进程复制父进程的 0 到 3G 空间和父进程内核中的 PCB,但进程 ID 号不同。
2. 功能是从当前进程克隆一个新进程,新进程称为子进程,原有进程为父进程。子进程是父进程的完全拷贝,从 fork 函数之后开始执行,与父进程具有相同的代码逻辑。
3. 返回值为 int 类型:在父进程中成功返回子进程的 pid 号(大于 0),失败返回 -1;在子进程中成功返回值是 0,失败无返回

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>// 定义全局变量 a 并初始化为 20
int a = 20;int main(int argc, char *argv[])
{// 调用 fork 函数创建子进程,返回值存储在 ret 中pid_t ret = fork();if (ret > 0){//father(父进程执行的代码块)sleep(3);// 输出父进程中的变量 a 的值、父进程的 PID 和父进程的父进程 PID(即启动这个程序的终端进程 ID)printf("father is %d   pid %d,ppid:%d  \n", a, getpid(), getppid());}else if (0 == ret){//child(子进程执行的代码块)// 输出子进程中变量 a 的初始值printf("child a is %d\n", a);a += 10;// 输出子进程中变量 a 自增后的结果、子进程的 PID 和子进程的父进程 PID(即主进程的 PID)printf("child a is %d pid:%d ppid:%d\n", a, getpid(), getppid());}else{perror("fork error\n");return 1;}// 输出当前进程中的变量 a 的值和当前进程的 PIDprintf("a is %d pid:%d\n", a, getpid());return 0;
}

八、getpid()和getppid()函数

1. getpid()函数用于获得当前进程的 ID 号码,无参数,返回值为进程的 pid。
2. getppid()函数用于获得当前进程的父进程 pid 号,无参数,返回值为父进程 id 号。目前没有直接获取子进程号的函数。

九、面试题解析:

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

一次 fork 生成两个进程,即父进程和子进程,它们是父子关系。

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

两次 fork 同时前后执行会生成四个进程。第一次 fork 产生父子两个进程,这两个进程再分别进行第二次 fork,又各自产生一个子进程,所以一共四个进程。关系可以表示为:最初的进程是根节点,第一次 fork 产生的父子进程是父子关系,第二次 fork 产生的进程对于第一次 fork 产生的父进程来说是父子关系,对于第一次 fork 产生的子进程来说也是父子关系,所以存在孙进程。

十、应用场合及测试

1. 应用场合:
◦ 一个进程希望复制自己,使父子进程同时执行相同的代码段,在网络服务中比较多见。
◦ 一个进程需要执行一个不同的程序时,可以使用 fork + exec 组合。
2. 使用变量测试可以验证父子进程位于不同的地址空间,文件的写入测试也可以进一步验证父子进程的独立性。
例如,在变量测试中,父进程和子进程分别修改同一个变量,不会相互影响,说明它们位于不同的地址空间。在文件写入测试中,父子进程同时向同一个文件写入内容,可以观察到写入的顺序和内容的独立性,进一步证明它们的独立性。

相关文章:

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

目录 一、进程的含义 二、进程和程序的区别 三、进程的作用 四、进程的状态 五、进程的调度与上下文切换 六、查询进程相关命令 七、fork()函数 八、getpid()和getppid()函数 九、面试题解析&#xff1a; 十、应用场合及测试 一、进程的含义 进程指正在运行的程序&a…...

C++练习备忘录

1. 保留两位小数输出格式 #include <iostream> #include <iomanip> using namespace std; int main() {double S 0;S (15 25) * 20 / 2;cout << fixed << setprecision(2) << S;return 0; }2. 设置输出宽度 #include <iostream> #inclu…...

改善工作流

快捷键管理器 打开Editor->Shortcuts查看和编辑Unity中的快捷键 示例 ShiftSpace 窗口最大化 P 选择预制体 进入预制体编辑模式 单一检视窗口 选择组件&#xff0c;选择Properties打开一个窗口&#xff0c;显示组件信息&#xff1b;切换对象&#xff0c;窗口信息不会改变…...

迭代器失效

一、什么是迭代器失效 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是对指针进行了封装&#xff0c;比如&#xff1a;vector的迭代器就是原生态指针T* 。因此迭代器失效&#xff0c;实际就是迭代器底层对应指针所指…...

@RequestParam @RequestBody @PathVariable 这三个注解对应的前端使用vue的http请求时不同的调用方式

1. RequestParam 用途&#xff1a;用于提取请求参数&#xff0c;常见于GET请求或表单提交。 Vue HTTP 请求示例&#xff1a; // 使用axios发送GET请求 axios.get(/api/users, { params: { id: 1, name: John } }); 2. RequestBody 用途&#xff1a;用于提取请求体…...

SQL - 索引

索引本质上是数据库引擎用来快速查找数据的数据结构&#xff0c;可以显著提高查询的性能&#xff0c;为了加快运行较慢的查询。创建索引 默认索引 create index 索引名 on 表名 (列名); 通过对列名进行创建索引&#xff0c;在查询的时候&#xff0c;数据库就能通过索引找到匹配…...

Oracle23ai新特性FOR LOOP循环控制结构增强

在Oracle数据库中&#xff0c;FOR LOOP是一种常用的循环控制结构&#xff0c;它允许你重复执行一系列语句固定次数或直到满足特定条件为止。然而&#xff0c;标准的Oracle PL/SQL中的FOR LOOP主要用于遍历集合&#xff08;如数组或游标的结果集&#xff09;&#xff0c;而不是像…...

DHU OJ 二维数组

思路及代码 #include<iostream> using namespace std; int main(){ //input 多组 //input M,N int 1< <20 //input M 行 N 列 数据 //initialize listint M, N;while (cin >> M >> N){int list[M][N];for (int i 0; i < M-1; i){for (int j 0; j…...

UDP/TCP --- Socket编程

本篇将使用 Linux 中的系统调用来实现模拟 TCP 和 UDP 的通信过程&#xff0c;其中只对 UDP 和 TCP 进行了简单的介绍&#xff0c;本篇主要实现的是代码&#xff0c;至于 UDP 和 TCP 的详细讲解将会在之后的文章中给出。 本篇给出的 tcp 和 udp 的代码中的 echo 都是测试连接是…...

【C语言】最详细的单链表(两遍包会!)

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:黄灿灿/数据结构 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、单链表的概念 1. 单链表的特点 2. 单链表的基本…...

QT:VS2019 CMake编译CEF

CEF介绍 CEF作为一个基于Chromium的开源Web浏览器控件&#xff0c;为第三方应用提供了强大的嵌入浏览器支持。其多平台支持、HTML5特性、自定义能力以及多进程架构等特性&#xff0c;使得CEF在浏览器开发、桌面应用、开发工具以及自动化测试等领域得到了广泛应用。 多平台支持…...

day31(8/19)——静态文件共享、playbook

目录 一、ansible模块 script模块 copy模块 使用command模块下载 nfs-utils rpcbind 在被控制的主机上添加static目录&#xff0c;并创建test文件 command模块 service模块 二、playbook 三、playbook编排vsftpd 1、安装 2、卸载 3、启动服务 4、修改配置文件设置不…...

白骑士的C#教学实战项目篇 4.4 游戏开发

系列目录 上一篇&#xff1a;白骑士的C#教学实战项目篇 4.3 Web开发 在这一部分&#xff0c;我们将探索如何使用 Unity 和 C# 开发游戏。游戏开发结合了编程、图形设计和创意&#xff0c;既充满挑战又充满乐趣。通过这一节的学习&#xff0c;您将了解游戏引擎的基础知识&#…...

在Vue工程中开发页面时,发现页面垂直方向出现两个滚动条的处理

在Vue工程中开发页面时&#xff0c;发现页面垂直方向出现两个滚动条 最近在开发页面时&#xff0c;发现页面多了两个滚动条&#xff0c;如图&#xff1a; 原因&#xff1a; 当一个页面的内容高度大于屏幕的高度时就会出现滚动条。一般情况下当一个页面高度大于屏幕高度时&a…...

【C++初阶】:C++入门篇(一)

文章目录 前言一、C命名空间1.1 命名空间的定义1.2 命名空间的使用 二、C的输入和输出2.1 cin和cout的使用 三、缺省参数3.1 缺省参数的分类 四、函数重载4.1 函数重载概念及其条件4.2 C支持函数重载原理 -- 名字修饰 前言 C是在C语言的基础之上&#xff0c;增加了一些面向对象…...

【JAVA CORE_API】Day14 Collection、Iterator、增强for、泛型、List、Set

Collection接口及常用方法 Collection<Object> collection new ArrayList();&#xff1a;实例化ArrayList集合对象&#xff1b; collectionName.add(Object obj);&#xff1a;在集合中增加元素&#xff1b; int sizeName collectionName.size();&#xff1a;获取集合…...

Go更换国内源配置环境变量

背景 要在中国境内下载和使用Go编程语言的包&#xff0c;可以使用国内的Go模块代理来加速下载速度。以下是一些常见的国内Go模块代理源以及如何切换到这些源的方法&#xff1a; 常见国内Go模块代理源 七牛云&#xff08;Qiniu&#xff09; https://goproxy.cn 阿里云&#xff0…...

澎湃认证显实力,浪潮信息存储兼容新篇章

浪潮信息在存储技术兼容性领域取得新突破&#xff0c;其集中式存储HF/AS系列与长擎安全操作系统24强强联合&#xff0c;成功完成澎湃技术认证。此次合作不仅验证了双方产品的无缝对接能力&#xff0c;更体现了浪潮信息在推动全产业链共建共享方面的坚定决心。 浪潮信息澎湃技术…...

Leetcode 3255. Find the Power of K-Size Subarrays II

Leetcode 3255. Find the Power of K-Size Subarrays II 1. 解题思路2. 代码实现 题目链接&#xff1a;3255. Find the Power of K-Size Subarrays II 1. 解题思路 这一题是题目3254的进阶版&#xff0c;其实主要就是增加了算法复杂度。 整体上来说的话思路还是一个分段的思…...

Kotlin学习02-变量、常量、整数、浮点数、操作符、元组、包、导入

变量、常量、整数、浮点数、操作符、元组、包、导入 Book.kt package com.wujialiang.packclass Book {var title: String "Hello" }val PI 3.14; val E 2.178;Main.kt //引入包 //import com.wujialiang.pack.Book; import com.wujialiang.pack.*; //重命名导…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...