文章目录
1.线程是什么
1.在一个程序里的一个执行路线就叫做线程,更准确的定义是线程是“一个进程内部的控制序列”
2.一切进程至少都是一个执行线程(进程:线程=1:n)
3.线程在进程内部运行,本质是在进程地址空间运行(一个进程的多个线程共用一块地址空间)
4.在Linux系统中,看到的PCB都是轻量级进程(线程的本质是轻量级进程)
5.通过进程的虚拟地址空间,可以看到进程的大部分资源,选择将进程合理分配给每个执行流,就形成了线程执行流(进程是申请资源,线程是分配资源)
2.线程的优点
1.创建一个新线程的代价要比创建一个新进程小得多
进程是承担资源分配的角色,需要去申请各种资源,而线程是承担资源分配的角色
2.与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
占得少,换得也少
比如,地址空间,页表等等都不需要换,只需要切换tss(任务状态段:在cpu上执行的上下文数据)
3.线程占用的资源要比进程少很多
线程只是占一个进程资源的一部分
4.能充分利用多处理器的可并行数量
多进程同样也可以(大家都有的优点也算优点,特点才是独有的)
5.在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
比如,I/O比较慢,我们可以一个线程执行I/O,另外一个线程执行计算
计算密集型应用(加密,解密等等,占用CPU),为了能在多处理器系统上运行,将计算分解到多个线程中实现
I/O密集型应用(访问数据库,打印内容等等,占用内存、带宽),为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作
3.线程的缺点
1.性能的损失
一个线程的代码、资源、另外一个线程也是可以看到的,这种多线的临界资源一定会变多,而临界资源我们需要保证它的安全性,因此需要进行一系列的加锁、解锁、互斥等动作。
而这些动作都会带来副作用的,即降低导致性能的降低
2.健壮性降低
因为线程是共享资源的,所以线程之间是会互相影响的,如果遇到了不确定的情况,访问了原本不该访问的资源,会导致出现一些未知的错误,而进程是独立的,所以进程的独立性是要强于线程的
3.缺乏访问的控制
比如创建一个全局变量,在多进程中只要有一方发生了写入,那么这个变量就会发生写时拷贝,因为进程之间是具有独立性的
而在多线程中,大家共享地址空间,如果一方在写入,另外一方在读取,那么就有可能会发生问题
4.编程难度提高
主要体现在调式方面,一个线程出现错误会影响整体,因此调试难度会增大
4.线程的操作
4.1POSIX线程库
linux没有真正意义上的多线程,然而,我们又需要进行一些多线程的创建,于是有一个非常接近底层的多线程库,叫做lpthread线程库。这个库采用的标准是POSIX
与线程有关的函数构成了一个完整的系列,绝大多数数函数的名字都是以pthread_打头的,要使用这些函数库,需要引入头文<pthread.h>。
链接这些线程函数库时,要使用编译器的-lpthread选项
4.2多线程的创建
4.3 ps -aL查看轻量级进程
4.4 PID和LWP之间的关系
在单进程单线程之中,PID和LWP是一样的,而单进程多线程之中,linux引入了线程组的概念
线程组中每一个线程(轻量级进程)都存在一个进程描述符LWP,这个轻量级进程描述符就是用户级进程ID,是OS调度的做小单位
主线程的LWP和PID是一样的
4.5 用户级线程,OS怎么看到的
4.6线程ID是什么
pthread_create 函数产生的线程ID存放在第一个参数指向的地址中。
这个线程ID不是LWP,LWP是轻量级进程的ID,是操作系统调度的最小单位,所以需要一个数值来表示该线程
pthread_create 函数的第一个参数,指向一个虚拟的内存单元,该内存单元的地址即为新创建线程的线程ID,属于线程库的范畴,线程库的后续操作,都是根据该线程ID来操作线程的
5.线程异常
1.单个线程如果出现除零,野指针导致线程崩溃,进程也会随之崩溃
这是信号发送的基本单位是进程——线程的鲁棒性不强
2.线程是进程的执行分支,线程出现异常相当于进程出现异常,进而触发信号机制,终止进程,释放所有进程资源,线程资源也就随之退出了
6.线程用途
1.合理运用多线程,线程并不是越多越好,线程一多,调度器的压力就会增大
2.计算密集型创建的进程个数最好和CPU核数相等
3.IO型,大部分时候都是在等待,因此可以稍微多一点,因为等的时间大多都是重合的
7.总结
1.进程是资源分配的基本单位
2.线程是调度的基本单位
3.线程更强调共享,但是也有自己的独立信息
线程ID
寄存器:上下文数据
线程栈:虚拟地址空间上是主线程的栈,线程的栈在共享库中
erron:一个线程的错误码
信号屏蔽字:不是pending信号集,信号是给进程发送的
调度优先级
4.线程的共享
代码段、数据段、堆区,共享区、都是共享的,比如定义一个函数或者全局变量,所有的线程都可以访问到
文件描述符(新线程的模板是主线程)
每种信号的处理方式(SIG_IGN,SIG_DFL)
当前工作目录
用户的id和组id
5.线程强调共享、进程强调独立
进程和线程相比,进程更强调独立性,但不是绝对独立,比如进程间的通信
线程更加强调共享,但也不是绝对共享的,比如线程私有线程运行线运行栈,如果大家都用同一个就出现混乱。
每个线程都有自己的一套寄存器(硬件上下文/任务状态段)
进程和线程的关系:
6.如何区分线程属于同一批进程
进程是承担资源的基本单位,线程是分配资源的基本单位,因此同一批线程的PID都是一样的,因为他们都是从同一个进程之中获取的资源