进程和线程
下面都是一些个人理解,有错欢迎指出
线程和进程的区别
一句话解释就是:线程是cpu调度和执行的基本单位。而进程是系统资源分配的基本单位。
个人理解的话, 二者虽然属于不同情况下的定义问题,其实也存在着联系。一个进程具有一个或者多个线程。我们考虑最特殊的情况,一个进程只存在一个线程的时候,那么二者在运行表现上几乎没啥差别。
为啥这么分呢?我觉得主要是cpu太快了,快到等你操作系统分配资源这个时间都是一种浪费。 所以就提出了将cpu的执行分出时间片。操作系统将各个进程所需的资源分配好,然后等着获得cpu时间片来执行。
对于cpu而言,我关注的是线程。如果我只有一个核心,就通过线程的并发执行运算。我有很多核心, 我就将不同的线程放入不同的核心运算就行了,也就是并行执行。也就是说我们调度的是线程。
对于操作系统而言,最常见的方式是,为进程分配资源然后进程获取cpu时间片运行。那么这个时候就出现两种情况了,就是系统支持的是用户级线程调度和内核级线程调度了。
-
对于前者,cpu是感知不到用户线程的。用户级线程调度由操作系统进行,也就是不同线程之间的切换非常快,不会涉及内存映射等资源的调整。
-
但是如果是内核级线程,内核选取特定的线程进行运算,而不感知该线程对应的进程。就有可能是切换到不同进程的线程而导致进程的切换,也就是内存映射等资源的调整。
也就是说前者其实是操作系统将同属于同一进程的线程交给cpu选,反正你怎么选该线程对应的资源都是同一份(同一进程下的线程共享资源)。 而后者则是cpu在所有内核线程中选择,然后再获取相对应的资源。由于cpu不关注进程。就有可能获取不同进程下的线程而导致进程切换。从始至终cpu调度的永远是线程。获得时间片的对于操作系统而言是进程,但是对于cpu而言还是得具体到某个线程。
简单这么理解应该没啥大问题,理论上这样并不代表实际就这样。比如你可以设计: 内核能够获取线程所属进程的信息等
并发和并行
并发就是两件事交替进行,并行就是两件事同时进行。其实这里还有一个概念叫做串行,也就是两件事第一件完成后继续完成第二件。其实并发是一种介于并行和串行的抽象概念,加入你从整个A、B事件看。并发和并行的结果没啥区别。都是两个时间同时完成,因为二者在不断切换。但是如果你将事件分割粒度再细一点,其实它和串行一样,因为确实实际上每个时刻都只能执行一个事件。
关于 多核cpu中的线程和进程的一点思考:
首先,多核cpu中的线程可能是并行执行的,刚才说了,cpu的调度单位是线程嘛。就可以将不同的线程分配给不同的核心去运算。这个是正儿八经的的并行运算。但是对于多进程而言就不一定了。我觉得需要看是否支持每个进程对应不同的MMU(CPU上增加了MMU模块负责转换虚拟地址和物理地址,虚拟地址经过操作系统和MMU之后,虚拟地址会映射到不同的物理地址,不同的进程就能获得各自独立的物理内存空间。) 等一系列资源。如果不支持的话,我个人觉得还是不能做到 多进程的并行执行。因为进程需要通过MMU获取自己的物理地址,也就是对于不同进程而言,MMU的运算应该不一样。你这个不能同时运行,所以即使cpu支持多线程并行,这些线程也只能同属于同一个线程。