内核版本:linux-2.6.11


在Linux中,有多种执行体(指令流、执行单位),它们是CPU调度和分配资源的基本单位,它们是内核态可见的,即内核态下,每一种执行体都有对应的唯一数据结构task_struct来存储它的执行上下文。

它们分别是进程、轻量级进程、内核线程,创建一个执行体的方法是基于调用clone()函数并指定flags参数来完成。
通过指定不同的flags参数,可以规定新建的执行体的共享资源量、执行状态等,也正是于此来区分不同的执行体并控制不同执行体的运行开销、切换开销。

  • task_struct

    在task_struct里使用一个thread_struct结构存储硬件上下文,使用mm_struct存储内存区,使用files_struct存储文件描述符,使用signal_struct存储信号。
    因此在Linux里,task_struct是一个CPU调度的基本单位也是分配资源的基本单位。

    进程、轻量级进程、内核线程都是通过一个叫clone的函数创建,任何一个新的进程、轻量级进程或内核线程都拥有自己的task_struct。

在现在的Linux里,用户态线程跟内核线程是一对一的,也就是说,每个使用pthread库产生的线程都是对应了一个task_struct的。
现如今些新兴的语言对M:N这种多线程模型提供了语言级的支持(如golang的goroutine),它对用户透明了内核线程的产生和销毁,用户可以肆无忌惮的使用用户级多线程,因为在用户态的切换开销仅仅是一个跳转指令。

  • 进程

    正常进程与父进程完全独立,但由于写时复制技术,仅在两个进程中的任何一个对独立区进行修改时,才进行独立资源的复制,
    即延迟且竟可能避免了额外的复制开销(可以避免是因为如果新建子进程一开始就直接执行exec那么之前对独立区的复制将做无用功)。

  • 轻量级进程和内核线程

    之所以把轻量级进程和内核线程放在一起是因为内核线程本质上就是一个轻量级进程。
    轻量级父子进程共享一些指定的资源,如地址空间、文件描述符等,根据需要通过设置不同的flags参数来规定。

    内核线程与普通轻量级进程的区别在于,内核线程只运行在内核态,任何一个内核线程的寻址范围都只会在3G~4G(线性地址)之间,它是专门为内核服务的,它存在的目的就是在对内核代码绝对信任的前提下,竟可能减少开销。


个人理解,错误难免,望能指出,万分感谢

Linux内核笔记——进程管理之执行体的更多相关文章

  1. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

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

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

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

    五.调度器的实现 调度器的任务是在程序之间共享CPU时间,创造并行执行的错觉.该任务可分为调度策略和上下文切换两个不同部分. 1.概观 暂时不考虑实时进程,只考虑CFS调度器.经典的调度器对系统中的进 ...

  4. Linux内核之 进程管理

    正如上一篇我们提到过,进程是Linux系统中仅次于文件的基本抽象概念.正在运行的进程不仅仅是二进制代码,而是数据.资源.状态和虚拟的计算机组成.我们今天主要介绍进程的概念,组成,运行状态和生命周期等. ...

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

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

  6. Linux内核笔记——内存管理之slab分配器

    内核版本:linux-2.6.11 内存区和内存对象 伙伴系统是linux用于满足对不同大小块内存分配和释放请求的解决方案,它为slab分配器提供页框分配请求的实现. 如果我们需要请求具有连续物理地址 ...

  7. Linux内核笔记——内存管理之块内存分配

    内核版本:linux-2.6.11 伙伴系统 伙伴系统是linux用于满足对不同大小块物理内存分配和释放请求的解决方案. 内存管理区 linux将物理内存分成三个内存管理区,分别为ZONE_DMA Z ...

  8. 【转载】linux内核笔记之进程地址空间

    原文:linux内核笔记之进程地址空间 进程的地址空间由允许进程使用的全部线性地址组成,在32位系统中为0~3GB,每个进程看到的线性地址集合是不同的. 内核通过线性区的资源(数据结构)来表示线性地址 ...

  9. 24小时学通Linux内核之内存管理方式

    昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...

随机推荐

  1. c# socket 编程

    转   http://www.cnblogs.com/cailangwei/archive/2011/11/21/2258191.html 基于Socket服务器端实现本例主要是建立多客户端与服务器之 ...

  2. linux 下C++查询mysql数据库

    上一节我们看了怎么使用mysql提供的API来连接mysql数据库,现在来看看怎么执行一条简单的查询语句,并且把查询的结果显示出来. 准备工作:首先新建了一个数据库inote,在这个数据库下面新建了一 ...

  3. 【Network】修改docker启动默认网桥docker0为自定义网桥

    自定义网桥 除了默认的 docker0 网桥,用户也可以指定网桥来连接各个容器. 在启动 Docker 服务的时候,使用 -b BRIDGE或--bridge=BRIDGE 来指定使用的网桥. 如果服 ...

  4. VS2013 密钥 – 所有版本

    Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥) ...

  5. 从C++实现Ping开始说起

    在C++中实现ping功能,并不难.但真正了解ping是需要花费一番功夫的. Ping功能是在ICMP基础上实现的.IP协议并不是一个可靠的协议,它不保证数据被送达,那么,保证数据送达的工作应该由其他 ...

  6. 如何方便的保存WinForm窗体控件的位置大小等等配置信息

    由于分辨率.屏幕主题.字体大小的不同,窗体显示效果在不同机器上不尽相同.窗体的弹性设计并不能满足多样的需求.为保证在各种情况下,能有满意的效果.窗体的多样显示方式能改变,并且保存.载入配置,显得很重要 ...

  7. cocos2d-x宏定义

    1 ccp : The "ccp" prefix means: "CoCos2d Point" //查看: ../cocos2d-x-2.2/cocos2dx/ ...

  8. Uiautomator--Uiselector元素定位

    一.UiSelector作用 按照一定的条件(例如控件的text值,资源id),定位界面上的元素.UiSelector对象的最终目的是去构造一个UiObject对象. 二.元素定位 1.根据text定 ...

  9. c/c++ 缓冲区的刷新

    利用string 对象查看缓冲区的变化,因为每个string对象在输入时会以空格作为分界. #include<iostream> #include<string> using ...

  10. 如何封装JS ----》JS设计模式《------ 封装与信息隐藏

    1. 封装与 信息隐藏之间的关系 实质是同一个概念的两种表达,信息隐藏式目的,二封装是借以达到目的的技术方法.封装是对象内部的数据表现形式和实现细节,要想访问封装过额对象中的数据,只有使用自己定义的操 ...