嵌入式学习 ——(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()函数 九、面试题解析: 十、应用场合及测试 一、进程的含义 进程指正在运行的程序&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 选择预制体 进入预制体编辑模式 单一检视窗口 选择组件,选择Properties打开一个窗口,显示组件信息;切换对象,窗口信息不会改变…...
迭代器失效
一、什么是迭代器失效 迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层对应指针所指…...
@RequestParam @RequestBody @PathVariable 这三个注解对应的前端使用vue的http请求时不同的调用方式
1. RequestParam 用途:用于提取请求参数,常见于GET请求或表单提交。 Vue HTTP 请求示例: // 使用axios发送GET请求 axios.get(/api/users, { params: { id: 1, name: John } }); 2. RequestBody 用途:用于提取请求体…...
SQL - 索引
索引本质上是数据库引擎用来快速查找数据的数据结构,可以显著提高查询的性能,为了加快运行较慢的查询。创建索引 默认索引 create index 索引名 on 表名 (列名); 通过对列名进行创建索引,在查询的时候,数据库就能通过索引找到匹配…...
Oracle23ai新特性FOR LOOP循环控制结构增强
在Oracle数据库中,FOR LOOP是一种常用的循环控制结构,它允许你重复执行一系列语句固定次数或直到满足特定条件为止。然而,标准的Oracle PL/SQL中的FOR LOOP主要用于遍历集合(如数组或游标的结果集),而不是像…...
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 的通信过程,其中只对 UDP 和 TCP 进行了简单的介绍,本篇主要实现的是代码,至于 UDP 和 TCP 的详细讲解将会在之后的文章中给出。 本篇给出的 tcp 和 udp 的代码中的 echo 都是测试连接是…...
【C语言】最详细的单链表(两遍包会!)
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客 🎁代码托管:黄灿灿/数据结构 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、单链表的概念 1. 单链表的特点 2. 单链表的基本…...
QT:VS2019 CMake编译CEF
CEF介绍 CEF作为一个基于Chromium的开源Web浏览器控件,为第三方应用提供了强大的嵌入浏览器支持。其多平台支持、HTML5特性、自定义能力以及多进程架构等特性,使得CEF在浏览器开发、桌面应用、开发工具以及自动化测试等领域得到了广泛应用。 多平台支持…...
day31(8/19)——静态文件共享、playbook
目录 一、ansible模块 script模块 copy模块 使用command模块下载 nfs-utils rpcbind 在被控制的主机上添加static目录,并创建test文件 command模块 service模块 二、playbook 三、playbook编排vsftpd 1、安装 2、卸载 3、启动服务 4、修改配置文件设置不…...
白骑士的C#教学实战项目篇 4.4 游戏开发
系列目录 上一篇:白骑士的C#教学实战项目篇 4.3 Web开发 在这一部分,我们将探索如何使用 Unity 和 C# 开发游戏。游戏开发结合了编程、图形设计和创意,既充满挑战又充满乐趣。通过这一节的学习,您将了解游戏引擎的基础知识&#…...
在Vue工程中开发页面时,发现页面垂直方向出现两个滚动条的处理
在Vue工程中开发页面时,发现页面垂直方向出现两个滚动条 最近在开发页面时,发现页面多了两个滚动条,如图: 原因: 当一个页面的内容高度大于屏幕的高度时就会出现滚动条。一般情况下当一个页面高度大于屏幕高度时&a…...
【C++初阶】:C++入门篇(一)
文章目录 前言一、C命名空间1.1 命名空间的定义1.2 命名空间的使用 二、C的输入和输出2.1 cin和cout的使用 三、缺省参数3.1 缺省参数的分类 四、函数重载4.1 函数重载概念及其条件4.2 C支持函数重载原理 -- 名字修饰 前言 C是在C语言的基础之上,增加了一些面向对象…...
【JAVA CORE_API】Day14 Collection、Iterator、增强for、泛型、List、Set
Collection接口及常用方法 Collection<Object> collection new ArrayList();:实例化ArrayList集合对象; collectionName.add(Object obj);:在集合中增加元素; int sizeName collectionName.size();:获取集合…...
Go更换国内源配置环境变量
背景 要在中国境内下载和使用Go编程语言的包,可以使用国内的Go模块代理来加速下载速度。以下是一些常见的国内Go模块代理源以及如何切换到这些源的方法: 常见国内Go模块代理源 七牛云(Qiniu) https://goproxy.cn 阿里云࿰…...
澎湃认证显实力,浪潮信息存储兼容新篇章
浪潮信息在存储技术兼容性领域取得新突破,其集中式存储HF/AS系列与长擎安全操作系统24强强联合,成功完成澎湃技术认证。此次合作不仅验证了双方产品的无缝对接能力,更体现了浪潮信息在推动全产业链共建共享方面的坚定决心。 浪潮信息澎湃技术…...
Leetcode 3255. Find the Power of K-Size Subarrays II
Leetcode 3255. Find the Power of K-Size Subarrays II 1. 解题思路2. 代码实现 题目链接:3255. Find the Power of K-Size Subarrays II 1. 解题思路 这一题是题目3254的进阶版,其实主要就是增加了算法复杂度。 整体上来说的话思路还是一个分段的思…...
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.*; //重命名导…...
2026年LLM推理加速全景:量化、投机解码与KV Cache工程实战
大语言模型推理速度慢、成本高,是阻碍AI大规模落地的核心障碍之一。一个7B参数的模型,在标准配置下每秒只能生成约30个token,对于需要实时响应的应用来说几乎无法接受。但2026年,一系列推理加速技术的成熟,让这一局面发…...
Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取
Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取微信小程序作为轻量级应用的代表,已经渗透到电商、社交、工具等各个领域。随着小程序功能的日益复杂,自动化测试成为保障产品质量的重要手段。本文将带你快速搭建微信小程序…...
电信运营商每月处理海量工单,如何不再出错?基于AI Agent的端到端自动化解决方案
在2026年的电信行业,海量工单处理已不再仅仅是效率问题,而是合规与生存的底线。随着2026年5月20日《电信和互联网服务 基础电信企业网上营业厅服务规范》国家标准的正式实施,监管层对“信息透明、流程闭环、计费精准”的要求达到了前所未有的…...
基于MAX78000的医疗紧急呼叫系统:边缘AI与低功耗设计实战
1. 项目概述与核心价值大家好,我是Victor Hugo,一名电子工程师。今天我想和大家分享一个我最近完成并参与设计竞赛的项目:一个基于MAX78000 FTHR开发板的医疗紧急呼叫辅助系统。这个项目的核心,不是从零开始造一个新轮子ÿ…...
Windows Cleaner深度解析:5大核心模块彻底解决系统空间不足问题
Windows Cleaner深度解析:5大核心模块彻底解决系统空间不足问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款完全免费开源的…...
WebSocket实时通信架构进阶:Room、命名空间与集群部署
WebSocket实时通信架构进阶:Room、命名空间与集群部署 作者:Crown_22 | AI Agent & Hermes Agent 桌面程序开发者 前言 WebSocket已经成为实时应用的标准技术,但大多数教程只停留在"建立连接、发送消息"的基础阶段。在生产环境中,你需要处理Room管理、命名空…...
TV Bro电视浏览器:为智能电视打造的最佳遥控器上网解决方案
TV Bro电视浏览器:为智能电视打造的最佳遥控器上网解决方案 【免费下载链接】tv-bro Simple web browser for android optimized to use with TV remote 项目地址: https://gitcode.com/gh_mirrors/tv/tv-bro 还在为智能电视上网操作不便而烦恼吗?…...
INT8量化下TVA注意力对齐精度保障方案
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
高精度光照检测
光线检测仪,kotlin开发,调用手机感光模块检测室内外光照强度,用途多多,我主要用途孩子写作业检测光照保护视力。 食用方法∶打开即测,速度快,无广告,手机平视即可,无须直视光线。 买…...
简单学习 --> SSE
我们使用AI时,AI对我们说的话不会一次性把全部内容弹出来,而是会像流水一样,一点点吐出来,那么这种丝滑的交互体验,背后的核心就是 SSE (Server-Sent Events)。 什么是 SSE? SSE(Server-Sent …...
