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

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

时间:2023-08-28 09:34:34浏览次数:39  
标签:操作系统 任务 线程 切换 进程 就绪 CPU 运行 内存

进程

所谓进程,大家可以理解为我们打开的应用程序,如微信、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资源运行系统进程。进程的状态通过队列进行管理。同时还讨论了内存交换和进程挂起的问题。

标签:操作系统,任务,线程,切换,进程,就绪,CPU,运行,内存
From: https://www.cnblogs.com/guoxiaoyu/p/17659686.html

相关文章

  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • 操作系统学习笔记(三)——内存管理
    一、虚拟内存将进程所用的地址隔离开,让操作系统为每个进程分配独立的一套虚拟地址。虚拟内存可以使进程的运行内存超过物理内存的大小。进程持有的虚拟地址会通过CPU芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存,如下图所示:有两种映射方......
  • 【操作系统】第一章 操作系统发展历程
    1.手工操作阶段所有运算工作需人工干预缺点:1.一个用户占用全机,导致资源利用率低2.CPU由于需要等待手工操作,利用不充分2.批处理阶段主要为了解决人工操作的问题,批处理系统的主要优点在于全自动处理,效率高。1.单道批处理系统主要有:自动性、顺序性和单道性的特征。缺点在于......
  • 在 Spring 6 中使用虚拟线程
    一、简介在这个简短的教程中,我们将了解如何在SpringBoot应用程序中利用虚拟线程的强大功能。虚拟线程是Java19的预览功能,这意味着它们将在未来12个月内包含在官方JDK版本中。Spring6版本最初由ProjectLoom引入,为开发人员提供了开始尝试这一出色功能的选项。首先,......
  • 操作系统学习笔记(二)——操作系统结构
    一、内核作为应用和硬件设备之间的桥梁,负责应用程序只与内核交互,不用关心硬件的细节。4个基本能力:管理进程、线程,决定哪个进程、线程使用CPU,也就是进程调度的能力;管理内存,决定内存的分配和回收,也就是内存管理的能力;管理硬件设备,为进程与硬件设备之间提供通信能力,也就是硬......
  • 操作系统学习笔记(一)——硬件
    一、冯诺依曼模型定义计算机基本结构为5个部分:存储器、运算器、控制器、输入设备、输出设备。运算器和控制器在中央处理器(CPU)里,存储器就是常见的内存,输入输出设备就是计算机外接的设备,比如键盘是输入设备,显示器是输出设备。1、内存 程序和数据存储在内存里,存储数据的基本单......
  • Linux 多线程基础
    @TOC前言一、多线程基础函数1.pthread_create创建新的线程。#include<pthread.h> intpthread_create(pthread_t*thread,constpthread_attr_t*attr, void*(*start_routine)(void*),void*arg);参数说明:thread:用于存储新线程的ID。attr:线程属......
  • 多线程基础
    进程在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程。某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,我们把子任务称为线程。进程和线程的关系:一个进程可以包含一个或多个线程,但至少会有一个......
  • tkinter窗口切换
    以下是使用tkinter实现窗口的创建、销毁和双向切换的示例代码: ```pythonimporttkinterastk classApp:  def__init__(self,root):    self.root=root    self.root.title("Tkinter窗口")    self.root.geometry("300x200")  ......
  • 线程安全的集合
    目录多线程环境下使用Dictionary产生的问题何时使用线程安全集合解决办法相关参考.NET中的Dictionary是非线程安全的,在多线程环境中可能会导致CPU使用率为100%。多线程环境下使用Dictionary产生的问题关于C#中Dictionary多线程情况下CPU100%问题的详细分析关于C#的Dictionar......