深入理解操作系统中进程与线程的区别及切换机制(下)

简介: 本文首先介绍了进程的控制结构,即进程控制块(PCB),它是表示进程的数据结构,包含了进程的相关信息和资源。PCB之间通过链表连接,形成就绪队列和阻塞队列,用于进程调度和资源管理。接着,文章详细探讨了进程的切换过程。进程切换是为了保证公平分配CPU时间片,涉及保存和恢复进程的执行上下文、更新进程状态和调度算法选择等步骤。文中还提到了进程上下文切换的场景,如时间片用完、内存不足、高优先级进程需求等。最后,文章介绍了线程的概念和上下文切换过程。线程是进程中的独立执行流程,可以共享进程的资源。线程的上下文切换开销较小,只需要保存和恢复线程的寄存器和计数器等信息。

前言

上一篇文章中我们了解了进程的执行方式,包括早期单核处理器上的顺序执行以及引入多任务概念实现的伪并行。我们还探讨了进程的状态模型。进程可以处于就绪、运行、阻塞和结束等不同的状态。
在本篇文章中,我将探讨研究进程的状态模型、控制结构和切换机制。希望通过这篇文章的分享,能够帮助更多的人理解和掌握进程管理的知识,为他们在计算机领域的学习和工作提供帮助。

进程的控制结构

也可以说是数据结构,毕竟操作系统也是一个进程,只要是应用程序就必然符合一条定律:程序=算法+数据结构,进程作为一种抽象概念,可将其视为一个容器,该容器聚集了相关资源,包括地址空间,线程,打开的文件,保护许可等。因此对于单个进程,可以基于一种数据结构来表示它,这种数据结构称之为进程控制块(PCB),这人家的专有名词;

每个进程都有一个唯一的PCB作为其标识,当进程被销毁时,PCB也会随之消失。如下:

image

PCB之间通过链表连接,形成各种队列,如就绪队列和阻塞队列。比如:

  1. 就绪队列:把所有就绪状态的PCB链在一起;
  2. 阻塞队列:把所有因等待某事件而处于等待状态的进程链在一起

另外,在单核CPU系统中,只有一个运行指针,因为在某个时刻,只能运行一个程序。

image

进程的切换

进程的切换是为了保证每个进程都能获得公平的CPU时间片来执行自己的程序,这也叫做上下文切换,上下文切换涉及以下内容:

  1. 存储进程的相关信息,如计数器、寄存器等,以便在切换回来时能正常加载。
  2. 更新进程的状态,如从运行态切换到就绪态等。
  3. 将当前进程放入就绪队列或阻塞队列中。
  4. 根据调度算法从就绪队列中选择一个进程加载并运行。
  5. 更新内存管理的数据结构(建立虚拟内存与物理内存的关系)。
  6. 新进程将自己的堆栈信息加载到CPU的计数器和寄存器中,占用时间片。

发生进程上下文切换有哪些场景?

时间片用完,强制进行上下文切换。

内存不足,将无用的进程交换出去挂起,待资源充足后再切换回来。

进程调用sleep函数进入睡眠状态,让出CPU,需要重新进行系统调度(对于线程也适用)。

有更高优先级的程序需要运行,当前进程需要让出CPU,确保高优先级进程能使用时间片。

发生硬件中断时,CPU立即处理相关中断服务程序,如键盘输入。即使是单核CPU,也能良好处理中断程序和进程之间的时间片占用。不必担心持续敲击键盘会导致系统崩溃,尤其现在大多数是多核处理器。

线程

在早期的操作系统中,以进程作为独立运行的基本单位,直到后来计算机科学家们提出了更小的能独立运行的基本单位,即线程。

程是进程中的一条执行流程,多个线程可以共享代码段、数据段、打开的文件等资源,但每个线程都有一套独立的寄存器和栈,确保线程的控制流是相对独立的。可以将线程视为CPU调度的基本单位。可以想象一个我们的Java多线程,代码公用、全局变量公用等,但是进程会控制好线程自己的独立栈信息等;

image

线程的上下文切换

线程与进程最大的区别在于:线程是调度的基本单位,而进程则是资源拥有的基本单位。

线程的上下文切换是指在切换线程时,需要保存和恢复线程的执行上下文。与进程相比,线程上下文切换的代价要小得多。

如果一个进程只有主线程,那么线程的切换流程与进程切换相同。

如果是进程内的某个线程进行切换,代价会更小。只需要保存线程的相关寄存器和计数器等信息,因为其他资源和虚拟内存是进程内共享的,无需切换。因此,线程的上下文切换开销较进程小很多。

总结

进程和线程是操作系统中的两个重要概念。进程是程序的一次执行过程,拥有自己的地址空间和资源,是资源分配的基本单位。进程之间通过上下文切换来共享CPU,保证公平分配。进程切换涉及到保存和加载进程的相关信息、状态变更、队列操作、调度算法等。

线程是进程中的独立执行流程,可以共享进程的资源,但有独立的寄存器和栈。线程的上下文切换相比进程较小,只需要保存线程的相关寄存器和计数器等信息。

相关文章
|
6天前
|
存储 网络协议 算法
【进程与线程】最好懂的讲解
【进程与线程】最好懂的讲解
13 1
|
1天前
|
数据挖掘 调度 开发者
Python并发编程的艺术:掌握线程、进程与协程的同步技巧
并发编程在Python中涵盖线程、进程和协程,用于优化IO操作和响应速度。`threading`模块支持线程,`multiprocessing`处理进程,而`asyncio`则用于协程。线程通过Lock和Condition Objects同步,进程使用Queue和Pipe通信。协程利用异步事件循环避免上下文切换。了解并发模型及同步技术是提升Python应用性能的关键。
17 5
|
3天前
|
监控 算法 安全
深入理解操作系统的内存管理机制
在数字时代的心脏,内存管理扮演着至关重要的角色。它是操作系统中的一项核心功能,负责协调、监控和控制计算机系统中的内存资源分配与回收。本文将深入探讨内存管理的基本原理、关键算法以及它在现代操作系统中的实现方式,揭示如何有效地利用和管理内存资源以优化系统性能和稳定性。
|
3天前
|
存储 缓存 人工智能
深入探讨现代操作系统的内存管理机制
在不断发展的计算机科学领域,内存管理一直是操作系统设计中的关键问题。本文将深入探讨现代操作系统中使用的各种内存管理技术,包括虚拟内存、分页、分段和缓存策略。通过分析这些技术的实现原理和实际应用,我们不仅能了解它们如何提升系统性能,还能看出它们在不同场景下的优缺点。
6 0
|
4天前
|
消息中间件 分布式计算 物联网
深入理解操作系统之进程与线程管理
操作系统的核心职责之一是进程与线程管理,它关乎系统的效率和稳定性。本文将剖析进程与线程的基本概念、生命周期以及它们在现代操作系统中的实现机制。通过对比分析,我们将揭示进程与线程的区别、优势及其适用场景,并探讨它们对系统性能的具体影响。进一步,文章将讨论进程间通信(IPC)的几种方式,以及同步和异步处理在多任务环境中的重要性。最后,我们将展望未来操作系统在进程与线程管理方面可能的发展趋势。
|
9天前
|
安全 开发者 Python
Python中的多线程与多进程编程
Python作为一种广泛使用的编程语言,在处理并发性能时具有独特的优势。本文将深入探讨Python中的多线程与多进程编程技术,分析其原理和应用,帮助读者更好地理解并发编程在Python中的实现与优化。
|
10天前
|
消息中间件 安全 Java
【嵌入式软件工程师面经】Linux多进程与多线程
【嵌入式软件工程师面经】Linux多进程与多线程
9 1
|
13天前
|
存储 Linux 数据处理
探索Linux操作系统的内核与文件系统
本文深入探讨了Linux操作系统的核心组件,包括其独特的内核结构和灵活的文件系统。文章首先概述了Linux内核的主要功能和架构,接着详细分析了文件系统的工作原理以及它如何支持数据存储和检索。通过比较不同的文件系统类型,本文旨在为读者提供一个关于如何根据特定需求选择合适文件系统的参考框架。
|
3天前
|
存储 缓存 安全
Linux基础——冯诺依曼体系结构与操作系统
Linux基础——冯诺依曼体系结构与操作系统
24 1
Linux基础——冯诺依曼体系结构与操作系统
|
4天前
|
网络协议 Linux 数据安全/隐私保护
【Linux操作系统】权限管理和粘滞位
【Linux操作系统】权限管理和粘滞位
【Linux操作系统】权限管理和粘滞位

热门文章

最新文章