【Linux 】多线程

什么是线程

  • 在⼀个程序⾥的⼀个执⾏路线就叫做线程(thread)。更准确的定义是:线程是“⼀个进程内部的控制序列”
  • ⼀切进程⾄少都有⼀个执⾏线程

线程和进程

  • 进程是资源竞争的基本单位
  • 线程是程序执⾏的最⼩单位
  • 线程共享进程数据,但也拥有⾃⼰的⼀部分数据: >* 线程ID >* ⼀组寄存器 >* 栈 >* errno >* 信号屏蔽字 >* 调度优先级

⼀进程的多个线程共享

共享:

1.文件描述符表,一个线程打开文件,另一个线程拿着文件描述符就可使用

2.信号的处理方式

3.当前工作目录

4.用户id组id

独有:

标识符    栈    上下文数据    errno    信号屏蔽字    调度优先级

进程和线程的关系如下图:

Linux下没有真正的线程,因为Linux的线程是以进程的pcb模拟的,也叫轻量级进程,因为这时候多个pcb共享同一个虚拟地址空间,所以这时候pcb相较于传统的pcb占用的资源更少,更加轻量化。

以前所说的进程是只有一个线程的进程,进程就变成了至少具有一个线程的线程组。线程组id:tgid = pid(第一个线程)。一个程序运行起来,一开始会创建一个pcb,这个pcb中有一个pid,有一个tgid,并且这个tgid=pid,再往后,如果创建了新的线程(pcb),这些pcb中的tgid都是一样的。外部看到的pid实际上是tgid,而tgid是线程组id,CPU调度进程是以pcb来调度的,然而Linux的pcb是线程,因此线程是CPU调度的基本单位。

线程的优点

  • 创建⼀个新线程的代价要⽐创建⼀个新进程⼩得多
  • 与进程之间的切换相⽐,线程之间的切换需要操作系统做的⼯作要少很多
  • 线程占⽤的资源要⽐进程少很多
  • 能充分利⽤多处理器的可并⾏数量
  • 在等待慢速I/O操作结束的同时,程序可执⾏其他的计算任务
  • 计算密集型应⽤,为了能在多处理器系统上运⾏,将计算分解到多个线程中实现
  • I/O密集型应⽤,为了提⾼性能,将I/O操作重叠。线程

线程的缺点

  • 性能损失

⼀个很少被外部事件阻塞的计算密集型线程往往⽆法与共它线程共享同⼀个处理器。如果计算密集型线程的数量⽐可⽤的处理器多,那么可能会有较⼤的性能损失,这⾥的性能损失指的是增加了额外的同步和调度开销,⽽可⽤的资源不变。

  • 健壮性降低

编写多线程需要更全⾯更深⼊的考虑,在⼀个多线程程序⾥,因时间分配上的细微偏差或者因共享了不该共享的变量⽽造成不良影响的可能性是很⼤的,换句话说线程之间是缺乏保护的。

  • 缺乏访问控制

进程是访问控制的基本粒度,在⼀个线程中调⽤某些OS函数会对整个进程造成影响。

  • 编程难度提⾼

编写与调试⼀个多线程程序⽐单线程程序困难得多
 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值