进程管理And线程实现(下)

简介: 进程管理And线程实现(下)

线程



什么是线程 && 为什么使用 ?

需要提出一种新的实体, 满足以下特征:


实体之间可以并发执行;

实体之间共享相同的地址空间.

这实体就是线程.

1687782546366-28a128d6-4266-49eb-9bdd-bd98e014ecc6.png


线程是进程当中的一条执行流程.

从两个方面重新理解进程:


  1. 从资源组合的角度: 进程把一组相关的资源组合起来,构成了一个资源平台(环境),包括地址空间(代码段,数据段),打开的文件等各种资源;
  2. 从运行的角度: 代码在这个资源平台上的一条执行流程(线程).


线程的优缺点:


线程 = 进程 - 共享资源

线程的优点:


  • 一个进程中可以同时存在多个线程;
  • 各个线程之间可以并发地执行;
  • 各个线程之间可以共享地址空间和文件等资源.


线程的缺点: (他的优点 也是 他的缺点 )


  • 一个线程崩溃, 会导致其所属进程的所有线程崩溃.(给它了”权限”就得有更高的”责任”)
  • 线程所需的资源不同的线程需要独立的寄存器和堆栈, 共享代码,数据和文件等.


★★进程和线程的比较★★★


  • 进程是资源分配单位, 线程是CPU调度单位;
  • 进程拥有一个完整的资源平台, 而线程只独享必不可少的资源, 如寄存器和栈;
  • 线程同样具有就绪,阻塞和执行三种基本状态,同样具有状态之间的转换关系;
  • 线程能减少并发执行的时间和空间开销:


线程的创建时间比进程短;(直接利用所属进程的一些状态信息)

线程的终止时间比进程短;(不需要考虑把这些状态信息给释放)

同一进程内的线程切换时间比进程短;(同一进程不同线程的切换不需要切换页表)

由于同一进程的各线程之间共享内存和文件资源, 可直接进行不通过内核的通信.(直接通过内存地址读写资源)


线程的实现


线程的实现之 用户线程


在用户空间实现


在用户空间实现的线程机制, 它不依赖于操作系统的内核, 由一组用户级的线程库来完成线程的管理, 包括进程的创建,终止,同步和调度等.


1687949843325-baba4a3f-0b25-4c93-a6a5-179cdc507f55.png


操作系统只能看到进程, 但是却看不到线程 ,线程的TCB在线程库中实现;


特点 :


  • 由于用户线程的维护由相应的进程来完成(通过线程库函数),不需要操作系统内核了解用户进程的存在,可用于不支持线程技术的多进程操作系统;
  • 每个进程都需要它自己私有的线程控制块(TCB)列表,用来跟踪记录它的各个线程的状态信息(PC,栈指针,寄存器),TCB由线程库函数来维护;
  • 用户线程的切换也是由线程库函数来完成,无需用户态/核心态切换,所以速度特别快;
  • 允许每个进程拥有自定义的线程调度算法.


缺点:


  • 阻塞性的系统调用如何实现?如果一个线程发起系统调用而阻塞,则整个进程在等待;
  • 当一个线程开始运行时,除非它主动地交出CPU的使用权,否则它所在的进程当中的其他线程将无法运行;
  • 由于时间片分配给进程,所以与其他进程比,在多线程执行时,每个线程得到的时间片较少,执行会较慢.


线程的实现之 内核线程


在内核空间实现


内核线程是在操作系统的内核当中实现的一种线程机制,由操作系统的内核来完成线程的创建,终止和管理.


1687950132830-46c0b55e-5f3b-4743-a9e2-b41f04549fcb.png


特点


  • 在支持内核线程的操作系统中,由内核来维护进程和线程的上下文信息(PCB和TCB);
  • 线程的创建,终止和切换都是通过系统调用,内核函数的方式来进行,由内核来完成,因此系统开销较大;
  • 在一个进程当中,如果某个内核线程发起系统调用而被阻塞,并不会影响其他内核线程的运行;
  • 时间片分配给线程,多线程的进程获得更多CPU时间;
  • Windows NT 和 Windows 2000/XP 支持内核线程.
  • 线程的实现之 轻量级进程


内核支持的用户线程(Solaris/ Linux)

1687950273411-3b9c993c-4e0c-41dd-871b-13d00bd99698.png


一个进程可以有一个或多个轻量化进程,每个量级进程由一个单独的内核线程来支持.(Solaris,Linux)


上下文切换


程序以进程的形式 在操作系统中运行。


停止当前运行进程(从运行状态变成其他状态),并且调度其他进程(转变为运行状态)


  • 必须在切换之前存储许多部分的进程上下文
  • 必须能够在之后恢复他们,所以进程不能显示它曾经被暂停过
  • 必须快速(上下文切换时非常频繁)

1687950651218-e5e82e01-f7bf-4877-922a-dcf77a2e7dc8.png


需要存储什么上下文?


  • 寄存器(PC,SP…),CPU状态等信息
  • 一些时候可能会费时,所以我们应该尽可能避免


操作系统为活跃进程准备了进程控制块(PCB)


操作系统将进程控制块(PCB)放置在一个合适的队列中


有三个队列:


  • 就绪队列
  • 等待IO队列(每个设备的队列)
  • 僵尸队列

1687950762266-6c5d2931-a2cd-426e-b2d2-64bcfd0f159b.png

进程控制


进程控制 之 创建进程

创建进程的简单实现(fork() )


  1. 对子进程分配内存
  2. 复制父进程的内存和CPU寄存器到子进程
  3. 开销昂贵


在大多数情况下, 我们在调用fork() 之后要调用exec()


  1. 在fork( ) 操作中内存复制是没有作用的
  2. 子进程将可能关闭打开的文件和链接
  3. 开销因此是最高的
  4. 为什么不能结合他们在一个调用中 ?


vfork()


  1. 一个创建进程的系统调用,不需要创建一个同样的内存映射
  2. 一些适合称为轻量级fork()
  3. 子进程应该几乎立即调用exec()
  4. 现在不再使用 copy on write 技术
  5. 进程控制 之 加载和执行进程


系统调用exec()加载程序取代当前运行的进程


exec()调用允许一个进程”加载”一个不同的程序并且在main开始执行(事实上 _start)


它允许一个进程指定参数的数量(argc)和它字符串参数数组(argv)


如果调用成功(相同的进程,不同的程序)


代码,stack,heap重写


进程控制 之 等待和终止进程


wait()系统调用是被父进程用来等待子进程的结束


  • 一个子进程向父进程返回一个值,所以父进程必须接受这个值并处理
  • wait()系统调用担任这个要求
  • 它使父进程去睡眠来等待子进程的结束


当一个子进程调用exit()的时候,操作系统解锁父进程,并且将通过exit()传递得到的返回值作为wait调用的一个结果(连同子进程的pid一起)如果这里没有子进程存活,wait()立刻返回

当然,如果这里有为父进程的僵尸等待,wait()立即返回其中一个值(并且解除僵尸状态)

  • 进程结束执行之后,它调用exit()


  • 这个系统调用:


将这程序的”结果”作为一个参数

关闭所有打开的文件,连接等等

释放内存

释放大部分支持进程的操作系统结构

检查是否父进程是存活着的:

如果是的话,它保留结果的值直到父进程需要它;在这种情况里,进程没有真正死亡,但是它进入了僵尸状态

如果没有,它释放所有的数据结构,这个进程死亡

  • 清理所有等待的僵尸进程
  • 进程终止是最终的垃圾收集(资源回收)1687952513177-a6033fb7-3405-438a-923b-38236e28e76.png
目录
相关文章
|
27天前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
40 1
|
6天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
10天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
7天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
18 1
|
13天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
28 2
|
14天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
1月前
|
存储 消息中间件 人工智能
进程,线程,协程 - 你了解多少?
本故事采用简洁明了的对话方式,尽洪荒之力让你在轻松无负担的氛围中,稍微深入地理解进程、线程和协程的相关原理知识
40 2
进程,线程,协程 - 你了解多少?
|
25天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
27天前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第15天】进程、线程和协程是操作系统中三种不同的执行单元。进程是资源分配和调度的基本单位,每个进程有独立的内存空间;线程是进程内的执行路径,共享进程资源,切换成本较低;协程则更轻量,由用户态调度,适合处理高并发和IO密集型任务。进程提供高隔离性和安全性,线程支持高并发,协程则在资源消耗和调度灵活性方面表现优异。
44 2
|
2月前
|
存储 消息中间件 资源调度
「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
该文章总结了操作系统基础知识中的十个关键知识点,涵盖了进程与线程的概念及区别、进程间通信方式、线程同步机制、死锁现象及其预防方法、进程状态等内容,并通过具体实例帮助理解这些概念。
「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识

热门文章

最新文章

相关实验场景

更多