进程:程序执行的一个实例,在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)的更多相关文章

  1. 24小时学通Linux内核之进程

    都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲的全是进程,这点在大二的时候就困惑了我,结果那 ...

  2. (转)Linux内核之进程和系统调用

    Linux内核之进程和系统调用 什么是系统调用 在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的.功能十分强大的一系列的函数.这些系统调用是在内核中实现的,再通过一定 ...

  3. Linux内核之进程地址空间

    Linux内核之进程地址空间 内核中的函数以相当直接了当的方式获得动态内存: __get_free_pages 或 alloc_pages从分区页框分配器中获得页框; kmem_cache_alloc ...

  4. 深入Linux内核架构——进程管理和调度(上)

    如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...

  5. Linux内核分析——进程描述与创建

    20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验内容 ...

  6. 分析Linux内核中进程的调度(时间片轮转)-《Linux内核分析》Week2作业

    1.环境的搭建: 这个可以参考孟宁老师的github:mykernel,这里不再进行赘述.主要是就是下载Linux3.9的代码,然后安装孟宁老师编写的patch,最后进行编译. 2.代码的解读 课上的 ...

  7. linux内核数据结构--进程相关

    linux里面,有一个结构体task_struct,也叫“进程描述符”的数据结构,它包含了与进程相关的所有信息,它非常复杂,每一个字段都可能与一个功能相关,所以大部分细节不在我的研究范围之内,在这篇文 ...

  8. Linux 内核开发 - 进程空间

    1.1 虚拟内存 Linux 的系统.假设每一个任务都独立的占用内存,则实际的物理内存将非常快消耗殆尽.实际上对于前台正在执行的任务来说,所须要要的内存并不多,非常多任务基本不须要执行,也就没有必要一 ...

  9. Linux内核之进程和文件共享

    1.Shell命令的执行和进程    Shell 命令可以是内部或者外部命令.    内部(内置)命令(internal (built-in) command)的代码本身就是shell进程的一部分.L ...

  10. Linux内核分析--进程创建,执行,切换

    学号:351 原创作品转载请注明出处本实验来源 https://github.com/mengning/linuxkernel/ 实验要求 从整理上理解进程创建.可执行文件的加载和进程执行进程切换,重 ...

随机推荐

  1. css 变手

    用css 添加手状样式,鼠标移上去变小手,变小手 用css 添加手状样式,鼠标移上去变小手,变小手 cursor:pointer; 用JS使鼠标变小手onmouseover(鼠标越过的时候) onmo ...

  2. [Docker]学习笔记--搭建gitlab

    Gitlab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 详细介绍可以参照官网,https://about.gitlab.com/ 今天主要是通过 ...

  3. restful demo 演示; jquery min1.1;

    [说明]上午建立了一个restful风格的一个测试,运行通过:下午试了试postman,想看看http请求的具体过程,但是chrome浏览器的network面板也可以查看,并且很方便,就索性用它了 一 ...

  4. 巨蟒python全栈开发linux之centos5

    1.nginx安装使用 2.nginx访问日志和压测命令 3.nginx反向代理配置 nginx的404页面 访问:淘宝官网的一个错误地址:http://taobao.com/eeeeeeee 淘宝的 ...

  5. mysql_数据库_操作

    1.查看数据库 show databases; # 默认数据库: test - 用于用户测试数据 information_schema - MySQL本身架构相关数据 2.创建数据库 #utf- 编码 ...

  6. VS中没有为此解决方案配置选中要生成的项目

    菜单->生成->配置管理器->给要生成的项目打钩

  7. MiniUI 在线示例

    引用 http://miniui.com/demo/#src=datagrid/celledit.html

  8. camke GUI工具 选择 vs2017 时,如何指定工具集 v140 而不是默认的 v141?

    在参数位置加入 v140 即可,不需要加 -T

  9. Python3.6全栈开发实例[016]

    16.电影打分:程序先给出几个目前正在上映的电影列表. 由用户给每个电影投票.最终将该用户投票信息公布出来 lst = ['北京遇上西雅图', '解救吴先生', '美国往事', '西西里的美丽传说'] ...

  10. ORACLE中RECORD、VARRAY、TABLE的使用具体解释

     1     说明 1.1       RECORD 定义记录数据类型. 它类似于C语言中的结构数据类型(STRUCTURE).PL/SQL提供了将几个相关的.分离的.基本数据类型的变量组成一个总 ...