线程的概念、组成和状态

1,293 阅读3分钟

线程的概念

线程其实很好理解,是进程里面干活的小弟。一个进程是计算机cpu的一次调度执行,但是现在的系统基本上都是面向线程设计的,也就是这句话应该说成,线程是计算机cpu的一次调度执行,是cpu的最小执行单位。那么进程就摇身一变成了资源分配的基本单位。线程就可以理解为是进程一样的东西,因为都是一个cpu的一次执行片段,只不过包含在进程里,正是因为包含在进程里,所以线程和进程还是不同的。

线程.png

如果你是程序猿,你肯定写过循环嵌套,如果进程是第一层循环,那么线程就是第二层循环(这么说好像也挺抽象的),总之想表达的意思就是,原来放到第一个循环里干的活,现在放到第二个循环里干来了,为什么呢?

为什么要有线程

我不想引用那些比较严肃的话术,什么是比较严肃的话术,比如教课上的那些话术,总给人一种威严感,正襟危坐。

大家都聊过qq,用过微信。你想一下,qq有那么多功能,可以聊天,可以发说说,可以同时干很多事情。在进程的文章里,我们也讲过cpu的工作方式,cpu以一个很快的速度在轮询服务各个进程。启动qq就是打开了一个进程,而我们现在需要让这个进程干那么多事,来满足我们不断膨胀的欲望。进程还不得累死。招募小弟,减轻自己的工作,是狠自然的事。所以就有了线程,同时服务于用户大爷,这样你不爽才怪。就是这么朴素的道理。这就是设计线程的原因。

线程的组成

之前我们讲过进程的组成,一个进程包含指令段,数据段,和PCB控制块。刚才我们也说了,线程是进程的小弟,吃的穿的都是进程给的。所以在线程里就不存在什么指令段和数据段了,直接用的都是进程的,那线程就剩下一个控制块(TCB)和id了。名字还是要有的嘛。

线程的状态

进程和线程,一字之差,又是“雇佣关系”,在状态方面,简直就是直接复用的进程那一套。分为运行态,就绪态,和阻塞态。其实线程的状态粒度分得更细,毕竟是底层干活的,分的细点好干活,除了三大状态之外,还有什么初始态和终止态,另外这个阻塞态其实具体来说,还细分成,真正的阻塞(因为缺少资源或者等待某个事件的结束),睡眠状态(程序调用sleep方法主动让线程停止工作一段时间,时间一到继续工作),挂起状态(程序主动让线程停止工作,什么时候继续工作,等候程序的指令)

最后来一张图,表述的是线程间各状态的切换,图片本身已经讲得很明确了,这里也不需要多说什么。

线程状态.jpg

其中,等待目标结束就是上文讲的真正的阻塞态,等待超时就是上文的睡眠状态,等待通知就是上文的挂起状态。

不要再往下看了,没有了。