Written by
daweibayu
on
on
线程的本质
前因
大学毕业五年,从刚毕业写 C++ 就遇到各种和线程相关的问题,时光易逝,转眼从小鲜肉变成了老腊肉,但是发现对操作系统的认知仍然停留在大学的书本上。各种语言使用了也不少,大多还都是有线程模型的。 最近几年也面试了很多人,线程通讯、线程安全基本都是必不可少的。前些日子突然想到一个问题,线程的本质是什么?发现自己并不是很清楚,突然感觉很惭愧,作为一个面试官,竟然对自己问的东西都不是很清晰,感觉也是有些讽刺的,所以准备想写篇文章介绍一下。但是越写越发现这里边需要填的坑越多。这里我们只是把和线程创建主线的东西列清楚,至于其他,以后在说吧。
主体
线程应该是码农们都绕不过去的坎,但是大家可能关注更多的是使用,最常用的说法是:
- 进程是资源分配的最小单位,线程是CPU调度的最小单位
- 进程是操作系统分配资源的最小单位。进程有独立的虚拟空间地址。线程有独立的线程栈,但是共享进程的堆内存。开销小,线程是运行在一个单一进程上下文的逻辑流,或者说是一个进程内部的一个控制序列。
乍听感觉醍醐灌顶,但细究仍是云山雾罩,进程、线程是 单位?感觉好像哪里不对。
进程也好,线程也罢,本质意义上来说,还是操作系统的调度单位,也看成是一种操作系统 “资源”。程序的本质其实是合理的利用物理资源(硬盘、内存、CPU、IO设备等),不管线程也好,进程也罢,那怕最原始的打点式,最终的目的其实都是利用物理资源。软件的本质就是如何更合理的利用物理资源。而线程,本身就是这样一个结构体,然后附带了一些操作,可以更方便的调度这些资源。这是我理解的线程本质。
上边依然“假大空”,既然都是程序猿,代码是最能解释一切的,下边我们还是落实到代码上。我们分别从三个方面来介绍: