当前位置: 首页 > backend >正文

Linux进程解析

一、进程的基本概念

1.进程的定义

  • 进程是操作系统中正在运行的程序的实例。每个进程都有自己的地址空间、文件描述符、栈和堆等资源。
  • 进程标识符(PID):每个进程都有一个唯一的PID,用于标识和管理进程。

2.进程与程序的区别

  • 程序是存储在磁盘上的可执行文件,包含指令和数据。
  • 进程是程序在内存中的运行实例,包含程序的代码、数据、堆栈以及操作系统分配的资源。

二、进程的内存结构

每个进程在内存中有自己独立的地址空间,通常分为以下几个部分:

1.代码段(Text Segment)

  • 存储程序的指令代码,通常是只读的。
  • 特点:多个进程可以共享同一个代码段以节省内存。

2.数据段(Data Segment)

  • 初始化数据段:包含有初始值的全局变量和静态变量。
  • 未初始化数据段(BSS):包含未初始化的全局变量和静态变量,默认为零。
  • 特点:数据段在进程创建时被分配,并在进程生命周期内存在。

3.堆(Heap)

  • 动态内存分配区域,程序可以通过 malloccallocrealloc 等函数分配和释放内存。
  • 特点:堆的大小在运行时可以动态变化,内存分配和释放需要管理。

4.栈(Stack)

  • 用于存储函数调用时的局部变量、函数参数、返回地址等。
  • 特点:栈的大小是固定的,超出限制会导致栈溢出。栈的增长方向通常是从高地址向低地址。

5.内核空间(Kernel Space)

  • 内核代码和数据所在的区域,用户进程无法直接访问。
  • 特点:用户进程通过系统调用进入内核空间,执行特权操作。

6.用户空间(User Space)

  • 进程可以访问的内存区域,包括代码段、数据段、堆和栈。

三、进程的生命周期

1.创建

  • fork():创建一个新的进程(子进程),子进程是父进程的副本,复制父进程的所有资源。
    • 特点:子进程与父进程拥有相同的代码、数据和堆栈,但拥有独立的地址空间和资源。
  • exec():用一个新的程序替换当前进程的映像。
    • 特点:不创建新进程,而是替换当前进程的代码、数据和堆栈。
  • clone():类似于 fork(),但提供了更多的选项来控制子进程的资源共享。
    • 特点:常用于创建线程,允许父子进程共享某些资源。

2.运行

  • 进程在CPU上执行指令,状态为 RUNNING
  • 调度:多个进程通过调度算法轮流使用CPU资源。

3.等待

  • 进程等待某个事件(如I/O操作完成),状态为 SLEEPING 或 WAITING
  • 特点:进程在等待期间不消耗CPU资源,直到事件发生。

4.停止

  • 进程被信号(如 SIGSTOP)停止,状态为 STOPPED
  • 特点:进程暂停执行,直到收到继续执行的信号(如 SIGCONT)。

5.终止

  • 正常终止:进程调用 exit() 或从 main 函数返回,状态为 TERMINATED
  • 异常终止:进程被信号(如 SIGKILL)终止。
  • 特点:进程退出后,内核会回收其资源,父进程可以通过 wait() 或 waitpid() 获取子进程的退出状态。

四、进程调度

Linux采用抢占式多任务调度机制,允许多个进程并发执行。调度算法决定了哪个进程在何时获得CPU资源。

1.调度策略

  • SCHED_OTHER:默认的调度策略,适用于普通进程,采用分时调度。
  • SCHED_FIFO:实时调度策略,先入先出。
  • SCHED_RR:实时调度策略,轮转调度。

2.调度算法

  • CFS(Completely Fair Scheduler):完全公平调度器,是Linux默认的调度算法,根据进程的虚拟运行时间(vruntime)进行调度,确保每个进程公平地获得CPU时间。
  • 实时调度:为需要及时响应的任务提供保证。

五、进程间通信(IPC)

进程间通信是指不同进程之间交换数据和控制信息的方式。常见的IPC机制包括:

1.管道(Pipes)

  • 特点:半双工的通信机制,用于在父子进程或不同机器上的进程之间传递数据。
  • 类型:匿名管道(使用 |)和命名管道(FIFO)。

2.信号(Signals)

  • 特点:异步事件,用于通知进程发生了某个事件(如 SIGINTSIGKILL)。
  • 用途:信号可以用于进程间通信、错误处理和任务控制。

3.消息队列(Message Queues)

  • 特点:允许进程以消息的形式交换数据,支持消息的优先级和随机访问。
  • 用途:适用于需要异步通信的场景。

4.共享内存(Shared Memory)

  • 特点:允许多个进程访问同一块内存区域,实现高效的数据共享。
  • 用途:适用于需要频繁读写共享数据的场景。

5.信号量(Semaphores)

  • 特点:用于同步进程对共享资源的访问,防止竞争条件。
  • 用途:控制多个进程对共享资源的访问顺序。

6.套接字(Sockets)

  • 特点:用于在不同机器上的进程之间进行网络通信。
  • 用途:适用于网络编程和分布式系统。

六、进程与线程

1.线程

  • 定义:线程是进程中的执行单元,一个进程可以包含多个线程。
  • 特点
    • 共享资源:线程共享进程的地址空间、文件描述符等资源,但拥有独立的栈和寄存器。
    • 并发执行:多个线程可以并行执行,提高程序的并发能力。
    • 轻量级:线程的创建和切换开销比进程小。

2.多线程的优势

  • 并发性:多个线程可以并行执行,提高程序的响应速度。
  • 资源共享:线程之间共享内存,通信效率高。
  • 轻量级:线程的创建和切换开销比进程小。

3.多进程与多线程

  • 多进程:适用于需要严格隔离的任务,进程间通信开销较大。
  • 多线程:适用于需要高效共享数据的任务,但需要处理同步和互斥问题。

七、进程安全与权限

1.用户与组

  • 定义:每个进程都有一个所有者(用户)和所属组,决定了进程对系统资源的访问权限。
  • 用途:通过用户和组来控制进程对文件、设备和网络资源的访问。

2.权限控制

  • 文件权限:控制进程对文件的读写执行权限。
  • 能力(Capabilities):细粒度的权限控制机制,允许进程拥有特定的能力而不需要完整的root权限。
  • 访问控制列表(ACL):提供更细粒度的权限控制。

3.沙箱机制

  • Linux Containers(如Docker):通过命名空间和控制组(Cgroups)实现进程隔离。
  • Seccomp:限制进程的系统调用,减少攻击面。
  • AppArmor 和 SELinux:提供更强的安全策略和访问控制。
                http://www.xdnf.cn/news/2306.html

                相关文章:

              1. 信息系统项目管理师备考计划
              2. 摸鱼屏保神器工具软件下载及使用教程
              3. C#里使用libxl来加载网络传送过来的EXCEL文件
              4. 计算机二级MS Office第一套演示文稿
              5. 图解 Redis 事务 ACID特性 |源码解析|EXEC、WATCH、QUEUE
              6. 【数据湖】Time Travel时间旅行
              7. 每日学习Java之一万个为什么?
              8. 3.1 掌握RDD的创建
              9. 英语学习4.26
              10. 进行物联网安全PoC时的注意事项
              11. 【Java-Day 1】开启编程之旅:详解Java JDK安装、环境配置与运行HelloWorld
              12. 用c语言实现——一个动态顺序存储的串结构
              13. 山东大学软件学院项目实训-基于大模型的模拟面试系统-前端美化滚动条问题
              14. 2025年4月25日第一轮
              15. Vue Composition API 与 Options API:全面对比与使用指南
              16. HTML快速入门-4:HTML <meta> 标签属性详解
              17. 【漫话机器学习系列】224.双曲正切激活函数(Hyperbolic Tangent Activation Function)
              18. 现在流行的linux面板管理工具
              19. 三款实用工具推荐:图片无损放大+音乐格式转换+音视频格式转换!
              20. TCGA 数据下载与生存分析 //todo
              21. FreeRTOS事件标志组详解:高效的任务间通知机制
              22. 结合五层网络结构讲一下用户在浏览器输入一个网址并按下回车后到底发生了什么?
              23. 机器学习基础理论 - 频率派 vs 贝叶斯派
              24. Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
              25. 什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?
              26. Spring 学习笔记之 @Transactional 异常不回滚汇总
              27. 【机器学习-线性回归-3】深入浅出:简单线性回归的概念、原理与实现
              28. 【VMware】虚拟机如何扩展存储
              29. LLM基础之源码一
              30. asammdf 库的依赖项和安装指南