Linux内核入门(十二)—— 新朋友:多线程

时间:2024-10-23 09:19:04

Linux内核入门(十二)—— 新朋友:多线程

  • 前言
  • 进程与线程
  • 关于线程的术语

前言

停更了一段时间,是去海康实习去了,最近要准备秋招,继续学习内核有关的知识。
前几篇我们看了进程间的通信,御三家:共享内存、消息队列、信号量。差信号量没写,为啥不写,因为这次要说的线程里也有信号量,我们先看看这个信号量,再回头去看进程里的信号量。

进程与线程

几乎所有的嵌入式笔试和面试题都会问到:进程和线程有什么区别?
学过操作系统的同学可能很快就回答上,然鹅对于博主这样的废废,第一次听到这样的问题着实不知道答案,回去搜,网上给出的答案大概是:
进程是资源分配的基本单位;
线程是CPU调度的基本单位。
死记硬背吧,容易忘,还容易窜词。真要记住,还是得理解!

  • 为什么要用线程?
    前面我们学过用进程创建子进程,还学过进程间通信,按理说,用多进程就能实现同时处理多个任务,现在又来了个线程,这不是多此一举吗?
    其实从20世纪60年代提出进程的概念之后,使得多个程序可以实现并发执行(单CPU中),改善了资源的利用效率,提高了系统的吞吐量。(并发:理解为看着像是好多任务同时进行,下面会讲)
    这时,还没有linux线程这个说法,人们用进程也能生活得很快乐。
    不过渐渐的,人们发现:在进程的推进过程中,系统必须进行一系列的操作,如创建进程、撤销进程、切换进程等。由于进程是一个资源的拥有者,所以在执行这些操作的时候系统要进行资源的分配与回收,现场的保存与恢复等工作。系统为此要付出较大的时间与空间开销。
    进程用着不够快乐!
    前面我们学过,进程间的资源是相互独立的,两个进程间通信麻烦的要死,又是管道,又是消息队列,我进程开多了,消耗的空间也多。那有没有一种,更轻量化的机制,他们之间能共享一些东西,又能同时运行呢?
    就像租房,每个房间都配厨房,淋浴,客厅太浪费,我可以几个房间共享一套,这样不是美滋滋?
    于是线程的概念应运而生:进程只需要负责分配资源,调度和执行的工作由线程来做。Linux下的线程实际上是一个轻量级进程,线程在CPU面前伪装成一个进程,其实线程自己几乎没有系统资源(有的只是一点维持自身存在的资源),资源都是属于进程的,线程与线程间,就像一套公寓里的租客一样,共用进程的资源。

在这里插入图片描述
这张图描绘了,线程是如何在CPU面前伪装成一个进程,骗取CPU来执行它,右边看不懂可以不看,只要知道mm_struct是内存就好。图一的task_struct是正儿八经的进程,有自己独立的虚拟地址空间(mm_struct),而图二是多个线程共用进程的虚拟地址空间,从cpu的角度看,好像有多个进程。

如此这般,我们就很容易理解线程的一些特点了:

  • 创建一个新线程的代价要比创建一个新进程小很多
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
  • 线程占用的资源要比进程少很多
  • 能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作的同时,程序可执行其他的计算任务

关于线程的术语

有:并发、并行、同步、异步

  • 并发与并行
    单核CPU时代,我们可以在登QQ的同时,还能上网冲浪,还能下载学习资料,cpu其实是轮着执行这些任务的,只是轮的很快,看起来任务是同时运行的。这叫做”并发“。
    多核CPU时代,很多的PC都号称”八核十六线程“,有8个CPU,多个任务在多个处理器上运行,实现了真正意义上的同时运行多任务。这叫做”并行“。
  • 同步与异步
    在多线程执行任务时,还是之前租公寓的例子,想象你就是线程,一个租客,另一个线程A君买了一个西瓜,叫上你一起吃。那么这里出现了一个资源:西瓜;两个任务:A君要切西瓜;而你要吃西瓜。你得等A君切好了才能吃西瓜,一个线程必须等待另一个线程完成才能进行,顺序不能乱,这就叫”同步“。
    什么叫异步呢?你要去卫生间洗澡,发现卫生间里A君正在洗澡,那我可以先不洗,我去客厅玩会手机,A君洗澡和我玩手机两个任务互不干涉,这就叫”异步“。

下面还有很多知识点,什么阻塞非阻塞,时间片轮,我们以后慢慢弄。