在阅读这篇文章之前,相信各位读者对程序的概念已经有了一定的了解了。一个程序就是编译生成后的可执行文件,说到底它只是一个二进制文件,只是一堆指令而已。
它没有被加载到内存里面,就没有什么意义。那如果一个程序被加载到内存当中呢?
那它就称为了一个进程。上次在聊到冯诺依曼体系结构的时候我们已经说到了,操作系统是帮我们管理软硬件资源的,它其中的一部分工作就是进程管理。
因为大量的进程载入到内存当中后,一定是杂乱无章的,它需要被操作系统管理。我们也说过操作系统的管理方式是先描述,再组织。那么对于单个进程而言,它的描述方式自然是用结构体来存储它的各种属性(这些属性我们后面会聊到的),这个结构体称为PCB(Process Control Block)——进程控制块。
对于大量的进程而言,操作系统则需要把它用数据结构组织起来,其中一种方式就是以链表的形式。用链表将每个PCB链接在一起,链表的数值域自然是PCB结构体。
说到这里,大家相信对进程有个大概的认识了,那我们就该对进程下一个很好的定义了!
进程的概念:
进程=程序代码+数据+对应的PCB。
在window下我们可以在任务管理器中查看当前的进程,它包括了进程的名字,以及进程的各种属性。
一、Linux下的进程
在Linux下我们又该如何查到当前存在的进程呢?可以输入ps+axj查看
其中的PID是进程号,每一个进程都有其独立的PID,Linux一般要求PID数量小于32767,如果有一个新的进程创建的时候,内核会按照顺序为其分配PID。如果PID数量大于32767,内核会重置PID,从300开始,寻找可用的PID分配给新进程。
后面我们会了解到,进程间存在父子关系,即一个进程可以通过创建子进程的方式为其完成特定的任务,PPID就是进程的父进程的PID。
二、进程的文件
在Linux下,内核会为进程在proc目录下创建一个独立的文件,里面保存着进程的信息。
其中蓝色的就是进程的文件夹,文件名是进程的PID。我们可以进入proc中,打开某个进程对应的文件夹查看进程的信息。
图中的cwd称为Current Work Directory(当前工作目录),exe后表示可执行程序的存储路径。
本次的介绍较为简短,主要集中于概念,希望大家多看,多操作,多理解。
下次我会介绍fork函数创建子进程的方式,以及一般进程的状态,最后落实到Linux下的具体进程。