什么是线程:
在刚刚接触Linux时,并没有线程这个概念,而是了解什么是进程,认为pcb是对进程的描述,pcb就是进程,是程序运行的动态描述,通过pcb实现程序运行的调度管理。
在学习线程时,pcb就不再是进程了而是一个轻量级进程,一个进程中可以有多个的pcb,也可以说一个pcb就是一个线程,这样一个进程中就有多个的线程,这样就可以高效处理多任务。
为什么可以高效处理多任务:
上述说的那么多其实没有表达出线程的本质,线程的本质就是进程中的一条执行流,这就可以解释为什么可以高效处理多任务:
进程是一个运行的程序,要完成一个或多个任务,在以前的进程中,多个任务只能串行处理,因为以前的进程是有一条执行流的进程,现在的进程中有多个执行流就可以实现同时处理多个任务(cpu资源足够),提高任务处理效率。
linux中如何实现一个进程中有多个执行流,执行流是什么?
在Linux中,pcb就是一个程序动态运行的描述,一个pcb就可以调用一段代码的执行,因此在Linux中执行流就是pcb,Linux中的执行流是通过pcb实现的。
创建线程的时候会伴随在内核中创建一个pcb作为一条执行流实现一段程序的运行调度管理。
线程,是进程中的一条执行流,是cpu调度执行的基本单元,因为Linux下执行流通过pcb实现,并且一个进程中可以有多个pcb,共享进程资源,因此linux下的线程也叫做轻量级进程,是一个pcb(这些pcb中有一个共同的线程组id,标记它们属于同一个进程)
进程,是程序运行时操作系统进行资源分配的基本单元
线程的优点:
创建一个新线程的代价要比创建一个新的进程小得多
与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
线程占用的资源比进程少
能充分的利用多处理器的可并行数量
在等待慢速I/O操作结束时,程序可执行其他的计算任务
计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
I/O密集型应用,大量的IO操作,IO会有阻塞操作,一个无法完成就无法发起下一个IO请求,对执行流请求就可以实现一个线程的阻塞不影响其它执行流
线程的缺点:
性能损失:
一个很少被外部事件阻塞的计算密集型线程往往无法与其它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,增加了额外的同步和调度开销,而可用的资源不变
健壮性降低:
编写多线程需要跟全面深入的考虑,在一个多线程程序里,因为时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,也就是说线程是缺乏保护的
缺乏访问控制:
线程是访问控制的基本度量,在一个线程中调用某些OS函数会对整个进程造成影响
编程难度提高
在进行多任务处理的时候,并非执行流越多越好(执行流过多有时反而增加了调度成本)
在计算密集型程序中,执行流的个数最好是CPU核心数+1(+1是为了防止某个执行流阻塞,而代替它的)
在IO密集型程序中,进程对CPU要求不高,因此执行流就不受与CPU核心数
多进程优点:
更加的稳定,健壮(因为一些系统调用接口以及异常都是针对整个进程产生效果的:exit / 异常)