进程:程序执行的一个实例,在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. 编写自己的ls命令

    ····要编写ls命令,首先要了解它能做什么,完成了什么工作,是如何完成这些工作的····  一.ls命令能做什么? 我们在命令行输入ls,ls默认找出当前目录中所有文件的文件名,并且按照字典序排序后 ...

  2. [NOIP2018PJ]对称二叉树

    [NOIP2018PJ]对称二叉树 这个题正常人看到题面难道不是哈希? 乱写了个树哈希... #include<bits/stdc++.h> using namespace std; co ...

  3. Python 新手常犯错误

    Python 新手常犯错误(第二部分) 转发自:http://blog.jobbole.com/43826/ 作用域 在这篇文章里,我们来关注作用域在Python被误用的地方.通常,当我们定义了一个全 ...

  4. Python3.6全栈开发实例[013]

    13.用户输入的信息,如果出现了列表中的敏感词汇,请用*替代. li = ["苍老师","东京热","武藤兰","波多野结衣&qu ...

  5. ThreadPoolExecutor 线程池任务队列分析 与 利特尔法则(Little's law)

    一. 演示 public class ThreadPoolTest { static class MyThread implements Runnable { private String name; ...

  6. spring boot 如何将没有注解的类@Autowired

    等于将类交给spring管理,也就是IOC. 注解@Autowired是自动装配,也就是spring帮你创建对象,当然前提是这个@Autowired的类已经配置成Bean了,spring配置bean文 ...

  7. 免费 SSL 安全证书

    为了保证网上传输信息的安全而在自己的 Linode VPS 上部署 SSL 加密服务.商业 CA 较贵,所以使用了自己签发的 CA.网友神爱的留言提到了 StartSSL 的免费 CA,稍做了一些调查 ...

  8. 【转】Python爬虫_示例

    爬虫项目:爬取汽车之家新闻资讯   # requests+Beautifulsoup爬取汽车之家新闻 import requests from bs4 import BeautifulSoup res ...

  9. xml转换为对象 微信接口

    public sealed class XMLSerilizable { /// <summary> /// XML转换为对象 /// </summary> /// <t ...

  10. The Collections Module内建collections集合模块

    https://www.bilibili.com/video/av17396749/?p=12 Python函数式编程中的迭代器,生成器详解 课程内容 1.iterators are objects ...