为什么引入多线程?
首先进程已经能很好的完成多任务这个情景下的并发编程了,那为什么又引入多线程呢?
这是因为在一些情景下,我么需要大量的创建和销毁进程来完成一些任务,此时多进程对系统的开销就会很大了.
假设有这样一个场景,服务器同时接收到很多个服务请求,这个时候服务器就会创建多个进程来处理这些请求,处理完成之后就要摧毁这个请求,这个时候就需要大量的创建和销毁对应的进程了,这样对服务器的cpu,硬盘,内存,带宽都会造成很多的占用.这个时候多进程表现的就不尽人意了.
这个时候我们就引入了多线程,你可以理解线程为一种轻量级的进程,线程在能完成以上情景之外,减小了创建的开销,保持了独立调度的特性,这样在支持并发的同时,减去了创建和销毁的开销!
注:线程是系统调度的基本单位,进程是系统分配资源的基本单位.
那么,线程是怎么做到这一点的呢?
线程的创建开销
线程和进程的描述一样是使用一个pcb来描述的,一个进程其实有多个pcb,这就是一个线程组,这里的线程在内存指针和文件操作符表等上是共用一个空间的,只有在其他的pid等是不同的,由于文件指针相同,所以只有在第一个线程的创建的时候是需要内存开销的,其他的时候都开销非常小,你可以理解为只有创建第一个线程的时候从系统分配资源,后续都直接使用之前分配好的资源即可.也不是随便两个线程都是"共享空间的",只有线程组内的线程才共享一个空间,而这个线程组可以理解为是进程的一部分.
进程和线程的区别
这是一个经典的问题,我们来讨论一下
1.每个进程有自己的资源,进程之间相互不影响,而线程之间有一些资源是共享的,比如文件描述符表和内存指针等.进程是cpu分配资源的基本单位,线程是cpu调度的基本单位.
2.进程之间相互独立运行,线程之间可能相互影响,可能一个线的崩溃导致一系列线程的异常终止
3.同一个进程中的线程可能相互干扰导致线程安全问题.
4.线程不是越多越好的,当线程超过十个之后对性能的提升就不明显了,调度开销可能就会越发明显