主要内容:
- 进程概念
- 进程生命周期
- 进程的创建
- 命名空间机制
1、进程概念
进程也即是在机器中运行的程序,在系统中资源分配是以进程为单位进行分配。在Linux内核中进程是用task_struct结构体来表示的,他可以分为实时进程和非实时进程。
- 实时进程:它必须在可保证的时间范围内得到处理。这类进程他的实时性要求比较高,低延迟。
- 非实时进程:大多数进程的运行没有时间约束的普通进程,但是还是会根据重要性来分配优先级。
2、进程生命周期
在Linux中进程的状态主要有运行、等待和睡眠三种状态,进程在这3种状态中切换过程就构成了进程的生命周期。
- 运行:进程获得了cpu时间片,此刻在cpu中执行。
- 等待:进程所需资源都已获得分配,获得了运行前的所有资源,等待分配cpu时间片执行,此刻进程是在就绪队列中排队,等待调度器的调度执行。
- 睡眠:进程在等待外部事件,调度器无法在下一次任务切换时选择调度该进程。
在Linux中的task_struct结构中的state字段用来表示当前进程的状态: - TASK_RUNNING:表示进程处于可运行状态。
- TASK_INTERRUPTIBLE:表示进程等待外部事件或其他资源的睡眠状态
- TASK_UNINTERRUPTIBLE:表示因内核而停用的睡眠进程,他不能由外部信号唤醒,必须由内核唤醒。
- EXIT_ZOMBIE:表示僵尸状态
-
EXIT_DEAD:wait系统调用已发出,当前进程完全从系统移除之前的状态。
僵尸进程:资源都已经释放,但进程表中仍然有表项,ps命令依然能查到对应的进程信息。进程销毁必须满足两个条件,其一,程序必须由另一个进程或用户杀死,其二,进程的父进程在子进程终止时必须调用wait4系统调用,这相当于向内核证实父进程已经确认子进程的终结。该系统调用使得内核可以释放为子进程保留的资源。僵尸进程就是在第一个条件发生而第二个条件不成立的条件的情况下的状态。
3、进程创建
在UNIX中新进程是使用fork和exec系统调用产生的:
- fork:生成当前进程的一个完整相同的副本,该副本称为子进程。除了pid不同,其它的都是相同的。
- exec:从一个可执行的二进制文件加载另一个应用程序,来代替当前运行的进程。exec并不创建新进程,所以必须先通过fork复制一个旧程序,然后调用exec在系统中创建另一个应用程序。
Linux还提供了clone系统调用来创建进程或线程,只是对应的调用clone函数对应的参数不同。
4、命名空间
本质上,命名空间建立了系统的不同视图。Linux中通过采用层次结构来表示命名空间,子命名空间的内容对父命名空间是可见的。Docker容器技术就是在namespace机制的基础上实现的