【Linux】什么是进程(process)?

文章介绍了进程与程序的区别,强调进程是程序执行时的实例,具有PID和权限等属性。PCB(进程控制块)在Linux中表现为task_struct,用于存储进程信息。讨论了Linux和Windows下的进程查看及管理,并介绍了父进程、子进程的概念,以及fork函数在创建进程中的作用。

进程与程序概念

在Linux系统中,触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,成为PID,同时根据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。

  • 程序(program):通常为二进制程序,存放在存储媒介中(如硬盘、光盘、软盘、磁带等),以物理文件的形式存在。
  • 进程(process):程序被触发后,执行者的权限与属性、程序的代码与所需数据等都会被加载到内存中,操作系统给予这个内存中的单元一个标识符(PID),可以说进程就是一个正在运行中的程序。内核观点:担当分配系统资源(CPU时间,内存)的实体

如何产生一个进程?
  执行一个程序或命令就可以触发一个事件而获取一个PID。系统只认识二进制文件,当我们要让系统工作的时候,就需要启动一个二进制文件,这个二进制文件就是程序(program)。
  程序一般是放置在物理磁盘中,通过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程。
  为了让操作系统可以管理进程,进程会给予执行者权限/属性等参数,以及进程所需要的脚本或数据等,最后再给予一个PID。操作系统通过这个PID来判断该进程是否具有执行权限。

在这里插入图片描述


描述进程-PCB

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

task_struct-PCB的一种:

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

在这里插入图片描述
  实际上,有太多的需要加载进CPU的程序,那么操作系统要不要管理这些加载进来的程序呢?答案是肯定的

PCB:

//进程控制块
struct task_struct{
	//该进程所有属性
	//该进程对应的代码和属性地址
	struct task_struct* next;//用来链接PCB
}

  我们在每个需要加载进入CPU的程序分配一个PCB,用来管理这些程序,通过该程序属性里的优先级决定什么时候加载进入CPU。
  所谓对进程的管理,实际是对进程对应的PCB进行相关管理。对进程的管理转化成对链表的增删改。

task_ struct内容分类:

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

struct task_struct 内核结构体 -> 内核对象task_struct对象 -> 将该结构与代码和数据关联起来 -> 先描述再组织的工作
进程 = 内核数据结构(task_struct)+ 进程对应的磁盘代码

Windows进程与Linux进程

Windows下的进程:
在这里插入图片描述
Linux下的进程:
在这里插入图片描述

//显示进程标题
ps axj | head -1
//显示标题的同时将进程信息显示出来
ps axj | head -1 && ps axj | grep 'Test'

在这里插入图片描述
杀掉一个进程:

kill -9 +(PID)

在这里插入图片描述

进程在调度运行的时候,进程就具有动态属性


Linux进程操作

子进程

查看进程id(PID):

getpid();

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

另一种查看进程方法:

ls /proc 

在这里插入图片描述
在这里插入图片描述
 进程终止,这个以进程PID命名的文件会自动被系统回收
在这里插入图片描述
 进入这个PID命名的进程目录
在这里插入图片描述

如果我们在进程正在运行的时候将进程的二进制文件删除,那么进程会继续运行吗?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
 一个进程对应的程序在加载到内存中后,理论上就与磁盘中的可执行程序没有关系了。(当然也有特殊情况)

父进程

父进程id(PPID)

getppid();

在这里插入图片描述
运行程序发现:
在这里插入图片描述
在这里插入图片描述
  我们发现这个父进程的ID对应的就是bash,这个bash是什么呢?
  shell是一个程序,可以称之为壳程序,用于用户与操作系统进行交互,bash命令是shell命令的超集,大多数shell脚本都可以在bash下运行。
  当我们登陆系统后,会获取一个bash的shell,然后我们用这个bash提供的接口去执行各种命令,比如ll、ls、touch、mkdir等,这个另外执行的命名也会触发成为PID,这个后来执行命令所产生的PID就是子进程,而在我们原本的bash环境下就是父进程

命令行上启动的进程,一般它的父进程没有特殊情况的话,都是bash

创建进程(初识-fork)

fork是一个函数,函数在执行前只有一个父进程,函数在执行后是为 父进程+子进程
在这里插入图片描述
 上面的ID关系是 24923是爷爷 5338是儿子 5339是孙子

fork的返回值:在这里插入图片描述
 在父进程中返回子进程的PID,而在子进程中返回0
在这里插入图片描述

初识多进程:
在这里插入图片描述
 fork()之后,就有父进程和子进程两个进程同时执行后续代码,fork后续的代码为父子进程共享,通过fork返回值的不同,使得父子进程运行的代码不同。


如有错误或者不清楚的地方欢迎私信或者评论指出🚀🚀

### Linux 进程的定义与相关概念 #### 1. **进程的定义** 在Linux中,进程是一个正在运行的程序实例。它是操作系统分配资源的基本单位,也是系统中最基本的任务调度实体[^1]。每一个进程都有自己的地址空间、打开文件列表以及其他独立的状态信息。 #### 2. **进程的核心描述结构** Linux中的每个进程都由内核维护的一个`task_struct`结构体来描述,该结构包含了关于进程的所有必要信息,例如进程ID(PID)、父进程ID(PPID)、状态标志位、优先级、内存管理信息、I/O设置以及信号队列等[^1][^2]。这个结构体位于进程控制块(Process Control Block, PCB)中,是操作系统管理和调度进程的基础[^3]。 #### 3. **进程的作用** - **资源隔离**:通过为每个进程提供单独的虚拟地址空间和其他资源,确保各进程之间互不干扰。 - **并发执行**:允许多个任务在同一时间片内交替运行,提高系统的整体效率。 - **动态性**:进程可以根据需求创建新的子进程或终止现有进程,适应复杂多变的工作负载场景。 - **交互能力**:支持父子进程间通信(IPC),使得应用程序能够协同工作以完成更复杂的任务。 #### 4. **进程的生命周期** 一个典型的生命历程包括以下几个阶段: - 创建:通过`fork()`系统调用复制当前进程并生成一个新的子进程[^4]。 - 执行:新创建的子进程继承了父进程中大部分属性,并开始独立运行。 - 结束:当某个进程完成了其使命后主动退出,或者因错误被强制杀死时进入终止状态。 #### 5. **常用的操作** 以下是几种常见的对进程进行操作的方式: - 获取进程标识符:使用`getpid()`获取当前进程ID,使用`getppid()`获得父进程ID[^2]。 - 查看进程状态:借助命令如`ps aux`或`ps axj`可以全面了解系统内的活动进程详情[^5]。 - 终止指定进程:可通过发送信号的方法停止不需要的服务,比如利用`kill -9 PID`强行销毁某特定编号的目标进程。 ```c #include<stdio.h> #include<unistd.h> int main(){ pid_t id = fork(); // 创建子进程 if (id == 0){ printf("Child Process ID: %d\n", getpid()); } else{ printf("Parent Process ID: %d\n", getpid()); } return 0; } ``` 以上代码展示了如何运用`fork()`函数建立父子关系的两个进程,并分别打印各自的唯一识别号码。 --- ###
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侠客cheems

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值