什么是线程?
说到线程,我们先来说一下什么是进程,进程是一个运行起来的程序,在操作系统中,一个程序运行起来,程序被加载到内存中,操作系统创建一个进程描述符(进程控制块)pcb对程序的运行进行描述控制,因此进程就是pcb,在Linux中进程是task_struct结构体。
Linux线程使用进程pcb模拟实现,因此Linux的线程可以说是一个轻量级的进程,如果说pcb是线程,那么进程就是一个线程组,在一个进程中有一个或多个线程。由于CPU调度的是pcb,那么在Linux下,线程是CPU调度的基本单位,由于程序运行的时候分配进程资源,所以说进程(线程组)是资源分配的基本单位。
在同一个进程中的线程的共享同一块虚拟地址空间,所以线程之间的通信非常简单,那么这么多线程在调用的时候为什么不会出现栈混乱?接下来为大家介绍同一个进程中个线程之间的共享和独有资源。
线程的共享资源:文件描述符、每种信号的处理方式、当前工作目录、用户ID和组ID
线程的独有资源:栈、寄存器、信号屏蔽字、errno、线程标识符
多线程优点:
1、线程之间通信简单
2、线程的创建/销毁成本低
3、线程的调度成本更低
4、线程的执行粒度更细
多线程缺点:
1、线程之间缺乏访问控制,编码难度更高(任何一个线程都可以访问虚拟地址空间中的任意进程,数据争抢更频繁)
2、健壮性较低:线程的某些错误会导致整个进程的退出
多线程的使用场景:
线程创建的越多效率越高,要根据具体的情况而定,比如说IO密集型程序是大量的磁盘IO操作,只有处理完当前文件才会去读取下一个文件,是串行化运行,如果使用多线程,就可以同时读取多个文件,这样的效率会大大提升,还有CPU密集型程序,也是同样的道理,虽然CPU密集型程序是大量的数据运算程序,但它和IO密集型程序一样,使用多线程会提高效率。
线程控制:线程创建、线程终止、线程等待、线程