进程,PCB,task_struct 我就是我 2022-06-03 08:53 202阅读 0赞 **1.进程的概念** **2.进程控制块PCB** **3.linux中的task\_struct** #### 一.进程的概念: #### (1)进程是保证多个程序能够并发执行的过程。是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。 注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源。 (2)要使程序能够并发执行,那么,就需要为它配置相应的控制结构,即进程控制块(PCB),用来控制进程状态,控制进程运行的全部信息; (3)独立运行的实体(进程实体)=程序+相关数据+进程控制块(PCB); (4)进程实体运行的过程,就是一个进程; (5)在未引入线程时,进程是系统资源分配的基本单位,是独立调度,独立运行的基本单位, 引入线程之后,进程的属性发生分离,此时,进程只是资源分配的基本单位,线程处理调度机制; (6)进程的特征: 1,动态性 2,并发性 3,独立性 4,异步性 5,共享性 #### 二.进程控制块PCB #### ![图一][SouthEast] (1)队列:由于不同状态的PCB 可以链接成不同的队列,故而就三种进程队列:运行队列,就绪队列,阻塞队列 例如:在单处理机系统中: `运行队列只有一个 就绪队列按照优先级或者FIFO(先进先出)的原则排队 堵塞队列:一般有多个同时存在, 处于不同的等待状态` (2)链接方式:利用PCB中的链接指针将具有相同状态的PCB链接成一个队列,则有单向链接和双向链接 1,单向链接:每个PCB中只设置一个链接指针 2,双向链接:每个PCB设置两个链接指针,一个指向当前PCB的前一个PCB,另一个指向后一个PCB。 (3)索引方式:在内存中具有相同状态的PCB建立相应的索引表,同一状态的每个PCB在该表中对应一个索引项,并记录PCB 在内存中的首地址,并将索引表在内部中的首地址记录在内核专门的指针单元中。 ![图二][SouthEast 1] (4)挂起状态:又称静止状态,系统在运行过程中,资源有限,在资源不足时,会将部分进程暂时调出,转到外存,当条件允许时,再将重新调入内存。 (5)进程控制:{1,创建进程;2,撤销进程;3,进程状态} 1,如何创建进程: (A)申请空闲的PCB (B)为新进程分配内存资源 (C)为新进程分配其他必要资源 (D)初始化PCB (E)将新进程插入到就绪队列 1.1常见的典型有: (a)提交批处理作业 (b)用户登录 (c)提供服务 (d)应用进程请求 2,如何进程撤销: (A)进程正常结束;---〉生老病死 (B)进程异常结束----〉自杀 (B1)越界错误 (B2)非法指令 (B3)运行超时 (B4)等待超时 (B5)算术运算错误 (C)外界干预。---〉它杀 #### 三:linux 中的进程 #### (1)在linux中,task\_struct相当于这里的程序控制块(PCB) Linux内核通过一个被称为进程描述符的task\_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。 **1.task\_struct结构描述** ##### 1. 进程状态(State) ##### 进程执行时,它会根据具体情况改变状态 。进程状态是调度和对换的依据。Linux中的进程主要有如下状态,如表3.1所示 ![图三][SouthEast 2] 表3.1 **2.如何查看进程:** 在linux中,进程的信息可以通过./proc查看,但是,,前提是在超级用户下,即\#/proc系统文件夹查看。 如下所示,查看当前进程: ![图五][SouthEast 3] 同样,也可使用top来获取进程信息: 直接在终端输入top即可,按q退出 ![图六][SouthEast 4] **3.进程的状态:** (1) 可运行状态 处于这种状态的进程,要么正在运行、要么正准备运行。 正在运行的进程就是当前进程(由current所指向的进程),而准备运行的进程只要得到CPU就可以立即投入运行,CPU是这些进程唯一等待的系统资源。系统中有一个运行队列,用来容纳所有处于可运行状态的进程,调度程序执行时,从中选择一个进程投入运行,current总是指向运行队列中的某个元素,只是具体指向谁由调度程序决定。 (2)等待状态 处于该状态的进程正在等待某个事件或某个资源,它位于系统中的某个等待队列中。 Linux中处于等待状态的进程分为两种:可中断的等待状态和不可中断的等待状态。 【 ⊙处于可中断等待态的进程能被信号唤醒,如果收到信号,该进程就从等待状态进入可运行状态,并且加入到运行队列中,等待被调度; ⊙处于不可中断等待态的进程是因为硬件环境不能满足而等待,例如等待特定的系统资源,它任何情况下都不能被打断,只能用特定的方式来唤醒它。例如唤醒函数wake\_up()等。 】 (3)暂停状态 此时的进程暂时停止运行来接受某种特殊处理。通常当进程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信号后就处于这种状态。例如,正接受调试的进程就处于这种状态。 (4)僵尸状态 进程虽然已经终止,但由于某种原因,父进程还没有执行wait()系统调用,终止进程的信息也还没有回收。顾名思义,处于该状态的进程就是死进程,这种进程实际上是系统中的垃圾,必须进行相应处理以释放其占用的资源。 ##### 2.进程调度信息 ##### 调度程序利用这部分信息决定系统中哪个进程最应该运行,并结合进程的状态信息保证系统运转的公平和高效。这一部分信息通常包括进程的类别(普通进程还是实时进程)、进程的优先级等等。如下所示: ![图四][SouthEast 5] 在系统中,父进程通过使用fork(),创建子进程。 **创建进程:** fork()调用,不待任何参数时,内核将进行以下操作: (1)在进程表中为新进程申请一个表项 (2)为新进程分配一个唯一的PID(进程标识符) (3)将父进程的现场及地址空间为新进程作一个拷贝 (4)将父,子进程共享文件,故增加文件和索引节点的引用计数 (5)将子进程的状态设置为ready to run (6)将子进程的PID返回给父进程,将0返回给子进程 查看程序: ![图七][SouthEast 6] 查看结果: ![图八][SouthEast 7] struct的可能取值: #define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 #define __TASK_STOPPED 4 #define __TASK_TRACED 8 #define EXIT_ZOMBIE 16 #define EXIT_DEAD 32 ##### 3.标识符(Identifiers) ##### 每个进程有进程标识符、用户标识符、组标识符,如表4.4所示。 每个进程都有一个唯一的标识符,内核通过该标识符来识别不同的进程,同时,进程标识符PID也是内核提供给用户程序的接口,用户程序通过PID对进程发号施令。PID是32位的无符号整数,它被顺序编号:新创建进程的PID通常是前一个进程的PID加1。然而,为了与16位硬件平台的传统Linux系统保持兼容,在Linux上允许的最大PID号是32767,当内核在系统中创建第32768个进程时,就必须重新开始使用已闲置的PID号。 ![图九][SouthEast 8] ##### 4. 进程通信有关信息 ##### 为了使进程能在同一项任务上协调工作,进程之间必须能进行通信即交流数据。 Linux支持多种不同形式的通信机制。它支持典型的Unix 通信机制:信号、管道,也支持System V 通信机制:共享内存、信号量和消息队列。 ![SouthEast 9][] ##### 5.进程的地址空间分布,代码验证: ##### ![SouthEast 10][] 验证结果: ![SouthEast 11][] 说明:task\_struct结构是进程实体的核心,Linux内核通过该结构来控制进程:首先通过其中的调度信息决定该进程是否运行;当该进程运行时,根据其中保存的处理机状态信息来恢复进程运行现场,然后根据虚拟内存信息,找到程序的正文和数据;通过其中的通信信息和其他进程实现同步、通信等合作。几乎所有的操作都要依赖该结构, 所以,task\_struct结构是一个进程存在的唯一标志。 [SouthEast]: /images/20220603/643d2db94da749a7a7338b8be272fd4c.png [SouthEast 1]: /images/20220603/bad753a249d7479a9c024b85ad388a02.png [SouthEast 2]: /images/20220603/b8ae8bc7a01a45d9b3add4c0ef0cc6d5.png [SouthEast 3]: /images/20220603/f54ff4a51a3e47e4a9e01e8ecce73cb3.png [SouthEast 4]: /images/20220603/d61e4520dadd416d98e273d4c9776abc.png [SouthEast 5]: /images/20220603/03eb0f04ae6c4e61957f5f27799085c5.png [SouthEast 6]: /images/20220603/4db875eee2da41a09b5ae5c7c01f5ff8.png [SouthEast 7]: /images/20220603/e68b98ac49d94334aea0658e016dea5c.png [SouthEast 8]: /images/20220603/5af57f50ab0740b0a15f8bcae7e0be8a.png [SouthEast 9]: /images/20220603/2daa94a12c1248e797952b73fca4902f.png [SouthEast 10]: /images/20220603/32083ef5eb064d239a23a7089b5d28fb.png [SouthEast 11]: /images/20220603/68d5d97777dc4281bc6e205ce081e510.png
还没有评论,来说两句吧...