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

简介: 本文首先介绍了进程的控制结构,即进程控制块(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,保证公平分配。进程切换涉及到保存和加载进程的相关信息、状态变更、队列操作、调度算法等。

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

相关文章
|
5月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
895 2
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
295 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
313 1
|
11月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
388 67
|
9月前
|
调度 开发工具 Android开发
【HarmonyOS Next】鸿蒙应用进程和线程详解
进程的定义: 进程是系统进行资源分配的基本单位,是操作系统结构的基础。 在鸿蒙系统中,一个应用下会有三类进程:
361 0
|
SQL 监控 网络协议
YashanDB进程线程体系
YashanDB进程线程体系
|
7月前
|
Ubuntu Unix Linux
操作系统的最强入门科普(Unix/Linux篇)
下期文章,小枣君会重点聊聊Windows和macOS那条线。敬请关注! 如果大家觉得文章不错,还请帮忙多多转发!谢谢!
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
1040 0
Vanilla OS:下一代安全 Linux 发行版
|
7月前
|
Web App开发 缓存 Rust
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
582 10

热门文章

最新文章

推荐镜像

更多