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

简介: 进程是正在运行的程序的实例,它可以包含一个或多个线程。我们了解了进程的执行方式,包括早期单核处理器上的顺序执行以及引入多任务概念实现的伪并行。我们还探讨了进程的状态模型。进程可以处于就绪、运行、阻塞和结束等不同的状态。就绪状态表示进程已经准备好运行,但还没有被调度执行。运行状态表示进程正在执行。阻塞状态表示进程被阻塞,需要等待某些事件的发生才能继续执行。结束状态表示进程已经完成执行。

进程

所谓进程,大家可以理解为我们打开的应用程序,如微信、QQ、游戏等,但也有系统应用是我们看不见的,可以打开任务管理器一探究竟,我们写的代码程序在服务器上在不运行的情况下,它就是一个二进制文件,并不是进程!

image

一个进程可以包含一个或者多个线程,但对于CPU来说他就是一个任务而已;

image

在早期,我们的CPU只有一个,而有多个任务需要执行时,它们只能排队等待,无论前面的任务执行时间有多长,后面的任务都得耐心等待。这种方式显然存在明显的弊端。举个例子,假设排在前面的A任务需要执行1小时,而排在后面的B任务仅需1分钟,那么B任务必须等待A任务完成后才能执行,这种方式显得极其不灵活。

进一步发展后,我们拥有了多任务的系统。在CPU在同一时间只能处理一个任务的前提下,系统将时间划分为多个时间片,每个任务只能占用一个时间片来执行自己的任务。一旦时间片用完,就必须轮到下一个任务执行,这种方式看起来就像是多个进程或任务同时在运行,这就是我们所说的并发,也称为伪并行。

有伪并行,那么就有真并行,随着现代化发展,我们的CPU开始拥有多核处理器,如4核、8核等。这样每个核心就像一个独立的CPU一样,可以并行处理多个任务。,8核对应的就是8个任务并行处理;

image

然而,我们当前的服务器系统都是高并发状态,不仅要运行自己的业务,还要占用一定的CPU资源来运行系统进程。因此,以下一系列问题就出现了:

  1. 一个任务占用多长时间的时间片?
  2. CPU如何进行任务切换?当一个任务正在执行时被切换,资源如何处理?
  3. CPU如何找到下一个要执行的任务的位置?

进程的状态

五状态模型

image

当我们的程序启动后就会变成这种状态,关联如下:

就绪->运行:当任务获得时间片后,使用CPU执行操作,进入运行状态。

运行->阻塞:进程调用系统服务时,无法立即获取返回值(如IO操作),进入阻塞状态。

运行->就绪:如果占用的时间片已经结束了,但任务未完成,回到就绪状态。

阻塞->就绪:阻塞结束后,进程回到就绪状态。

运行->结束:进程自行完成任务后,那么会被系统终止;

以上便是对于单个进程的5状态描述,从上面可以看出由于系统通常同时运行多个进程,因此就绪和阻塞状态的进程可能会有多个,那么这么多进行都在就绪态和阻塞态怎么办?一般来说就是使用队列,这不跟你写java是一样的解决方案吗?排队就行了

七状态模型

image

队列是可以解决排队了问题了,但是这么长的队列放到哪里呢?我们的内存是很宝贵的,所以这里面就有上一节说的内存交换的问题了,可以使用内存交换机制将部分进程交换到磁盘中,这时候就是一个挂起的状态;

挂起的状态分两种:

  1. 就绪状态的挂起:一旦进程重新加载到内存中,就会立即运行。
  2. 阻塞状态的挂起:等待特定事件发生后才会运行。

这时候你就知道为什么你可以运行很多个程序,但是有时候你打开的太多了,你正打开某一个软件的同时,另一个软件自己退了,你就可以看下你的内存是不是满了,这是因为已经被交换到磁盘中的进程不容易重新加载回内存。一旦内存已满,重新加载进程就变得困难。

总结

进程是指正在运行的程序,可以包含一个或多个线程。在早期,CPU只有一个核心,多个任务需要排队等待执行。后来,引入了多任务的概念,将时间划分为多个时间片,每个任务占用一个时间片执行,实现了伪并行。现代CPU拥有多核处理器,可以并行处理多个任务。高并发的服务器系统中,除了运行业务,还要占用一定的CPU资源运行系统进程。进程的状态通过队列进行管理。同时还讨论了内存交换和进程挂起的问题。

相关文章
|
11天前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
5天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
4天前
|
消息中间件 安全 算法
深入理解操作系统:进程管理的艺术
【10月更文挑战第38天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是硬件与软件的桥梁,更是维持计算机运行秩序的守夜人。本文将带你走进操作系统的核心——进程管理,探索它是如何协调和优化资源的使用,确保系统的稳定与高效。我们将从进程的基本概念出发,逐步深入到进程调度、同步与通信,最后探讨进程安全的重要性。通过这篇文章,你将获得对操作系统进程管理的全新认识,为你的计算机科学之旅增添一份深刻的理解。
|
5天前
|
存储 消息中间件 算法
深入探索操作系统的心脏——内核机制解析
本文旨在揭示操作系统核心——内核的工作原理,通过剖析其关键组件与机制,为读者提供一个清晰的内核结构图景。不同于常规摘要的概述性内容,本文摘要将直接聚焦于内核的核心概念、主要功能以及其在系统管理中扮演的角色,旨在激发读者对操作系统深层次运作原理的兴趣与理解。
|
8天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
26 3
|
10天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
7天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
18 1
|
11天前
|
算法 调度 UED
深入理解操作系统的进程调度机制
本文旨在探讨操作系统中至关重要的组成部分之一——进程调度机制。通过详细解析进程调度的概念、目的、类型以及实现方式,本文为读者提供了一个全面了解操作系统如何高效管理进程资源的视角。此外,文章还简要介绍了几种常见的进程调度算法,并分析了它们的优缺点,旨在帮助读者更好地理解操作系统内部的复杂性及其对系统性能的影响。
|
9天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理的艺术
【10月更文挑战第33天】本文旨在揭示操作系统中进程管理的神秘面纱,带领读者从理论到实践,探索进程调度、同步以及通信的精妙之处。通过深入浅出的解释和直观的代码示例,我们将一起踏上这场技术之旅,解锁进程管理的秘密。
15 0
|
11天前
|
算法 Linux 调度
深入理解操作系统之进程调度
【10月更文挑战第31天】在操作系统的心脏跳动中,进程调度扮演着关键角色。本文将深入浅出地探讨进程调度的机制和策略,通过比喻和实例让读者轻松理解这一复杂主题。我们将一起探索不同类型的调度算法,并了解它们如何影响系统性能和用户体验。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇理解操作系统深层工作机制的大门。
22 0