Linux --- 进程

一、进程概念

在 Linux 系统中,​​进程(Process)​​ 是程序执行的动态实例,是操作系统进行资源分配和调度的基本单位。
​​1. 程序 vs 进程​​
​​程序(Program)​​:是静态的代码集合(如二进制可执行文件 /bin/ls),存储在磁盘上,不占用系统资源(如 CPU、内存)。
​​进程(Process)​​:是程序被加载到内存后​​动态运行​​的状态,是操作系统管理的“活”的实体。同一程序可被多次执行,生成多个独立的进程(如同时打开多个 bash 终端)。

二、进程的核心特性

​​1. 动态性​​:进程是程序执行的动态过程,有生命周期(创建→运行→终止)。
​​2. 并发性​​:多个进程可在同一时间段内交替运行(宏观并行,微观串行),由操作系统调度实现。
​​3. 独立性​​:每个进程拥有独立的资源空间(如内存、文件句柄),通过内核隔离,一个进程崩溃不影响其他进程(除非涉及共享资源)、一个进程也无法直接访问其他进程内存的资源。
​​4. 异步性​​:进程的执行顺序由操作系统调度决定,具有不确定性(受优先级、资源竞争等因素影响)。

三、进程状态与切换

Linux 进程的状态反映了其当前的活动情况,常见状态包括:
在这里插入图片描述
状态转换示例​​:

  1. 新进程通过 fork() 创建 → 进入 R(就绪)或直接运行(若 CPU 空闲)。
  2. 进程因 I/O 请求进入 S(可中断睡眠),I/O 完成后被唤醒回 R。
  3. 进程收到 SIGKILL 信号 → 强制终止,释放资源(避免变为僵尸)。
  4. 父进程未调用 wait() 回收子进程 → 子进程终止后变为 Z(僵尸)。

四、进程的描述:进程控制块(PCB)​​

Linux 内核通过 ​​task_struct 结构体​​(进程控制块,PCB)描述进程的所有信息,存储于内核内存中。关键字段包括:

​​1. 标识信息​​:进程 ID(PID,进程的唯一标识)、父进程 ID(PPID)、用户 ID(UID)、组 ID(GID)。
2. ​​状态信息​​:当前状态(如 R/S/Z)、退出状态码(终止原因)。
​​3. 资源信息​​:虚拟内存映射(mm_struct)、打开的文件描述符表(files_struct)、信号处理方式(signal_struct)。
​​4. 调度信息​​:优先级(nice 值)、CPU 占用时间(utime/stime)、调度策略(如 CFS 公平调度)。
​​5. 上下文信息​​:寄存器值(如程序计数器 PC、栈指针 SP)、浮点运算状态(用于进程切换时保存现场)。

​​五、进程的创建与终止​​

​​1. 进程创建​​
Linux 中进程通过 fork() 系统调用创建,遵循“​​写时复制(Copy-On-Write)​​”原则:

父进程调用 fork() 后,内核复制父进程的 PCB 和内存页表(初始时共享物理内存),生成子进程。
子进程从 fork() 的返回值开始往后执行(fork()系统调用,在父进程的代码是返回子进程 PID,在子进程的代码中则是返回 0)。
实际内存复制仅在子进程修改内存时发生(提高效率)。

明明是父进程调用了fork,为什么fork在子进程中也返回了一直值?而且值是0,和父进程的不一样?
解释: 从内核源码(如 Linux 的 fork() 实现)来看,fork() 的返回值是通过​​修改调用者的寄存器状态​​实现的:

  1. 当父进程调用 fork() 时,内核会复制父进程的上下文到子进程,并分别设置两个进程的“返回寄存器”:

  2. 父进程的返回寄存器被设置为子进程的 PID(正数)。子进程的返回寄存器被设置为 0(表示无错误且是子进程)。因此,父进程和子进程在 fork() 后从同一条指令继续执行,但由于寄存器中的返回值不同,它们的后续逻辑会分道扬镳。

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

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

相关文章

Cgroup 控制组学习(三)在容器中使用 CGroups

一、CGroups 关于mememory的限制操作 cgroup关于cpu操作 关于memeory cgroup的几个要点 ① memeory限额类 1、memory.limit_bytes:硬限制--> 限制最大内存使用量,单位有k、m、g三种,填-1则代表无限制,默认是字节2、memory.soft_limi…

SpringBoot面试基础知识

SpringBoot 是面试中后端开发岗位的高频考点,以下是核心考点整理:1. SpringBoot 基础概念- 定义:SpringBoot 是 Spring 框架的简化版,通过“自动配置”“起步依赖”等特性,简化 Spring 应用的搭建和开发,减…

Java面试全方位解析:从基础到AI的技术交锋

Java面试全方位解析:从基础到AI的技术交锋 面试场景:互联网大厂Java工程师岗位面试 面试官:您好,我是今天的面试官,接下来我们将进行三轮技术面试。 谢飞机:您好您好!我是谢飞机,特别…

Web Worker:解锁浏览器多线程,提升前端性能与体验

目录 一、Web Worker 是什么? 核心特性 类型 二、为什么需要 Web Worker?(单线程的痛点) 三、Web Worker 的典型使用场景 四、一个简单的代码示例 (专用 Worker) 五、使用 Web Worker 的注意事项 六、总结 一、Web Worker 是什么? 简…

LabVIEW命令行调用与传参功能

该功能一方面借助 Formatinto String 构建命令行字符串,实现LabVIEW 环境下命令行调用 VI 并传参;另一方面,针对 Mac 平台,通过解析应用 Info.plist 文件,处理 LabVIEW 可执行文件路径,完善跨平台命令行调用…

使用FRP搭建内网穿透工具,自己公网服务器独享内外网端口转发

内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。简单来说,就是让互联网(外网)设备能访问局域网(内网)设备提…

JavaWeb01——基础标签及样式(黑马视频笔记)

1.如何用VScode写html代码 1. 首先在vscode上安装一些插件,插件如下: 2.打开你要写入的html文件的文件夹,然后右击“ 新建文件”,命名 “xxx.html”, 3.如果是写 css文件,那么也是右击“新建文件”,命名“x…

在2G大小的文件中,找出高频top100的单词

将 2GB 的大文件分割为 2048 个大小为 512KB 的小文件,采用流式读取方式处理,避免一次性加载整个文件导致内存溢出。初始化一个长度为 2048 的哈希表数组,用于分别统计各个小文件中单词的出现频率。利用多线程并行处理机制遍历所有 2048 个小…

基于LNMP分布式个人云存储

1.准备工作a.关闭两台虚拟机的安全软件客户端:[rootmaster ~]# systemctl stop firewalld [rootmaster ~]# systemctl disable firewalld [rootmaster ~]# systemctl status firewalld ○ firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (…

指针运算全攻略:加减、比较与排序

常见的指针指针运算说明1.指针与整数的加减运算对指针可以进行加法运算&#xff0c;即p n或者p - n。其结果依旧是一个是一个指针&#xff0c;新的指针是在原来的地址值基础上加上/减去n *(sizeof(指针指向的数据类型)&#xff09;个字节。示例&#xff1a;#include<stdio.…

物联网安装调试-物联网网关

物联网网关作为连接终端设备与云平台的核心枢纽,其分类与选型需结合功能定位、硬件性能、连接方式及应用场景等多维度考量。以下从分类体系和产品推荐两方面系统梳理,助您高效决策: 🔧 一、物联网网关分类体系 1. 按功能定位划分 类型 核心能力 典型场景 代表产品 边缘计…

Jenkins教程(自动化部署)

Jenkins教程(自动化部署) 1. Jenkins是什么&#xff1f; Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;广泛用于项目开发&#xff0c;具有自动化构建、测试和部署等功能。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&…

linux 驱动验证是否成功 之 查看moudle信息

这些是 Linux 内核模块&#xff08;.ko&#xff09;中的元信息&#xff08;metadata&#xff09;&#xff0c;可以通过如下方式查看&#xff1a;✅ 1. 使用 modinfo 命令查看已加载或已编译模块信息 示例&#xff1a; modinfo aw2013.ko输出内容大概如下&#xff1a; filename:…

浏览器关闭之前请求接口到后端

2025.07.24今天我学习了如何在浏览器关闭之前请求一个接口返回到后端。可以用performance.navigation判断是浏览器关闭&#xff0c;还是浏览器刷新&#xff0c;因为我这边只需要浏览器关闭的时候才去触发1. 利用performance API&#xff08;刷新检测&#xff09; 刷新页面时&am…

MySQL批量数据处理与事务管理

MySQL是一种广泛应用的关系型数据库管理系统&#xff0c;尤其在数据分析和业务逻辑处理方面具有重要地位。在数据量庞大的业务场景中&#xff0c;批量数据处理和事务管理是提高效率和保障数据一致性的重要手段。掌握高效的批量数据操作方法与事务管理技巧&#xff0c;不仅能够提…

iOS网络之异步加载

为什么你的图片要异步加载&#xff1f;在仿写天气预报时&#xff0c;我们常常需要从网络加载天气图标&#xff0c;例如显示某个小时的天气状态图标。这看似简单的事情&#xff0c;如果处理不当&#xff0c;却很容易造成界面卡顿&#xff0c;甚至影响整个 App 的用户体验。错误做…

C#值类型属性的典型问题

问题复现&#xff1a;值类型属性的副本问题以下代码展示了值类型属性的典型问题&#xff1a;struct Point {public int X;public int Y; }class MyClass {public Point Position {get; set;} }// 使用属性修改结构体&#xff08;无效&#xff01;&#xff09; var obj new MyC…

机器学习基础-k 近邻算法(从辨别水果开始)

一、生活中的 "分类难题" 与 k 近邻的灵感 你有没有这样的经历&#xff1a;在超市看到一种从没见过的水果&#xff0c;表皮黄黄的&#xff0c;拳头大小&#xff0c;形状圆滚滚。正当你犹豫要不要买时&#xff0c;突然想起外婆家的橘子好像就是这个样子 —— 黄色、圆…

【WPF】NumericUpDown的用法

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;NumericUpDown 控件并不是内置的标准控件之一&#xff0c;但它是一个非常常用的控件&#xff0c;用于让用户输入一个数值&#xff08;整数或浮点数&#xff09;&#xff0c;并提供上下箭头来递增或…

Kotlin位运算

Kotlin 提供了几种用于操作整数各个位&#xff08;bit&#xff09; 的运算符。这些操作是由处理器直接支持的&#xff0c;速度快且操作简单。在底层编程中非常重要&#xff0c;比如设备驱动、低级图形处理、网络通信、加密和压缩等。 尽管计算机通常都有高效的硬件指令来执行算…