线程

线程定义

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。 –百科

  • 轻量级的进程(LWP: light weight process),在Linux环境下线程的本质仍然是进程。
  • 进程:拥有独立的地址空间,拥有PCB,相当于独居。
  • 线程:有PCB,但没有独立的地址空间,多个线程共享进程空间,相当于合租。
    在这里插入图片描述
在LINUX操作系统下:
  • 线程:最小的执行单位;
  • 进程:最小分配资源单位,可看成是只有一个线程的进程。
  • 当创建了子进程之后,进程就退化成了主线程
  • 对于内核而言,有几个PCB就有几个线程,内核认为线程就是进程,是轻量级的进程
  • 主线程和子线程共享一个地址空间
  • 除了栈空间不能共享之外,其他资源都能共享
  • 一般情况下,多个线程可以使用全局变量或者是堆内存进行数据交换
线程的特点
  • 类UNIX系统中,早期是没有”线程”概念,80年代才引入,借助进程机制实现出了线程的概念。
  • 线程是轻量级的进程(light-weight process),也有PCB,创建线程使用的底层函数和进程一样,都 clone()
  • 从内核看进程和线程是一样的,都有各自不同的PCB
  • 进程可以蜕变成线程
  • 在LINUX下,线程是最小的执行单位;进程是最小的分配资源单位
  • 在这里插入图片描述

实际上,无论是创建进程的fork,还是创建线程的pthread_create,底层实现都是调用同一个内核函数clone().

  • 如果复制对方的地址空间,那么就产出一个“进程”;
  • 如果共享对方的地址空间,就产生一个“线程”。
    所以: Linux内核是不区分进程和线程的,只在用户层面进行区分。
    所以: 线程所有操作函数 pthread_* 是库函数,而非系统调用
线程共享资源
  • 文件描述符表
  • 每种信号的处理方式
  • 当前工作目录
  • 用户ID和组ID
  • 内存地址空间 (.text/.data/.bss/heap/共享库)
线程非共享资源
  • 线程id
  • 处理器现场和栈指针(内核栈)
  • 独立的栈空间(用户空间栈)
  • errno变量
  • 信号屏蔽字
  • 调度优先级
线程的优缺点

优点
提高程序的并发性
开销小
数据通信、共享数据方便
缺点:
库函数,不稳定
gdb调试、编写困难
对信号支持不好

优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值