linux 下的进程控制块-task
2022-09-21
进程控制块PCB(Process Control Block) (1)概述 进程控制块的作用是使一个在环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。 PCB通常是系统内存占用区中的一个连续存区,它存放着用于描述进程情况及控制进程运行所需的全部信息,它使一个在环境下不能独立运行的程序成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。 (2)基本内容: 进程控制块(PCB)(系统为了管理进程设置的一个专门的数据结构,用它 来记录进程的外部特征,描述进程的运动变化过程。系统利用PCB来控制 和管理进程,所以PCB是系统感知进程存在的唯一标志。进程与PCB是一 一对应的)。是进程存在和运行的唯一标志,在Linux中用task_struct这个结构体来表示。进程在操作系统中都有一个户口,用于表示这个进程。这个户口操作系统被称为PCB(进程控制块),这个结构体中有很多数据项,查看源代码时没必要理解全部的数据项,只需要在以后使用时再理解。理解为进程在操作系统中都有一个户口,用于表示这个进程。这个户口操作系统被称为PCB(进程控制块),在linux中具体实现是 task_struct数据结构,它记录了一下几个类型的信息: 1.状态信息,例如这个进程处于可执行状态,休眠,挂起等。 2.性质,由于unix有很多变种,进程有自己独特的性质。 3.资源,资源的链接比如内存,还有资源的限制和权限等。 4.组织,例如按照家族关系建立起来的树(父进程,子进程等)。 (3)应用: 在不同的中对进程的控制和管理机制不同,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的时间等。 (4)实例:

Linux task_struct

在linux 中每一个进程都由task_struct 来定义. task_struct就是我们通常所说的PCB。struct task_struct { long state; /*任务的运行状态(-1 不可运行,0 可运行(就绪),>0 已停止)*/ long counter;/*运行时间片计数器(递减)*/ long priority;/*优先级*/ long signal;/*信号*/ struct sigaction sigaction[32];/*信号执行属性结构,对应信号将要执行的操作和标志信息*/ long blocked; /* bitmap of masked signals */ /* various fields */ int exit_code;/*任务执行停止的退出码*/ unsigned long start_code,end_code,end_data,brk,start_stack;/*代码段地址 代码长度(字节数) 代码长度 + 数据长度(字节数)总长度 堆栈段地址*/ long pid,father,pgrp,session,leader;/*进程标识号(进程号) 父进程号 父进程组号 会话号 会话首领*/ unsigned short uid,euid,suid;/*用户标识号(用户id) 有效用户id 保存的用户id*/ unsigned short gid,egid,sgid; /*组标识号(组id) 有效组id 保存的组id*/ long alarm;/*报警定时值*/ long utime,stime,cutime,cstime,start_time;/*用户态运行时间 内核态运行时间 子进程用户态运行时间 子进程内核态运行时间 进程开始运行时刻*/ unsigned short used_math;/*标志:是否使用协处理器*/ /* file system info */ int tty; /* -1 if no tty, so it must be signed */ unsigned short umask;/*文件创建属性屏蔽位*/ struct m_inode * pwd;/*当前工作目录i 节点结构*/ struct m_inode * root;/*根目录i节点结构*/ struct m_inode * executable;/*执行文件i节点结构*/ unsigned long close_on_exec;/*执行时关闭文件句柄位图标志*/ struct file * filp[NR_OPEN];/*进程使用的文件表结构*/ /* ldt for this task 0 - zero 1 - cs 2 - ds&ss */ struct desc_struct ldt[3];/*本任务的局部描述符表。0-空,1-代码段cs,2-数据和堆栈段ds&ss*/ /* tss for this task */ struct tss_struct tss;/*本进程的任务状态段信息结构*/ };(5)struct结构的描述: struct task_struct { .... };

struct task_struct { .... };一、下面重点介绍几个基本的数据项:
1。进程状态 task_struct中用一个长整形state表示进程的状态。

volatile long state;

volatile long state;在linux中有四种基本的进程状态:
(1)就绪态(TASK_RUNNING):包括了运行态的进程。这是为了方便管理,因为任意时刻处于就绪态的进程最多只有一个。 (2)等待(睡眠)态:又被分为两种 i.浅度睡眠态(TASK_INTERRUPTIBLE): 在两种情况下被唤醒: 1.当等待的资源满足时。 2.其它进程通过信号或时钟中断唤醒。 ii.深度睡眠态(TASK_UNINTERRUPTIBLE):只能等到等待的资源满足时才被唤醒,而不能被其它进程唤醒 (3)暂停状态(TASK_STOPPED):收到以下几种信号,进程进入暂停状态: i.SIGSTOP------------------停止进程执行 ii。SIGTSTP-----------------从终端发来信号停止进程 iii。SIGTTIN------------------来自键盘的中断 iv。SIGTTOU----------------后台进程请求输出。 (4)僵死状态(TASK_ZOMBIE):进程已结束且释放大部分资源,但尚未释放其PCB 2。进程标识符 linux用一个32位无符号整形pid来简单的标识一个进程,用uid和gid分别来标识进程所属的用户和组 pid_t pid; uid_t uid; gid_t gid; pid的上限是由pid_max决定的。编译内核时会让选择0x1000和0x8000两种数值,即pid_max=4096和pid_max=32768两种。 3。亲属关系 struct list_head children; //子进程链表 struct list_head sibling; //兄弟进程链表 struct task_struct *real_parent; //真正创建当前进程的进程 struct task_struct *parent; //养父进程
struct list_head children; //子进程链表 struct list_head sibling; //兄弟进程链表 struct task_struct *real_parent; //真正创建当前进程的进程 struct task_struct *parent; //养父进程二。进程控制块的存放 1.内核栈 当进程从用户态进入内核态时要使用位于内核数据段上的内核栈, 2.数据结构 union thread_union { struct thread_info thread_info; unsigned long stack[THERAD_SIZE/sizeof(long)];//内核栈,一般为8KB };
union thread_union { struct thread_info thread_info; unsigned long stack[THERAD_SIZE/sizeof(long)];//内核栈,一般为8KB };内核中将task_struct的指针放在thread_info结构体中,而这个结构体又与内核栈一块被放在8KB的内核空间thread_union中。 struct thread_info{ struct task_struct *task; struct exec_domain *exec_domain; ..... };
声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 以32位微处理器为控制核心的超级电容器组管理系统

    在传统的能量供应系统中,电池作为主要的储能单元被广泛使用。随着科学技术的发展和保护环境的需求,超级电容器因其容量大、寿命长、放电速度快、工作温度范围宽、可以串并

    09-30
  • 多节动力电池检测系统的单片机控制模块

    针对动力电池工作参数的监测,保护其安全性和使用寿命的问题,提出基于电池管理芯片 LTC6803 设计一套电池管理系统,利用 LTC6803 和 STC12C54

    09-30
  • CFS任务的负载均衡

    负载均衡的系列文章共分为三篇,第一篇为框架篇,描述负载均衡的相关原理、场景和框架。本篇作为该系列文章第二篇,主要通过对任务放置场景(task placement)的均衡分布进行分析,以便加深读者对内核调度器实现任务均衡分布的理解。 本文基于linux-5.4.24分

    09-29
  • Multi-queue 架构分析

    Linux上传统的块设备层(Block Layer)和IO调度器(如cfq)主要是针对HDD(hard disk drivers)设计的。我们知道,HDD设备的随机IO性能很差,吞吐量大约是几百IOPS(IOs per second),延迟在毫秒级,所以当时IO性能的瓶颈在硬件,而不是内核。但是,随着高速

    09-29
  • ARMv8 异常处理简介

    内核稳定性问题复杂多样,最常见的莫过于“kernel panic”,意为“内核恐慌,不知所措”。这种情况下系统自然无法正常运转,只能自我结束生命,留下死亡信息。诸如: “Unable to handle kernel XXX at virtual address XXX” “undefined instruction XXX”

    09-29
  • 新型 IO 调度器 BFQ 简介

    Linux io调度器有很多种,大多数调度器都经受住了各种市场环境的长时间验证,稳定性、性能得到各种用户的认可,但新的调度器依然展露头角,在4.12内核中出现了一个新的bfq调度器,这个调度器将取代曾经的辉煌的cfq调度器。社区对待大的改动都是很谨慎的,为什

    09-29
  • CFS任务的负载均衡(框架篇)

    我们描述负载均衡的系列文章一共三篇,第一篇是框架部分,即本文,主要描述了负载均衡相关的原理、场景和框架。后面的两篇是对均衡代码的情景分析,通过对load balance、task placement和active upmigration几个典型的负载均衡来呈现其实现细节,稍后发布,敬

    09-29
  • linux IO Block layer 解析

    早期的 Block 框架是单队列(single-queue)架构,适用于“硬件单队列”的存储设备(比如机械磁盘),随着存储器件技术的发展,支持“硬件多队列”的存储器件越来越常见(比如 NVMe SSD),传统的单队列架构也因此被改成了多队列(multi-queue)架构。早在 3.

    09-29
  • eMMC简介

    1 eMMC是什么 eMMC是embedded MultiMediaCard的简称,即嵌入式多媒体卡, 是一种闪存卡的标准,它定义了基于嵌入式多媒体卡的存储系统的物理架构和访问接口及协议,具体由电子设备工程联合委员会JEDEC订立和发布。 它是对 MMC的一个拓展,具有体积小,功耗低,

    09-29
  • 低纹波、高精度电流源设计

    低纹波、高精度电流源是一种重要的仪器设备;广泛应用于电光源、电化学、通信、测量技术、电子仪器等领域。目前,市场上的电流源不具备连续可调功能;并且输出电流范围小、

    09-29
  • Linux 电信基站系统解决方案

      自从1991年Linux第一次面世以来,任何人也不会想到这个不起眼的操作系统现在会应用得如此广泛。无论是从嵌入式领域的智能手机到大型计算服务器都可以找到它的

    09-28
  • 单片机振荡电路中如何选择晶体?

    1.单片机晶振的原理晶振一般采用三端式(考毕兹) 交流等效振荡电路;实际的晶振交流等效电路中,其中Cv是用来调节振荡频率,一般用变容二极管加上不同的反偏电压来实

    09-28
下载排行榜
更多
广告