Linux多进程

进程的概述

进程是计算机科学中的一个基本概念,它指的是在操作系统中正在执行的程序的实例

在Linux操作系统中,进程是程序执行的实体,是资源分配的基本单位

在在Ubuntu中,通过使用ps命令可以查看当前的进程列表

ps aux

进程与程序的区别

  1. 定义

    • 程序:程序是一组指令的集合,它们被编写来执行特定的任务,存储在磁盘上的可执行文件中。程序是静态的,不包含关于执行状态的信息。
    • 进程:进程是程序的执行实例,是程序在执行时的动态实体。它不仅包含程序代码,还包括程序计数器、寄存器、堆栈、内存分配等执行状态信息。
  2. 存储位置

    • 程序通常存储在磁盘上,是持久的。
    • 进程存在于内存中,是暂时的,随程序的执行而动态变化。
  3. 执行

    • 程序本身不执行任何操作,它只是指令的集合。
    • 进程是程序在执行时的实体,具有执行能力。
  4. 生命周期

    • 程序的生命周期与文件系统相关,只要文件未被删除,程序就存在。
    • 进程的生命周期与执行过程相关,一旦执行结束或被终止,进程就会消亡。

程序是一组静态的指令集合,而进程是这些指令在执行时的动态实体,包含了程序计数器、寄存器、内存等执行状态信息。程序是进程执行的基础,而进程是程序执行的载体。

并发与并行

并发(Concurrency)

  1. 定义:并发是指在计算机系统中,多个任务(程序或线程)似乎同时执行的能力。实际上,这些任务可能是交替执行的,但它们在时间上被分割,使得从外部看起来像是同时进行。
  2. 多任务处理:并发通常通过时间分片或多任务处理实现,操作系统将CPU时间分配给不同的任务,快速地在它们之间切换。
  3. 单核处理器:即使在单核处理器上,也可以通过操作系统的调度实现并发执行。
  4. 目的:并发的主要目的是提高资源利用率和系统吞吐量

并行(Parallelism)

  1. 定义:并行是指在计算机系统中,多个任务或计算过程真正同时执行的能力。
  2. 硬件支持:并行需要硬件支持,如多核处理器、多处理器或分布式计算系统。
  3. 同时执行:在并行计算中,任务或数据被分割成多个小块,每一块都在不同的处理器或计算节点上同时执行。
  4. 目的:并行的主要目的是减少程序的执行时间,通过并行处理可以显著提高计算速度。

区别

  • 执行方式:并发是任务交替执行,给人一种同时执行的假象;并行是任务真正同时执行。
  • 硬件要求:并发可以在单核上实现,而并行需要多核或多处理器。
  • 性能提升:并行通常能提供更显著的性能提升,因为它减少了任务的总体执行时间。
  • 复杂性:并行编程通常比并发编程更复杂,因为它需要处理数据同步、通信和潜在的竞态条件。

进程的空间分配

进程的空间分配

进程建立之后,系统则要为这个进程分配相应的空间,32位Linux系统中,会为每个进程分配 4G 的空间。

4G的进程空间主要分为两部分,高位1G是内核空间,低位3G是用户空间

 用户空间又具体分为如下区间

stack : 存放非静态的局部变量

heap : 动态申请的内存

.bss : 未初始化过的全局变量(包括初始化为0的,未初始化过的静态变量(包括初始化为0)

.data : 初始化过并且值不为0的全局变量,初始化过的不为0静态变量

.rodata : 只读变量(字符串之类)

.text : 程序文本段(包括函数,符号常量)

Tips:1. 当用户进程需要通过内核获取资源时,会切换到内核态运行,此时当前进程会使用内核空间的资源

2. 用户需要切换到内核态运行时,主要是通过 系统调用

虚拟地址与物理地址 

  1. 物理地址(Physical Address)
    • 物理地址是内存单元在实际物理内存(RAM)中的实际地址。
    • 它们是直接被内存管理单元(MMU)和CPU用来访问物理内存的地址。
    • 物理地址的大小受限于系统的物理内存大小。
  2. 虚拟地址(Virtual Address)
    • 虚拟地址是程序在执行时使用的地址,它们通过内存管理单元(MMU)转换为物理地址。
    • 虚拟地址允许每个进程拥有自己的地址空间,这个地址空间不必与物理内存的实际布局相对应。
    • 虚拟地址的大小通常由CPU的地址宽度决定,例如32位或64位。
  3. 内存管理单元(MMU)
    • MMU是硬件组件,负责将虚拟地址转换为物理地址,这个过程称为地址转换。
    • 当程序访问内存时,MMU查找它的页表,找到虚拟地址对应的物理地址。
  4. 内存映射(Memory Mapping)
    • 内存映射是将文件或设备直接映射到虚拟地址空间的过程,这样可以使用虚拟地址来访问文件或设备。
  5. 地址转换过程
    • 当程序访问一个虚拟地址时,MMU使用页表来确定对应的物理地址。
    • 如果虚拟地址不在当前的页表中,将触发缺页异常(Page Fault),操作系统会处理这个异常,将缺失的数据加载到物理内存中。

 在操作系统中使用虚拟地址空间主要是基于以下原因:

1.直接访问物理地址,会导致地址空间没有隔离,很容易导致数据被修改

2.通过虚拟地址空间可以实现每个进程空间都是独立的,操作系统会映射到不用的物理地址区间,在访问时互不干扰

Linux的状态管理

进程状态描述了进程在操作系统中的生命周期中的不同阶段

三态模型

进程的三态模型是操作系统中描述进程状态及其转换的基本理论,包括以下三种状态:

  1. 运行态(Running):进程当前正在执行,占用CPU资源。在单核系统中,只有一个进程处于此状态;而在多核系统中,可以有多个进程同时处于运行态 。

  2. 就绪态(Ready):进程已经具备了运行的所有条件,包括所需的资源,等待CPU调度执行。处于就绪状态的进程可能存在多个,它们通常被组织在就绪队列中等待CPU时间 。

  3. 等待态(Waiting或Blocked):又称阻塞态或睡眠态,进程正在等待某个事件的发生,如I/O操作完成或某些资源的可用性。在这种状态下,即使分配CPU资源,进程也无法立即执行 。

进程状态转换的主要场景包括:

  • 运行态→等待态:进程可能因等待资源(如I/O操作)而从运行状态转换到等待状态。
  • 等待态→就绪态:当进程所等待的事件发生,如I/O操作完成,进程从等待状态转换到就绪状态。
  • 运行态→就绪态:由于时间片用完或出现更高优先级的进程,当前运行的进程可能会被挂起,转换到就绪状态。
  • 就绪态→运行态:当CPU空闲或调度策略选中就绪队列中的进程时,进程从就绪状态转换到运行状态 。

三态模型简洁地描述了进程在生命周期中的基本状态及其转换,是操作系统中进程管理的核心概念之一。

五态模型

五态模型是操作系统中描述进程状态及其转换的一种模型,它在传统的三态模型基础上增加了新建态(new)和终止态(exit),具体包括以下五种状态:

  1. 创建态(New)

    • 对应于进程被创建时的状态,此时进程已经拥有进程控制块(PCB),但其他资源尚未就绪,进程尚未进入就绪队列。创建进程需要两个步骤:分配所需的资源和建立管理信息,然后操作系统将该进程设置为就绪态并等待调度执行 。
  2. 就绪态(Ready)

    • 进程已经具备了除CPU以外的所有必要资源,一旦获得CPU即可运行。系统中可能存在多个处于就绪状态的进程,它们通常被组织在就绪队列中等待CPU时间 。
  3. 运行态(Running)

    • 进程当前正在执行,占用CPU资源。在单核系统中,只有一个进程处于此状态;而在多核系统中,可以有多个进程同时处于运行态 。
  4. 等待态(Waiting或Blocked)

    • 进程正在等待某个事件的发生,如I/O操作完成或信号量等资源的可用性,因此暂时无法执行。即使分配了CPU资源,进程也无法立即运行,故称该状态为阻塞状态 。
  5. 终止态(Exit)

    • 进程完成任务正常结束,或因错误异常终止,或被操作系统及有终止权的进程所终止时所处的状态。处于终止态的进程不再被调度执行,操作系统将进行善后处理,回收资源并最终从系统中删除该进程 。

五态模型通过引入新建态和终止态,更加细致地描述了进程从创建到结束的整个生命周期,为操作系统提供了更为丰富的状态管理和调度策略。

经常使用的进程状态:

(1)运行态(TASK_RUNNING) : 此时进程或者正在运行,或者准备运行,就绪或者正在进行都属于运行态

(2)睡眠态(TASK_SLEEP): 此时进程在等待一个事件的发生或某种系统资源

可中断的睡眠(TASK_INTERRUPT) : 可以被信号唤醒或者等待事件或者资源就绪

不可中断的睡眠(TASK_UNTERRUPT) : 只能等待特定的事件或者资源就绪

(3)停止态(TASK_STOPPED) : 进程暂停接受某种处理。例如:gdb调试断点信息处理。

(4)僵尸态(TASK_ZOMBIE):进程已经结束但是还没有释放进程资源

Linux下进程的相关命令

  1. ps:查看当前运行的进程

ps -aux 显示所有进程的详细信息

ps -ef 列出所有的进程,相比 ps -aux 信息要少一些

  1. top:实时显示进程的资源占用情况,类似于Windows的任务管理器。

top -i:不显示任何闲置 (idle) 或无用 (zombie) 的进程

top -n:更新的次数,完成后将会退出top
  1. pgrep:根据名称或其他属性查找进程。

pgrep -u username 查找特定用户的所有进程
  1. kill:向特定PID的进程发送信号

kill -9 PID 发送SIGKILL信号以杀死进程
  1. pstree:以树状图展示进程和它们的父进程关系

pstree -p 显示进程树并包括进程的PID

 结语:

无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值