进程 线程 进程迁移
进程
- 进程是系统中独立存在的实体,它可以拥有自己独立的资源,比如文件和设备描述符等。在没有经过进程本身允许的情况下,其它进程不能访问到这些资源。这一点上和线程有很大的不同。
- 进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。
- 在进程中加入了时间的概念。进程具有自己的生命周期和各种不同的状态,这些概念在程序中都是不具备的。
- 若干个进程可以在单处理机状态上并发执行。
- 进程运行的环境称为进程上下文(context),进程的上下文由进程控制块PCB(process control block)、正文段(text segment)、数据段(data segment)以及用户堆栈(stack)组成。其中:正文段存放该进程的可执行代码;数据段存放进程中静态产生的数据结构;PCB包括进程的编号、状态、优先级以及正文段和数据段中数据分布的大概情况。
- 一个称做进程表(process table)的链表结构将系统中所有的PCB块联系起来。
- 系统每次访问一个进程时,内核根据PID在进程表中查找相应的进程PCB块(具体查找过程通过一个PID的hash表实现),再通过PCB块找到其对应的代码段与数据段,并进行操作。
线程
- 线程是包含在进程中的一种实体。它有自己的运行线索,可以完成一定的任务,可与其他线程共享进程中的共享变量及部分环境、相互之间协同来完成进程所要完成的任务。
- 线程能够比进程有更高的性能,这是由于同一个进程中的线程都有共性:多个线程将共享同一个进程虚拟空间
- 线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。
- 每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标识线程。
- 由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程上时,必须将原有的线程的寄存器集合的状态保存,以便将来该线程在被重新切换到时能得以恢复。
- 堆栈是保证线程独立运行所必须的。
- 线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影响。
- 由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参数,这个参数就是线程的优先级.
进程迁移
- 进程迁移是将进程在处理机节点间转移的技术,也可以认为是进程的重新定位。
进程迁移的步骤:
- [Step 1] 询问目标处理机是否可以接受迁移进程;
- [Step 2] 得到目标处理机的肯定答复后,在目标处理机上创建恢复进程;
- [Step 3] 中断迁移进程的运行程序;
- [Step 4] 在源处理机上收集迁移进程状态;
- [Step 5] 将迁移进程状态传输到目标处理机;
- [Step 6] 目标处理机上的恢复进程负责恢复迁移进程状态,重建进程实例;
- [Step 7] 通知系统内其它进程迁移进程的新位置,并重建迁移中断前的通信连接;
- [Step 8] 迁移进程在目标节点恢复运行;
- [Step 9] 利用转发机制(或利用单一系统映像的性质)保证进程可以在远程处理机透明执行。