03-解析多线程与多进程的联系以及上下文切换所导致资源浪费问题

什么是进程?简单来讲就是运行中的程序,那么,何为运行中的程序呢?我们如何来看看进程呢?操作系统都是多进程的。我们通过任务管理器就可以看到操作系统中当前运行的很多的进程

我们写过的任何的一个程序,我们写一个程序,那么,这个程序运行起来,它就称之为进程。

进程和线程之间又有什么关系呢?这里简单给大家提几点,进程是资源分配的基本单位。如果大家对进程比较感兴趣的话,你可以去了解一下咱大学中所学的《操作系统原理》这本书,这本书里面就详细的讲解了进程。 进程和线程之间到底有什么关联呢?首先,进程是资源分配的基本单位。第二个,进程中包含多个线程,线程共享进程的资源。我们可以这么理解,就是说,进程是操作系统级别的,一个操作系统运行了多个进程,每一个进程里面有包含着多个线程,我们可以通过下图这个地方来看

这里面有一个CPU的统计信息,此处有一个进程数是137,就是,运行了137个进程,线程有1720个,显然线程的数量远远大于进程的数量,也就是说,一个进程里面会有多个线程。我们的eclipse软件就是一个进程,我们看一个进程中到底包含了多少个线程呢?我们之前也通过jconsole监控工具

也就是说,这一个进程中,目前所包含的线程数量使29个。

线程是共享进程的资源,这句话,就是说,进程是操作系统级别的,那么,线程就是进程级别的,你可以这样理解,操作系统里面包含多个进程,而一个进程里面有包含多个线程。第三个,线程是处理器调度的基本单位。为什么处理器调度的基本单位是线程而不是进程?我们说,进程是资源分配的基本单位,在进行进程之间的切换的过程中,它会浪费更多的资源,然而,线程可以说是轻量级的进程,所以,CPU的调度的基本单位是线程。

这就是线程和进程之间的联系与区别

 

多线程执行一定会快吗?我们大家可能都知道在很多的下载的网站上,都会提多线程下载,那么,我们也同样的发现,使用多线程下载远比单线程下载要快的多,这样,可能大家都会认为多线程一定比单线程快,其实并不一定,我们来举个例子,还是拿之前烤烧饼的例子来说,

下面只有一个炉火,上面在不停的转,这样烤一定会快吗?咱大家想一下,我们现在是多个线程在执行,如果我们不这样做,我们不让它转,

就让它烤这一个,等它烤熟了之后,我们再拿另外一个,再放进来烤,然后依次类推,那么,我们想一下,是之前的全部放上去让炉子转起来烤,烤的快呢?还是我一个一个放上去烤,烤的快呢?其实是非常明显的,如果选在转的话,在转的过程中,每个烧饼(线程)切换的过程中是有空隙的

那么,火就浪费了,这是第一个,第二个,在加热的工程中,能量都集中在在一个块上

如果你在转,那么,热量是分散在整个炉子上面的

这样也会损失热量,总之就是说,线程任务之间在进行切换,也就是说,烧饼在进行切换的过程中,它是要浪费我们的资源的,也就是要浪费我们的能量的,因此,其实是远远不如一个一个的执行反而更快一些,那么,有没有实际的例子来说明呢,烤烧饼是我们生活中的一个例子,我们来举一个变成界的例子,我们知道垃圾收集,垃圾收集,它有一些垃圾收集算法,比如说,像复制算法、标记清除算法、标记整理算法、分代收集算法等等,它有很多的算法,我们这里要说的就是和垃圾收集器相关的问题,垃圾收集器有非常多,有多线程执行的垃圾收集器,或者说是并行执行的垃圾收集器,而serial垃圾收集器是单线程执行的,一个单线程执行的垃圾收集器,既然有了多线程执行的垃圾收集器,为什么还会有serial单线程垃圾收集器呢?存在的就是合理的,其实并非多线程的就一定快,你让单线程的serial垃圾收集器收集垃圾去了,那么,它没有二心思,就一味的去收集干活,一直等它干完活之后就结束了,而多线程垃圾收集器,它们的事比较多,一边想着干活,一边还得再进行线程之间的切换,那么,对于占用内存比较少的,回收时间本来就比较短的,那么,完全就可以使用单线程的垃圾收集器来进行收集,而它的性能是远比多线程要快的,就是在某些情境下单线程是远比多线程要快的。

这就是关于多线程的性能问题,我们在之前提到过线程的缺点上也说过,在线程之间切换的时候,是非常耗性能的,每一个线程的创建和销毁更是对资源的浪费是非常大的,当然了,如果你这个地方不是一个炉子,而是有多个炉子,那么,此时多个线程就快了,所以,就是说,多线程快还是不快,它不是绝对的。回过头我们再来解释刚才提到的关于迅雷下载,就是说,多线程下载的问题,多线程下载为什么一定能够提高,也并非一定能够提高下载的速度,但是,绝大部分情况下是可以的,为什么呢?因为,我们说,做一个文件服务器的话,允许用户去下载,那么,它肯定不会说你这个链接过来了,我就会毫无保留的一下子把我的带宽全部给你,让你去下载,我肯定是为每一个链接分配一定的带宽,比如说,你这一个连接进来,我就给你这个响应最高200k,不能再多了,那么也就是说,你这一个链接进来,它的峰值下载速度也就是200k,那么,它是一个链接级别的,那么,我可以把要下载的一个文件分成多个,切分成多个,我用多个线程一块去下载,那么,每一个链接200k,假设有三个链接,那么,加起来就是一共有600k的下载速度,那么,等我把切分的每一小块文件都下载完了之后,我在把这些小文件合并起来就可以了,这样,下载的速度就会变的很快,也就是说,多线程下载并不是多线程提高了速度,不是多线程的性能提高了,而是,由于外部服务器对资源的限制,所导致的一个问题,那么,多个链接就突破了这个远程服务器的限制,也就导致了性能的提高。也就是说,虽然看着下载速度快了,并不是多线程的性能提高了,而是由于远程服务器的问题。

猜你喜欢

转载自blog.csdn.net/G_66_hero/article/details/85331812