linux进程学习-进程描述符的存储
当进程被新建时,内核会给进程分配一个8K的空间作为进程的内核堆栈。同时我们知道task_struct结构体也会被创建,但有意思的是,内核不会给task_struct单独分别空间,而是直接将其扔到8k的内核堆栈中,与内核堆栈共享这8K内存。 假设我们用如下结构表示进程描述符和内核堆栈: struct task_struct task; unsigned long stack [INIT_TASK_SIZE/sizeof(long)]; 那么我们很容易将其做成一个联合体: union task_union { struct task_struct task; unsigned long stack[INIT_TASK_SIZE/sizeof(long)]; }; 实际上,进程创建时内核会分配2个连续的页面(8192byte),将其底部大约1k(960byte)的空间拿来存放进程描述符(task_struct),上部大约7k(7232byte)的空间拿来作为内核堆栈。(更多,参考这里和这里) 内核不会让内核堆栈超出7232byte,否则会覆盖task_struct而导致错误。 在内核空间(kernel space)中,有一个专门的全局数组来保存所有的进程描述符(指针),数组条目就是上面的task_union的指针, 这个数组称为Task Array。 很明显的一个问题:pid的最大值是32767,而系统允许的最大进程数是512,如果用pid作为Task Array的索引而将数组大小设为32768的话,数组空间上存在明显的浪费。实际上Task Array的实际大小是系统允许的最大进程数,而内核采用了一些其他的算法(???)将进程描述符分布到数组中去。 现在,如果我们想遍历系统中所有的进程,由于一般情况下Task数组中的大多数元素都是空的,所以下面的代码是低效的: for ( i=; i<NR_TASKS; i++ ) { if (task[i]) //do something } 为此,task_struct结构体中加了如下字段:struct task_struct *next_task, *prev_task; 分别指向上一个进程和下一个进程,那么所有进程在连接在一起便形成了一个双向循环链表(double circular linked list),这样的遍历就变得高效了。该链表的头和尾都始终是init进程,因为init进程是长期存在的,这能保证链表一直有效。 随着进程的创建,我们需要在Task数组中找到空闲位置而将新进程插入进去。遍历Task数组的方式是可行却低效的,一个很简单的方式是准备一个堆栈(数据结构上的stack),让栈持有Task数组空闲位置的指针。当你需要插入新元素Task数组时,弹出栈顶元素供你使用便可;当你从Task数组中删除元素后,将该空闲位置压栈以便下次使用。而这个栈,就是linux中的tarray_freelist (自由时间列表) 试想如下case,进程p1要kill进程p2: p1: kill - pidOfP2 此时系统如何通过p2的PID找到p2的进程描述符?遍历task数组或遍历task_struct形成的双向循环链表都是低下的。 快速查找的一个简单方案是散列表(hash table),这个散列表称为pidhash,该表以pid为键(key),以指向pid对应的进程描述符的指针为值(value)。散列算法为: #define pid_hashfn(x) ((((x)>>8) ^ (x)) & (PIDHASH_SZ-1)) 其中PIDHASH_SZ为系统定义的此散列表的大小。 pidhash解决碰撞(冲突,colliding)的算法是“链接表法” (扩展, 其实效率最高的做法是直接通过pid做索引而用普通数组,只所以用散列表,道理和Task数组一样:节约空间)
linux进程学习-进程描述符的存储的更多相关文章
- Linux中的文件描述符与打开文件之间的关系
Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...
- Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列
http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...
- (转)Linux中的文件描述符
本文转自:http://blog.csdn.net/cywosp/article/details/38965239 作者:cywosp 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为 ...
- (转)Linux中的文件描述符与打开文件之间的关系
转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...
- Linux exec与文件描述符
看到好几篇文章讲述exec都是一知半解,所以我尽量说的清楚明白一些.本文首先讲述Linux文件描述符,然后是exec,最后举例说明exec I/O重定向及其用法. 概念:exec命令用于调用并执行指令 ...
- Linux Linux下最大文件描述符设置
Linux下最大文件描述符设置 by:授客 QQ:1033553122 1. 系统可打开最大文件描述符设置 查看系统可打开最大文件描述符 # cat /proc/sys/fs/file-max 6 ...
- [svc]linux中的文件描述符(file descriptor)和文件
linux中的文件描述符(file descriptor)和文件 linux为了实现一切皆文件的设计哲学,不仅将数据抽象成了文件,也将一切操作和资源抽象成了文件,比如说硬件设备,socket,磁盘,进 ...
- linux fcntl 对文件描述符控制
linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制
- linux进程学习-进程描述符,控制块
从数据结构的角度,进程用task_struct结构来描述,称为“进程描述符 (Process Descriptor)”或者“进程控制块(Process Control Block, PCB)”,其包含 ...
随机推荐
- Windows Thin PC体验 & 语言包更改(win 7 included)
本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. 简介: Window ...
- UIView属性的动画
//标记着动画块的开始,第一个参数表示动画的名字,起到标识作用 [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDurat ...
- 转 FreeBSD 安装JDK
cd /usr/ports/java/openjdk6make install clean 默认什么都不用选,因为我们配置的是运行环境, 中间编译过程好久... 偷懒的干脆就直接安装/usr/port ...
- Hadoop--设置单一节点集群
目的 这篇文档描述如何安装和配置一个单一节点的Hadoop,以便你可以快速使用hadoop mapreduce和Hadoop Distributed File System (HDFS)的一些简单操作 ...
- 图片压缩CompressUtil解析
CompressUtil 流程图: CompressUtil 类 具体解释 public class CompressUtil { /** * 终于封装的压缩方法 * @param imgPath * ...
- 迁移EXT4
http://fanli7.net/a/JAVAbiancheng/ANT/20101003/43604.html 級別: 中級 Roderick W. Smith ,顧問和作家 2008 年6 月0 ...
- rtems 4.11 IRQ (arm,beagle)
arm IRQ入口在 cpukit/score/arm/arm_exec_interrupt.S 中,其中BSP最关心就是 bl bsp_interrupt_dispatch 这句,看看beagle ...
- PHP网站常见安全漏洞 及相应防范措施总结
一.常见PHP网站安全漏洞 对于PHP的漏洞,目前常见的漏洞有五种.分别是Session文件漏洞.SQL注入漏洞.脚本命令执行漏洞.全局变量漏洞和文件漏洞.这里分别对这些漏洞进行简要的介绍. 1.se ...
- JVM、垃圾回收、内存调优、常见參数
一.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写.JVM是一种用于计算设备的规范.它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现 ...
- django数据库同步时报错“Table 'XXX' already exists”
转自:http://blog.csdn.net/huanhuanq1209/article/details/77884014 执行manage.py makemigrations 未提示错误信息, 但 ...