Linux:进程的概念

函数调用和库函数概念

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。

系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

进程基本概念

一个已经加载到内存中的程序(正在运行中的程序)叫做进程。

一个操作系统不仅只可以运行一个进程,还可以同时运行多个进程。

所以操作系统不许管理进程——先描述,再组织。

描述进程

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。

任何一个进程,在加载到内存,形成真正的进程时,操作系统要先创建描述进程的结构体对象,叫做PCB(Process Ctrl Block:进程控制块),在Linux下的PCB是task_struct

task_struct是LIinux内核的一种数据结构,它会被装载到RAM(内存)里,并且包含着进程的信息。

所以 进程 = 内核PCB数据结构对象 + 代码和数据。

其中该结构对象描述该进程的所有属性值(供操作系统做管理)。

在Linux内核中,最基本的组织进程task_struct的方式,采用双向链表组织。

task_struct内容分类

标示符: 描述本进程的唯一标示符,用来区别其他进程。

状态: 任务状态,退出代码,退出信号等。

优先级: 相对于其他进程的优先级。

程序计数器: 程序中即将被执行的下一条指令的地址。

内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

上下文数据: 进程执行时处理器的寄存器中的数据。

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

记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

其他信息

组织进程

可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。

查看进程

进程的信息可以通过/proc系统文件夹查看。

在这里插入图片描述

也可以通过ps指令来查看,例如查看当前所有进程:

在这里插入图片描述

当我们在当前目录下写一个test.c程序,该程序死循环打印:
在这里插入图片描述

我们在另一个用户上查看进程,可以查看到该进程:
在这里插入图片描述

其中PID是该进程的编号,PPID是该进程的父进程的编号,那么这个进程的父进程是谁呢?

我们查看一下:

在这里插入图片描述
可以看到,它的父进程是bach命令行,说明bash命令行也是一个程序,我们在命令行中输入指令,其实就是在bash这个进程中,再去调用其他进程。

进程的编号

每个进程都有一个编号,叫做PID,同一个进程,每次运行时,它的PID是不同的,在程序中我们可以通过getpid()来获取当前程序的PID。还可以通过getppid()来获取父进程的进程编号。

所以我们可以知道,bash命令行也是进程,是其调用的进程的父进程。

也就是:一切在命令行内调用的进程,都是bash的子进程。

创建进程 fork

fork()可以在进程内创建子进程,fork()函数如果创建进程成功,给子进程返回0,给父进程返回子进程的PID
在这里插入图片描述
在这里插入图片描述

可以看到,在fork之后的代码被执行了两次,因为父进程和子进程都会执行一次,其中有一个的PID和之前的一样,这就是原来的父进程,另一个的PID改变了,且PPID变为原来进程的PID,这个进程为子进程。

fork的返回值

为什么fork()给子进程返回0,父进程返回子进程的PID呢?

我们为什么要在进程中创建子进程呢?一定是因为我们想让父子进程执行不同的代码,所以fork()给父子进程的返回值必须不同,我们后续才可以根据返回值让父子进程执行不同的代码。
在这里插入图片描述
在这里插入图片描述

那么为什么要给父进程返回子进程的PID,给子进程返回0呢?

因为子进程可以通过PPID找到父进程,而父进程则无法找到子进程,所以要通过函数返回值来帮助父进程找到子进程。

7936712280)]

那么为什么要给父进程返回子进程的PID,给子进程返回0呢?

因为子进程可以通过PPID找到父进程,而父进程则无法找到子进程,所以要通过函数返回值来帮助父进程找到子进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值