Linux——线程基础概念

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都是一样的,因为他们都是从同一个进程之中获取的资源

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值