Linux——线程概念及私有数据和优缺点

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

一.什么是线程

二.线程私有的数据

三.线程的优点

四.线程的缺点

五.线程与进程对比


一.什么是线程

线程是在进程内部运行一个进程可以有多个线程

打个比方假如人是一个进程那么走路、思考、吃饭、说话作为不同的线程。一个进程能有多个线程同时运行就好比一个人在走路时还可以思考、说话、吃饭一样。

可以说线程就是进程的“四肢”是进程运行的基本单位是CPU调度的基本单位。

画个草图如下

总结而言在一个程序里的一个执行路线就叫做线程且一个进程至少要有一个执行线程。

线程与进程共享虚拟地址空间、页表等内核数据结构、数据和代码。
线程的数据结构理论上与进程的不同但基于线程和进程的相似性linux的线程数据结构依旧采用
task_struct结构体与进程的一致
。但是其他的操作系统线程有专属的结构与进程的不同。也就是说linux没有真正意义上的线程结构而是采用进程的task_struct结构体模拟的线程。

即便线程与进程都采用task_struct结构体但是内核数据结构依旧属于进程线程只是与进程共享。
换句话说进程 = 多个线程执行流+ 内核数据结构 + 数据 + 代码。
而task_struct本质就是进程内部的一个执行流。
对于CPU而言本质上只是调度task_struct而不会区分进程还是线程。

图示如下

二.线程私有数据及区域

所有线程共享进程的内核数据结构、数据及代码但是每个线程也有自己私有的数据

比如线程id、寄存器和栈还有errno、信号屏蔽字block位图、调度优先级。

linux的线程数据创建在共享区中因此线程结构在共享区中。

linux使用pthread库来创建及管理线程而pthread作为动态库需要加载到共享区进而线程创建在共享区中。

线程栈、局部存储数据__pthread类型变量及线程id由pthread库函数创建的struct pthread结构体管理。该结构体在共享区因此线程的栈也在共享区中

值得注意的是

①主线程使用虚拟地址空间中的栈区只有其他线程使用共享区中分配的栈区。

②线程id本质是共享区pthread库所分配给该线程空间的起始地址即id本质是一个地址。

图示如下

三.线程的优点

①创建线程的代价比创建进程小。创建线程只用创建task_struct结构体而进程还有相关内核数据结构加载数据和代码。

②线程切换效率比进程切换高。线程占用系统资源少切换更高效。线程切换时不会清除缓存数据进程切换会清除缓存。

③线程可以充分利用CPU多核心的优势多线程。可以同时执行不同的任务使得多个任务能够并发进行。

④多线程可以提高计算密集型和IO密集型应用的效率。计算密集型应用可以将计算分给多个线程处理IO密集型应用可以使用多线程同时进行不同的IO操作。

四.线程的缺点

①多线程的健壮性差。多线程之间没有数据保护可能存在因为线程执行顺序问题导致的数据错误。

②缺乏访问控制。线程访问某些系统函数可能会对整个进程造成影响。

③多线程程序调试难度大。多线程代码的调试比单线程困难许多。

五.线程与进程对比

①一个进程可以有多个线程且只少有一个线程。

②进程拥有内核数据结构、数据及代码线程只有使用权和必不可少的私有数据如寄存器和栈。

③线程执行效率通常更高但不安全。

④一个线程异常整个进程异常。


如有错误敬请斧正

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux

“Linux——线程概念及私有数据和优缺点” 的相关文章