进程:程序执行的一个实例,在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. CodeIgniter框架——CI中视图路径问题

    答: 视图中的所有路径全部和 index.php 同级,也就是和 index.php 属于一个目录下,也就是网站根目录. 因为 index.php 后面看似是路径的东西其实那只是一种 URL 参数而已 ...

  2. Parenthesis(前缀和+线段树)

    1809: Parenthesis Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitted: 2291     Solved: 622 Des ...

  3. linux下安装nmon监控工具

    1.首先下载压缩包 wget http://sourceforge.net/projects/nmon/files/download/nmon_x86_12a.zip/download 2.解压并修改 ...

  4. CAP theorem

    https://en.wikipedia.org/wiki/CAP_theorem

  5. <2013 08 26> 雅思听力相关

    近两日开始接触雅思题型,初步做了6套剑桥雅思题的听力部分,完成情况还可以,这里做个总结. 1.听力总共约40左右道题目,30min左右完成,结束后有十分钟把答案写到答题卷上.所有听力材料都只播放一遍! ...

  6. ECMAScript6面对大于0xFFFF的Unicode字符如何正确返回长度

    一.match() 1.定义 match()方法用于检索字符串内指定(字符串或正则)的值,返回指定值的数组,若找不到,返回null. 2.语法 str.match(searchvalue) str.m ...

  7. What are DESC and ASC Keywords?

    What are DESC and ASC Keywords? ASC is the short form for ascending DESC is the short form for desce ...

  8. MySQL 5.6 死锁演示 及 日志分析

    1.  表结构 CREATE TABLE dead_update ( a ) ', PRIMARY KEY (a) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; ), ...

  9. (2)sql server 跨网段复制

    转自:http://www.cnblogs.com/gaizai/p/3328511.html 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) ...

  10. IIS 6.0上部署.NET 4.0网站

    最近需要把VS2010开发的网站部署到Windows Server 2003的服务器上去, Windows Server 2003操作系统自带的为IIS 6.0,IIS 6.0一般只支持.NET 2. ...