【Linux】:进程的基本概念

目录

1.了解进程

为什么要有进程

进程的基本概念

2.描叙进程 

3.tast_struct(组织进程)

 4.查看进程

ps指令

top指令

 在目录proc下查看

vim底行模式下输入系统指令 

删除进程

5.获取自己进程的PID 

6.通过系统调用fork() 创建进程

fork运行初解

1.了解进程

为什么要有进程

我们知道,计算机的一切运行,本质上是底层硬件的运行。由于底层硬件运行过于复杂,我们不直接控制底层硬件,而是对硬件的控制接口进行封装,通过编写驱动程序对硬件进行控制。

设备驱动程序(英语:device driver),简称驱动程序(driver),是一个允许高阶(High level)电脑软件(computer software)与硬件(hardware)交互的程序,这种程序建立了一个硬件与硬件,或硬件与软件沟通的接口,经由主板上的总线(bus)或其它沟通子系统(subsystem)与硬件形成连接的机制,这样的机制使得硬件设备(device)上的资料交换成为可能。来源:驱动程序 - 维基百科,自由的百科全书 (wikipedia.org)

那么谁来控制驱动程序呢?程序员可以编写驱动程序,那么编写好后是由谁来控制管理驱动程序的呢? 一般是由操作系统直接控制管理驱动程序。不同的硬件,比如网卡、显卡、声卡、IO总线,甚至不同厂家的同类型硬件,驱动程序往往不同。对于硬件,操作系统要管理对应的驱动程序,对于软件呢?同样,也要管理软件运行时对应的系统调用。那么,为了管理这些程序的运行,操作系统的开发者对这些程序运行的状态、时间、是否内嵌其他程序、哪条程序先运行等等,各种程序运行时可能产生的场景(事件),以及程序运行时涉及的代码和数据,进行了抽象,抽象出了一种数据结构,每一个程序的运行都会产生该结构类型的对象,通过对对象的管理,达到管理程序的效果。

这个对象就是进程(还有一种理解,这个进程 = 这个对象 + 这个对象中的某些成员指向的程序数据和代码,PCB对象并不直接存储程序的数据和对象,而是存储程序的数据和代码的指针),而抽象出的数据结构,就是进程控制块(PCB)。进程控制块 - 维基百科,自由的百科全书 (wikipedia.org)

进程的基本概念

已经加载到内存中的程序或正在运行的程序,被称为进程。是程序的一个执行实例,担当分配系统资源(CPU时间,内存)的实体。进程 - 维基百科,自由的百科全书 (wikipedia.org)

2.描叙进程 

我们知道,这个世界是由客观事物构成的,事物可以分为客观事物和抽象事物,事物的变化我们称之为事件。我们描叙事物,本质上是描叙事物的属性,是对事物的抽象或事物属性的抽象。同样的,我们描叙事件,本质上是描叙事件的属性,比如事件所处的空间、事件构成的事物等,越复杂的事件,其描叙往往越困难,因为一个事件可能内嵌着多个子事件、子事件可能涉及多个事物。

对同类客观事物的简单描叙,比如学校的学生信息系统中,我们可以用姓名、性别、学号、籍贯等信息去描叙一个具体的、客观存在的学生,这些信息可以称之为学生的属性。

同样的,对于进程的描叙,本质上是对程序的运行进行描叙,只不过这个程序是操作系统管理的。也就是说,进程是操作系统管理的。而PCB就是对进程的描述,是进程属性的结合,在计算机中表现为一种数据结构。

3.tast_struct(组织进程)

 操作系统都要有进程控制器PCB,但不同的操作系统,其实现可能不同,Linux操作系统下,PCB是tast_struct。

Linux中进程控制块PCB-------task_struct结构体结构 - 童嫣 - 博客园 (cnblogs.com)

 task_ struct内容分类

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

注意:所有运行在Linux系统里的进程都以task_struct双链表的形式存在内核里 (双向链表)。

 4.查看进程

ps指令

ps命令来自英文单词process的缩写,中文译为“进程”,其功能是显示当前系统的进程状态。
原文链接:ps命令 – 显示进程状态 – Linux命令大全(手册)

top指令

top命令的功能是实时显示系统运行状态,包含处理器、内存、服务、进程等重要资产信息。
原文链接:top命令 – 实时显示系统运行状态 – Linux命令大全(手册)

 在目录proc下查看

 proc目录在开机时创建,关机时销毁。

 为什么我们在一个目录下创建的文件时不指定创建路径,会自动创建在当前目录。

这是因为当一个进程开始执行时,Linux系统会在/proc目录下创建一个对应的文件夹,里面存放了程序工作的绝对路径(当前路径)。

vim底行模式下输入系统指令 

当用vim打开某个文件时,如果要用man 查看某个指令或函数调用,可以直接在命令行模式(底行模式)下,先输入一个感叹号(!),后输入man相关的查询指令即可。

删除进程

kill -9 进程标识符

5.获取自己进程的PID 

PPID是PID的父进程,我们启动程序关闭程序再次启动同一个程序,发现程序的PID改变了,但PPID没有改变,这是为什么呢?

进程在同一个终端下启动,系统会提供一个bash作为父进程,一切在终端下直接执行的指令都是父进程的子进程(好像有歧义)。我们查看父进程,

6.通过系统调用fork() 创建进程

我们之前都是通过运行可执行程序创建进程。现在我们要学习用系统调用接口——fork()函数创建进程。输入指令:man 2 fork(要安装好man手册,安装指令:yum install man),会展示fork()的头文件、返回值等信息。

如果fork创建子进程成功,在父进程中会返回创建的子进程的PID(标识符),在子进程中会返回0;如果失败,fork在父进程中返回-1,子进程中报错。这怎么理解呢?我们在实践中理解。

编写两个myprocess.c程序,并运行其编译后的可执行程序,发现“带有fork()的可执行程序会多打印”一次“after:only one line"。

 这是为什么呢?

其实是因为fork()在当前进程中创建了一个子进程,从而多打印一行“after:only one line"。额?为什么创建一个子进程就多打印了一行呢?子进程是啥?子进程 - 维基百科,自由的百科全书 (wikipedia.org)

为了弄清子进程和父进程的关系,我们编写下面的程序,

观察fork前的进程和fork返回值对应的进程。正常情况下,一个函数只能有一个返回值,我们来看看这个程序是怎么运行的。

我们用普通用户执行程序,用root用户查看程序对应的进程状况。

在root账户下输入:

while :; do ps ajx|head -1 && ps ajx|grep process|grep -v grep;echo "";sleep 1;done

按回车,就可以查看与process相关的进程。

根据程序运行时的显示:先打印了“我是一个进程”,然后循环打印“我是父进程”、“我是子进程”,同时root终端开始显示与process相关的进程信息。两次运行的程序中父进程都是17551,我们查看一下

发现17551进程来自-bash命令。(我们知道fork函数会创建子进程,bash命令也创建了进程,是不是说明bash命令的实现中含有fork函数呢?这一点我们后面解释)

同时循环打印,表示两个循环都运行了,这表明fork返回了两个返回值,fork函数是如何实现返回两个返回值的呢?fork (系统调用) - 维基百科,自由的百科全书 (wikipedia.org)

fork运行初解:

我们知道,当调用fork函数时,fork会创建一个子进程,每个进程都要有自己的PCB实例化对象和对象指向的数据和代码块,所以这个子进程也有一个tast_struct对象。刚开始这个对象指向父进程的数据和代码块,因为代码块在内存中是无法修改的,所以子进程和父进程可以共享一段代码块,但数据是可以被修改的,所以当子进程要修改数据时,为了不影响父进程的数据,会对共享的数据进行一份深拷贝再修改(这种写时再拷贝的技术叫做写时拷贝技术)。

所以fork函数的具体实现,本质上就是对子进程的tast_struct以及tast_struct中的各种数据变量或结构进行定义或初始化(主要是子进程的数据和代码块),并对子父进程进行链接。

因为return返回的是数据,并且该数据被修改,子进程会对其进行写实拷贝,这样字符进程就拥有两个不同的返回值了。这里大家可能会疑惑,为什么一个变量(id)可以表示两个不同的值呢(0和PID)?这就涉及进程地址空间的相关知识了,后期我们会详细解读。

同时还有一个问题,fork创建好了子进程,接下来是该执行子进程还是父进程呢?

这要看调度器优先调度谁。

调度 (计算机) - 维基百科,自由的百科全书 (wikipedia.org)

7.进程和程序的区别 

程序是数据和代码的集合,是一个静态的文件集合。

进程是程序被CPU运行时产生的一个实例,该实例是动态的,

程序是操作系统的数据,进程则是操作系统的任务。进程与程序的区别是什么? - CSDN文库

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值