1.线程和进程的关系
(1)线程和进程的关系就是流水线和工厂之间的关系。
-线程依附于进程才能存在,如果没有进程线程就不能单独存在
-多线程是为了提高整个程序的运行效率
(2)在我们写进程方面代码的时候是否存在线程呢:
是有的,从main函数开始运行的线程被称之为“主线程”。
(3)之前的博客我们所理解的进程在内核当中就是一个task_struct结构体,该结构体当中的成员变量pid被我们称之为进程ID;
但其实操作系统当中没有线程的概念,程序员所说的创建线程,本质上在Linux操作系统当中就是创建轻量级进程(lwp),所以轻量级进程等价于线程(行业中约定俗成的就称之为线程)。
2.pid & tgid
pid本质上就是轻量级进程ID,换句话说pid其实就是线程ID
在task_struct结构体当中:
pid_t pid; //就是轻量级进程id,也被称之为线程id,不同的线程具有不同的pid;
pid_t tgid; //轻量级进程组id,也被称之为进程id,一个进程当中的线程拥有相同的tgid。
但是为什么在介绍进程概念的时候说pid就是进程id?
因为主线程的pid和tgid相等,线程组=>进程,进程概念里面的进程id也就是线程组id:tgid
3.线程的共享与独有
独有:
在进程虚拟地址空间的共享区当中:调用栈、寄存器、线程ID、errno、信号屏蔽字、调用优先级
共享:
文件描述符表、用户ID、用户组ID、信号处理方式、当前进程的工作目录
4.线程的优缺点
优点:
(1)多线程的程序,拥有多个执行流,合理使用(控制线程的访问时序问题),可以提高程序的运行效率。
(2)多线程程序的线程切换比多进程程序快,付出的代价小(有些可以共享的数据(全局变量)就能在线程切换的时候不进行切换)。
(3)可以充分发挥多核CPU并行的优势。
(4)计算密集型的程序,可以进行拆分,让不同的线程执行计算不一样的事情。
(5)I/O密集型的程序,可以进行拆分,让不同的线程执行不同的I/O操作,可以不用串行运行,提高程序运行效率。
缺点:
(1)编写代码的难度更高。
(2)代码的鲁棒性(稳定性)要求更高:一个线程崩溃,整个进程就崩溃。
(3)线程数量并不是越多越好:随着线程的数量增多,进程的运行效率符合正态分布,随着线程数量增多,会导致线程切换的次数增多。
(4)缺乏访问控制,可能会导致程序产生二义性结果。