为什么会出现线程?为什么会出现多线程?之前没有现成的时候是有什么弊端?
计算机系统包括三个方面的大的东西
计算机系统包括三个方面的大的东西:
- cpu。相当于我们人的大脑,人的大脑可以调度我们的身体,控制身体执行具体操作。而cpu相当于计算机的大脑,可以控制计算机系统执行各种操作。现在的计算机系统cpu已经可以是多核的了,就相当于是一个计算机有多个大脑。
- 内存。计算机软件运行的时候会牵涉到一些数据存储和转换,这些数据都是保存在内存中的,没有内存的话,计算机软件就不能够运行。内存只有在软件程序运行的时候才会存在,程序关闭就没有内存了。
- 磁盘。磁盘主要是持久化保存我们计算机系统的数据的,比如你从网站上下载了一本书,就会保存到磁盘上。这样我们下次重新开机的时候才不会消失。
首先需要明白的一件事情是,万物都是一直在发展的,都是在慢慢变好的,那么既然后续发展出了线程这个东西肯定是由于如果不给计算机引入线程的话会有一些问题,那这些问题是什么呢?
- 首先没有线程的话会导致cpu长期处于空闲状态,导致cpu利用率大大降低。比如没有线程的时候,我们的计算机系统处理任务的时候是串行按照顺序执行的,比如先提交给计算机系统的任务会先执行,并且在这个任务执行完毕之前下个任务不会执行。那比如我们现在顺序提交给了计算机系统两个任务,第一个任务是从磁盘中读取一个视频到内存里面;第二个任务是打开记事本;那么此时就会出现一个问题,就是我们的cpu会先去处理第一个读取视频的任务,读取视频的时候会进行i/o磁盘操作,会把磁盘中的视频读取到内存中,但是因为这个视频比较大,所以io操作的时间就会很长,但是问题就是,因为此时我们的计算机系统中没有线程,那么我们的cpu此时虽然是空闲状态,但是它也不能去调度其他的任务,只能被动等待。所以 如果没有线程 这就会让我们的cpu大部分时间都处于空闲等待的状态,大大降低了cpu的利用率。
- 会导致程序的响应速度变慢。比如还是上面的两个顺序任务,第一个任务是把视频从磁盘中加载到内存中,第二个任务是打开记事本。因为我们现在的计算机系统中没有线程,所以所有提交给计算机系统的任务都会顺序执行。所以在我们第一个任务执行完毕之前,第二个任务就不会执行,那么就会出现一种情况就是,我点击了一下打开记事本,但是计算机系统给我响应了好久才打开,因为它的上一个任务把视频加载到内存中还没有执行完。所以这就是计算机系统中没有线程的弊端,它会导致我们的程序的响应变得很慢。
- 会导致计算机系统处理任务的速度变慢。如果计算机系统没有引入线程的话,我们一段时间内只能把一个任务中的磁盘信息加载到内存中,比如我在把磁盘中的视频加载到内存中的时候,是不能加载磁盘中的其他东西到内存中的。但是如果有多个线程的话,cpu调度一个线程任务的时候比如说是把视频从磁盘中加载到内存中,然后这个流程就开始就行,但是cpu此时是处于空闲状态的,它可以继续去调度另外一个线程里面的任务,让他从磁盘中比如加载一本书到内存中。那么视频和书就可以同时加载到内存中了。我们计算机处理任务的速度就变快了。
进程和线程和程序三者的关系?
一个进程其实就是一个程序,一个进程里面或者说一个程序里面存在多个线程。
一个进程里面的多个线程共用进程里面的内存资源,所以多线程可能会出现共享资源问题。
线程是cpu调度的最小单位,我是这样理解的,cpu先去调度一个进程,然后给进程一个执行命令,这个时候进程再去调度里面的某个线程,用过这个线程去执行计算机里面的某个任务。
说完了计算机系统中没有线程的弊端之后,我们也就容易理解计算机系统中为什么会引入线程了,就是弊端的相反面嘛!
- 减少cpu空闲时间,提高cpu利用率。比如我们cpu会先调度一个线程执行“把磁盘中的视频加载到内存”的任务,在这个任务进行io操作的时候,cpu不会再空闲等待了,而是继续去调度另外一个线程,执行打开记事本的任务。这样通过给计算机系统引入了多个线程 就能够大大减少cpu空闲时间,提高cpu利用率。
- 提高程序的响应速度。如果没有引入线程,那么打开记事本的任务只能在第一个任务执行完毕再执行,那假如我们进行io磁盘交互的时间很长,就会出现一个问题,就是我打开记事本之后,过了很久才响应,过了很久才打开。
- 提高计算机处理任务的速度。比如有两个任务,一个是“把磁盘中视频加载到内存中”,另外一个是“把磁盘中的音乐加载到内存中”,那么引入线程之后我们的加载音乐就不必再加载视频完毕之后执行了,我们二者可以在同一个时间段内执行,这就可以大大的提高计算机处理任务的速度。