线程是什么?线程的作用是什么

作为程序员,线程和进程是最基本的概念,但是相信很多小伙伴对这两个概念以及他们的工作原理还是一头雾水,今天就通过本文让你彻底搞清楚他们的区别以及工作原理。

线程是什么?线程的作用是什么

什么是进程

进程是操作系统级别的运行单位,我们执行的每一个可执行文件,在操作系统看来,就是一个独立的进程。进程与进程之间是彼此隔离的,也就是我们常说的沙盒原理。进程之间不会共享内存。以大家相对熟悉的Windows操作系统而言,我们打开一个Word文档编辑软件,就是开启了一个进程。从编码的角度理解,进程就是包含了我们程序员开发的一套完整的,可独立运行的代码指令集合。指令集合包含了我们程序运行需要的内存结构,运行顺序等所有信息。

什么是线程

线程是寄生在进程内的单位。一个进程至少包含一个线程,我们称这个线程为主线程。主线程可以创建多个子线程,线程与线程之间并不是彼此隔离的,线程间可以共享进程内的内存。

如何通过生活中的例子描述进程和线程的工作原理

计算机科学本身是人类发明的,那么它必然也受到人类对客观世界认知的限制。所以几乎所有计算机理念都可以从我们现实世界中找到原型,只不过为了区别于其他学科,定义了很多新的名词去针对性的形容计算机科学的相关概念。我们今天就以进程和线程为例,讲解一下他们的含义以及原理。

我们以一个班级的学生进行大扫除为例,每个班级可以理解为是一个进程,各个进程之间彼此隔离,只清扫自己班级负责的区域。每个班级中假如有30个人,我们可以分成3个小组,第一小组负责擦窗户,第二小组负责搬桌椅,第三小组负责清洁地面。这三个小组就相当于三个线程,他们可以各司其职,去开展自己的工作。其中第一组的擦窗户任务和其他两组地面情节先关的任务没有任何依赖关系,也就是说第一组的工作不依赖其他小组,其他小组的工作开展也不依赖第一小组,擦窗户的任务和其他两个小组的任务可以同时开展,我们称这种形式的线程工作,叫做异步线程,因为他们可以同时进行,彼此无依赖。第二小组和第三小组的任务有依赖关系,需要第二小组先将桌椅搬动移开后,第三小组才能开展清洁地面的工作,这种情形我们叫做同步线程。需要一个线程任务完成后,才能开展另一个线程。这里就要涉及到一个线程同步的机制。常用的线程同步机制包括信号量,互斥锁,边界量等。他们的目的都是一样的,就是保证两个线程之间的工作顺序。

信号量

信号量,就是连个线程共享一个消息变量。例如上例中,第二小组开始搬桌椅的时候,第三小组只能处于等待,无事可做。那究竟什么时候才开始清洁地面的工作呢?这时候我们可以选定一名学生作为通告员,当第二小组完成桌椅搬动工作后,这名通告员去通知第三小组可以开始清洁地面的工作了,这时候第三小组才开始清洁工作。这名通告员的角色就是一个信号量的角色。第三小组收到通告员的信号后,开始地面清洁工作,这时候轮到第二小组处于等待状态,也就是我们说的线程阻塞状态,当第三小组清洁完地面后,再去让通告员通知第二小组可以将桌椅恢复原位了,这时第三小组继续处于等待阻塞状态,第二小组收到通告员的信号后,从阻塞状态转换为工作状态,开始桌椅的复位工作。这就是通过信号量来实现线程同步的基本原理。

互斥锁

互斥锁的原理也类似,目的依然是保证同一时间,只有一个工作线程在工作,直到这个线程完成任务并让权后,其他线程才能开展工作。例如上例中,第二小组没有选择通告员的模式,而是将第三小组赶出教室,并将教室门锁上,这时候,第三小组根本无法进入教室工作,直到第二小组完成桌椅搬动后,打开教室门,让第三小组进入,这时第三小组也会将第二小组赶出教室,并锁上教室门,保证这个教室在当下只有第三小组在清洁地面工作,不让第二小组进来将地面搞脏。当然有人会问那么第一小组呢?正如我们前文讲述的,第一小组和二三小组的工作没有任何依赖关系,所以无论是采用信号量模式还是互斥锁模式,第一小组都会默默的擦着窗户,对于二三小组的资源争抢活动,既不参与也不受影响。

以上就是关于线程和进程的基本原理,当然对于不同的编程语言,都有相应的接口函数可以实现以上的流程。在清楚他们的工作原理之后,使用起来就相对简单很多了。

职业发展

无监督学习的应用场景有哪些?如何提高无监督学习的效果?

2024-2-25 17:56:05

职业发展

redis命令如何使用?快速学习redis命令

2024-2-25 18:28:52

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索