什么是进程?
狭义定义:进程是正在运行的程序的实例。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
在我理解里进程就是程序从磁盘被读到内存中(从文件变为指令),CPU一条条执行的过程。各个进程占用的资源相互独立。
Linux下的进程
用户视角
在用户空间,进程是由进程标识符(PID)表示的。PID是一个数字值,每个PID标识唯一一个进程。
一个PID在进程的整个生命期间中不会变,但PID可以在进程销毁后被重新使用。
用户空间下创建进程的方式包括:
内核视角
在linux内核中,是通过结构体task_struct来表示进程的
task_struct包含了这些内容:
- 标示符:描述本进程的唯一标识符,用来区别其他进程。
- 状态:任务状态,退出代码,退出信号等。
- 优先级:相对于其他进程的优先级。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
- 上下文数据:进程执行时处理器的寄存器中的数据。
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
关于进程的常识
- linux下线程与进程的关系
task_struct中定义了:pid_t pid; //表示每一个进程的标识符。也是内核提供给用户程序的接口,用户程序通过pid操作程序。
pid_t tgid; //线程组中所有线程使用同一个tgid。主线程pid=tgid。
其实linux下线程是进程模拟的,没有单独的结构体,所以每个线程其实也有自己pid,拥有相同tgid的进程属于同一个线程组。
注意:getpid()系统调用返回的是当前进程的tgid值而不是pid值。 - 僵尸进程、孤儿进程、守护进程
僵尸进程:当子进程比父进程先结束,而父进程又没有回收子进程(调用wait函数)。僵尸进程无法kill掉。
孤儿进程:指的是在其父进程执行完成或被终止后仍继续运行的一类进程(被1号进程接管)。
守护进程:本身是一个孤儿进程,没有session,在后台默默服务。 - 进程的优先级
Linux中的PRI(new)=PRI(old)+nice,其中PRI(old)为系统内核算法决定。用户只能改变nice值来改变优先级。
因为PRI浮动,所以就算改低了nice值,优先级也不一定会变高。
总结
进程是资源调用的基本单位,所以我们得了解进程从而掌握计算机的各类资源的调度。