进程与内存、进程状态

进程的概念

  进程与程序不同,进程是运行中的程序,而程序是保存在硬盘上的可执行代码。

  程序转为进程的三个步骤:

    1. 内核将程序读入内存,为程序分配内存
    2. 内核为进程分配PID(进程标识符)和其他所需资源
    3. 内核为该进程保存PID以及其他状态信息,并把进程放入运行队列等待执行。当程序转化为进程后就可以被操作系统的调度程序调度执行了

  Linux下可通过ps、pstree查看当前系统中的进程。

进程标识

  每个进程都是由每个进程ID(PID)唯一标识的,PID 存储在 PCB 中, PCB 是进程控制块,是进程最重要的组成部分。每个进程除了进程ID外还有其他标识,需要由相应函数获得。这些函数在头文件unistd.h中。

进程与内存

  Linux一个进程由三部分组成,进程在内存中包含三个方面:

    1. 代码段。它存放程序中的代码,并可以被机器中运行同一程序的数个进程共享
    2. 堆栈段。它存放的是子程序(函数)的返回地址、子程序(函数)的参数、局部变量
    3. 数据段。它存放了全局变量,常量,以及动态数据分配的空间(比如malloc申请的空间)

      

  系统中同时运行多个相同的程序,它们的堆栈段和数据段不能是同一个,而代码段是同一个。

进程的状态

  Linux进程的状态包含九个方面:

    1. 用户状态。进程在用户状态下进行的状态
    2. 内核状态。进程在内核状态下进行的状态
    3. 内存中就绪。进程没有执行,但是处于就绪状态,只要内核调度它,就可以执行。
    4. 内存中休眠。进程正处在休眠并在内存之中。并且没有被交换到swap设备(虚拟内存) 
    5. 就绪且换出。进程处于就绪状态,但是还必须要经过两个步骤(1.换入内存2.内核调度)才可以执行。
    6. 睡眠且换出。进程处于睡眠状态,且内存还没换入。
    7. 被抢先。进程在从内核状态返回用户状态的时候,内存抢先于它,做了上下文切换,调度了另一个进程,原进程就处于被抢先状态。
    8. 创建状态。进程刚被创建,但既不是就绪状态,也不是休眠状态,这个状态是除了进程0外的最初状态。
    9. 僵死状态。进程调用exit结束,进程不再存在,但是在进程表上还有记录,该记录可由父进程收集。

  举例说明Linux的进程转换:

    1. 进程被父进程通过系统调用 fork 创建,此时进程处于创建状态;
    2. 当fork为进程配置好内核数据结构和私有数据结构后,子进程处于就绪状态;(可能的就绪位置:1.内存  2.swap设备)
    3. 当在内存就绪时,进程可被内核调度程序调度到cpu中执行
    4. 内核调度该进程的时候,进程进入内核状态。随后由内核状态返回用户状态而执行程序。在用户状态持续一段时间后,又会被内核调度程序调度而进入内核状态,由此转入就绪状态。有时进程在用户状态时,也会因为系统调用而进入内核状态,服务完毕,又从内核状态返回用户状态。
    5. 内核状态返回向用户状态返回时可能被抢占,这是由于有优先级更高的进程需要使用cpu而不能等到下一次调度时间,从而造成抢占
    6. 进程调用exit进入僵死状态,最后结束
————全心全意投入,拒绝画地为牢
原文地址:https://www.cnblogs.com/Bw98blogs/p/7603263.html