进程

来源:互联网 发布:sql语句增删改查范例 编辑:程序博客网 时间:2024/05/05 03:15

一、进程的概念与理解

1、进程是程序执行的实体。你可以把它看做充分描述程序已经执行到的何种程度的数据结构的汇集。

2、从内核的观点看:进程的目的就是担当分配系统资源的实体。

二、进程描述符

      为了管理进程、内核必须对每个进程所做的事情进行清楚的描述。(如内核需要知道进程的优先级、它是正在CPU上运行还是因某件事件而被阻塞、给它分配了什么样的地址空间、允许他访问哪个文件等等、这正是进程描述符的作用)


进程描述符包含的信息大致有

                       进程的基本信息

                      指向内存区描述符的指针

                       与进程相关的tty

                       当前目录

                       指向文件描述符的指针

                       所接收的信号

2.1进程状态

进程描述符中的state字段描述了进程当前所处的状态

         进程状态有

          可运行状态:进程要么在CPU上执行、要么准备执行

          可中断的等待状态:进程被挂起,直到某个条件变为真(产生一个硬件中断、释放进程正在等待的系统资源、或传递一个信号都可以唤醒进程的条件,把进程放回可运行状态)。

         不可中断状态:如打开一个设备文件、其相应的设备驱动程序开始探测相应的硬件设备时会用到这种状态。探测完成以前。设备驱动程序不能被中断,否则,硬件设备会处于不可预知的状态

         暂停状态:进程的执行被暂停。当进程接收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOUT信号后,进入暂停状态

        跟踪状态:

        僵死状态:进行执行被终止,但是,父进程还没有发布wait4()或waitpid()系统调用来返回有关死亡进程的信息,发布wait类系统调用前,内核不能丢弃包含在死进程描述符的数据,因为父进程可能还需要它。

       僵死撤销状态:


2.2标识一个进程

1、能被独立调度的每个执行上下文都必须拥有它自己的进程描述符,因此、即使共享内核大部分数据结构的轻量级进程,也有他们自己的task-struct。

2、进程和进程描述符之间有严格的一一对应关系。

3、进程标识符pid来标识进程、pid字段放在进行描述符的pid字段中。

4、32位系统进程pid为32767,64位系统为4194303


2.4 进程描述符处理

  1、对每个进程来说,LINUX都把两个不同的数据结构紧凑地的存放在一个单独为进程分配的存储区域内:一个是内核态的进程堆栈、另一个是紧挨进程描述符的小数据结果thread-info,叫做线程描述符,这块存储区域的大小通常为8192字节(两个页框)

        考虑到效率的因素、内核让这8k空间占据连续的两个页框并让第一个页框的起始地址2的13次方的倍数,当几乎没有可用的动态内存空间时,就会很难找到这样的2个连续的页框,因为空闲空间可能存在大量的碎片。


2.5 标识当前进程

1、用栈存放进程描述符的另一个优点体现在多处理器系统上:如前所述,对于每个硬件处理器、仅通过检查栈就可以获得当前正确的进程。


2.6双向链表


2.7 进程链表

1、双向链表的第一个例子:进程链表

2、进程链表的头是init-task描述符,它是所谓的0进程。init-task的task。pre字段指向链表最后插入进程的描述符的task字段。

3、提高调度程序运行速度的诀窍是建立多个可运行的进程链表,每种进程优先权对应一个不同的链表。


2.8 进程间关系

1、进程0 和进程1是由内核创建的。

2、父子关系


2.9 pidhash表及链表

1、kill()系统调用时:当进程p1希望向另一个进程p2发出一个信号时,p1调用kill系统调用,其参数为p2的pid,内核从这个pid导出其对应的进程描述符,然后从p2的进程描述符中取出记录挂起信号的数据结构指针。

2、顺序扫描进程链表并检查进程描述符的pid字段可行但是相当低效的。为了加速查找,引入了4个散列表,需要4个散列表是因为进程描述符包含了表示不同类型pid的字段,而且每种类型的pid需要它自己的散列表。


2.10如何组织进程

1、等待队列:等待队列在内核中有很多用途,尤其用在中断处理,进程同步及定时

    等待队列表示一组睡眠的进程,当某个条件变为真时,由内核唤醒他们。

    等待队列由双向链表实现,其元素包括指向进程描述符的指针。因为等待队列是由中断处理程序和主要内核函数修改的,因此必须对其双向链表进行保护,避免对其进行同时访问。      同步是通过等待队列头中的lock自旋锁达到的。

   

有2中睡眠进程:互斥进程:由内核有选择地唤醒

                          非互斥进程:总是由内核在事件发生时唤醒:等待磁盘传输结束的一组进程,一旦磁盘传输完成,所有等待的进程都被唤醒

                        等待访问临界资源的进程是互斥进程的典型列子

                        




             

         

         












0 0
原创粉丝点击