Linux系统之----进程的概念

1.进程

1.1基本概念

课本概念 :进程是程序的一个执行实例,是正在执行的程序。当程序被执行时,系统会为其创建一个进程,包含程序代码、数据以及运行时所需的资源。

内核观点 :进程是担当分配系统资源(CPU 时间、内存)的实体。操作系统内核通过进程来管理和调度系统资源,确保每个进程都能合理地使用 CPU、内存等硬件资源。

1.2 描述进程-PCB 

1.2.1 基本概念

进程控制块(PCB) :进程的信息被存放在一个名为进程控制块的数据结构中,它是进程属性的集合,就好比一个档案袋,里面装着进程的各种信息,比如进程的状态、优先级、内存分配情况等。

Linux 中的 PCB(task_struct :在 Linux 操作系统下,PCB 是通过 task_struct 这个结构体来实现的。

1.2.2 task_struct 相关内容

task_struct 的定义task_struct 是 Linux 内核中定义的一个复杂的数据结构,包含在内核源代码的 include/linux/sched.h 文件中。它是内核用来表示和管理进程的核心数据结构,包含进程的各种信息,如进程标识符、状态、内存管理信息、I/O 信息、调度参数等。

task_struct 的作用 :用于在 Linux 中描述进程的结构体,它承载着进程相关的各类信息,是内核管理和调度进程的关键依据。

存储位置task_struct 是 Linux 内核的一种数据结构,会被装载到 RAM(内存)里,这样内核可以快速地访问和修改进程的信息,以实现对进程的有效管理,比如进程的创建、切换、销毁等操作都依赖于对 task_struct 的操作。

 1.2.3 内容分类

1)标示符

作用 :用于唯一标识一个进程,区分系统中的不同进程。

具体信息 :通常包括进程 ID(PID)、父进程 ID(PPID)等信息。

2)状态

作用 :反映进程当前的执行状态,以及进程退出时的相关信息。

具体信息 :包括进程是处于运行态、就绪态、等待态等,还有进程的退出代码(用于表示进程正常结束或异常终止的原因)、退出信号(用于通知其他进程该进程已结束)等。

3)优先级

作用 :决定进程调度的优先顺序,优先级高的进程更容易获得 CPU 资源进行执行。

具体信息 :包括动态优先级和静态优先级,不同的进程调度算法会根据优先级来安排进程的执行顺序。

4)程序计数器

作用 :指示处理器当前正在执行的指令位置,控制程序的执行流程。

具体信息 :指向进程在程序中即将被执行的下一条指令的内存地址,当进程被调度执行时,处理器根据程序计数器的值来获取并执行相应的指令。

5)内存指针

作用 :描述进程在内存中的布局和内存资源的使用情况,以及与其他进程共享内存的区域

具体信息 :包括指向进程的程序代码段、数据段、堆、栈等内存区域的指针。还有指向与其他进程共享的内存块的指针,用于实现进程间通信(IPC)和共享资源等功能。

6)上下文数据

作用 :保存进程执行时处理器的寄存器状态,用于在进程切换时恢复进程的执行环境。

具体信息 :包括处理器的各种寄存器(如通用寄存器、控制寄存器、状态寄存器等)的值,当进程被中断或切换时,系统会保存当前的上下文数据,以便在该进程再次被调度执行时能够恢复到之前的状态继续执行。

7)I/O 状态信息

作用 :记录进程的 I/O 操作相关信息,方便系统进行 I/O 管理和调度。

具体信息 :包括进程已发出的 I/O 请求、分配给进程的 I/O 设备(如磁盘、网络设备等)以及进程打开和使用的文件列表等。

8)记账信息

作用 :用于记录进程的资源使用情况,可用于系统资源管理和计费等目的。

具体信息 :包括进程使用的处理器时间总和(如用户态和内核态的 CPU 时间)、使用的时钟数总和、时间限制(如超时时间)、记账号等。

9)其他信息

作用 :包含一些其他与进程相关的信息,这些信息可能因不同的内核版本或特定的系统配置而有所不同。

具体信息 :例如进程的创建时间、所属的用户和组、安全上下文信息(在支持安全模块的系统中)等。

1.3 进程的查看

1.3.1   PID与PPID

1) PID(Process ID)
  1. 定义

    • PID 是操作系统分配给每个进程的唯一标识符,用于区分系统中的不同进程,是进程存在的标志。

  2. 作用

    • 唯一标识进程 :在 Linux 系统中,每个进程都有一个唯一的 PID,通过 PID 可以准确地识别和操作特定的进程。

    • 进程管理 :系统和用户可以根据 PID 对进程进行管理,如发送信号、终止进程、获取进程信息等。

    • 资源分配 :操作系统利用 PID 来管理进程的资源分配,如内存、CPU 时间等。

  3. 范围

    • 在 Linux 系统中,PID 是一个正整数。传统的 PID 范围是 1 到 32768,但具体范围可能因系统配置而有所不同。可以通过查看 /proc/sys/kernel/pid_max 文件来确定系统中 PID 的最大值。

2) PPID(Parent Process ID)
  1. 定义

    • PPID 是创建该进程的父进程的 ID。每个进程(除了 init 进程)都有一个父进程,PPID 用于标识这个父进程。

  2. 作用

    • 父子进程关系 :PPID 建立了进程之间的父子关系,有助于理解进程的层次结构和来源。例如,通过查看 PPID 可以知道某个进程是由哪个父进程启动的。

    • 进程管理 :在进程管理中,父进程可以利用 PPID 来管理和控制其子进程,如等待子进程结束、获取子进程状态等。

    • 孤儿进程处理 :当父进程终止时,其子进程将成为孤儿进程。系统会将孤儿进程的 PPID 改为 1,由 init 进程(PID 为 1)收养这些孤儿进程,确保它们能够正常结束 

3) 创建子进程的方式

在 Linux 系统中,父进程通过 fork() 系统调用创建子进程。

fork() 的功能是创建一个与父进程几乎完全相同的子进程。子进程会复制父进程的地址空间、环境变量、打开的文件等。

1.3. 2 查看进程的可执行文件

1)使用 /proc 文件系统

/proc 文件系统提供了关于进程的信息,每个进程在 /proc 中有一个以 PID 命名的目录。可以使用 ls -l /proc/<PID>/exe 查看进程对应的可执行文件的链接。 

2)示例:

假设有一个名为 myprocess 的进程,其 PID 为 1234,可以使用以下命令查看其可执行文件:

ls -l /proc/1234/exe

输出可能如下:

lrwxrwxrwx 1 root root 0 Mar 31 20:03 /proc/1234/exe -> /home/user/bin/myprocess

这表明进程 1234 的可执行文件位于 /home/user/bin/myprocess

1.3.3 查看进程及父进程

使用 getpid 和 getppid 函数

  • 功能

  • getpid 函数返回当前进程的 ID(PID)。

  • getppid 函数返回当前进程的父进程 ID(PPID)。

 函数原型:

#include <sys/types.h>
#include <unistd.h>pid_t getpid(void);
pid_t getppid(void);

 应用:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main() {pid_t pid = getpid();    // 获取当前进程的 PIDpid_t ppid = getppid();  // 获取当前进程的 PPIDprintf("Current process ID: %d\n", pid);printf("Parent process ID: %d\n", ppid);return 0;
}

 最后附上老师板书:

1.3.4 fork

 1) 基本概念

fork 的作用是创建一个新进程,这个新进程称为子进程,而调用 fork 的进程称为父进程。子进程是父进程的副本,它继承了父进程的几乎所有资源和状态。

2)工作原理

复制父进程资源

fork 被调用时,操作系统会创建一个新进程,并将父进程的代码段、数据段、堆、栈等资源复制到子进程中。子进程在创建时几乎与父进程完全相同,包括代码、变量、文件描述符、环境变量等。但是,子进程有自己独立的进程标识符(PID),并且它与父进程是两个独立的进程实体

写时拷贝

现代操作系统通常采用“写时复制”技术来优化 fork 的性能。在 fork 调用时,操作系统并不会立即复制父进程的所有资源,而是将父进程的资源标记为“共享”。只有当父进程或子进程对这些资源进行写操作时,操作系统才会真正复制被修改的部分资源,从而避免了不必要的复制操作,节省了时间和内存。

3) 返回值

fork 的返回值用于区分父进程和子进程

在父进程中

fork 返回子进程的进程标识符(PID),这是一个正整数。父进程可以通过这个 PID 来监控子进程的状态,例如使用 waitwaitpid 等系统调用等待子进程结束。

在子进程中

fork 返回 0。子进程可以通过返回值为 0 来判断自己是子进程,并执行相应的逻辑。

出错时

如果 fork 调用失败(例如系统资源不足或超出进程限制),它会返回 -1,并设置错误码 errno

 4)代码示例
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main() 
{pid_t pid = fork(); // 调用 fork 创建子进程if (pid < 0) {// fork 失败perror("fork failed");return 1;}else if (pid == 0) {// 子进程printf("I am the child process, my PID is %d\n", getpid());} else {// 父进程printf("I am the parent process, my PID is %d, my child's PID is %d\n", getpid(), pid);            wait(NULL); // 等待子进程结束}return 0;
}

假设父进程的 PID 是 1234,子进程的 PID 是 1235,程序的输出可能是:

 也许此时会有人疑惑,为什么if和else都进去了??难道是程序出错了吗?还是说我们碰到了编程领域的量子力学了??实际上,这里是多线程编程,可以同时都进的。

 5)代码详解

fork 调用后,程序会分为两部分继续执行:一部分在父进程中运行,另一部分在子进程中运行。因此,ifelse 语句分别对应父进程和子进程的逻辑。

当程序执行到 pid_t pid = fork(); 时,操作系统会创建一个子进程。在调用 fork 之前,父进程和子进程是同一个进程,共享相同的代码和数据。调用 fork 之后,程序会分为两部分继续执行:父进程和子进程。

在父进程中,fork 返回子进程的进程标识符(PID),这是一个正整数。因此,pid > 0,程序会进入 else 分支。

在子进程中,fork 返回 0。因此,pid == 0,程序会进入 else if 分支。

实际上,ifelse 并不是同时进入的,而是分别在父进程和子进程中执行不同的分支。

父进程 执行 else 分支。子进程 执行 else if 分支。

从程序的整体运行角度来看,ifelse 的逻辑分别在两个不同的进程中执行,因此看起来像是“都进去了”,但实际上它们是在不同的上下文中运行的

有一点值得注意的是:当我们创建出子进程后,父子两个进程,谁先运行不确定,具体由OS的调度原则来确定。

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

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

相关文章

Shell脚本中的字符串截取和规则变化

文章目录 前言if通配符判断if判断多个条件规则变化字符串的两个示例改变中间段数字改变末尾段数字 总结 前言 科技的发展会带来习惯的改变&#xff0c;特别是对于我们这批敲代码的&#xff0c;之前还积累一些奇巧淫技&#xff0c;想着在必要的时候卖弄一下&#xff0c;自从生成…

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第七式】程序的编译

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第七式】程序的编译 【心法】 【第零章】c语言概述 【第一章】分支与循环语句 【第二章】函数 【第三章】数组 【第四章】操作符 【第五章】指针 【第六章】结构体 【第七章】const与c语言中一些错误代码 【禁忌秘术】 【第一式】…

Feign 深度解析:Java 声明式 HTTP 客户端的终极指南

Feign 深度解析&#xff1a;Java 声明式 HTTP 客户端的终极指南 Feign 是由 Netflix 开源的 ​声明式 HTTP 客户端&#xff0c;后成为 Spring Cloud 生态的核心组件&#xff08;现由 OpenFeign 维护&#xff09;。它通过注解和接口定义简化了服务间 RESTful 通信&#xff0c;并…

如何Ubuntu 22.04.5 LTS 64 位 操作系统部署运行SLAM3! 详细流程

以下是在本地部署运行 ORB-SLAM3 的详细步骤&#xff0c;基于官方 README.md 和最佳实践整理&#xff0c;适用于 Ubuntu 16.04/18.04/20.04/22.04 系统&#xff1a; 一、系统要求与依赖项安装 1. 基础系统要求 操作系统&#xff1a;Ubuntu 16.04/18.04/20.04/22.04&#xff…

USB 共享神器 VirtualHere 局域网内远程使用打印机与扫描仪

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 很久之前,有分享过使用 CUPS 和路由器来实现局域网内共享打印机,但由于 SANE 支持的打印机较少以及扫描驱动的缺失,试了很多种方法都没有办法成功远程使用打印机的扫描功能。 后面偶然发现 VirtualHere 可以曲线…

一洽智能硬件行业解决方案探索与实践

一、智能硬件行业发展现状剖析 在数字化浪潮推动下&#xff0c;智能硬件行业呈现蓬勃发展态势。软硬件一体化的深度融合&#xff0c;构建起智能化服务的核心架构&#xff0c;而移动应用作为连接用户与设备的重要桥梁&#xff0c;其作用愈发关键。深入研究该行业&#xff0c;可…

【C++ 类和数据抽象】构造函数

目录 一、构造函数的基本概念 1.1 构造函数核心特性 1.2 构造函数的作用 1.3 构造函数类型体系 二、构造函数的类型 2.1 默认构造函数 2.2 带参数的构造函数 2.3 拷贝构造函数 2.4 移动构造函数&#xff08;C11 及以后&#xff09; 三、初始化关键技术 3.1 成员初始…

图数据库nebula测试指南

概述 Nebula是一个开源的分布式图数据库系统&#xff0c;专为处理超大规模关联数据而设计。可以将复杂的关联关系存在nebula图数据库中&#xff0c;提供可视化平台用于案件关联查询及调查。测试的前提是了解nebula图数据库&#xff0c;会使用基本的插入语句和查询语句&#xf…

dispaly: inline-flex 和 display: flex 的区别

display: inline-flex 和 display: flex 都是 CSS 中用于创建弹性盒子布局&#xff08;Flexbox&#xff09;的属性值&#xff0c;但它们之间有一些关键的区别&#xff0c;主要体现在元素如何在页面上被渲染和它们对周围元素的影响。 主要区别 1&#xff0c;块级 vs 行内块级 d…

Sqlserver安全篇之_Sqlcmd命令使用windows域账号认证sqlserver遇到问题如何处理的案例

sqlcmd https://learn.microsoft.com/zh-cn/sql/tools/sqlcmd/sqlcmd-connect-database-engine?viewsql-server-ver16 sqlcmd -S指定的数据库连接字符串必须有对应的有效的SPN信息&#xff0c;否则会报错SSPI Provider: Server not found in Kerberos database. 正常连接 1、…

电脑硬盘常见的几种接口类型

一、传统接口&#xff08;机械硬盘为主&#xff09; 1. SATA 接口&#xff08;Serial ATA&#xff09; 特点&#xff1a; 最主流的机械硬盘&#xff08;HDD&#xff09;接口&#xff0c;广泛用于台式机和笔记本电脑。传输速度较慢&#xff0c;理论最大带宽为 6 Gbps&#xff…

【前端HTML生成二维码——MQ】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前端HTML生成二维码——MQ 前言本文将介绍前端HTML如何更具用户输入的内容生成对应的二维码,附页面代码、实现函数、js脚本。一、自定义显示页面1、效果图二、使用步骤1、引入库2、实现函数3、页面及函数代…

研发效率破局之道阅读总结(3)工程优化

研发效率破局之道阅读总结(3)工程优化 Author: Once Day Date: 2025年4月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…

C# MP3 伴奏

使用建议&#xff1a; 参数调节指南&#xff1a; 低频人声残留&#xff1a;降低CenterFrequency(800-1500Hz) 高频人声残留&#xff1a;提高CenterFrequency(2500-3500Hz) 消除力度不足&#xff1a;提高EliminationStrength(0.9-1.0) 伴奏失真&#xff1a;降低EliminationSt…

大模型面经 | 春招、秋招算法面试常考八股文附答案(四)

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…

Springboot 集成 RBAC 模型实战指南

RBAC 模型核心原理 详情可参考之前的笔记&#xff1a;https://blog.csdn.net/qq_35201802/article/details/146036789?spm1011.2415.3001.5331 RBAC 定义与优势 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;** 是一种通过角色关联…

如何收集用户白屏/长时间无响应/接口超时问题

想象一下这样的场景:一位用户在午休时间打开某电商应用,准备购买一件心仪已久的商品。然而,页面加载了数秒后依然是一片空白,或者点击“加入购物车”按钮后没有任何反馈,甚至在结算时接口超时导致订单失败。用户的耐心被迅速消耗殆尽,关闭应用,转而选择了竞争对手的产品…

用户需求报告、系统需求规格说明书、软件需求规格说明的对比分析

用户需求报告、系统需求规格说明书&#xff08;SyRS&#xff09;和软件需求规格说明书&#xff08;SRS&#xff09;是需求工程中的关键文档&#xff0c;分别对应不同层次和视角的需求描述。以下是它们的核心区别对比&#xff1a; ​​1. 用户需求报告&#xff08;User Requirem…

iostat指令介绍

文章目录 1. 功能介绍2. 语法介绍3. 应用场景4. 示例分析 1. 功能介绍 iostat (input/output statistics)&#xff0c;是 Linux/Unix 系统中用于监控 CPU 使用率和 磁盘 I/O 性能的核心工具&#xff0c;可实时展示设备负载、吞吐量、队列状态等关键指标。 可以使用 man iostat查…

神经网络 “疑难杂症” 破解指南:梯度消失与爆炸全攻略(六)

引言 在神经网络的发展历程中&#xff0c;梯度消失和梯度爆炸如同两座难以翻越的大山&#xff0c;阻碍着深层神经网络发挥其强大的潜力。尤其是在处理复杂任务时&#xff0c;这两个问题可能导致模型训练陷入困境&#xff0c;无法达到预期的效果。本文将深入探讨梯度消失和梯度…