当前位置: 首页 > 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.*; //重命名导…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...