【Linux从入门到精通】进程的基本概念

简介: 我们通过对上篇文章冯诺依曼体系结构对硬件进行讲解后, 本篇文章会对进程进行深入讲解。同时会讲解PCB(进程控制块)。希望本篇文章内容会对你有所帮助。

 我们通过对上篇文章冯诺依曼体系结构对硬件进行讲解后, 本篇文章会对进程进行深入讲解。同时会讲解PCB(进程控制块)。希望本篇文章内容会对你有所帮助。



一、再次理解操作系统


在学习进程之前,我们先来理解一下操作系统。我们学习完冯诺依曼体系结构后,知道计算机是由一个个硬件组成的。只有一堆硬件,计算机可以运行起来吗?答案是不可能的。还需要结合软件才能运行起来。例如最重要的软件:操作系统。


 前面的文章中我们提到,操作系统是一款管理软硬件的软件。我们这里就有很多问题:操作系统是管理哪些软硬件呢?操作系统为什么要管理呢?操作系统是怎么进行管理的呢?我们接着往下看。

1、1 操作系统的作用

 我们先来看一张图:




3db153b2c34b461eb68dde82e45f083f.png


我们用户是不会直接跟底层的硬件打交道的。首先,新手用户不懂底层硬件的使用。其次,底层硬件学习起来成本太高。我们所使用的都是可视化界面,一个个软件。而软件是怎么跟底层的硬件打交道的呢?原因是中间有一个操作系统。


 通过上图我们看到,我们作为用户都是在向计算机使用简单操作或发送许多指令,达到我们使用计算机的目的。而我们的每个操作是要贯穿操作系统,操作系统经过一系列操作将我们的指令“翻译”成底层硬件认识的指令,进而送达硬件部分。从这里我们了解到,操作系统有连接上层用户软件和下层驱动和硬件的作用。


 一个个硬件放在那里是不能运行起来的,他们之间需要产生联系。操作系统就是对下要管理好各种驱动程序和各个硬件资源,为上层的软件提供一个良好的运行环境。

1、2 操作系统的管理



在上节图片中看到,操作系统的主要的四个功能:内存管理、进程管理、文件管理、驱动管理。我们发现,操作系统主要就是进行管理的。那到底是怎么管理的呢?


 在这里举一个例子:学校管理学生。当一个学校只有几个学生时,那这个学校管理起来就很容易,并且可以很容易的记住这几个学生的所有信息。当学校有几千名甚至上万名学生时,管理起来似乎就并没有那么容易。为了更好的管理学生呢,学校会将所有学生的各种信息、属性统计起来,放在一张表格中。当需要看某个学生的成绩时,直接通过该同学的信息属性直接筛查出来即可。我们发现这样管理似乎就简单起来了。


 操作系统的管理也正是如此。对比上述的例子,我们知道操作系统中软硬件资源多而复杂(学生很多),为了更好的管理这些软硬件资源,可以先将这些软硬件资源进行描述(学生入学填写各种属性、信息),再通过各种高效的数据结构将他们组织起来(放到一张表格中,需要时可通过筛查直接找到)。


 通过上面的描述,我们总结管理其实就是先描述,后组织。这里我们再引入进程。那操作系统是怎么对进程进行管理的呢?我们可以直接理解操作系统是对进程先进行描述,再把进程组织起来。我们接下来进入我们主题:进程。

二、进程基本的概念

2、1 什么是进程

 我们在自己电脑上任务管理器下就可以查看进程,如下图:



9a56cebd8fa74222a0edfe37b801821d.png


 那到底什么是进程呢?

 我们在很多地方可能看到:加载到内存中的程序,就是进程。这种概念是正确的吗?我们不妨先接着往下探索一下。



2、2 进程控制块 PCB


在学习进程中,我们都知道每个进程都会有一个PCB。为什么呢?PCB又是什么呢?


 我们上述提到了,操作系统对进程的管理就是先描述,后组织。怎么对进程进行描述的呢?答案就是:进程控制块PCB是对进程描述的一个结构体。这里我们知道了PCB是用来描述进程的一个结构体。是为了我们后面对进程更好的组织和管理。


 在Linux下描述进程的PCB是task_struct。有很多同学会在这里有点搞不清楚了。PCB和task_struct到底是什么关系呢?这里给大家举一个例子:在现实生活中,我们都知道相亲都靠媒婆。你可能也认识几个媒婆,例如你的邻居王阿姨就是媒婆,我们也叫她为王婆。媒婆是一个统称,王婆就是媒婆中的一个具体的人。同样,PCB是进程控制块的统称,task_struct就是PCB中的具体的一种进程控制块。我们知道PCB是描述进程的一个结构体,


那么这个结构体中都有进程的哪些属性呢?我们接着往下看。

2、3 查看Linux上的进程

 我们在上面了解到进程后,我们不妨在Linux下查看一下进程。我们先在Linxu下写一个C语言代码,代码如下:

  #include<stdio.h>                                                                                                                                            
  int main()    
  {    
    while(1)    
    {    
      sleep(1);    
      printf("hello OS,pid";    
    }                                                                                    
    return 0;                                                                            
  }


我们写的是一段无限循环的代码。是为了我们后面可以更好的观察进程。我们编译生成 myporc 的可执行程序。查看进程的指令是:ps axj | head -1 && ps axj | grep "proc"。我们可看下图一起理解:


889dd92b4a5349b4b721e45376374561.gif


当我们结束程序后,我们就会发现进程中就不再有该程序,如下图:


f6a49f062abb477dafe5393fb70f5282.png


我们曾经所有运行创建的程序,本质上都是在内村上创建进程

2、4 再次理解进程


 问题回溯:加载到内存中的程序,就是进程吗?


 这里举个例子:在清华大学里面的学生就算是清华大学的学生吗?你可能会说是的。那么问题来了。我现在确实是一个河北省的大学生,我现在坐个火车来到清华了,我就是清华的学生了吗?想得美ovo!是清华的学生就应该有清华的学生证。


 加载到内存中的程序也是一样,程序确实是程序,但不能称它为进程。我们上面学到了为更好的控制进程,我们还有PCB来描述进程。加载到内存中的程序,就是进程这个说法并不准确。我们目前可理解进程=程序文件内容+维护进程相关的数据结构。我们可结合下图理解:

————————————————


2f707fd23b794c60a4bcaed3c1b0f924.png


PCB就是操作系统给每个进程提供的。在Linux上就会自动创建出struct task_struct{} 结构体。task_struct就会包含了进程的所有属性和信息。


 有同学就会有所疑惑:操作系统到底在哪里呢?注意:操作系统也是一款软件。当我们开机时,我们相当于就是启动了操作系统这款软件,相关内容数据就会加载到了内存中。当然,操作系统也会有其对应的PCB。只不过操作系统这款软件的功能较为强大。


 当有多个进程时,操作系统就会用搞笑的数据结构将它们组织起来,以便后续的更好的管理。


 当我们知道进程中还包含了task_struct后,CPU拿数据时,是直接找程序的内容数据,还是找task_struct呢? 答案是找task_struct。我们看下图:


eea9fe25386a4b79875864e694328696.png


 如上,假如内存中有6个进程。其中每个进程的PCB都有特殊的联系,也就是操作系统见他们组织起来了。CPU拿数据时,会直接找对应进程task_struct,这样会更加高效。为什么呢?因为task_struct中包含了指向内容数据的指针,找到了进程对应的task_struct就可以找到对应的内容数据!到这里我们知道了PCB中包含了对应的内容数据指针。还有呢?


2、5 task_struct内容分类


 task_struct中包含的内容很多,在这里给大家列出主要的内容:


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

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

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

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

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

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

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

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

其他信息。

 这里标识符下面会对齐详解。状态有运行状态,阻塞状态等等。退出码也会在下发进行详解。程序计数器也就是PC指针,该指针存储的是下条指令的地址。内存指针我们上面提到了。上下文数据和记账信息会另写一篇文章对其进行详解,因为上下文数据相对复杂,也比较重要。I/O状态信息我们可简单理解为输入输出信息状态及请求。注意:并不是你在控制I/O,也不是你所写的代码在控制I/O,而是进程在控制I/O。


2、5、1 进程标识符 PID

 进程标识符PID就是唯一标示一个进程。我们这里有一个函数getpid()可以直接返回进程的PID,如下图:7667b6395b0c4b1180c14efb4d1a317a.png

 我们可结合下面例子一起理解一下。代码如下:

#include<stdio.h>    
#include<sys/types.h>    
#include<unistd.h>    
int main()    
{    
  while(1)    
  {    
    sleep(1);    
    printf("hello OS,pid:%d\n",getpid());                                                                                                                    
  }                                                                                                                        
  return 0;                                                                                                                
}     

运行结果如下图:

 当然,我们也可通过此PID找到该进程,指令为:ps ajx | grep 16940。结果如下:


096a5a00ee034ed99838d675150a1247.png

我们也可通过 kill 指令来终止该进程,指令:kill -9 16940。结果如下图:

 一个进程也是有父进程的,可通过getppid()函数获得父进程的PPID。一般在命令行上运行的命令,其父进程基本上都为bash


2、5、2 退出码

 你有没有想过,在我们所写的代码中,为什么最后都会有一句 return 0呢?return 100 可以吗?这里的 return 的数据就是我们程序结束的结束码,查看结束吗的指令为:echo $?。具体如下图:

49b2e8b313234a48be4ab6158e5c268b.png



注意,echo $? 是指的最近一次的退出码。又如下图:

三、总结


 本篇文章的内容就讲解到这里。我们来稍微总结一下:我们在讲述进程之前,是学习了冯诺依曼体系结构和操作系统管理,是我们理解起来进程更加容易。而不是突然蹦出来一个概念,显得枯燥难理解。当然,进程中还有很多细节,包括我们还没有讲解上下文数据,后面都会给大家解释。进程是一个十分重要的概念,对我们后面的学习也很重要,我们需要反复阅读,查阅资料去理解进程概念。也希望本篇文章会对你有所帮助,让你有所收获。  


相关文章
|
20天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
45 1
|
8天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
61 13
|
15天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
24天前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
44 4
|
23天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
1月前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
144 4
linux进程管理万字详解!!!
|
28天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
1月前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
85 8
|
1月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
90 1
|
1月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?