一.线程与进程的区别
进程:有独立的 进程地址空间,有独立的pcb,是CPU分配资源的最小单位。
线程:没有独立的进程地址空间,有独立的pcb。是CPU执行的最小单位
在LInux系统中,使用命令 ps-Lf 进程id 可以查看某个进程所拥有的线程
LWP即为线程号。
二.Linux内核线程实现原理
虽然线程与子进程都有自己独立的PCB,但是线程与子进程不同:
线程的pcb中,与它属于的那个进程具有相同的三级映射结构(三级页表),这表示在将地址空间映射到内存时,线程和它属于的那个进程会映射到同一块内存区域。
子进程的pcb与父进程不同,它有独立的三级页表,那么在进程地址空间经mmu映射时,会映射到一块不同于父进程的内存地址。
映射原理图
三.线程之间的共享/非共享资源
线程共享资源
1.文件描述符表 (方便通信)
2.每种信号的处理方式
3.当前工作目录、
4.用户 ID 和组 ID.
5.内存地址空间(.text/.data/.bss/heap/共享库) --------栈区(stack)不共享,因为线程本身就做由寄存器和栈组成,一个进程地址空间的栈分成多个线程,各线程之间有不同的栈区空间)
线程非共享资源
1.线程 id
2.处理器现场和栈指针(内核栈)
3.独立的栈空间(用户空间栈)
4.errno 变量。
5.信号屏蔽字。
6.调度优先级
线程优、缺点
优点:
1.提高程序并发性
2.开销小
3.数据通信、共享数据方便,
缺点:
1.库函数,不稳定
2.调试、编写困难、gdb不支持
3.对信号支持不好,优点相对突出,缺点均不是硬伤。