一、什么是线程
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
大致可以将线程看为一下几点:
1.轻量级进程(light-weight process),也有PCB,创建线程使用的底层函数和进程一样,都是clone
2.从内核里看进程和线程是一样的,都有各自不同的PCB,但是PCB中指向内存资源的三级页表是相同的(即公用内存空间)
3.进程可以蜕变成线程
4.在底层的工程师眼中,线程就是寄存器和栈
5.在linux下,线程最是小的执行单位(cpu进行调度时,以线程为单位分配cpu的使用权);进程是最小的分配资源单位(创建进程的时候为其分配4g的虚拟内存空间,包括为其分配的信号的处理动作)
察看LWP号:
$ ps -Lf pid(对应的进程id)
$ ps -eLf
进程、线程、cpu调度、时间片之间的关系:
二、线程间共享哪些资源
线程之间共享的资源有:
1、文件描述符表
2、每种信号的处理方式
3、当前工作目录
4、用户ID和组ID
5、内存地址空间
以及
可执行的代码段(.text)
读写数据段(.data 用于保存已初始化的全局变量和已初始化的全局变量)、
非初始化数据段(.bss保存未初始化的全局变量和未初始化的静态变量、初始值都为0)
堆
共享库。
三、线程间不共享哪些资源
线程之间不共享的资源有:
1.线程id(注:不是轻量级进程(lwp)。在进程中,每个线程都有自己的线程id、其作用域为自己的进程(eg:进程A不能访问进程B中的线程b))
2.处理器现场和栈指针(内核栈)
3.独立的栈空间(用户空间栈)
4.errno变量
5.信号屏蔽字
6.调度优先级