0

    Linux进程概念

    2023.07.24 | admin | 134次围观

    @[toc]

    零.前言

    本文为介绍进程的第一篇,将介绍操作系统对进程管理过程中的先描述,在组织的过程,并介绍PCB中的基本内容及作用。

    1.什么是进程

    进程是一个执行的实例,即正在被执行的程序

    我们可以打开win下的进程管理器,里面的内容给就是一个一个的进程。

    由于可能存在大量的进程,操作系统需要对进程来进行管理,管理的方式就是:先描述怎么看电脑进程数,再组织。

    2.Linux系统下查看进程 (1)ps axj|grep 进程名

    要观察进程,那么这个进程一定是在一个执行的条件下才能进行观察,因此我们可以写一个死循环的程序,使它一直在运行:

     #include    
      int main()    
      {    
        while(1)    
        {    
          printf("hello process!\n");    
          sleep(1);    
        }    
        return 0;                                                                                                   
      }    
    

    我们来运行一下这个程序,要观察进程还需要再开出一个窗口来输入命令,查看进程。

    ps ajx|head -1 && ps axj |grep “mytest”

    使用该命令我们就可以查看当前的进程了。

    这一行显示的就是当前进程的各种属性,当然这并不完全。上面一行就是属性的名称(也就是要写入task_struct中的内容),至于下面一行,由于grep指令也会创建一个进程,所以我们可以先不用考虑它。

    如果我们将程序Ctrl C结束掉,此时再查看进程,我们发现该进程已经没有了:

    (2)/proc查看

    我们还可以在proc系统文件夹中通过查找进程码来进行进程查看,此时即显示该进程的信息,其中exe表示的是当前正在执行谁,cwd表示的是当前工作目录,其实这也就是为什么我们使用C语言进行创建文件,默认路径就是当前路径的原因,它会通过cwd读取当前路径再创建文件。

    3.PCB

    从上一节中,我们了解了操作系统的管理方式是:先描述,再组织。其中先描述指的是将信息存入结构体中,再组织指的是将这些

    结构体以一定的数据结构进行链接起来。

    放到进程上来说,其中存放进程信息的结构体叫做:进程控制块,简称PCB(process control blog),PCB就是操作系统对进程的先描述的体现。

    注意,PCB是一个总称,在Linux系统下的PCB是一个名为task_struct的结构体(Linux是使用C语言写的)。也就是说在Linux系统下,每创建一个进程就会建立一个task_struct结构体来存储该进程的基本信息。

    这有点类似shell和bash两者之间的关系。

    4.进程和程序之间的关系

    我们所说的程序通常是指可执行程序,它本质上就是一个文件,当我们要运行这个程序的时候,我们会将其加载到内存中:

    在加载到内存中之后,操作系统会为该程序建立一个PCB来存储该程序中的信息,PCB与程序的总体就称为进程。

    进程=程序文件内容+与进程相关的数据结构(PCB)

    Linux进程概念

    即用红色部分圈起来的整体。

    操作系统对进程的管理不是直接对程序文件进行操作,而是通过PCB(管理者与被管理者不接触的原则)进行管理,因此PCB中一定存在找到该程序文件的信息,程序文件包括程序代码和数据。

    在内存中不可能只存在一个进程,不同进程的PCB操作系统使用一定的数据结构连接起来,这就是再组织的过程,注意连接的是PCB而不是程序文件。

    5.Linux下(PCB)task_struct中的内容 (1)PID和PPID

    PID表示的是当前进程的编号,PPID表示的是当前进程的父进程的编号。

    我们可以使用getpid()和getppid()两个函数来打印当前进程的编号,还拿之前的代码进行举例:

    #include    
    #include    
    int main()    
    {    
      while(1)    
      {    
       printf("pid:%d  ppid:%d\n",getpid(),getppid());    
       sleep(2);                                                   
      }    
      return 0;    
    }   
    

    然后运行这个程序,我们可以观察到它的进程和它的父进程的编号:

    分别是900和26326,那么它的父进程到底是谁呢?

    我们可以在另一个界面查看一下:

    我们发现父进程就是bash。同时我们还需要知道一个结论。

    在命令行执行的命令其实也是进程它们的父进程都是bash。

    (2)状态

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

    这里只对退出码来进行说明,该部分比较重要,需要篇幅较大,在之后的内容再来提及。

    我们在写C语言和C++程序的时候,最后是不是都要有一个返回值呢?在大部分情况下,返回值是0怎么看电脑进程数,即return 0,其实这个0就是该程序的退出码。

    如果让我们的程序返回100呢?那么这个程序的退出码就是100。

    int main()      
    {      
      return 100;
    } 
    

    我们可以通过:

    echo $?

    指令来查看程序退出码:

    该命令查看的退出码是离该命令最近的进程的退出码。

    (3)优先

    CPU的资源是有限的,而进程有多个,这就存在谁先使用CPU谁后使用CPU的问题。

    优先级指的是该进程相对于其他进程的优先级。然后通过优先级队列来按顺序使用CPU资源。注意优先级队列的元素不是程序而是程序的PCB。通过PCB可以找到该程序。

    即不同进程执行的顺序,注意优先级决定的先后问题,而之前所说的权限指的是能与不能的问题。

    (4)程序计数器

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论