1、程序(program)是这样一系列指令的所构成的集合,程序大多数时候被存储为可执行的文件。进程是程序的一个具体实现,是执行程序的过程。同一个程序可以执行多次,每次都可以在内存中开辟独立的空间来装载,从而产生多个进程。不同的进程还可以拥有各自独立的IO接口。
使用ps命令来查询正在运行的进程,比如ps -eo pid,comm,cmd,执行结果:
(-e表示列出全部进程,-o pid,ppid,comm,cmd表示我们需要PID,COMMAND,CMD信息)
PID(processIDentity)是一个16位的整数,每一个进程都有一个唯一的PID来作为自身标识。进程当中的pid号的分配是从0—32767之间的,其中0—299的进程号是分配给demo(守护进程)的,剩下的pid号是分配给普通进程的。第二列的ppid是本进程的父进程号。第三列的COMMAND是这个进程的简称。第四列的CMD是进程所对应的程序以及运行时所带的参数。
所有的进程也构成一个以init为根的树状结构,用pstree命令可以显示整个进程树的结构(这里不再展示)。
当子进程终结时,它会通知父进程,并清空自己所占据的内存,并在kernel里留下自己的退出信息。父进程在得知子进程终结时,有责任对该子进程使用wait系统调用。这个wait函数能进行内存清空处理。但是,如果父进程早于子进程终结,子进程就会成为一个孤儿(orphand)进程。孤儿进程会被过继给init进程,init进程也就成了该进程的父进程。init进程负责该子进程终结时调用wait函数。
当然,一个糟糕的程序也完全可能造成子进程的退出信息滞留在kernel中的状况(父进程不对子进程调用wait函数),这样的情况下,子进程成为僵尸(zombie)进程。当大量僵尸进程积累时,内存空间会被挤占。
进程的创建、销毁、执行等详细过程在此不做讨论,在学习unix c编程后,在代码编写的过程中会有深入的了解
在Linux中,线程是一种特殊的进程,多个线程之间可以共享内存空间和IO接口。(进程之间内存是独有的,不会共享)
2、进程的基本状态转换(三态和五态)
三态模型:在多道程序系统中,进程在处理器上交替运行,状态也不断地发生变化。进程一般有3种基本状态:运行、就绪和阻塞。
(1)运行:当一个进程在处理机上运行时(占据cpu),则称该进程处于运行状态。处于此状态的进程的数目小于等于处理器的数目——如果是单核处理器,则当前只有一个进程处于运行态;如果是多核(例如n核),则有m(0<m<n+1)个进程处于运行态。
特别注意:多核处理器可能在同一时间执行一个进程(可以认为是多行代码一块执行,每个核执行一条)
(2)就绪:当一个进程获得了除处理机以外的