Linux_线程概念

进程回顾

在学习线程之前,我们先回顾一下之前讲的进程概念

当我们创建一个进程,操作系统会将磁盘中的代码load到内存中,然后创建当前进程的task_struct(后面可能会用”PCB“或者”进程控制块“代替),创建mm_struct维护当前进程的虚拟地址空间,再通过页表映射到物理内存

当我们fork创建一个子进程,为了保证进程的独立性,就要构造新的进程控制块(task_struct),维护新的mm_struct,产生新的页表

虽然父子进程的代码是共享的,但是可以通过 if(pid > 0) / else 这样的分支结构,让父子进程分别执行不同的代码块,有各自的执行流,同时通过写时拷贝也让它们有自己独立的数据区、堆区、栈区。

线程的理解

当新建一个进程,除了创建新的PCB,还要为每个进程独立分配 mm_struct 和页表,这无疑会消耗大量的空间、时间;

现在,我们新建一个”进程“的时候,只为其创建一个新的PCB,但和原来的进程共享同一个mm_struct、同一个页表;

先前我们通过if/else的分支结构拆分代码块,现在我们通过构建函数体的方法,划分代码块,让新的“进程”执行函数体中的那部分代码,同时也为其分配自己的的栈区,从而让它们有各自的执行流

我们就称这种:

  • 在父进程的地址空间内部运行执行流
  • 比进程粒度更低,调度成本更低

的“进程”为线程

这种进程中创建出的一个个线程块我们成为TCB

但是在Linux中并没有为TCB创建独立的结构体,而是复用了task_struct这样的结构体,从CPU的角度看,PCB和TCB是同一个东西

而在Windows这样的真线程操作系统中,专门为线程设计的独立的结构体

重新理解进程

进程概念一文中我们定义过进程的概念:

进程 = 内核数据结构 + 进程对应的代码数数据

现在,我们从内核的视角重新看待进程:

进程 = 承担分配系统资源的基本实体

如下图,包含了task_structmm_struct、页表、维护的地址映射关系……的整个结构才是进程

它是向系统申请资源的基本单位

而线程成为了调度的基本单位

  • 之前我们提到的内部只有一个执行流的进程是单执行流进程

  • 现在有了线程的概念,我们知道进程内部可以有多个执行流,这样的进程成为多执行流进程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值