news 2026/8/11 12:08:53

《二刷Linux:这一次,我终于“理解”了进程》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《二刷Linux:这一次,我终于“理解”了进程》

二刷Linux:这一次,我终于“理解”了进程


文章目录

  • 二刷Linux:这一次,我终于“理解”了进程
  • 二刷Linux的理解
    • 理解冯诺依曼体系结构
    • 理解数据流动
    • 理解系统调用
    • 进程到底是什么
    • 查看进程的两种方式
    • fork函数的三个问题
    • 进程状态的理解
    • Linux内核链表
  • 一、冯诺依曼体系结构
  • 二、操作系统(OS)
    • 2.1 概念
    • 2.2 设计OS的目的
    • 2.3 核心功能
    • 2.4 如何理解管理
    • 2.5 系统调用和库函数概念
  • 三、进程
    • 3.1 基本概念与基本操作
      • 3.1.1 描述进程-PCB
      • 3.1.2 task_struct
        • 内容分类
        • 组织进程
      • 3.1.3 查看进程
      • 3.1.4 通过系统调用获取进程标示符
      • 3.1.5 通过系统调用创建进程-fork初识
      • 3.1.5 通过代码来创建子进程
    • 3.2 进程状态
      • 3.2.1 Linux内核源代码
      • 3.2.2 进程状态查看
      • 3.2.3 Z(zombie) - 僵尸进程
      • 3.2.4 僵尸进程危害
      • 3.2.5 孤儿进程
    • 3.3 进程优先级
      • 3.3.1 基本概念
      • 3.3.2 查看系统进程
      • 3.3.3 PRI and NI
      • 3.3.4 RPI vs NI
      • 3.3.5 查看进程优先级的命令
      • 3.3.5 进程优先级的极值问题
      • 3.3.6 竞争、独立、并行、并发
    • 3.4 进程切换
      • 3.4.1 Linux2.6内核进程O(1)调度队列
      • 3.4.2 一个CPU拥有一个runqueue
      • 3.4.3 优先级
      • 3.4.4 活动队列
      • 3.4.5 过期队列
      • 3.4.6 active指针和expired指针
      • 3.4.7 总结
  • 四、环境变量
    • 4.1 基本概念
    • 4.2 常见环境变量
    • 4.3 查看环境变量方法
    • 4.4 和环境变量相关的命令
    • 4.5 环境变量的组织方式
    • 4.6 通过代码如何获取环境变量
    • 4.7 通过系统调用获取或设置环境变量
    • 4.8 环境变量通常是具有全局属性的
  • 五、程序地址空间
    • 5.1 研究平台
    • 5.2 程序地址空间回顾
    • 5.3 虚拟地址
    • 5.4 进程地址空间
    • 5.4 区域划分
    • 5.5 虚拟内存管理
    • 5.6 为什么要有虚拟地址空间

二刷Linux的理解

理解冯诺依曼体系结构


理解数据流动


理解系统调用

操作系统的目标如下:


进程到底是什么


查看进程的两种方式


fork函数的三个问题


进程状态的理解



Linux内核链表



一、冯诺依曼体系结构


常见的计算机(如笔记本 服务器),大多数都遵循冯诺依曼体系!


二、操作系统(OS)

2.1 概念

printf的本质:是你把你的数据写到了硬件(显示器)


2.2 设计OS的目的



2.3 核心功能

整个计算机软硬件架构中,操作系统的定位:一款纯正的"搞管理"的软件


2.4 如何理解管理


2.5 系统调用和库函数概念


库函数和系统调用是上下层的关系!

操作系统管理进程:先描述后组织


三、进程

3.1 基本概念与基本操作


3.1.1 描述进程-PCB




3.1.2 task_struct

内容分类


组织进程

可以在内核源代码里找到他
所有运行在系统里的进程都以task_struct链表的形式存在内核中!


3.1.3 查看进程




3.1.4 通过系统调用获取进程标示符

进程 id (PID)
父进程 id (PPID)


3.1.5 通过系统调用创建进程-fork初识



fork之后通常要用if进行分流


3.1.5 通过代码来创建子进程






3.2 进程状态




3.2.1 Linux内核源代码

• 为了弄明⽩正在运⾏的进程是什么意思,我们需要知道进程的不同状态。⼀个进程可以有⼏个状态
(在Linux内核⾥,进程有时候也叫做任务)。

下⾯的状态在kernel源代码⾥定义:


3.2.2 进程状态查看



3.2.3 Z(zombie) - 僵尸进程



创建一个维持30s的僵尸进程的例子:


3.2.4 僵尸进程危害


3.2.5 孤儿进程




3.3 进程优先级

3.3.1 基本概念


3.3.2 查看系统进程

在Linux或unix系统中,用ps-l 命令则会类似输出以下几个内容:


3.3.3 PRI and NI


3.3.4 RPI vs NI


3.3.5 查看进程优先级的命令


3.3.5 进程优先级的极值问题


3.3.6 竞争、独立、并行、并发



3.4 进程切换





参考一下Linux内核0.11代码


3.4.1 Linux2.6内核进程O(1)调度队列


3.4.2 一个CPU拥有一个runqueue

如果有多个CPU就要考虑进程个数的负载均衡问题!


3.4.3 优先级


3.4.4 活动队列



3.4.5 过期队列


3.4.6 active指针和expired指针


3.4.7 总结

在系统中查找一个最合适调度的进程的时间复杂度是一个常数,不随着
进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!


四、环境变量


4.1 基本概念


4.2 常见环境变量


4.3 查看环境变量方法

echo $NAME // NAME: 你的环境变量名称


4.4 和环境变量相关的命令


4.5 环境变量的组织方式


4.6 通过代码如何获取环境变量


libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头⽂件中,所以在使⽤时 要⽤extern声明。


4.7 通过系统调用获取或设置环境变量


4.8 环境变量通常是具有全局属性的

环境变量通常具有全局属性,可以被子进程继承下去!


五、程序地址空间

5.1 研究平台


5.2 程序地址空间回顾



5.3 虚拟地址


然后修改成以下的代码试一下


5.4 进程地址空间

之前说虚拟地址空间不准确,准确的应该说成进程地址空间!


5.4 区域划分


5.5 虚拟内存管理







代码如下(示例):

structvm_area_struct{unsignedlongvm_start;//虚存区起始unsignedlongvm_end;//虚存区结束structvm_area_struct*vm_next,*vm_prev;//前后指针structrb_nodevm_rb;//红⿊树中的位置unsignedlongrb_subtree_gap;structmm_struct*vm_mm;//所属的 mm_structpgprot_tvm_page_prot;unsignedlongvm_flags;//标志位struct{structrb_noderb;unsignedlongrb_subtree_last;}shared;structlist_headanon_vma_chain;structanon_vma*anon_vma;conststructvm_operations_struct*vm_ops;//vma对应的实际操作unsignedlongvm_pgoff;//⽂件映射偏移量structfile*vm_file;//映射的⽂件void*vm_private_data;//私有数据atomic_long_tswap_readahead_info;#ifndefCONFIG_MMUstructvm_region*vm_region;/* NOMMU mapping region */#endif#ifdefCONFIG_NUMAstructmempolicy*vm_policy;/* NUMA policy for the VMA */#endifstructvm_userfaultfd_ctxvm_userfaultfd_ctx;}__randomize_layout;

5.6 为什么要有虚拟地址空间





版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/10 10:28:04

Dify平台的开发者激励计划展望

Dify平台的开发者激励计划展望 在大语言模型(LLM)日益渗透到内容生成、客户服务和企业智能决策的今天,一个明显趋势正在浮现:AI开发的重心正从“调通一个模型”转向“构建可落地的应用”。然而,现实中的大多数团队仍困…

作者头像 李华
网站建设 2026/8/9 10:31:52

萤石开放平台 Ehome协议设备接入 |产品介绍

1. 产品简介 1.1 什么是ehome协议 EHome协议是海康威视针对移动监控场景下开发的设备主动注册协议,它不仅支持实时预览、录像回放、对讲、报警、定位等基础功能,而且在海康的不同类型设备上实现了自定义的功能特性,比如智能报警、低功耗场景…

作者头像 李华
网站建设 2026/7/31 3:26:47

18、利用Ruby与Google AdWords进行数据处理和广告优化

利用Ruby与Google AdWords进行数据处理和广告优化 1. Ruby与Microsoft Office结合进行数据导入 在使用Ruby脚本时,当调用涉及数据库的操作,特别是使用 rubyscript2exe 时,程序会先运行一次以确定所需的库。但数据库驱动要在建立数据库连接时才会加载,如果在那之前不运行…

作者头像 李华
网站建设 2026/8/4 7:21:38

电源完整性基础:去耦电容在电路初期的深度剖析

电源完整性设计:从去耦电容看高速电路的“生命线”你有没有遇到过这样的情况?一个看似完美的硬件设计,原理图严谨、布局规整、信号走线干净利落——可一上电,FPGA莫名其妙锁死;MCU在DMA传输时频繁复位;ADC采…

作者头像 李华
网站建设 2026/8/1 6:17:04

9、PHP开发中的反射API、版本控制与单元测试

PHP开发中的反射API、版本控制与单元测试 1. 反射API中的属性添加 1.1 属性概述 属性是编程语言元素,用于为应用程序添加可通过编程访问的元数据,通常用于与可能与代码协同工作的其他程序进行通信。PHP本身不原生支持属性,但可以通过扩展反射能力来添加属性。 1.2 添加属…

作者头像 李华
网站建设 2026/8/8 0:02:27

17、PHP MVC架构与Zend框架入门指南

PHP MVC架构与Zend框架入门指南 1. MVC架构基础 MVC(Model-View-Controller)模式是一种将应用程序分为三个部分的设计模式,即模型(Model)、视图(View)和控制器(Controller)。这种模式主要用于帮助Web应用程序开发工作流,通过定义特定角色让团队更高效地协作,这些角…

作者头像 李华