线程概念
- 什么是线程
- 线程的优点和缺点
- 线程的用途和线程异常
- 线程与进程的区别
什么是线程
实际上,线程是一个进程内部的控制序列,一个程序的一个执行线路就是一个线程。
并且一个进程中至少有一个线程,本质上,一个进程内部如果有多个线程,那么这些线程实际上是指向同一块地址空间的。而不论进程还是线程,从CPU看来都是一个PCB,只是说线程的PCB要比进程更加轻量化一些。意味着当需要进行切换时,线程切换的代价要远低于进程切换。
线程的优点和缺点
优点:
1.我们知道,并发和并行,那么当我们的进程中有多个执行流的时候,利用并行的方式可以极大的提高程序运行效率。
2.进程切换的代价要比线程切换的代价大的多
3.线程占用的资源要比进程少很多
4.可以并行的运行
缺点
1.当进程中的线程数量远远超过CPU的数量,可能线程切换的开销会影响进程运行的效率
2.对代码的鲁棒性要求更高
3.缺乏访问控制,编程的难度变高
线程的用途和线程异常
线程的用途:
合理的使用多线程,可以提高CPU密集型程序的执行效率
合理的使用多线程,也可以提高IO密集型程序的用户体验
线程异常:
当单个线程出现:越界访问,解引用空指针,管道破裂,除0,double free和栈溢出的情况时,会导致线程崩溃,从而触发信号机制,终止进程,当进程终止了,当前进程中所有的线程就都终止了。
线程与进程的区别
进程是操作系统进行资源分配的最小单位,而线程是操作系统进行调度的最小单位。同一个进程组中,有多个线程,多个线程都指向同一个进程虚拟地址空间,意味着各个线程是共享进程数据的。
但是如果仅仅是共享进程数据,那么就会出现调用栈混乱的情况,比如,主线程调用了func函数,其中调用了工作线程,当主线程的func函数要退出时,但是工作线程没有退出,按照压栈的操作来说,需要首先等工作线程退出后,才能退出主线程的func函数,这样就出现了调用栈混乱的情况。
为了防止出现这种问题,在进程虚拟地址空间内部,定义了一块共享区,其中就包含一个叫做调用栈,这样各个线程的调用栈是独立的,就不存在调用栈混乱的问题了。
线程独有的数据 | 线程共享的数据 |
---|---|
线程ID,调用栈、寄存器、erron,信号屏蔽字,调度优先级 | 文件描述符表,信号的处理方式,工作目录,用户id和用户组id |