【Linux】进程概念

本文详细介绍了Linux进程的相关知识,包括进程的概念、描述进程的PCB(进程控制块)、进程状态(七种状态,如僵尸进程、孤儿进程)、进程优先级及其调整、环境变量的使用和管理,以及程序地址空间的虚拟地址机制。通过对进程的深入理解,有助于更好地管理和操控Linux系统。

目录

一、什么是进程?

二、如何描述进程?

1. 要描述进程就得先了解进程:

2. 进程描述符---PCB:

3. task_struct 中包含的进程信息:

4. Linux 如何组织进程?

5. 查看进程

  (1) 通过 ps 命令查看进程:

 (2) 通过系统调用获取进程 id 

6. 创建进程

三、进程状态

(1)Linux 下进程的 七种 状态

(2)僵尸进程

(3)孤儿进程

四、进程优先级

1. 优先级是什么?

2. 为什么要有优先级?

3. 进程优先级概念

(1)基本概念:

(2)其他概念:

4. 查看进程

(1)查看系统进程 

(2)查看指定进程

(3)PRI  &  NI

(4)修改进程优先级

五、环境变量

1. 环境变量基本概念

2. 常见的环境变量

3. 查看 或 设置环境变量

4. 环境变量在代码中的获取 & 全局特性

六、程序地址空间(进程虚拟地址空间)

1. 研究背景

2. 进程虚拟地址空间

(1)早期内存管理机制

(2)操作系统对内存的管理方法

(2)分页 & 虚拟地址空间(结构体 mm_struct)

(3)虚拟内存的工作原理:


一、什么是进程?

       用户角度:进程就是正在运行中的程序

       操作系统角度:进程就是操作系统对运行中程序的描述信息--->进程描述符(简称PCB)。

二、如何描述进程?

1. 了解进程:

       进程:运行中的程序,当一个程序运行起来,程序从磁盘中被加载到内存里,CPU 要调度这个程序运行,操作系统为了更好的管理这个运行中的程序,因此使用 pcb 描述符 进行描述,并管理这个运行中的程序,因此站在操作系统的角度,进程就是 pcb。在 Linux 下 pcb 的具体对象是一个结构体:task_struct

2. 进程描述符---PCB:

  • 在 Linux 中描述进程的结构体就是 task_struct,它是 pcb 的一种特殊结构
  • task_struct Linux 内核的一种 数据结构 ,它会被装载到 RAM (内存) 里,并且它还包含着进程的信息

3. task_struct 中包含的进程信息:

  1.  身份标识符 (进程  id,pid) :描述进程的唯一标识符,用于区别其他进程。
  2.  内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。它的作用是找到进程对应的代码和代码依赖的数据的位置。
  3.  辅助进程调度的信息:

          a)  优先级:相对于其他进程的优先级,它决定了进程被调度到 CPU 上执行的先后顺序。

          b)  上下文( CPU 中的各种存储器):保存了该进程上次在 CPU 内部执行的“现场”,即进程执行时处理器的寄存器中的数据

          c)  记账信息:统计了一个进程何时应该让出 CPU,也就是说它决定着进程什么时间需要占用 CPU,什么时间需要放弃 CPU,可能包括处理器时间总和,使用的时钟总数,时间限制,记账号等。

          d)  进程的状态:记录的当前进程所处的状态。

     4.  IO 状态信息(文件描述符表):包括显示的 I/O 请求,分配给进程的 I/O 设备和被进程使用的文件列表。

     5.  信号相关信息

4. Linux 如何组织进程?

      通过双向链表的形式对进程进行组织。所有运行在系统中的进程都以 task_struct 链表的形式存在内核里。

5. 查看进程

  (1) 通过 ps 命令查看进程:

ps aux     // 查看操作系统上的所有进程

     

ps aux | grep 进程名      // 查看指定进程

  

ps -ef     // 查看系统的所有进程,但是没有 ps aux 显示的信息全面

ps -ef | wc -l           //  统计系统中正在运行的进程个数

 

ps -ef | grep 进程名      // 查看指定进程

 (2) 通过系统调用获取进程 id 

  • 父进程 id (PID)
  • 子进程 id (PPID)
#include<stdio.h>
#include<unistd.h>

int main()
{
    printf("pid:%d\n", getpid());
    printf("ppid:%d\n", getppid());
    return 0;
}

6. 创建进程

 (1)创建一个进程就相当于创建一个 pcb 

 (2)操作系统启动创建的第一个进程是 init 进程,后续操作系统上所有的进程都是由 init 进程直接或间接的创建出来的。用大白话讲:init  可以理解为其他进程的 “ 老祖宗 ”,并且 init 进程的进程id   pid = 1    

 (3)通过系统调用创建进程---fork

  • fork 是通过复制调用进程来创建子进程的。其中 复制 的是父进程的 pcb,因此代码共享,数据独有。
  • 父进程创建子进程的过程:以父进程为模板,把父进程的 pcb 复制过来,然后稍加修改 ( pid / ppid ),内存指针基本相同,上下文(EIP)也是相同的,父子进程执行同一份代码,由于 EIP 也是相同的,所以 fork 执行完毕之后,父进程和子进程都要从 fork 之后的位置继续执行,直到程序结束。
  • fork 返回值的含义:                                                                                                                                                                    1. 父进程返回的是子进程的 pid;                                                                                                                                               2. 子进程返回的是 0;                                                                                                                                                                3. fork 执行失败返回  -1;
  • fork 执行失败的原因          &nb
### Linux 进程基本概念详解 Linux 系统中的进程是操作系统进行资源分配和调度的基本单位,每个运行中的程序都对应一个进程进程的管理与调度是操作系统的核心功能之一[^1]。以下将从多个方面对 Linux 进程的基本概念进行详细说明。 #### 1. 进程状态Linux 系统中,进程具有多种状态,这些状态反映了进程当前的行为和生命周期。通常,Linux 中的进程有以下几个主要状态- **创建状态**:当一个新的进程被创建时,它处于此状态- **就绪状态**:进程已经准备好运行,等待 CPU 资源分配。 - **执行状态**:进程正在 CPU 上运行。 - **阻塞状态(等待状态)**:进程因等待某些事件(如 I/O 操作完成)而暂停运行。 - **终止状态**:进程已完成或被终止。 此外,Linux 特有的状态还包括: - **D状态(不可中断的睡眠状态)**:这是一种深度睡眠状态,通常发生在进程与硬件交互时,例如等待慢速设备完成操作。该状态下的进程无法被信号唤醒或终止,只能通过等待其完成或重启系统来解决[^2]。 - **Z状态(僵尸状态)**:当子进程退出后,父进程尚未回收其退出状态时,子进程会进入僵尸状态。这种状态进程仅保留在进程表中,不占用任何实际资源[^5]。 #### 2. 进程控制块(PCB) 每个进程都有一个对应的进程控制块(Process Control Block, PCB),它是操作系统用来描述和管理进程的数据结构。PCB 包含了进程的所有信息,包括但不限于: - 进程标识符(PID) - 内存管理信息 - CPU 寄存器状态 - 文件描述符- 其他资源使用情况 PCB 是操作系统管理和调度进程的基础,通过它,操作系统可以跟踪和控制每个进程的运行状态[^4]。 #### 3. 进程优先级与竞争性 由于系统中可能存在大量的进程,而 CPU 的资源有限,因此进程之间存在竞争关系。为了更高效地完成任务,操作系统引入了进程优先级概念进程优先级决定了进程在 CPU 调度中的顺序,高优先级进程通常会优先获得 CPU 资源。可以通过 `nice` 命令调整进程优先级[^3]。 #### 4. 进程的并行与并发 - **并行**:在多核或多 CPU 系统中,多个进程可以同时运行,这称为并行。 - **并发**:在单核 CPU 系统中,操作系统通过时间片轮转等调度策略,在一段时间内让多个进程轮流运行,从而实现并发的效果[^3]。 #### 5. 创建子进程Linux 系统中,可以通过 `fork()` 系统调用创建子进程。`fork()` 函数会复制当前进程的所有资源,并生成一个几乎完全相同的子进程。子进程拥有独立的地址空间和资源,但继承了父进程的部分属性,例如文件描述符环境变量[^4]。 ```python import os pid = os.fork() if pid == 0: # 子进程代码 print("子进程 PID:", os.getpid()) else: # 父进程代码 print("父进程 PID:", os.getpid(), "子进程 PID:", pid) ``` #### 6. 查看进程 Linux 提供了多种工具用于查看和管理进程,例如: - `ps` 命令:显示当前系统的进程状态- `top` 命令:实时监控系统中各个进程的资源使用情况。 - `kill` 命令:向指定进程发送信号以终止或控制其行为。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值