Linux内核之进程(1)
进程:程序执行的一个实例,在Linux源代码中,常把进程称为任务(task)或者线程(thread)。
从内核观点来看,进程的目的是担当分配系统资源(CPU的时间、内存等)的实体。
当一个进程创建时,几乎与父进程相同,接受父进程地址空间的一个逻辑拷贝,并从进程创建系统调用的下一条指令开始执行与父进程相同的代码。尽管父子进程可以共享含有程序代码的页,但是它们有各自独立的数据拷贝(栈和堆)。因此子进程对一个单元的修改对父进程是不可见的(反之亦然)。
早期的系统采用这种模式,现代Unix支持多线程应用程序——拥有相对独立执行流的用户程序共享应用程序的大部分数据结构。一个进程由几个用户线程组成,每个线程代表进程的一个执行流。现在大部分应用程序都是pthread库的标准库函数集编写的。
使用轻量级进程基本上可以共享一些资源,诸如地址空间、打开的文件等。只要其中一个修改共享资源,另一个就能立即查看这种修改。两个线程访问共享资源时就必须同步它们自己。
实现多线程应用程序的一个简单方式是把轻量级进程和每个线程关联起来,这样线程之间就可以通过简单地共享同一内存地址空间、同一打开的文件集等来访问相同的程序数据结构集;同时每个线程可以由内核独立调度,以便一个睡眠的同时另一个仍然是可以运行的。
1.进程状态
进程描述符中state字段描述了当前进程所处的状态。
1)可运行状态:进程要么在CPU上执行,要么准备执行。
2)可中断的等待状态:进程被挂起,直到某个条件为真。产生一个硬件中断,释放进程正等待的系统资源,或传递一个信号都是可以唤醒进程的条件。
3)不可中断的等待状态:与可中断的等待状态类似,但有一个例外,把信号传递给睡眠进程不能改变它的状态。
4)暂停状态:进程执行被暂停。当进程接收到,SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOUT信号后,进程进入暂停状态。
5)跟踪状态:进程的执行已由debugger程序暂停。当进程被另一个进程监控时,任何信号都可以把这个进程置于TASK_TRACED状态。
6)僵死状态:进程的执行被终止,但是父进程还未发布wait4()或waitpid()系统调用来返回有关死亡进程的信息。发布wait()类系统调用前,内核不能丢弃包含在死进程描述符中的数据,因为父进程可能还需要它。
7)僵死撤销状态:最终状态:由于父进程刚发出wait4()或者waitpid()系统调用,因为进程由系统删除。为了防止其他执行线程在同一进程上也执行wait()类系统调用,因为将进程由僵死状态改为僵死撤销状态。
2.标志一个进程
能被独立调度的执行上下文都必须拥有自己的进程描述符。
进程和进程描述符之间有非常严格的一一对应关系,这使得用32位的进程描述符标识进程成为一种方式,进程描述符指针指向这些地址,内核对进程的大部分引用都是通过进程描述符指针进行的。
类Unix系统使用进程标识符process ID(PID)的数来标识进程,PID存放在进程描述符的pid字段中,PID被顺序编号。在缺省情况下,最大的PID是32767;64位体系结构中,系统管理员可以把PID的上限扩展到4194303
3.进程描述符处理
进程是动态实体,生命周期从几毫秒到几个月。因此,内核必须能够同时处理多个进程,并把进程描述符放到动态内存中,而不是放到永久的分配各内核的分配区。
4.进程间的关系
程序创建的进程具有父子关系,多个子进程之间具有兄弟关系。进程1(init)是所有进程的祖先。



顺序扫描进程链表(双向链表)并检查进程描述符的pid字段是可行但相当低效的。为了加速查找,引入4个散列表。
需要4个散列表是因为进程描述符包含了表示不同类型的PID字段,每种类型的PID需要自己的散列表。

内核初始化期间动态地为4个散列表分配空间,并把他们存入pid_hash数组。一个散列表的长度依赖于可用RAM的容量,例如:一个系统拥有512M的RAM,那么每个散列表就被存在于4个页框中,可以拥有2048个表项。
具有链表的散列法比从PID到表索引的线性转换更优越。
PID散列表包含四个pid结构的数组。


我们考虑线程组4351的PID链表:散列表的进程描述符的pid_list字段中存放链表头,同时每个PID链表中指向前一个元素和后一个元素的指针也存放每个链表元素的pid_list字段中。
copyright@2015 liupan
liu.pan@datatom.com
Linux内核之进程(1)的更多相关文章
- 24小时学通Linux内核之进程
都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲的全是进程,这点在大二的时候就困惑了我,结果那 ...
- (转)Linux内核之进程和系统调用
Linux内核之进程和系统调用 什么是系统调用 在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的.功能十分强大的一系列的函数.这些系统调用是在内核中实现的,再通过一定 ...
- Linux内核之进程地址空间
Linux内核之进程地址空间 内核中的函数以相当直接了当的方式获得动态内存: __get_free_pages 或 alloc_pages从分区页框分配器中获得页框; kmem_cache_alloc ...
- 深入Linux内核架构——进程管理和调度(上)
如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...
- Linux内核分析——进程描述与创建
20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验内容 ...
- 分析Linux内核中进程的调度(时间片轮转)-《Linux内核分析》Week2作业
1.环境的搭建: 这个可以参考孟宁老师的github:mykernel,这里不再进行赘述.主要是就是下载Linux3.9的代码,然后安装孟宁老师编写的patch,最后进行编译. 2.代码的解读 课上的 ...
- linux内核数据结构--进程相关
linux里面,有一个结构体task_struct,也叫“进程描述符”的数据结构,它包含了与进程相关的所有信息,它非常复杂,每一个字段都可能与一个功能相关,所以大部分细节不在我的研究范围之内,在这篇文 ...
- Linux 内核开发 - 进程空间
1.1 虚拟内存 Linux 的系统.假设每一个任务都独立的占用内存,则实际的物理内存将非常快消耗殆尽.实际上对于前台正在执行的任务来说,所须要要的内存并不多,非常多任务基本不须要执行,也就没有必要一 ...
- Linux内核之进程和文件共享
1.Shell命令的执行和进程 Shell 命令可以是内部或者外部命令. 内部(内置)命令(internal (built-in) command)的代码本身就是shell进程的一部分.L ...
- Linux内核分析--进程创建,执行,切换
学号:351 原创作品转载请注明出处本实验来源 https://github.com/mengning/linuxkernel/ 实验要求 从整理上理解进程创建.可执行文件的加载和进程执行进程切换,重 ...
随机推荐
- TP数据删除
[数据删除及执行原生sql语句] delete() 返回受影响的记录条数 $goods -> delete(30); 删除主键值等于30的记录信息 $goods -> delete( ...
- tf.name_scope()和tf.variable_scope()
https://blog.csdn.net/gqixf/article/details/80191918 https://blog.csdn.net/uestc_c2_403/article/deta ...
- 前端基础------JS
JS中的语句要以分号 ; 为结束符. JS语言基础: 1, JS 的变量名可以使用 下划线, 数字, 字母, $ 组成. 不可以是数字开头 2, 声明变量使用var 变量名. 的格式来进行声明. v ...
- 【BZOJ2005】[Noi2010]能量采集 欧拉函数
[BZOJ2005][Noi2010]能量采集 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把 ...
- 1028 大数乘法 V2(FFT or py)
1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B ...
- 巨蟒django之权限7:动态生成一级&&二级菜单
内容回顾: . 权限的控制 . 表结构设计 存权限的信息 用户表 - name 用户名 - pwd 密码 - roles 多对多 角色表 - name - permissions 多对多 权限表 - ...
- iOS 面试题总结
最近项目做完了 比较空闲 在网上看了一份面试题 想自己整理一下 一.为什么说Objective-C是一门动态的语言?NSUInteger和NSInteger 的区别? 静态 动态是相对的,这里的动态语 ...
- 如何查看l操作系统是否开启rpc服务
linux操作系统 在linux 5.X以及下的版本你可以通过service portmap status命令查看rpc是否启动.如果提示running,表示正在运行:如果提示stop就是关闭了.如果 ...
- js获取链接等号“=”后面的参数
用该属性获取页面 URL 地址: window.location 对象所包含的属性 属性 描述 hash 从井号 (#) 开始的 URL(锚) host 主机名和当前 URL 的端口号 hostnam ...
- [NOIP2018TG]赛道修建
[NOIP2018TG]赛道修建 考场上multiset调不出啊啊啊!!! 首先肯定是二分答案 做树形dp,f[i]表示i点的子树两两匹配后剩下的最长长度 匹配可以用multiset维护 但是菊花图跑 ...