
进程控制块.docx
12页概述进程控制块(PCB)(系统为了管理进程设置的一个专门的数据结构,用 它来记录进程的外部特征,描述进程的运动变化过程系统利用 PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志进程与 PCB 曰_.疋一对应的)编辑本段应用在不同的操作系统中对进程的控制和管理机制不同,PCB中的信息多少不一样,通常PCB应包含如下一些信息1、进程标识符name :每个进程都必须有一个唯一的标识符,可以是字符串,也可以是一个字2、进程当前状态status :说明进程当前所处的状态为了管理的方便,系统设计时会将相同的状态的进程组成一个队列,如就绪进程队列,等待进程则要根据待的事件组成多个等待队列,如等待打印机队列、等待磁盘 I/O完成 队列等等3、 进程相应的程序和数据地址,以便把PCB与其程序和数据联系起来4、 进程资源清单列出所拥有的除 CPU外的资源记录,如拥有的I/O 设备,打开的文件列表等5、 进程优先级priority :进程的优先级反映进程的紧迫程度,通常由用户指定和系统设置6、 CPU现场保护区cpustatus :当进程因某种原因不能继续占用CPU时(如等待打印机),释放CPU,这时就要将CPU的各种状态信息保护起来,为将来再次得到处理机 恢复CPU的各种状态,继续运行。
7、 进程同步与通信机制 用于实现进程间互斥、同步和通信所需的信 号8、进程所在队列PCB的链接字根据进程所处的现行状态,进程相应 的PCB参加到不同队列中PCB链接字指出该进程所在队列中下一个进PCB的首地址9、与进程有关的其他信息 如进程记账信息,进程占用CPU的时间 等编辑本段实例Linux task_struet在linux中每一个进程都由task_struct数据结构来定义. task_struct就是我们通常所说的PCBstruct task_struet {long state; /*任务的运行状态(T不可运行,0可运行(就绪),>0 已停止)*/long counter;/*运行时间片计数器(递减)*/long priority;/* 优先级*/long signal;/* 信号*/st ruct sigac tion sigac tion[32];/ * 信号执行属性结构,对应信号将 要执行的操作和标志信息*/long blocked; /* bitmap of masked signals *//* various fields */int exit_code;/*任务执行停止的退出码*/unsigned long start_ code,end_code,end_da ta,brk,s tart_st ack;/ * 代码段地址 代码长度(字节数)代码长度+数据长度(字节数)总长度 堆栈段地址*/long pid,father,pgrp,session,leader;/* 进程标识号(进程号)父进 程号父进程组号会话号会话首领*/unsigned shor t uid,euid,suid;/* 用户标识号(用户id) 有效用户 id保存的用户id*/unsigned short gid,egid,sgid; /* 组标识号(组 id)有效组 id 保 存的组id*/long alarm;/*报警定时值*/long uti me,s ti me,c uti me,cs ti me,s tart_ti me;/ * 用户态运行时间 内 核态运行时间 子进程用户态运行时间子进程内核态运行时间 进程开始运行时刻*/unsigned short used_math;/* 标志:是否使用协处理器 *//* file system info */int tty; /* -1 if no tty, so it must be signed */ unsigned short umask;/* 文件创建属性屏蔽位*/ st rue t m_inode * pwd;/ * 当前工作目录 i 节点结构*/ st rue t m_inode * root;/* 根目录 i 节点结构*/ st rue t m_inode * exeeu table;/ * 执行文件 i 节点结构*/ unsigned long elose_on_exee;/ * 执行时关闭文件句柄位图标志 */ struet file * filp[NR_OPEN];/* 进程使用的文件表结构*/ /* ldt for this task 0 - zero 1 - es 2 - ds&ss */st rue t dese_s true t ldt[ 3];/ * 本任务的局部描述符表。
0-空,1-代 码段cs, 2-数据和堆栈段ds&ss*//* tss for this task */st rue t tss_s truet t ss;/ *本进程的任务状态段信息结构*/};task_struet结构描述1.进程状态(State )进程执行时,它会根据具体情况改变状态进程状态是调度和对换的 依据Linux中的进程主要有如下状态,如表1.1所示表1.1 Linux进程的状态内核表示含义TASK_RUNNING可运行TASK_INTERRUPTIBLE可中断的等待状态TASK_UNINTERRUPTIBLE不可中断的等待状态TASK_ZOMBIE僵死TASK_STOPPED暂停TASK_SWAPPING换入/换出•可运行状态处于这种状态的进程,要么正在运行、要么正准备运行正在运行的 进程就是当前进程(由eurrent所指向的进程),而准备运行的进程只要 得到CPU就可以立即投入运行,CPU是这些进程唯一等待的系统资源系统中有一个运行队列(run_queue ),用来容纳所有处于可运行状态的进程, 调度程序执行时,从中选择一个进程投入运行在后面我们讨论进程调度 的时候,可以看到运行队列的作用。
当前运行进程一直处于该队列中,也 就是说,current总是指向运行队列中的某个元素,只是具体指向谁由调度 程序决定•等待状态处于该状态的进程正在等待某个事件(event )或某个资源,它肯定位 于系统中的某个等待队列(wait_queue )中Linux中处于等待状态的进程 分为两种:可中断的等待状态和不可中断的等待状态处于可中断等待态 的进程可以被信号唤醒,如果收到信号,该进程就从等待状态进入可运行 状态,并且加入到运行队列中,等待被调度;而处于不可中断等待态的进 程是因为硬件环境不能满足而等待,例如等待特定的系统资源,它任何情 况下都不能被打断,只能用特定的方式来唤醒它,例如唤醒函数 wake_up()等•暂停状态此时的进程暂时停止运行来接受某种特殊处理通常当进程接收到 SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信号后就处于这种状态例如, 正接受调试的进程就处于这种状态•僵死状态进程虽然已经终止,但由于某种原因,父进程还没有执行 wai t()系统调用,终止进程的信息也还没有回收顾名思义,处于该状态的进程就是 死进程,这种进程实际上是系统中的垃圾,必须进行相应处理以释放其占 用的资源。
2.进程调度信息调度程序利用这部分信息决定系统中哪个进程最应该运行,并结合进 程的状态信息保证系统运转的公平和高效这一部分信息通常包括进程的 类别(普通进程还是实时进程)、进程的优先级等等如表 1.2所示:表1.2进程调度信息域名含义need_resched调度标志Nice静态优先级Counter动态优先级Policy调度策略rt_priority实时优先级在下一章的进程调度中我们会看到,当need_resched被设置时,在“下 一次的调度机会"就调用调度程序 schedulecounter代表进程剩余的 时间片,是进程调度的主要依据,也可以说是进程的动态优先级,因为这 个值在不断地减少;nice是进程的静态优先级,同时也代表进程的时间片, 用于对counter赋值,可以用nice()系统调用改变这个值;policy是适用 于该进程的调度策略,实时进程和普通进程的调度策略是不同的; rt_priority只对实时进程有意义,它是实时进程调度的依据进程的调度策略有三种,如表1.3所示表1.3进程调度的策略名称解释适用范围SCHED_OTHER其他调度普通进程SCHED_FIFO先来先服务调度实时进程SCHED_RR时间片轮转调度只有root用户能通过sched_setscheduler ()系统调用来改变调度策略。
3 .标识符(Identifiers)每个进程有进程标识符、用户标识符、组标识符,如表 1.4所示不管对内核还是普通用户来说,怎么用一种简单的方式识别不同的进 程呢?这就引入了进程标识符(PID: process identifier ),每个进程都 有一个唯一的标识符,内核通过这个标识符来识别不同的进程,同时,进 程标识符PID也是内核提供给用户程序的接口,用户程序通过 PID对进程发号施令PID是32位的无符号整数,它被顺序编号:新创建进程的 PID通常是前一个进程的PID加1然而,为了与16位硬件平台的传统Linux 系统保持兼容,在Linux上允许的最大PID号是32767,当内核在系统中创 建第32768个进程时,就必须重新开始使用已闲置的 PID号表1.4各种标识符Pid进程标识符Uid、 gid用户标识符、组标识符Euid、 egid有效用户标识符、有效组标识符Suid、 sgid备份用户标识符、备份组标识符Fsuid、 fsgid文件系统用户标识符、文件系统组标识符另外,每个进程都属于某个用户组task_struct结构中定义有用户标 识符和组标识符它们同样是简单的数字,这两种标识符用于系统的安全 控制。
系统通过这两种标识符控制进程对系统中文件和设备的访问,其它 几个标识符将在文件系统中讨论4.进程通信有关信息(IPC: Inter_Process Communication )为了使进程能在同一项任务上协调工作,进程之间必须能进行通信即 交流数据Linux支持多种不同形式的通信机制它支持典型的 Unix通信机制(IPC Mechanisms ):信号(Signals)、管道(Pipes),也支持 System V 通信机制:共享内存(Shared Memory )、信号量和消息队列(Message Queues), 如表1.5表1.5进程通信有关信息域名含义Spinlock_t sigmask_lock信号掩码的自旋锁Long blocked信号掩码Struct signal *sig信号处理函数Struct sem_undo *semundo为避免死锁而在信号量上设置的取消操 作Struct sem_queue *semsleeping与信号量操作相关的等待队列这些域的具体含义将在进程通信一章进行讨论5.进程链接信息(Links)程序创建的进程具有父/子关系因为一个进程能创建几个子进程,而 子进程之间有兄弟关系,在task_struct结构中有几个域来表示这种关系。
在Linux系统中,除了初始化进程init,其他进程都有一个。
