Linux(十) 线程,线程控制

目录

一、认识线程

1.1 线程是什么

1.2 为啥要有线程

并行与并发

为什么要有线程(线程的优点)

为什么线程的切换成本更低

1.3 线程的缺点

1.4 线程和进程的区别

二、线程控制

2.1 线程创建

进程ID和线程ID

2.2 线程终止

2.3 线程等待

2.4 线程分离

三、注意


一、认识线程

1.1 线程是什么

  1. 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”
  2. 一切进程至少都有一个执行线程
  3. 线程在进程内部运行,本质是在进程地址空间内运行
  4. 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化
  5. 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流

1.2 为啥要有线程

并行与并发

首先先介绍一下并行与并发

  • 并发:指两个或多个事件在同⼀个时间段内发⽣。
  • 并⾏:指两个或多个事件在同⼀时刻发⽣(同时发⽣)。

在操作系统中,安装了多个程序,并发指的是在⼀段时间内宏观上有多个程序同时运⾏,这在单 CPU 系统中,每⼀时刻只能有⼀道程序执⾏,即微观上这些程序是分时的交替运⾏,只不过是给⼈的感觉是同时运 ⾏,那是因为分时交替运⾏的时间是⾮常短的。
⽽在多个 CPU 系统中,则这些可以并发执⾏的程序便可以分配到多个处理器上( CPU ),实现多任务并⾏ 执⾏,即利⽤每个处理器来处理⼀个可以并发执⾏的程序,这样多个程序便可以同时执⾏。⽬前电脑市场 上说的多核 CPU ,便是多核处理器,核 越多,并⾏处理的程序越多,能⼤⼤的提⾼电脑运⾏的效率。

注意:单核处理器的计算机肯定是不能并⾏的处理多个任务的,只能是多个任务在单个 CPU 上并发运 ⾏。同理 , 线程也是⼀样的,从宏观⻆度上理解线程是并⾏运⾏的,但是从微观⻆度上分析却是串⾏ 运⾏的,即⼀个线程⼀个线程的去运⾏,当系统只有⼀个 CPU 时,线程会以某种顺序执⾏多个线程, 我们把这种情况称之为线程调度。

为什么要有线程(线程的优点)

“并发编程” 成为 “刚需”.

  • 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU 资源.

  • 有些任务场景需要 “等待 IO”, 为了让等待 IO 的时间能够去做⼀些其他的工作, 也需要用到并发编程. 

  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现,提高效率
    I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)

  • 创建一个新线程的代价要比创建一个新进程小得多

  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多

  • 线程占用的资源要比进程少很多

  • 能充分利用多处理器的可并行数量

最后, 线程虽然比进程轻量, 但是人们还不满足, 于是又有了 “线程池”(ThreadPool) 和 “协程”(Coroutine)关于线程池我们后面再介绍. 关于协程的话题我们此处暂时不做过多讨论.

为什么线程的切换成本更低

1.地址空间&&页表不需要切换,进程PCB,页表,进程地址空间的地址会保存在CPU寄存器中,切换进程要切换它们,但是其实成本并不高。
2.这条原因成本比较高,是主要原因。一条代码附近的代码有较高概率被使用,所以根据这条局部性原理,会将内存中的代码和数据预读进CPU内部,CPU内部有L1~L3 cache(缓存),对预读的内容进行保存。如果进程切换,cache就立即失效,新进程过来只能重新缓存。

1.3 线程的缺点

  • 性能损失
  • 一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
  • 健壮性降低
  • 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
  • 缺乏访问控制
  • 进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
  • 编程难度提高
  • 编写与调试一个多线程程序比单线程程序困难得多

1.4 线程和进程的区别

进程是资源分配的基本单位,在用户视角里,进程 = 内核的PCB结构 + 该进程对应的代码和数据
在内核视角,承担系统资源分配的基本实体。

线程在进程内部进行,是CPU调度的基本单位。线程在进程的地址空间内运行,CPU其实不关心执行流是进程还是线程,只关心PCB(task_struct)。

进程向操作系统要资源ÿ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值