Linux~操作系统~什么是线程?线程底层结构是怎样的?线程的优缺点?

1.线程和进程概念对比

进程:把程序文件加载到内存,操作系统为该进程创建PCB,页表等管理进程的数据机构,这就形成了进程,是程序的执行实例。(一个程序可以有多个进程来执行)

线程:是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细和轻量化。

进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位

  • 进程内部:线程在进程的地址空间内运行,地址空间描述了进程所能看到的所有内容
  • 执行分支:CPU调度的时候只看PCB,每一个PCB曾经被指派过指向方法和数据,CPU可以直接的调度
  • 属于进程的一部分:所有和进程相关的数据结构(PCB,页表,file_struct等等)+代码和数据最多算进程内的一个执行流,进程由多个执行流组成

2.线程的结构

windows下:

        一个进程内可能存在多个线程,所以在操作系统内部,会存在更多的线程,操作系统需要管理这些线程,先描述再组织,所以也有线程控制块(tcb-thread-control-block,pcb的p表示process),也就是一个struct tcb(这是windows的做法,Linux下不一样)

Linux下:

        这里CPU拿到的PCB,不一定是同一个进程里面的PCB,在操作系统看来,一个PCB就是一个需要被调度的执行流。在Linux下,使用进程PCB模拟线程,在一个进程里面可以有多个PCB,表示多个线程。所以在Linux下,对操作系统来说,一个PCB就是一个需要被调度的执行流,也就是一个线程。

  1. CPU此时看到的PCB〈=PCB的概念, 一个PCB就是一个需要被调度的执行流
  2. Linux中没有专门为线程设计TCB,而是用进程的PCB来模拟线程
  3. 不用维护复杂的进程和线程的关系,不用单独为线程设计任何算法,直接使用进程的一套相关的方法。OS只需要聚焦在线程间的资源分配上就可以了

3.进程和线程的区别

1.进程,独立性,可以有部分共享资源(管道、ipc资源)

线程,大部分资源是共享的,可以有部分资源是"私有"的

(私有的如:pcb,栈,上下,线程ID,一组寄存器,errno,信号屏蔽字,调度优先级)

(公有的如:文件描述符表,每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数),当前工作目录,用户id和组id)

2.进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位


4.线程的优缺点

线程的优点:

  • 创建一个新线程的代价要比创建一个新进程小得多
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多(不需要切换页表,也不需要更新缓存数据等,只需要切换上下文即可)
  • 线程占用的资源要比进程少很多

  • 能充分利用多处理器的可并行数量(多线程也可以做到)
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务(多线程也可以做到)

  • 计算密集型应用(加密,大数据运算,主要使用的是CPU资源),为了能在多处理器系统上运行,将计算分解到多个线程中实现,提高效率(但是并不是线程越多越好,如果线程太多,会导致线程间被过度调度切换(有成本的),因为要保证所有的线程都能够获得CPU资源,所以需要切换)
  • I/O密集型应用(网络下载,云盘,ssh,在线直播,看电影,主要使用的是内存和外设的资源),为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作(等外设A的时候另一个线程也在等外设B)。(同样也不是线程越多越好,相比计算密集型,可以多一些线程,因为IO比较慢,大部分时间都是在等待,比如等待用户输入)

计算密集+IO密集型的应用:网络游戏

线程的缺点:

  • 性能损失(多线程也有)

        如果线程数量超过CPU的核心数量,来回切换线程会需要额外的同步和调度的开销。

  • 健壮性降低

        一个线程崩溃,整个进程崩溃。因为所有线程共享进程地址空间,线程之间是完全透明的,一个线程崩溃就说明该线程此时已经出现了不可逆转的错误,该错误极有可能已经破坏掉了或者即将破坏掉进程的地址空间,因此在操作系统眼里看来继续运行其它线程是有很大风险的,因为大家共同运行的基础已经没有了(完好的地址空间)。

  • 缺乏访问控制

        线程是没有独立性的,在进行一些操作的时候(比如修改了进程中某些全局数据),会对整个进程产生影响。

  • 编程难度提高

        总和前三个原因,也就导致了编写与调试一个多线程程序比单线程程序困难得多。程序崩溃后,调试很困难。


5.线程异常/线程用途

线程异常:

  • 单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
  • 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出

线程用途:

  • 合理的使用多线程,能提高CPU密集型程序的执行效率
  • 合理的使用多线程,能提高IO密集型程序的用户体验(像迅雷的边下边播,一个线程下载数据,一个线程播放视频)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统
算法与数据结构涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值