Linux - 线程基础概念

什么是线程
  • 线程是能够运行调度的最小单位
  • 进程实际运作的单位
  • 是进程中单一顺序的执行流(例如,一个进程中的main函数,是由线程执行起来的)
  • 一个进程可以并发执行多个线程
进程和线程
  • 进程/任务是资源分配的基本单位
  • 线程/轻量级进程(这个叫法只针对于Linux而言,别的OS下不一定是)是资源调度的基本单位
  • 我们平常说的pid(getpid() 得到的),其实是这个进程的唯一标识符,也是这个进程中主线程的唯一标识符
  • 线程共享进程数据,但也拥有自己的一部分信息
        线程ID : 线程的唯一标识符
        一组寄存器 :线程的上下文信息
        栈 :每个线程都维护者自己的一个栈
        errno
        信号屏蔽字
        调度优先级


一进程的多个线程共享
  • 同一虚拟地址空间 : 数据段和代码段都是共享的,如果定义了一个函数,那么这个进程中的所有线程都可以调用,如果定义了一个全局变量,这个全局变量在各个线程中都可以访问到,如果在堆上申请了一段空间,所有的线程也都可以对这个数据进行操作
  • 文件描述符 :一个线程修改了一个文件,其他的线程访问到的文件也都改变
  • 共用信号处理机制中的未决信号机
线程的优点(与进程对比)

  • 创建一个新的线程的代价小于创建一个进程的代价
创建一个进程,我们需要给他分配虚拟地址空间,这个空间占用了一部分资源,比如我们的堆默认为8M,耗费的时间当然比较大
创建一个线程,线程的很对区域都是和其他线程共享的,所以节约了很多的资源,增快了效率
  • 线程之间的切换代价很小
两进程之间的切换,因为占用的空间和资源比较多,所以切换效率比较低
两线程的切换,只用切换一小部分数据,效率较高
  • 能够成分利用多处理器的可并行数量
比如我们现在是4核CPU,现在需要不停歇的进行CPU的运算操作,当前用四个线程运算操作,CPU占用率可达到400%(Linux下),可见充分利用了硬件资源
线程的缺点

  • 缺乏访问控制,这导致线程使用起来安全性比较低
线程之间不独立,很有可能访问到其他线程的数据,使程序发生未定义行为
一个线程挂掉,其余线程都会挂掉
  • 编程难度大大增加
编写和调试一个多线程程序的难度比单线程的难度困难的多
  • 线程并不是越多越好
如我们是4核CPU,现在有8个线程,期中4个线程在执行任务的时候,其他4个线程就在等待,也会和正在执行任务的线程竞争,消耗资源,而且很容易导致整个进程都挂掉

小结:
在Linux下,线程可以理解为一个 轻量级进程,他与进程的很多操作方式都很相似。
当一个进程中只剩下一个线程的时候,这时候进程就约等于线程。
线程虽然不够安全,但是为我们节约了很多的资源,也提高了程序运行的效率。


猜你喜欢

转载自blog.csdn.net/J4Ya_/article/details/80596838
今日推荐