当前位置:   article > 正文

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

linux process

进程与程序概念

在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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  我们在每个需要加载进入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
  • 1
  • 2
//显示标题的同时将进程信息显示出来
ps axj | head -1 && ps axj | grep 'Test'
  • 1
  • 2

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

kill -9 +(PID)
  • 1

在这里插入图片描述

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


Linux进程操作

子进程

查看进程id(PID):

getpid();
  • 1

在这里插入图片描述

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

另一种查看进程方法:

ls /proc 
  • 1

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

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

父进程

父进程id(PPID)

getppid();
  • 1

在这里插入图片描述
运行程序发现:
在这里插入图片描述
在这里插入图片描述
  我们发现这个父进程的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返回值的不同,使得父子进程运行的代码不同。


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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/635153
推荐阅读
相关标签