首页 > 系统相关 >揭秘操作系统内核:深入浅出进程阻塞与唤醒

揭秘操作系统内核:深入浅出进程阻塞与唤醒

时间:2024-03-14 10:29:19浏览次数:23  
标签:深入浅出 揭秘 空间 线程 内存 进程 CPU 内核

一、进程与线程

        操作系统要运行一个可执行的程序,首先要将程序文件加载到内存,然后CPU去读取和执行这些指令,而一个进程就是“一次程序执行的过程”,内核会给每一个进程创建一个名为task_struct 的数据结构,而内核也是一段程序,系统启动时就被加载到了内存中。

        进程在运行过程中要访问内存,而物理内存是有限的,比如内存只有 8GB,那怎么把有限的内存分给不同的进程使用呢?

        跟 CPU 的分时共享一样,内存也是共享的,Linux 给每个进程虚拟出一块很大的地址空间,比如 32 位机器上进程的虚拟内存地址空间是 4GB,从 0x00000000 到 0xFFFFFFFF。但这 4GB 并不是真实的物理内存,而是进程访问到了某个虚拟地址,如果这个地址还有对应的物理内存页,就会产生缺页中断,分配物理内存,MMU(内存管理单元)会将虚拟地址与物理内存页的映射关系保存在页表中,再次访问这个虚拟地址,就能找到相应的物理内存页。每个进程的4G虚拟地址空间如图:

        当物理内存不足时,Linux 会使用交换空间(Swap Space)作为临时的延伸存储。不活跃的进程的部分或全部内存页面会被换出到磁盘上的交换空间,以便为活动进程腾出物理内存。

        Linux 内核采用页面替换算法(如最近最少使用 LRU 等)来决定哪些内存页面应当被换出至交换空间。当需要恢复已被换出的页面时,内核会将其从交换空间读回物理内存。

        如上图,总体的虚拟地址空间分为用户空间和内核空间,低地址上的3GB属于用户空间,高地址的1GB是内核空间。这时基于安全考虑,用户程序只能访问用户空间内核程序可以访问怎么进程空间,并且只有内核可以直接访问各种硬件资源,比如磁盘和网卡等。

        那用户程序需要访问这些硬件资源怎么办呢?答案是通过系统调用,系统调用可以理解为内核实现的函数,比如应用程序要通过网卡接收数据,会调用 Socket 的 read 函数:

ssize_t read(int fd,void *buf,size_t nbyte)

        CPU 在执行系统调用的过程中会从用户态切换到内核,CPU 在用户态下执行用户程序,使用的是用户空间的栈,访问用户空间内存。当 CPU 切换到内核态后,执行内核代码,使用的是内核空间的栈。

        从上图看到,用户空间从低到高依次是代码区、数据区、堆、共享库与mmap内存映射区、栈、环境变量。其中堆向高地址增长,栈向低地址增长。

        请注意用户空间上还有一个共享库和 mmap 映射区,Linux 提供了内存映射函数 mmap,他可以将文件内容映射到这个内存区域,用户通过读写这段内存,从而实现对文件的读取和修改,无需通过 read/write 系统调用来读写文件,省去了用户空间和内核空间之间的数据拷贝,Java 的MappedByteBuffer 就是通过它来实现的,用户程序用到的系统共享库也是通过 mmap 映射到这个区域。

        开始提到的 task_struct 的结构体本身是分配在内核空间,它的 vm_struct 成员变量保存了各内存区域的起始和终止地址,此外 task_struct 中还保存了进程的其他信息,比如进程号、打开的文件、创建的 socket 以及 CPU 运行的上下文等。

        在 Linux 中,现成是一个轻量级的进程,轻量级说的是线程只是一个 CPU 调度单元,因此线程有自己的 task_struct 结构体和运行栈区,但是线程的其他资源都是跟父进程共用的,比如虚拟地址空间、打开的文件和 Socket 等。

二、阻塞和唤醒

        当用户线程发起一个阻塞 read 调用,数据未就绪时,线程就会阻塞,那阻塞具体是如何实现的呢?

        Linux 内核将线程当做一个进程进行 CPU 调度,内核维护了一个可运行的的进程队列,所有处于 TASK_RUNNING 状态的进程都会被放入运行队列中,本质是用双向链表将 task_struct 链接起来,排队使用 CPU 时间片,时间片用完重新调度 CPU。所谓调度就是在可运行进程列表中选择一个进程,再从 CPU 列表中选择一个可用的 CPU,将进程的上下文恢复到这个 CPU 寄存器中,然后执行进程上下文指定的下一条指令。        

        而阻塞的本质就是将进程 task_struct 移除出运行队列,添加到等待队列,并且将进程的状态设置成 TASK_UNINTERRUPTIBLE 或者 TASK_INTERRUPTIBLE,重新触发一次 CPU 调度让出CPU。

        2.1 线程唤醒

        那线程是怎么唤醒的呢?线程在加入到等待队列的同时向内核注册了一个回调函数,告诉内核我在等待这个 Socket 上的数据,如果数据到了旧唤醒我。这样当网卡接收到数据时,产生硬件中断,内核通过调用回调函数唤醒进程。唤醒的过程就是将进程的 task_struct 从等待队列移到运行队列。并且将 task_struct 的状态置为 TASK_RUNNING,这样进程就有机会重新获取 CPU 时间片。

        这个过程中,内核还会将数据从内核空间拷贝到用户空间的堆上。

        当 read 系统调用返回时,CPU 又从内核态切换到用户态,继续执行 read 调用的下一行代码,并且能从用户空间上的 Buffer 读到数据了。

往期经典推荐

SpringBoot开箱即用魔法:深度解析与实践自定义Starter-CSDN博客

一文看懂Nacos如何实现高效、动态的配置中心管理-CSDN博客

SpringBoot项目并发处理大揭秘,你知道它到底能应对多少请求洪峰?_springboot并发处理-CSDN博客

Redis高性能的秘密原来在这,超越想象-CSDN博客

TiDB内核解密:揭秘其底层KV存储引擎如何玩转键值对-CSDN博客

标签:深入浅出,揭秘,空间,线程,内存,进程,CPU,内核
From: https://blog.csdn.net/qq_39209927/article/details/136622997

相关文章

  • Linux内核编译(版本6.0以及版本v0.01)并用qemu驱动
    系统环境:ubuntu-22.04.1-desktop-amd64目标平台:x86i386内核版本:linux-6.0.1linux-0.0.1环境配置修改root密码sudopasswd修改软件源(非必要)vmtools安装(实现win-linux软件互传)安装一些必须的软件:sudoaptinstallbuild-essentialopenssh-servervimnet-toolsgc......
  • 揭秘ChatGPT的Prompt方法:原理与应用总结
    简介在自然语言处理和人工智能领域,ChatGPT(GenerativePre-trainedTransformer)无疑是一项令人印象深刻的技术。其出色的语言生成能力使得它成为各种应用场景下的热门选择,如聊天机器人、智能助手等。其中,ChatGPT的Prompt方法是其成功的关键之一。本文将深入探讨ChatGPT的Prompt方......
  • 【专业揭秘】一键搞定自动点赞关注,提升社交效率的神器来了!
    在数字时代,社交媒体已经成为我们生活的一部分。随之而来的自动化工具也不断涌现,其中自动点赞、自动关注和自动评论工具受到了广泛关注。这类工具通常通过模拟人类用户的行为来增加账户的互动性和可见度。这些自动化工具的工作机制并不复杂。它们通过预设的脚本或算法,自动执行......
  • 深入浅出Java多线程(十二):线程池
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十二篇内容:线程池。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代软件开发中,多线程编程已经成为应对高并发、高性能场景的必备技术。随着计算机硬件的发展,尤其是多核CPU的普及,利用多线程能够......
  • 智能迷惑行为揭秘:AI时代的隐形游戏
    人工智能迷惑行为大赏随着ChatGPT热度的攀升,越来越多的公司也相继推出了自己的AI大模型,如文心一言、通义千问等。各大应用也开始内置AI玩法,如抖音的AI特效~在使用过程中往往会遇到一些问题,让你不得不怀疑,这真的是人工智能吗?来分享一下人工智能的迷惑瞬间吧!方向一:人工智能的......
  • AI迷惑行为揭秘:如何辨别真实与虚假
    人工智能迷惑行为大赏人工智能迷惑行为大赏是一个有趣的概念,它可以用来探讨和概括人工智能系统中的一些迷惑行为。然而,作为一个AI模型,我必须强调以下几点:首先,人工智能是根据数据和算法进行训练和学习的,它不能有意识地产生迷惑行为。任何看似迷惑的行为往往是由于数据的输......
  • 互联网风控揭秘:打造核心指标体系
    一、互联网业务风控的业务范围风控其实是一个很大的概念,"风控入门指南"系列文章,关注互联网业务风控。具体包括,账号风控、营销反作弊、支付风控、广告反作弊、内容风控等场景的风险管控。各场景风险项如下:风险场景风险类型账号风控批量注册、晒号、养号、撞库营销反作弊薅羊......
  • JAVA系统源码中的AI智能绘画生成技术揭秘
    在数字化时代,人工智能(AI)已经逐渐渗透到我们生活的方方面面,从智能语音助手到自动驾驶汽车,无不体现出AI技术的强大魅力。而在艺术领域,AI同样展现出了惊人的创造力。近期,一项融入JAVA系统源码的AI智能绘画生成技术引起了广泛关注。这项技术究竟有何神奇之处?让我们一起来揭秘。一......
  • 揭秘Docker镜像:概念、原理、特性的全方位解读与实战常用命令解析
    在当今的云原生时代,Docker凭借其轻量级容器技术彻底改变了软件交付和部署的方式。而Docker镜像作为容器的基石,其背后的奥秘和实际应用更是值得我们深入探讨。本文将全面解析Docker镜像的概念、底层原理、独特特性以及日常运维中常用的命令,让您对Docker镜像有更深层次的理解与掌......
  • 揭秘Google Gemini:AI界的多模态革命者与ChatGPT-4的较量
    在人工智能的快速发展浪潮中,GoogleDeepMind的最新力作——Gemini,以其多模态的超凡能力,正引领着AI技术的新一轮革命。本文将深入探讨Gemini的核心特性、不同版本的特点,以及它与ChatGPT-4的对比优势和差异。一、Gemini简介AI的新纪元GoogleGemini,作为DeepMind的旗舰产......