【操作系统】总结

news2024/11/20 6:34:49

依旧是小林coding 的内容

存储架构

现代 CPU 都是多核心的,线程可能在不同 CPU 核心来回切换执行,这对 CPU Cache 不是有利的,虽然 L3 Cache 是多核心之间共享的,但是 L1 和 L2 Cache 都是每个核心独有的,如果一个线程在不同核心来回切换,各个核心的缓存命中率就会受到影响,可以采用绑核的操作使该线程只在该核上运行提高命中率。

在这里插入图片描述

MESI 协议

对于多核cpu ,访问内存会存在数据不一致的情况。mesi 给cache line 提供了四种状态。
在这里插入图片描述
伪共享
这种因为多个线程同时读写同一个 Cache Line 的不同变量时,而导致 CPU Cache 失效的现象称为伪共享(False Sharing)。可以声明数据不在同一个cache line避免频繁被锁。

软中断

那 Linux 系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分成了两个阶段,分别是「上半部和下半部分」。

上半部用来快速处理中断,一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。
下半部用来延迟处理上半部未完成的工作,一般以「内核线程」的方式运行。

Linux 中的软中断包括网络收发、定时、调度、RCU 锁等各种类型,可以通过查看 /proc/softirqs 来观察软中断的累计中断次数情况,如果要实时查看中断次数的变化率,可以使用 watch -d cat /proc/softirqs 命令。

每一个 CPU 都有各自的软中断内核线程,我们还可以用 ps 命令来查看内核线程,一般名字在中括号里面到,都认为是内核线程。

如果在 top 命令发现,CPU 在软中断上的使用率比较高,而且 CPU 使用率最高的进程也是软中断 ksoftirqd 的时候,这种一般可以认为系统的开销被软中断占据了。这时我们就可以分析是哪种软中断类型导致的,一般来说都是因为网络接收软中断导致的,如果是的话,可以用 sar 命令查看是哪个网卡的有大量的网络包接收,再用 tcpdump 抓网络包,做进一步分析该网络包的源头是不是非法地址,如果是就需要考虑防火墙增加规则,如果不是,则考虑硬件升级等。

内存管理

Linux 内存主要采用的是页式内存管理

Linux 系统中的每个段都是从 0 地址开始的整个 4GB 虚拟空间(32 位环境下),段只被用于访问控制和内存保护。
在这里插入图片描述

虚拟内存作用

第一,虚拟内存可以使得进程对运行内存超过物理内存大小,因为程序运行符合局部性原理,CPU 访问内存会有很明显的重复访问的倾向性,对于那些没有被经常使用到的内存,我们可以把它换出到物理内存之外,比如硬盘上的 swap 区域。
第二,由于每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的。进程也没有办法访问其他进程的页表,所以这些页表是私有的,这就解决了多进程之间地址冲突的问题。
第三,页表里的页表项中除了物理地址之外,还有一些标记属性的比特,比如控制一个页的读写权限,标记该页是否存在等。在内存访问方面,操作系统提供了更好的安全性。

malloc 是如何分配内存的?

  • 方式一:通过 brk() 系统调用从堆分配内存
    如果用户分配的内存小于 128 KB,则通过 brk() 申请内存;
    malloc 通过 brk() 方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在 malloc 的内存池中,待下次使用;
  • 方式二:通过 mmap() 系统调用在文件映射区域分配内存;
    如果用户分配的内存大于 128 KB,则通过 mmap() 申请内存;
    malloc 通过 mmap() 方式申请的内存,free 释放内存的时候,会把内存归还给操作系统,内存得到真正的释放

操作系统申请内存,是要通过系统调用的,进入内核态的,再回到用户态。运行态的切换会耗费不少时间。申请内存的操作应该避免频繁的系统调用,如果都用 mmap 来分配内存,等于每次都要执行系统调用。mmap 分配的内存每次释放的时候,都会归还给操作系统,于是每次 mmap 分配的虚拟地址都是缺页状态的,然后在第一次访问该虚拟地址的时候,就会触发缺页中断。

在这里插入图片描述

回收内存

回收的方式主要是两种:直接内存回收和后台内存回收。

  • 后台内存回收(kswapd):在物理内存紧张的时候,会唤醒 kswapd 内核线程来回收内存,这个回收内存的过程异步的,不会阻塞进程的执行。
  • 直接内存回收(direct reclaim):如果后台异步回收跟不上进程内存申请的速度,就会开始直接回收,这个回收内存的过程是同步的,会阻塞进程的执行。

文件页(File-backed Page):内核缓存的磁盘数据(Buffer)和内核缓存的文件数据(Cache)都叫作文件页。大部分文件页,都可以直接释放内存,以后有需要时,再从磁盘重新读取就可以了。而那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),就得先写入磁盘,然后才能进行内存释放。所以,回收干净页的方式是直接释放内存,回收脏页的方式是先写回磁盘后再释放内存。

匿名页(Anonymous Page):这部分内存没有实际载体,不像文件缓存有硬盘文件这样一个载体,比如堆、栈数据等。这部分内存很可能还要再次被访问,所以不能直接释放内存,它们回收的方式是通过 Linux 的 Swap 机制,Swap 会把不常访问的内存先写到磁盘中,然后释放这些内存,给其他更需要的进程使用。再次访问这些内存时,重新从磁盘读入内存就可以了

文件页的回收:对于干净页是直接释放内存,这个操作不会影响性能,而对于脏页会先写回到磁盘再释放内存,这个操作会发生磁盘 I/O 的,这个操作是会影响系统性能的。
匿名页的回收:如果开启了 Swap 机制,那么 Swap 机制会将不常访问的匿名页换出到磁盘中,下次访问时,再从磁盘换入到内存中,这个操作是会影响系统性能的。

文件页和匿名页的回收都是基于 LRU 算法,也就是优先回收不常访问的内存。回收内存的操作基本都会发生磁盘 I/O 的,如果回收内存的操作很频繁,意味着磁盘 I/O 次数会很多,这个过程势必会影响系统的性能。

解决方式
  • 设置 /proc/sys/vm/swappiness,调整文件页和匿名页的回收倾向,尽量倾向于回收文件页;
  • 设置 /proc/sys/vm/min_free_kbytes,调整 kswapd 内核线程异步回收内存的时机;
  • 设置 /proc/sys/vm/zone_reclaim_mode,调整 NUMA 架构下内存回收策略,建议设置为 0,这样在回收本地内存之前,会在其他 Node 寻找空闲内存,从而避免在系统还有很多空闲内存的情况下,因本地 Node 的本地内存不足,发生频繁直接内存回收导致性能下降的问题

在经历完直接内存回收后,空闲的物理内存大小依然不够,那么就会触发 OOM 机制,OOM killer 就会根据每个进程的内存占用情况和 oom_score_adj 的值进行打分,得分最高的进程就会被首先杀掉。

我们可以通过调整进程的 /proc/[pid]/oom_score_adj 值,来降低被 OOM killer 杀掉的概率。

在这里插入图片描述
在这里插入图片描述

文件管理

Linux 文件系统会为每个文件分配两个数据结构:索引节点(index node)和目录项(directory entry),它们主要用来记录文件的元信息和目录层次结构。

索引节点,也就是 inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以索引节点同样占用磁盘空间。

目录项,也就是 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存。

设备管理

在这里插入图片描述

直接内存访问

在进行 I/O 设备和内存的数据传输的时候,数据搬运的工作全部交给 DMA 控制器,而 CPU 不再参与任何与数据搬运相关的事情,这样 CPU 就可以去处理别的事务
在这里插入图片描述

零拷贝

核心在于减少【用户态和内核态的上下文切换】 和 内存拷贝的次数
传统数据传输共发生了 4 次用户态与内核态的上下文切换,因为发生了两次系统调用,一次是 read() ,一次是 write(),每次系统调用都得先从用户态切换到内核态,等内核完成任务后,再从内核态切换回用户态。
其次,还发生了 4 次数据拷贝,其中两次是 DMA 的拷贝,另外两次则是通过 CPU 拷贝的。

  • 第一次拷贝,把磁盘上的数据拷贝到操作系统内核的缓冲区里,这个拷贝的过程是通过 DMA 搬运的。
  • 第二次拷贝,把内核缓冲区的数据拷贝到用户的缓冲区里,于是我们应用程序就可以使用这部分数据了,这个拷贝到过程是由 CPU 完成的。
  • 第三次拷贝,把刚才拷贝到用户的缓冲区里的数据,再拷贝到内核的 socket 的缓冲区里,这个过程依然还是由 CPU 搬运的。
  • 第四次拷贝,把内核的 socket 缓冲区里的数据,拷贝到网卡的缓冲区里,这个过程又是由 DMA 搬运的。
mmap + write

mmap() 系统调用函数会直接把内核缓冲区里的数据「映射」到用户空间,这样,操作系统内核与用户空间就不需要再进行任何的数据拷贝操作。

应用进程调用了 mmap() 后,DMA 会把磁盘的数据拷贝到内核的缓冲区里。接着,应用进程跟操作系统内核「共享」这个缓冲区;
应用进程再调用 write(),操作系统直接将内核缓冲区的数据拷贝到 socket 缓冲区中,这一切都发生在内核态,由 CPU 来搬运数据;
最后,把内核的 socket 缓冲区里的数据,拷贝到网卡的缓冲区里,这个过程是由 DMA 搬运的。

sendfile

替代前面的 read() 和 write() 这两个系统调用,这样就可以减少一次系统调用,也就减少了 2 次上下文切换的开销。
该系统调用,可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里,不再拷贝到用户态,这样就只有 2 次上下文切换,和 3 次数据拷贝。
在这里插入图片描述

大文件传输

文件传输过程,其中第一步都是先需要先把磁盘文件数据拷PageCache。
但是,在传输大文件(GB 级别的文件)的时候,PageCache 会不起作用,那就白白浪费 DMA 多做的一次数据拷贝,造成性能的降低,即使使用了 PageCache 的零拷贝也会损失性能

在高并发的场景下,针对大文件的传输的方式,应该使用「异步 I/O + 直接 I/O」来替代零拷贝技术。

直接 I/O 应用场景常见的两种:

  • 应用程序已经实现了磁盘数据的缓存,那么可以不需要 PageCache 再次缓存,减少额外的性能损耗。
  • 传输大文件的时候,由于大文件难以命中 PageCache 缓存,而且会占满 PageCache 导致「热点」文件无法充分利用缓存,从而增大了性能开销,因此,这时应该使用直接 I/O。

PageCache 优势

  • 内核的 I/O 调度算法会缓存尽可能多的 I/O 请求在 PageCache 中,最后「合并」成一个更大的 I/O 请求再发给磁盘,这样做是为了减少磁盘的寻址操作;
  • 内核也会「预读」后续的 I/O 请求放在 PageCache 中,一样是为了减少对磁盘的操作;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMWare安装windows7虚拟机提示Operating System not found

前提:下载windows7 Gost并创建虚拟机,启动报错:Operating System not found 解决办法 用微PE工具制作iso系统,对虚拟机进行分区 下载地址:https://www.wepe.com.cn/ 制作方法,双击安装程序,选…

最困难的也是最简单的,做好这两点不盈利天理难容

投资者应该时刻记住,在外汇交易中复杂的方法并不总是最好的。Forexclub发现交易中最困难的是正确识别进场点和出场点。 从技术上来说,进入交易是非常容易的,你只需要点击一个按钮,你就在那里交易。但是你会从中获利吗?没人能回答…

【Linux Network】网络编程套接字(代码练习)—UDP

目录 1. 常用接口 2. C/S 回声模拟 3. C/S myshell 的制作 Linux网络编程✨ 1. 常用接口 socket:创建套接字: // 创建 socket 文件描述符 int socket(int domain, int type, int protocol); 返回值: 套接字创建成功返回一个文件描述符 &…

GAMMA电源维修直流高压电源模块RR300-1P

美国GAMMA高压电源维修参数(RR分离式): 输入:220VAC 或 380VAC(视型号而定) 输出电压:550KV,功率:0-10KW或定制 纹波率0.01 ;稳定度0.01/1H 控制部分19英…

(只需两步)让ChatGPT帮你制作出漂亮的PPT

目录 第一步:生成 PPT 代码 第二步:将代码转化为 PPT 还在为制作PPT而烦恼吗? 让ChatGPT来帮您! 本篇文章介绍如何利用ChatGPT一键生成PPT文字和样式,省时省力又专业! (真的只需两步&#xf…

案例实践|云智慧ITSM产品在利星行汽车的运维实践

ITSM(信息技术服务管理)是一种以客户为中心的方法,旨在提高信息技术的效率和效果。在传统零售行业,ITSM可以帮助连锁零售企业提升客户服务水平,通过IT服务台提供快速响应和解决客户的问题和需求。同时, ITS…

PSP - 配置 AlphaFold2 的高效运行环境

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130560538 AlphaFold2 是由 DeepMind 开发,可以根据蛋白质的氨基酸序列预测其三维结构,准确度经常可以与实验相媲美。DeepMind 和 EMBL 的欧洲生物信息学研…

最新的Ubuntu20安装配置Nagios教程

首先声明,盗帖可耻,我发现有人把我文章复制到百度文库,并设置vip下载,直接照搬别人的还牟利,恶心!!! 目录 一、简介 二、安装配置 1、安装Nagios以及相关插件 a、安装Nagios核心…

Blender渲染动画太慢怎么办?用云渲染啊!

1995 年,荷兰开发者 Ton Roosendaal 开发了三维制作软件 Blender ,这是一款功能强大的 3D 创建工具,用于创建 3D 图形、交互式 3D 应用程序、视频游戏、虚拟现实视频和动画。它自 2002 年以来一直作为开源软件提供,可在 macOS、Li…

嵌入式基础测试手册——基于NXP iMX6ULL开发板(3)

前 言 本文档适用开发环境: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.1.0 Linux开发环境:Ubuntu18.04.4 64bit U-Boot:U-Boot-2020.04 Kernel:Linux-5.4.70 Linux SDK:5.4.70_2.3.0 基于测试板卡:创龙科技TLIMX6U-EVM是一款基于NXP…

Gradio的web界面演示与交互机器学习模型,主要特征《2》

上一篇文章是介绍了安装与使用,Gradio的web界面演示与交互机器学习模型,安装和使用《1》 了解到这个gradio,真是个贴心的产品,接下来更多的关注一些重要的细节特征,让我们去更完善和熟练的使用它。 1、简单计算器的示…

Netty基础(三)

1.Netty模型 1.1.工作原理示意图1-简单版 Netty主要基于主从Reactors多线程模型(如图)做了一定的改进,其中主从Reactor多线程模型有多个Reactor; 说明: ①.BossGroup线程池中的线程维护了Selector,只关注Accecpt事件; ②.当接收到Accept事件,获取到连接对应的SocketChannel…

数据结构入门--栈和队列

栈 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一段为栈顶,另一端为栈底。栈中元素遵循后进先出LIFO(Last In First Out)原则。 压栈:栈的插…

玄子Share - 2023.1 IDEA 部署Web项目

玄子Share - 2023.1 IDEA 部署Web项目 创建项目 IDEA 2023 创建Jakarta EE项目 模板:选择使用 Web 应用程序 应用程序服务器:选择安装的 Tomcat 第一次创建项目可能识别不到 Tomcat 需要手动添加 Tomcat 服务器 设置 Tomcat 主目录为 Tomcat 的安装路径…

给httprunnermanager接口自动化测试平台加点功能(二)

文章目录 一、背景1.1、新增字段1.2、简化流程1.3、举一反三 二、总结 一、背景 继续前面的功能改造,这回又是什么需求呢?在编写测试用例的时候,咱们有看到列表有作者名称,也就是说,可以在用例列表就可以知道这条用例是…

网络数据包丢失监控

什么是网络数据包 数据包或网络数据包是通过网络传输的小数据单元。顾名思义,这些是小的、离散的数据单元。单独来看,这些单位不一定有多大意义。它们只是正在传输的整体消息的一部分,这些消息已被组装成多个层。但是,当组合在一…

人工智能前景

人工智能AI的未来非常广阔和光明。随着科技的不断发展和普及,人工智能已经开始逐渐融入我们生活的方方面面,比如智能家居、智能医疗、无人驾驶等等。未来,随着更多的应用场景被开拓和挖掘,人工智能的应用范围将会越来越广泛&#…

Word控件Spire.Doc 【打印】教程(3):如何在自定义纸张尺寸上打印 Word—C#/VB.NET

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

B、B+、红黑树、AVL树的对比

主要来自 小林coding https://mp.weixin.qq.com/s/AoPq8poENF9T4mVS1fDFPw# 怎样的索引的数据结构是好的? MySQL 的数据是持久化的,意味着数据(索引记录)是保存到磁盘上的,因为这样即使设备断电了,数据也…

SpringBoot自动配置原理解析

​ SpringBoot的主旨是约定大于配置,开发项目初期阶段,我们不需要做过多的配置,SpringBoot已经帮我们自动配置好了大部分的内容,比如仲裁依赖机制,自动引入需要的依赖,自动配置等内容。让我们能够将更多的精…