进程及其相关概念

来源:互联网 发布:少帅汤玉麟 知乎 编辑:程序博客网 时间:2024/05/16 02:52

进程、轻量级进程和线程
一、进程
1.在Linux源代码中,常把进程称为任务(task)或线程(thread);
从内核观点看进程目的就是担当分配系统资源(CPU时间、内存等)的实体。
2.一个进程创建时,几乎与父进程相同。接受父进程地址空间的一个(逻辑)拷贝,并从进程创建系统调用的下一条指令开始执行父进程相同的代码,尽管父子进程共享含有程序代码的页,它们各自拥有独立的数据拷贝(栈和堆),因此子进程对内存单元的修改对父进程是不可见的。
3.轻量级进程,线程
实现多线程应用程序的一个简单方式就是把轻量级进程与每个线程关联起来,线程之间就可以通过简单的共享同一内存地址空间、同一打开文件集等来访问相同的应用程序数据结构集。

二、进程状态
可运行装态 进程要么在CPU上运行,要么准备运行。
可中断的等待状态
不可中断的等待状态
暂停状态
跟踪状态
僵死状态(EXIT_ZOMBIE)
僵死状态:进程的执行被终止,但父进程还没有wait4()或waitpid()系统调用来返回有关死亡信息。发布wait()类系统调用前,内核不能丢弃包含在死进程描述符中的数据,因为父进程可能还需要它。
僵死撤销状态(EXIT_DEAD)
僵死撤销状态:最终状态,由于父进程刚发出wait4()或waitpid()系统调用,因而进程由系统删除,为了防止其他执行线程在同一个进程上也执行wait()类系统调用而把进程状态由僵死状态改为僵死撤销状态。
三、标识一个进程
1.进程和进程描述符之间有严格的一一对应关系,使得用32位进程描述符描述地址表示进度成为一种方便地方式。进程描述符指针指向这些地址,内核对进程的大部分引用都是通过进程描述符指针进行的。
2.Unix操作系统允许用户使用进程标示符process ID(PID)的数标识进程。
3.一个多线程应用程序中所有线程都必须有相同的pid。
四、进程描述符处理
内核必须能同时处理很多进程,并把进程描述符放在动态内存中,而并不是永久分配给内核的内存区;
线程描述符 :thread_info
内核态的进程访问处于内核数据段的栈,这个栈不同于用户态的栈。
五、进程间的关系
程序创建的进程之间有父/子关系。如果一个进程创建多个子进程时,则子进程之间有兄弟关系。
六、如何组织进程
1.运行队列链表把处于TASK_RUNNING状态的所有进程组织到一起。当要把其他状态进程分组时,不同状态要求不同处理。
*没有为处于TASK_STOPPED、EXIT_DEAD或EXIT_ZOMBIE的进程建立专门的链表(由于暂停、死亡、僵死状态的进程访问比较简单),或者通过特定父进程的子进程链表,或者通过PID,所以不必对这三种状态进行分组。
*根据不同的特殊事件把处于TASK_INTERRUPTIBLE(可中断状态)或TASK_UNINTERRUPTIBLE(不可中断)状态的进程细分为许多类,每一类都对应一个特殊事件。in this condition,进程状态提供的信息满足不了快速检索进程的需要,所以必须引入另外的进程链表(被称为等待队列)。
七、等待队列
1. wait queue plays a important role in kernel,尤其在中断处理、进程同步及定时。
2.进程经常等待某些事件的发生,(等待磁盘操作的终止,等待释放系统资源,或等待时间固定的间隔)。等待队列实现了在事件上的条件等待;希望等待特定事件的进程把自己放在合适的等待队列,并放弃控制权。
3.等待队列表示一组睡眠的进程,当某一条件变为真时,由内核唤醒它们。
4.如果有两个或多个进程等待互斥访问临界资源,仅唤醒等待队列中的一个进程才有意义。 这个进程占有资源,其他进程继续睡眠。
八、两种睡眠进程
*1.互斥进程 (等待队列元素的flags字段为1),由内核唤醒。
*2.非互斥进程(flags值总为0)总是由内核在事件发生时唤醒。
等待访问临界资源的进程就是互斥进程的典型;
等待相关事件进程是非互斥的。
九、进程资源限制
每个进程都有一组相关的资源限制(resource limit),限制了制定进程才能使用系统资源数量。避免用户过分使用系统资源(CPU、磁盘空间等)。
十、进程切换
控制进程执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。此种行为被称为进程切换(process switch)、任务切换(task switch)或上下文切换(context switch)。
下面介绍一些在Linux进程切换下的重要内容。
1.硬件上下文
尽管每个进程可以拥有属于自己的地址空间,但所有进程必须共享CPU。so,在恢复一个进程的执行之前,内核必须确保每个寄存器装入了挂起时的值。
进程恢复执行前必须装入寄存器的一组数据称为硬件上下文(hardware context)。
进程切换只发生在内核态。在执行进程切换之前,用户态进程使用的所有寄存器内容都以保存在内核态堆栈上。
2.任务状态段
任务状态段TSS(Task State Segment)用来存放硬件上下文。尽管Linux并不使用硬件上下文切换,但是强制它为系统每个不同的CPU创建一个TSS。
3.thread字段
在每次进程切换时,被替换的硬件上下文必须保存在别处,每个进程描述符包含一个类型为thread_struct的thread字段,只要进程被切换出去,内核就把其硬件上下文保存在这个结构中。 这个数据结构包含的字段涉及大部分CPU寄存器,但不包括像eax,ebx等这些通用寄存器,他们的值保留在内核堆栈中。