
从资源管理的角度来看:前面讲到进程需要管理一系列资源,这里进一步明确出来,进程就是用来管理资源的,包含地址空间,打开的文件、访问的网络等等,而把进程的另一部分功能给拆出来了,进程的执行功能,它这个执行状态,这些交给线程来管理。
从运行的角度来看:代码在进程这个资源管理平台上的一条执行的流程,认为是线程。
进程除了完整资源管理之外,还需要一系列线程来完成执行过程,(进程是由资源管理和线程两部分组成)

上图 线程=进程-共享资源的意思就是 线程等于进程所有功能减去资源管理这部分就是线程。
线程,它的有点就是它的缺点,既然它都开共享了,那如果一个线程写错了,它就有可能破坏其他线程所共享的进程资源,因为线程可以访问进程中所有资源,比如它把数据破坏了,其它线程也需要这个数据,其他线程,就可能出现崩溃的现象。它的缺点就是安全可靠性没有保障,一个线程崩溃,其他线程全完蛋,进程也就结束了。
什么时候适合用进程?什么时候适合用线程?
在我们高频计算里面很强调性能,而且它所执行的代码相对统一,不会出现一个代码出现不同的控制流程,强调性能的需要使用线程来完成。
另外一方面,比如浏览器,打开一个网页就可以用线程的方式来实现,打开不同的网页都很快,如果用线程的机制,可能有的网页有恶意代码或者有bug导致这个线程崩溃了,就有可能引起整个进程的崩溃,你可能打开很多网页,这些网页都崩溃。这也是早期浏览器很多采用线程实现,现在的浏览器都采用进程来实现。这个适合进程。


上图,对于单线程而言,只有一个控制流,但是通过对多线程的支持,在进程空间里面会出现多个控制流,而且每个控制流都不一样,而且具有自己独立的寄存器和堆栈,但是可以共享代码段、数据段还有文件资源、网络资源。

进程是资源的分配单位,资源包含了,内存、打开的文件、访问网络等等
同一进程内的线程切换事件比进程短,为什么呢?这个要去了解内存管理相关,因为线程是具有同一个地址空间的,属于同一个进程的线程拥有同一个页表,切换的时候不要切换页表。
而对于进程而言,我们要切换进程的话,需要把页表也切换掉,而这个切换页表的开销是比较大的,因为这里面涉及到它们访问的地址空间不一样,它里面的很多cache信息,很多TLB信息,硬件的信息,都会失效,需要重新加载。那么这个开销比较大。
线程切换的时候,由于共享页表,重用,不用做失效处理,效率会很高。
文章探讨了进程作为资源管理单元,主要负责地址空间、文件和网络等资源,而线程则管理执行状态。线程共享进程资源可能导致安全问题,但能提高性能。适合使用线程的情况包括高频计算和浏览器中打开网页。相反,进程适用于需要隔离错误影响的场景,如现代浏览器的多进程架构。线程切换比进程切换快,因它们共享页表,减少了内存管理的开销。

被折叠的 条评论
为什么被折叠?



