码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 深入理解操作系统中进程与线程的区别及切换机制(上)


    合集 - 计算机基础(9)
    1.探索操作系统:内核、启动和系统调用的奥秘08-242.系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理08-25
    3.深入理解操作系统中进程与线程的区别及切换机制(上)08-28
    4.深入理解操作系统中进程与线程的区别及切换机制(下)08-295.进程调度的原理和算法探析08-306.深入探讨进程间通信的重要性:理解不同的通信机制(上)08-317.深入探讨进程间通信的重要性:理解不同的通信机制(下)09-018.探索文件系统:高效、可靠的文件管理与访问机制09-049.操作系统中文件系统的实现和分配方式探析(上)09-05
    收起

    进程

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

  • 相关阅读:
    SQL Select(选择) 语法
    新来的一个同事,把SpringBoot参数校验玩的那叫一个优雅
    手动导出URL 证书
    Python——操作MySQL数据库
    【快应用】网页跳转快应用测试指导
    【实验技术笔记】细胞表型检测之细胞迁移(细胞划痕实验 + transwell实验)
    网络拓扑图怎么画最好?
    基本微信小程序的购物商城系统
    企业单位公众号如何上传附件(如Word,Excel,PPT等)
    学习.NET验证模块FluentValidation的基本用法
  • 原文地址:https://www.cnblogs.com/guoxiaoyu/p/17659686.html
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号