当一个程序没有运行的时候保存在磁盘里面,如果要运行就要加载到内存里面,内存里面有程序的代码和数据。内存里面这些代码和数据就是进程对应的代码和数据。但是这些代码和数据不是进程。
操作系统管理程序运行实际上是在管理进程,操作系统在内存中也占有一部分空间,用来管理进程。我们开机就是在把磁盘中的操作系统加载到内存里面。
课本上讲的是,进程是程序的一个执行实例,正在执行的程序
内核观点看,进程是担当系统分配资源(CPU时间,内存)的的实体
进程信息被放在一个叫做进程控制块的一个数据结构(struct PCB)中,可以理解为进程属性的集合,其中包括了内存指针,指向程序所在的内存地址。
struct PCB是一个链表,其中有struct PCB* next用来指向下一个结构体。操作系统对进程的管理其实就是对链表的管理。一个进程对应一个PCB
操作系统不直接管理代码和数据,而是管理进程,代码和数据只是进程的一小部分。
PCB是操作系统上的概念,具体到Linux中,这个数据结构叫做struct task_struct,这个数据结构叫做Linux进程控制块。
我们Linux中的指令也是程序,我们每执行一个指令都要加载到内存并创建进程,执行完后终止
ps axj
:查看当前所有进程
ps axj | head -1 && ps axj | grep myprocess
:&&符号表示连续执行两条命令,执行完"&&"前面的再执行后面的
每个进程都有唯一的进程标识符,叫做PID,PID是结构体中的一个无符号整型
用户无法自己获得进程的PID,所以操作系统提供了系统调用函数叫做get pid
无参数,返回值位pid_t(无符号整形)
getppid()
:获得当前进程的父进程pid
fork()
:创建一个子进程。无参数,返回值为pid_t,子进程的返回值是0,父进程的返回值为其子进程的pid,返回值为负数则创建失败
fork以后的代码父子共享,主函数为父进程,fork创建的为子进程
fork会返回两个id值,有两个返回值是因为创建了子进程,我们在fork返回值之前就已经进行了代码共享,所以在两个进程里面有两个返回值就合情合理了。
ctrl + c
:结束当前进程
kill -9 + 进程pid
:结束pid对应进程
根目录下有一个文件为
/proc
,该文件夹包含了所有的进程信息,每形成一个进程该目录下就会形成以该进程pid命名的文件夹