首先 我们会用一个例子来介绍什么是线程 为什么要引入线程机制呢
在引入线程机制之后 比起传统的进程机制来说 带来了哪些变化
之后我们会介绍线程有哪些重要的属性 首先来看一下什么是线程 为什么要引入线程呢
在很久很久以前 在没有引入进程之前 系统之间的各个程序是只能创新执行的
所以在那个时候 我比如说像我 我们想一边运行音乐播放程序一边运行qq这个程序 那么显然是不可以实现的
在那个时候 我们不可能边聊qq然后边听音乐 但之后引入了进程的机制之后就可以实现
qq边聊qq边听音乐这样的事情 但是大家再来深入的思考一下
qq可以做一些什么事情呢 我们可以用qq进行视频聊天 同时还可以和其他的人进行文字聊天
然后在同时还在传送文件 那么这些事情是怎么在进程当中完成的呢
很显然 在传统的进程定义当中进程 它是程序的一次执行
但是这些功能 视频聊天 文字聊天 传送文件 这些功能显然是不可能由一个程序顺序执行来处理的
如果只能顺序的来处理 那么就不可能在我们用户看来 这几件事情是可以同时发生的 就不可能有这样的现象
所以有的进程其实他是需要同时处理很多事情的 就像刚才咱们说的qq那样
但是 传统的进程 它只能串行的执行一系列的程序代码就是这样子
在传统的进程机制当中 cpu会轮流的为各个进程进行服务 那么这些进程就可以并发的实行
并且每一个进程会有他自己相应的一系列程序代码 然后被cpu服务的时候 这些代码就可以一句一句开始往下执行
所以 在传统的进程机制当中 进程是执行流的最小单位 这句话什么意思呢 听了后面的
这个讲解大家应该就可以理解 之后为了满足像咱刚才咱们说的一个进程当中 同时就宏观上同时做很多事情
人们又引入了线程机制 用来增加系统的并发度 引入了线程之后
系统的cpu的这个调度服务对象就不再是进程 而是进程当中的线程
每一个进程当中可能会包含多个线程 然后cpu会轮流的为用一定的算法
轮流的为这些线程进行服务 就像这样子为哥哥线程服务 那么这样的话 同一个进程当中被分为了多个线程
像刚才咱们说的qq视频聊天和传送文件这这两件事情 如果想要并发的执行的话 那么我们就可以把这两件事情对应的处理程序放到两个
不同的线程下 那么这两个线程可以并发的执行 自然 这两件事就可以并发的完成
所以 在引入了线程机制之后 线程就成了程序执行流的最小单位
在没有引入线程之前 一个进程其实就对应一份代码 这些代码只能顺序的一次往下执行 但是在引入了线程之后
每每一个进程可以有多个线程 并且这些线程它可以有各自不同的代码 也可以是每个进 也可以是不同的进线程 运行的是同一份代码 但是这些代码都会并发的被cpu处理 然后并发的一次执行下去 所以 这就
是啊 所谓程序执行留的最小单位的意思 所谓的线程 其实我们可以把它理解为是一种轻量级的进程 以前cpu调度的单位是进程 但是现在cpu的服务对象不是进程 而是以线程为单位 所以线程 它是基本的cpu
执行单元也是程序执行流的最小单位 这个经过刚才的讲解 相信大家已经可以理解
在引入了线程之后 进程之间可以并发的执行 并且进程之间的各个线程也可以并发的执行 所以引入线程机制进一步的提高了系统的并发度
可以使得一个进程内也可以并发的处理各种各样的任务 就像刚才咱们聊到的qq聊天啊什么传文件这样这些事情
然后在引入线程之后 进程不再是cpu调度的基本单位进程 他只作为除了cpu之外的系统资源的分配单元 什么意思呢
假如系统当中 假如说这个计算机系统当中有各种各样的系统资源 那么这些资源是被分配给进程的
而不是分配给线程 就像这样子 那么在引入了线程机制之后 比起传统的进程机制来说 有了哪些变化呢
首先 我们来看一下资源分配和处理机调度方向 这个刚才已经讲过传统的进程机制当中进程 它既是资源分配的基本单位 也是处理机调度的基本单位 但是在引入线程之后 进程
他只是资源分配的基本单位 而线程变成了调度的基本单位 这是区别
在并发性角度来讲 传统的进程机制中竟只能是进程之间并发的执行 但是在引入线程之后 各个线程间也可以并发执行 所以进一步提升了系统的并发度
在实现并发带来的系统开销方面 传统的进程间并发
需要切换进程的运行环境 切换进程的运行环境其实系统开销是比较大的
但是引入了线程机制之后 如果我们是切换同一个进程内的不同线程
那么 我们不需要切换进程的运行环境 这样的话 并发所带来的系统开销就会进一步的降低
怎么理解切换进程的运行环境所带来的系统开销呢 我们来用一个
去图书馆看书的例子 来来理解 假如说你在使用图书馆当中的某一张桌子
但是突然有一个人不 你不认识的人也要用这个桌子 那么你需要把你的运行环境 你的书给收走
然后他要把自己的运行环境 把他自己的书放到桌子上 所以这就是
进程切换所带来的运行环境的切换 这个切换过程其实需要付出一定代价的
你需要把书搬走 他需要把书放放上去 但是如果说啊 这个时候是你的舍友想要用这张书桌的话
那么 既然你们认识就相当于你们俩是属于同一个进程的 这种情况下就可以
不把你自己的桌子 不把你自己的书收走 把这个书依然放在桌子上
这就类似于统一进程内的线程的切换 统一进程内的线程切换不需要切换进程的运行环境
所以 由于你们不需要把书挪来挪去 因此这个开销也会降低很多
接下来我们再来看一下线程有哪些属性
线程是处理机调度的单位
这个刚才已经强调过很多次了 然后多个cpu计算 多cpu的计算机当中就是多和cpu的计算机当中每个线程 它可以占用不同的cpu
比如说现在的cpu一般都是什么双核四核八核的 那各个线程可以分配到不同的核心里去
另外呢 每个线程它其实像会有一个线程id和线程控制块
tcb这样的数据结构线程控制块 其实有点类似于我们之前学过的pcb
进程控制块 线程控制块 也是用于管理线程所创建的一个数据结构
那么 和进程类似 线程它也会有 就绪 阻塞运行这样的三种基本状态
因为引入线程机制之后 线程 它只是处理机调度的基本单位
而系统资源分配是分配给进程的 所以线程几乎不拥有系统资源 系统资源都是在进程那里
那么线程肯定也需要使用一系列的系统资源 这些系统资源从哪里来呢 其实 同一个进程当中的不同线程
他们是可以共享使用这个进程所拥有的系统资源的 这些系统资源包括像什么l设备 还有内存地址空间这样的资源
由于同一个进程当中的不同线程 他们可以共享内存地址空间 所以
同一个进程中的线程 他们之间的通信就可以不需要操作系统干预 可以直接通过共享的内存地址空间就可以完成他们之间的信息传递
另外呢 我们还需要注意 同一个进程中的线程切换其实并不会引起进程切换
但是 不同的进程中的线程切换会引起进程切换 如果我们切换的是同进程内的线程
那么 由于不需要切换进程的运行环境 所以系统开销是比较小的 如果我们切换的是
不同进程间的线程 那么它会导致进程的切换 相应的也需要切换进程的运行环境 所以系统开销就比较大 这个就是刚才咱们讲到的图书馆那个例子
好的 那么这就是线程的相应的一系列属性
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习