Linux系统中的进程控制块
进程控制块PCB的组织方式

进程控制块PCB的组织方式1. 概述进程控制块(Process Control Block,简称PCB)是操作系统中用于管理和控制进程的重要数据结构。
PCB存储了进程的各种信息,包括进程的状态、程序计数器、寄存器、资源分配情况等。
PCB的组织方式直接影响着操作系统的运行效率和进程管理的灵活性。
本文将介绍PCB的组织方式,并讨论各种组织方式的优缺点。
2. 线性表组织方式线性表是最简单、最常见的一种PCB组织方式。
在线性表中,操作系统将PCB按照进程的创建顺序依次连接起来,形成一个链式结构。
每个PCB包含一个指向下一个PCB的指针,并且最后一个PCB的指针为空。
这种组织方式简单直观,易于实现。
2.1 优点•简单易实现:使用链表结构存储PCB,代码实现简单。
•节省空间:只需分配PCB所需的空间,无需分配额外空间。
2.2 缺点•查找效率低:在线性表中查找特定的PCB需要遍历整个链表。
•插入和删除效率低:在链表中插入和删除PCB需要更新指针,导致效率低下。
•随机访问困难:无法通过索引或地址直接访问特定位置的PCB。
3. 链表组织方式链表组织方式是对线性表组织方式的改进,通过为PCB增加一些辅助指针,提高PCB的查找和操作效率。
3.1 双向链表双向链表是一种常见的链表结构,每个PCB除了指向下一个PCB 的指针外,还包含一个指向上一个PCB的指针。
这样就可以实现双向遍历,提高查找效率。
3.2 循环链表循环链表是一种特殊的链表结构,最后一个PCB的指针指向第一个PCB。
这样就可以实现循环遍历,简化代码实现。
循环链表可以是单向的,也可以是双向的。
3.3 优点•提高查找效率:双向链表和循环链表可以实现双向遍历或循环遍历,从而提高查找效率。
•提高插入和删除效率:通过辅助指针的更新,插入和删除PCB的效率得到提高。
•降低空间利用率:为了实现双向遍历或循环遍历,需要增加额外的指针,导致PCB的空间占用增加。
4. 哈希表组织方式哈希表是一种通过哈希函数将元素映射到某个位置的数据结构。
操作系统必备基础知识

操作系统必备基础知识今天给大家推荐两份大佬们总结的PDF,一份是计算机基础知识,一份是操作系统,反正帅地看完之后,和面试官聊天,都有点飘了,废话不多说,下面就让小编带你去看看哪些操作系统必备基础知识,希望能帮助到大家!操作系统基础知识操作系统是计算机体系中必不可少的核心系统软件,其他软件(如编辑程序、汇编程序、编译程序、数据库管理系统等系统软件,以及大量应用软件)是建立在操作系统的基础上,并在操作系统的统一管理和支持下运行。
操作系统是用户与计算机之间的桥梁,用户可以通过操作系统提供的功能访问计算机系统中的软硬件资源。
操作系统的作用是通过资源管理提高计算机系统的效率,改善人机界面,为用户提供有好的工作环境。
有效地组织和管理系统中的各种软硬件资源,合理的组织计算机系统工作流程,控制程序的执行,并且向用户提供一个良好的工作环境和友好的接口。
简单的说,操作系统就是运行在计算机硬件和软件(其他系统软件和应用软件)之间的一个系统软件,它的主要作用就是让计算机能够运行的很好的同时让你觉得也不错。
操作系统分为这么几种:批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统、嵌入式操作系统、微机操作系统(这个我们就比较常见了,比如Linux、Windows、Unix、手机上的基于Unix的安卓系统等等)。
操作系统的功能可分为5大部分:处理机(CPU)管理、文件管理、存储管理、设备管理和作业管理。
下面说说处理机管理中的一些基础知识。
三态模型五态模型在多道程序环境的系统中,存在多个可以一起进行(并发执行)的进程,因此必然会存在进程之间的通信问题。
进程间的通信主要有同步、互斥、调度、死锁、信号量机制等问题进程间的同步多个进程都是独立进行的,有的时候需要在某些地方协调一下,比如进程A在生产一个原件,进程B要加工这个原件,这时候就需要进程B等待进程A完成后才能开始进行,这就是进程之间的同步。
进程间的互斥这就是指两个进程都想用同一个资源,但是这个资源同时只能被一个进程使用。
Linux 进程概念

Linux 进程概念进程是执行中的程序,这是一种非正式的说法。
进程不只是程序代码,程序代码有时称为文本段。
进程还包括当前活动,通过程序计数器的值和处理器寄存器的内容来表示。
另外,进程通常还包括进程堆栈段(包含临时数据,如方法参数、返回地址和局部变量)和数据段(包含全局变量)。
这里强调,程序本身不是进程;程序只是被动实体,如存储在磁盘上的文件内容,而进程是活动实体,它有一个程序计数器用来表示下一个要执行的指令和相关资源集合。
虽然两个进程可以与同一程序相关,但是它们被当做两个独立的执行序列。
例如,多个用户可运行电子邮件程序中的不同拷贝命令,或者同一用户能调用编辑器程序的多个拷贝命令。
这些都是独立的进程,虽然文本段相同,但是数据段不同。
1.进程状态进程在执行时会改变状态,进程状态部分地由进程的当前活动所定义。
每个进程可能处于下列状态之一:●新建进程正在被创建。
●运行指令正在被执行。
●等待进程等待一定事件的出现(如接收某个信号)。
●就绪进程等待被分配给某个处理器。
●终止进程已完成执行。
这些状态的名称较随意,且随操作系统的不同而变化。
不过,它们所代表的状态可以出现在所有系统上。
有的操作系统更为仔细地描述了进程状态。
在任何时刻一次只能有一个进程可在任何一个处理上运行,尽管许多进程可能处于就绪或等待状态。
2.进程控件块每个进程在操作系统内用进程控制块(Process control block,PCB也称为任务控制块)来表示。
每个任务控制块都包含与特定进程相关的许多信息。
●进程状态状态可包括新的、就绪、运行、等待和停止等。
●程序计数器计数器表示这个进程要执行的下个指令的地址。
●CPU寄存器根据计算机体系结构的不同,寄存器的数量和类型也不同。
它们包括累加器、索引寄存器、堆栈指针、通用寄存器和其他条件码信息寄存器。
与程序计数器一样,这些状态信息在出现中断时也需要被保存,以便进程以后正确地继续执行。
●CPU调度信息这类信息包括进程优先级、调度队列的指针和任何其他高度参数。
Linux系统编程之进程控制(进程创建、终止、等待及替换)

Linux系统编程之进程控制(进程创建、终⽌、等待及替换)进程创建在上⼀节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建⼀个新进程。
那么,系统是如何创建⼀个新进程的呢?这就需要我们更深⼊的剖析fork 函数。
1.1 fork函数的返回值调⽤fork创建进程时,原进程为⽗进程,新进程为⼦进程。
运⾏man fork后,我们可以看到如下信息:#include <unistd.h>pid_t fork(void);fork函数有两个返回值,⼦进程中返回0,⽗进程返回⼦进程pid,如果创建失败则返回-1。
实际上,当我们调⽤fork后,系统内核将会做:分配新的内存块和内核数据结构(如task_struct)给⼦进程将⽗进程的部分数据结构内容拷贝⾄⼦进程添加⼦进程到系统进程列表中fork返回,开始调度1.2 写时拷贝在创建进程的过程中,默认情况下,⽗⼦进程共享代码,但是数据是各⾃私有⼀份的。
如果⽗⼦只需要对数据进⾏读取,那么⼤多数的数据是不需要私有的。
这⾥有三点需要注意:第⼀,为什么⼦进程也会从fork之后开始执⾏?因为⽗⼦进程是共享代码的,在给⼦进程创建PCB时,⼦进程PCB中的⼤多数数据是⽗进程的拷贝,这⾥⾯就包括了程序计数器(PC)。
由于PC中的数据是即将执⾏的下⼀条指令的地址,所以当fork返回之后,⼦进程会和⽗进程⼀样,都执⾏fork之后的代码。
第⼆,创建进程时,⼦进程需要拷贝⽗进程所有的数据吗?⽗进程的数据有很多,但并不是所有的数据都要⽴马使⽤,因此并不是所有的数据都进⾏拷贝。
⼀般情况下,只有当⽗进程或者⼦进程对某些数据进⾏写操作时,操作系统才会从内存中申请内存块,将新的数据拷写⼊申请的内存块中,并且更改页表对应的页表项,这就是写时拷贝。
原理如下图所⽰:第三,为什么数据要各⾃私有?这是因为进程具有独⽴性,每个进程的运⾏不能⼲扰彼此。
1.3 fork函数的⽤法及其调⽤失败的原因fork函数的⽤法:⼀个⽗进程希望复制⾃⼰,通过条件判断,使⽗⼦进程分流同时执⾏不同的代码段。
Linux下的进程控制块(PCB)

Linux下的进程控制块(PCB)本⽂转载⾃1. 导语进程在操作系统中都有⼀个户⼝,⽤于表⽰这个进程。
这个户⼝操作系统被称为PCB(进程控制块),在linux中具体实现是 task_struct数据结构。
2. 说明进程控制块(PCB)(系统为了管理进程设置的⼀个专门的数据结构,⽤它来记录进程的外部特征,描述进程的运动变化过程。
系统利⽤PCB来控和管理进程,所以PCB是系统感知进程存在的唯⼀标志。
进程与PCB是⼀⼀对应的)在不同的操作系统中对进程的控制和管理机制不同,PCB中的信息多少不⼀样,通常PCB应包含如下⼀些信息。
1、进程:每个进程都必须有⼀个唯⼀的标识符,可以是字符串,也可以是⼀个数字。
2、进程当前状态 status:说明进程当前所处的状态。
为了管理的⽅便,时会将相同的状态的进程组成⼀个队列,如就绪进程队列,等待进程则要根据等待的事件组成多个,如等待打印机队列、等待磁盘完成队列等等。
3、进程相应的程序和数据地址,以便把PCB与其程序和数据联系起来。
4、进程。
列出所拥有的除CPU外的,如拥有的,打开的⽂件列表等。
5、 priority:进程的优先级反映进程的紧迫程度,通常由⽤户指定和系统设置。
6、现场保护区 cpustatus:当进程因某种原因不能继续占⽤CPU时(如等待打印机),释放CPU,这时就要将CPU的各种状态信息保护起来,为将来再次得到处理机恢复CPU的各种状态,继续运⾏。
7、进程同步与通信机制⽤于实现进程间互斥、同步和通信所需的信号量等。
8、进程所在队列PCB的链接字根据进程所处的现⾏状态,进程相的PCB参加到不同队列中。
PCB链接字指出该进程所在队列中下⼀个进程PCB的⾸地址。
9、与进程有关的其他信息。
如进程记账信息,进程占⽤CPU的时间等。
在linux 中每⼀个进程都由task_struct 来定义. task_struct就是我们通常所说的PCB。
3. 源码struct task_struct{volatile long state; //说明了该进程是否可以执⾏,还是可中断等信息unsigned long flags; // flags 是进程号,在调⽤fork()时给出int sigpending; // 进程上是否有待处理的信号mm_segment_t addr_limit; //进程地址空间,区分内核进程与普通进程在内存存放的位置不同 //0-0xBFFFFFFF for user-thead //0-0xFFFFFFFF for kernel-thread //调度标志,表⽰该进程是否需要重新调度,若⾮0,则当从内核态返回到⽤户态,会发⽣调度volatile long need_resched;int lock_depth; //锁深度long nice; //进程的基本时间⽚//进程的调度策略,有三种,实时进程:SCHED_FIFO,SCHED_RR, 分时进程:SCHED_OTHERunsigned long policy;struct mm_struct *mm; //进程内存管理信息int processor;//若进程不在任何CPU上运⾏, cpus_runnable 的值是0,否则是1 这个值在运⾏队列被锁时更新unsigned long cpus_runnable, cpus_allowed;struct list_head run_list; //指向运⾏队列的指针unsigned long sleep_time; //进程的睡眠时间//⽤于将系统中所有的进程连成⼀个双向循环链表, 其根是init_taskstruct task_struct *next_task, *prev_task;struct mm_struct *active_mm;struct list_head local_pages; //指向本地页⾯unsigned int allocation_order, nr_local_pages;struct linux_binfmt *binfmt; //进程所运⾏的可执⾏⽂件的格式int exit_code, exit_signal;int pdeath_signal; //⽗进程终⽌时向⼦进程发送的信号unsigned long personality;//Linux可以运⾏由其他UNIX操作系统⽣成的符合iBCS2标准的程序int did_exec:1;pid_t pid; //进程标识符,⽤来代表⼀个进程pid_t pgrp; //进程组标识,表⽰进程所属的进程组pid_t tty_old_pgrp; //进程控制终端所在的组标识pid_t session; //进程的会话标识pid_t tgid;int leader; //表⽰进程是否为会话主管struct task_struct *p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_osptr;struct list_head thread_group; //线程链表struct task_struct *pidhash_next; //⽤于将进程链⼊HASH表struct task_struct **pidhash_pprev;wait_queue_head_t wait_chldexit; //供wait4()使⽤struct completion *vfork_done; //供vfork() 使⽤unsigned long rt_priority; //实时优先级,⽤它计算实时进程调度时的weight值//it_real_value,it_real_incr⽤于REAL定时器,单位为jiffies, 系统根据it_real_value//设置定时器的第⼀个终⽌时间. 在定时器到期时,向进程发送SIGALRM信号,同时根据//it_real_incr重置终⽌时间,it_prof_value,it_prof_incr⽤于Profile定时器,单位为jiffies。
Linux 第5章课后习题答案

Linux思考题51.fork()与clone()二者之间得区别就是什么?答:fork创建一个进程时,子进程只就是完全复制父进程得资源,复制出来得子进程有自己得task_struct结构与pid,但却复制父进程其它所有得资源。
通过fork创建子进程,需要将上面描述得每种资源都复制一个副本。
fork()调用执行一次返回两个值,对于父进程,fork函数返回子程序得进程号,而对于子程序,fork函数则返回零,这就就是一个函数返回两次得本质。
在fork之后,子进程与父进程都会继续执行fork调用之后得指令。
系统调用fork()与vfork()就是无参数得,而clone()则带有参数。
fork()就是全部复制,vfork()就是共享内存,而clone()就是则可以将父进程资源有选择地复制给子进程,而没有复制得数据结构则通过指针得复制让子进程共享,具体要复制哪些资源给子进程,由参数列表中得clone_flags来决定。
另外,clone()返回得就是子进程得pid。
2.什么就是进程?什么就是线程?Linux系统中得进程有那些状态?如何获取系统中各进程得状态?答:进程就是指在系统中正在运行得一个应用程序;线程就是系统分配处理器时间资源得基本单元,或者说进程之内独立执行得一个单元。
对于操作系统而言,其调度单元就是线程。
一个进程至少包括一个线程,通常将该线程称为主线程。
一个进程从主线程得执行开始进而创建一个或多个附加线程,就就是所谓基于多线程得多任务。
Linux系统中得进程状态有:TASK_RUNNING(运行状态),TASK_INTERRUPTIBLE(可中断睡眠状态),TASK_UNINTERRUPTIBLE(不可中断得睡眠状态),TASK_STOPPED(暂停状态),TASK_NONINTERACTIVE(不可交互睡眠状态),TASK_DEAD(死亡状态),EXIT_ZOMBIE(僵死进程),EXIT_DEAD(僵死撤销状态)ps 查瞧静态得进程信息可以使用man 来查瞧ps 得使用参数以下就是几个常使用到得,a 显示当前终端得所有进程信息u 使用以用户为主得格式输出进程信息x 显示当前用户在所有终端下得进程信息-e 显示系统内得所有进程# ps 只显示当前用户打开得进程]# ps aux 显示系统中所有进程信息3.Linux系统中进程有哪两种模式?各有何特点?答:用户进程与系统进程,用户进程就就是用户自己打开得应用程序,可有可无。
第6章 linux进程控制开发及多线程编程

进程的状态
进程是程序的执行过程,根据它的生命周期可以划分成3种 状态。 执行态:该进程正在运行,即进程正在占用CPU。 就绪态:进程已经具备执行的一切条件,正在等待分配 CPU的处理时间片。 等待态:进程不能使用CPU,若等待事件发生(等待的 资源分配到)则可将其唤醒。
Linux下进程地址空间(1)
互斥锁线程控制 (1)
在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态 的线程能够对共享资源进行操作。若其他线程希望上锁一个 已经被上锁的互斥锁,则该线程就会挂起,直到上锁的线程 释放掉互斥锁为止。
互斥锁机制主要包括下面的基本函数。 互斥锁初始化: pthread_mutex_init() 互斥锁上锁: pthread_mutex_lock() 互斥锁判断上锁:pthread_mutex_trylock() 互斥锁解锁: pthread_mutex_unlock() 消除互斥锁: pthread_mutex_destroy()
示例
阅读并执行示例7-2-4 开始
教材P216-P217
fork()
程序功能: (1)使用fork创建一个子进程, 然后让其子进程暂停5s(sleep函 数)。 (2)父进程使用waitpid,参数 WNOHANG使进程不会阻塞; (3)若子进程退出,则waitpid返 回子进程号,若没有则waitpid返 回0,并且父进程每隔一秒循环判 断。
因此,可以通过返回值来判定该进程是父进程还是子进程。
fork示例
1.Fork返回两个值返回到哪里??
int main(void)
{
pid_t result;
2.怎样区分是父、子进程??
result = fork();
操作系统试题库(经典版)

---操作系统试题库一, 选择题8. 计算机系统的组成包括 (B ).第一部分:操作系统概述A, 程序和数据 B, 计算机硬件和计算机软件1. 在计算机系统中 , 操作系统是 ( B ). C, 处理器和内存 D, 处理器 , 存储器和外围设备A. 一般应用软件B. 核心系统软件9. 下面关于计算机软件的描述正确的是 (B ).C.用户应用软件D. 系统支撑软件A, 它是系统赖以工作的实体2. ( D ) 不是基本的操作系统 . B, 它是指计算机的程序及文档A, 批处理操作系统 B, 分时操作系统C, 位于计算机系统的最外层C,实时操作系统 D, 网络操作系统D, 分为系统软件和支撑软件两大类3. (C ) 不是分时系统的基本特征 : 10. 财务软件是一种 (C).A, 同时性 B, 独立性A, 系统软件 B, 接口软件 C, 应用软件 D, 用户C,实时性 D, 交互性软件4. 关于操作系统的叙述 (D) 是不正确的 . 11. 世界上第一个操作系统是 (B).A." 管理资源的程序 "B." 管理用户程序执行的A, 分时系统 B, 单道批处理系统程序 " C, 多道批处理系统 D,实时系统C." 能使系统资源提高效率的程序 "D." 能方便12. 批处理操作系统提高了计算机的工作效率 , 用户编程的程序 " 但(B ).5. 操作系统的发展过程是 (A ) A, 系统吞吐量小 B, 在作业执行时用户不能直A. 设备驱动程序组成的原始操作系统, 管理程接干预序, 操作系统C, 系统资源利用率不高 D, 不具备并行性B. 原始操作系统 , 操作系统 , 管理程序13. 允许多个用户以交互使用计算机的操作系C.管理程序 , 原始操作系统 , 操作系统统是 (A).D.管理程序 , 操作系统 , 原始操作系统A, 分时系统 B, 单道批处理系统6. 设计批处理多道系统时 , 首先要考虑的是C, 多道批处理系统 D, 实时系统( B) 14. 下面关于操作系统的叙述正确的是 (A ).A. 灵活性和可适应性B. 系统效率和吞吐量A, 批处理作业必须具有作业控制信息C.交互性和响应时间D. 实时性和可靠性B, 分时系统不一定都具有人机交互功能7. 操作系统是一种 (B ). C, 从响应时间的角度看 , 实时系统与分时系统A, 应用软件 B, 系统软件 C, 通用软件 D, 差不多工具软件D, 由于采用了分时技术 , 用户可以独占计算机---的资源所需的时间可能要 (B).15. 操作系统是一组 (C ). A,增加, 减少 B, 增加, 延长 C, 减少,延长 D, 减A, 文件管理程序 B, 中断处理程序少, 减少C,资源管理程序 D, 设备管理程序22. (A) 没有多道程序设计的特点 .16. 现代操作系统的两个基本特征是(C) 和资A,DOS B,UNIX C,WINDOWS D,OS/2源共享 . 23. 下列四个操作系统中, 是分时系统的为A, 多道程序设计 B, 中断处理(C ).C,程序的并发执行 D, 实现分时与实时处理A,MS-DOS B,WINDOWS 9817. (D) 不是操作系统关心的主要问题 . C,UNIX D,OS/2 系统A, 管理计算机裸机24. 在分时系统中 , 时间片一定 ,( B), 响应时间B, 设计 , 提供用户程序与计算机硬件系统的界越长 .面A, 内存越多 B, 用户数越多C, 管理计算机系统资源C, 后备队列 D, 用户数越少D, 高级程序设计语言的编译器25. 批处理系统的主要缺点是 (B ).18. 引入多道程序的目的是 (D ). A,CPU的利用率不高 B, 失去了交互性A, 为了充分利用主存储器 B, 增强系统的交互C, 不具备并行性 D, 以上都不是能力26. 在下列性质中 , 哪一个不是分时系统的特C, 提高实时响应速度 D, 充分利用CPU,减少征.(C)CPU的等待时间A, 交互性 B, 多路性 C, 成批性 D, 独占性19.在多道程序设计的计算机系统中 ,CPU(C ).27. 实时操作系统追求的目标是 ( C).A, 只能被一个程序占用 B, 可以被多个程序同A, 高吞吐率 B, 充分利用内存时占用C, 快速响应 D, 减少系统开销C,可以被多个程序交替占用 D, 以上都不对28. 以下 (C) 项功能不是操作系统具备的主要20. 多道程序设计是指 (B ). 功能 .A, 有多个程序同时进入 CPU运行A, 内存管理 B, 中断处理 C, 文档编辑 D,CPU调B, 有多个程序同时进入主存并行运行度C,程序段执行不是顺序的29. 操作系统程序结构的主要特点是 (C).D,同一个程序可以对应多个不同的进程A, 一个程序模块 B, 分层结构21. 从总体上说 , 采用多道程序设计技术可以 ( ) C, 层次模块化 D, 子程序结构单位时间的算题量 , 但对每一个算题 , 从算30. 操作系统负责为方便用户管理计算机系统题开始到全部完成所需的时间比单道执行的(C ).---A, 程序 B, 文档资料 C, 资源 D, 进程37. 在下列关于 Linux 的论述中 ,( D) 是不正确31. 计算机在接受用户请求后处理数据以及在的 .数据处理结束时 , 将结果送到终端显示器 . A. Linux 是一个多道分时操作系统例如 , 导弹控制系统应选择安装 (C ) B. 管道机制是 Linux 贡献之一A, 批处理操作系统 B, 分时操作系统 C. 提供可动态装卸的文件系统是 Linux 的特色C,实时操作系统 D, 网络操作系统之一32. 操作系统的基本职能是 (A). D. 路径名是 Linux 独有的实现文件共享的机制A. 控制和管理系统内各种资源 , 有效地组织多38. 将汇编语言源程序转换成等价的目标程序道程序的运行的过程称为 (C )B. 提供用户界面 , 方便用户使用 A. 汇编 B. 解释C. 编译D. 连接C.提供方便的可视化编辑程序39. 下面( B) 不是计算机高级语言。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB.她是对进程控制的唯一手段也是最有效的手段. 当我们调用fork() 时, 系统会为我们产生一个task_struct结构。
然后从父进程,那里继承一些数据, 并把新的进程插入到进程树中, 以待进行进程管理。
因此了解task_struct的结构对于我们理解任务调度(在linux 中任务和进程是同一概念)的关键。
在进行剖析task_struct的定义之前,我们先按照我们的理论推一下它的结构:1、进程状态,将纪录进程在等待,运行,或死锁2、调度信息, 由哪个调度函数调度,怎样调度等3、进程的通讯状况4、因为要插入进程树,必须有联系父子兄弟的指针, 当然是task_struct型5、时间信息, 比如计算好执行的时间, 以便cpu 分配6、标号,决定改进程归属7、可以读写打开的一些文件信息8、进程上下文和内核上下文9、处理器上下文10、内存信息因为每一个PCB都是这样的, 只有这些结构, 才能满足一个进程的所有要求。
打开/include/linux/sched.h可以找到task_struct 的定义struct task_struct {volatile long state; /*说明了该进程是否可以执行,还是可中断等信息*/unsigned long flags; /*Flage 是进程号,在调用fork()时给出*/int sigpending; /*进程上是否有待处理的信号*/mm_segment_t addr_limit;/**********************************************************//**进程地址空间,区分内核进程与普通进程在内存存放的位置不同*//****0-0xBFFFFFFF for user-thead ***********************//****0-0xFFFFFFFF for kernel-thread ***********************//**********************************************************/volatile long need_resched;/**********************************************************//**********调度标志,表示该进程是否需要重新调度,************//**********若非0,则当从内核态返回到用户态,会发生调度*******//**********************************************************/int lock_depth; /*********************锁深度***************/long nice; /*************进程的基本时间片******************/unsigned long policy;/**********************************************************//*进程的调度策略,有三种************************************//*实时进程:SCHED_FIFO,SCHED_RR*****************************//*分时进程:SCHED_OTHER*************************************//**********************************************************//**********************************************************/struct mm_struct *mm; //进程内存管理信息int processor;/**********************************************************//*若进程不在任何CPU上运行,/*cpus_runnable 的值是0,否则是1。
/*这个值在运行队列被锁时更新.*//**********************************************************/unsigned long cpus_runnable, cpus_allowed;struct list_head run_list; /****指向运行队列的指针*********/unsigned long sleep_time; /*****进程的睡眠时间*************/struct task_struct *next_task, *prev_task;/**********************************************************//*用于将系统中所有的进程连成一个双向循环链表*//*其根是init_task.*//**********************************************************/struct mm_struct *active_mm;struct list_head local_pages;/**指向本地页面***************/unsigned int allocation_order, nr_local_pages;struct linux_binfmt *binfmt;/*进程所运行的可执行文件的格式*/int exit_code, exit_signal;int pdeath_signal;/*父进程终止是向子进程发送的信号*********/ unsigned long personality;/*Linux可以运行由其他UNIX操作系统生成的符合iBCS2标准的程序*/ int did_exec:1;/**********************************************************//*按POSIX要求设计的布尔量,区分进程正在执行从***************//*父进程中继承的代码,还是执行由execve装入的新程序代码******//**********************************************************/pid_t pid;/**********进程标识符,用来代表一个进程***********/pid_t pgrp;/********进程组标识,表示进程所属的进程组********/pid_t tty_old_pgrp;/*******进程控制终端所在的组标识********/pid_t session;/*************进程的会话标识*****************/pid_t tgid;int leader; /*************标志,表示进程是否为会话主管******/struct task_struct *p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_osptr;struct list_head thread_group; /****线程链表***************/struct task_struct *pidhash_next;/*用于将进程链入HASH表pidhashstruct task_struct **pidhash_pprev;wait_queue_head_t wait_chldexit; /*供wait4()使用***********/struct completion *vfork_done; /* 供vfork() 使用***********/unsigned long rt_priority;/****实时优先级,用它计算实时进程调度时的weight值,/*******//*it_real_value,it_real_incr用于REAL定时器,单位为jiffies*/系统根据it_real_value //设置定时器的第一个终止时间。
在定时器到期时,向进程发送SIGALRM信号,同时根据it_real_incr重置终止时间,it_prof_value,it_prof_incr用于Profile定时器,单位为jiffies。
当进程运行时,不管在何种状态下,每个tick都使it_prof_value值减一,当减到0时,向进程发送信号SIGPROF,并根据it_prof_incr重置时间it_virt_value,it_virt_value用于Virtual定时器,单位为jiffies。
当进程运行时,不管在何种状态下,每个tick都使it_virt_value值减一当减到0时,向进程发送信号SIGVTALRM,根据it_virt_incr重置初值。
Real定时器根据系统时间实时更新,不管进程是否在运行Virtual定时器只在进程运行时,根据进程在用户态消耗的时间更新Profile定时器在进程运行时,根据进程消耗的时(不管在用户态还是内核态)更新*****************************/unsigned long it_real_value, it_prof_value, it_virt_value;unsigned long it_real_incr, it_prof_incr, it_virt_value;struct timer_list real_timer;//指向实时定时器的指针struct tms times; //记录进程消耗的时间,unsigned long start_time;//进程创建的时间long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS]; //记录进程在每个CPU上所消耗的用户态时间和核心态时间/* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific *///内存缺页和交换信息://min_flt, maj_flt累计进程的次缺页数(Copy on Write页和匿名页)和主缺页数(从映射文件或交换设备读入的页面数);//nswap记录进程累计换出的页面数,即写到交换设备上的页面数。