2017-08-03 23:44:36 +0000   |     operating system thread   |   Viewed times   |    

什么是线程?

线程就像一个进程中分离的进程,但 这些线程共享所属进程的地址空间

所以 进程线程 的根本区别就是,

进程拥有自己独立的地址空间。但一个进程内的所有线程是共享这个进程的地址空间的。

另外一句话非常好,

进程用于把资源集中到一起,而线程则是在CPU上被调度执行的实体。

线程是必须的吗?

答案肯定是必须的。考虑一个场景,

一个单线程的文字处理软件,任何修改发生,系统重新排版的时间内将无法对键盘和鼠标事件进行相应。或者在定时自动磁盘备份时,也无法响应用户的任何操作。

这时候,一个多线程的文字处理软件,就显得灵活地多。第一个线程只是和用户交互,第二个线程在得到通知时进行文档的重新格式化,第三个线程周期性将RAM内容写到磁盘上。

但是这里,多线程并不是唯一的解决方案。单线程的条件下,同样可以同时处理多个请求。比如接到1号请求,处理了一半,接到2号请求,先记下1号请求的处理信息,然后先处理2号请求。一段时间后1号请求的某个回答信号(多数以信号或中断的形式)到了,这时候又需要记录下2号请求处理的状态,再回来处理1号请求。

这就非常类似系统处理进程的方式,涉及到上下文的切换。这类设计叫做 有限状态机(finite-state machine)。但这样的做法实现起来很困难。相当于要给每个事件都模拟一个专属的堆栈。而且在单线程的模型下,这些操作都需要程序员自己完成。

实际上 线程模型 所做的和上面的描述的有限状态机的工作非常相似,这套模型包括线程执行的状态,堆栈,线程间的调度,通信,资源共享等等问题。相当于操作系统给出 线程模型 这个抽象之后,程序员就不需要面对有限状态机的很多处理细节。只需要了解线程模型的一套公共API,专注于程序流程就行了。