牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万(上)

简介: 牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万

image.png

Linux内核成神笔记:200+经典内核文章,100+内核论文,50+内核项目,500+内核面试题,80+内核视频
知乎首发地址: https://zhuanlan.zhihu.com/p/635315467(欢迎大家观看)

一,前言


Linux内核是一个操作系统(OS)内核,本质上定义为类Unix。它用于不同的操作系统,主要是以不同的Linux发行版的形式。Linux内核是第一个真正完整且突出的免费和开源软件示例。Linux 内核是第一个真正完整且突出的免费和开源软件示例,促使其广泛采用并得到了数千名开发人员的贡献。


Linux 内核由芬兰赫尔辛基大学的学生 Linus Torvalds 于 1991 年创建。随着程序员调整其他自由软件项目的源代码以扩展内核的功能,它迅速取得了进展。Torvalds 首先使用 80386 汇编语言编写的任务切换器以及终端驱动程序,然后将其发布到 Comp.os.minix Usenet 组。它很快被 Mini社区所改编,为该项目提供了见解和代码。


Linux 内核越来越受欢迎,因为 GNU 自己的内核 GNU Hurd 不可用且不完整,而 Berkeley Software DistribuTIon(BSD)操作系统仍然受到法律问题的困扰。在开发人员社区的帮助下,Linux 0.01 于 1991 年 9 月 17 日发布。


【文章福利】小编推荐自己的Linux内核技术交流群:【】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100名进群领取,额外赠送一份价值699的内核资料包(含视频教程、电子书、实战项目及代码)

640.png

[内核资料领取,](https://docs.qq.com/doc/DTmFTc29xUGdNSnZ2)  
[Linux内核源码学习地址。](https://ke.qq.com/course/4032547?flowToken=1044435)


想知道什么是 Linux 内核上真正的(不是那种时髦的)创新吗?


在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux 内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大物。


撇开营销和模式不谈,Linux 可以说是开源世界中最受欢迎的内核,它在近 30 年的生命时光当中引入了一些真正的规则改变者。


Cgroups(2.6.24)


早在 2007 年,Paul Menage 和 Rohit Seth 就在内核中添加了深奥的控制组(cgroups)功能(cgroups 的当前实现是由 Tejun Heo 重写的)。这种新技术最初被用作一种方法,从本质上来说,是为了确保一组特定任务的服务质量。


例如,你可以为与你的 WEB 服务相关联的所有任务创建一个控制组定义(cgroup),为例行备份创建另一个 cgroup ,再为一般操作系统需求创建另一个 cgroup。然后,你可以控制每个组的资源百分比,这样你的操作系统和 WEB 服务就可以获得大部分系统资源,而你的备份进程可以访问剩余的资源。


然而,cgroups 如今变得这么著名是因其作为驱动云技术的角色:容器。事实上,cgroups 最初被命名为进程容器。当它们被 LXC、CoreOS 和 Docker 等项目采用时,这并不奇怪。


就像闸门打开后一样,“容器” 一词就像成为了 Linux 的同义词一样,微服务风格的基于云的“应用”概念很快成为了规范。如今,已经很难摆脱 cgroups 了,它们是如此普遍。每一个大规模的基础设施(如果你运行 Linux 的话,可能还有你的笔记本电脑)都以一种合理的方式使用了 cgroups,这使得你的计算体验比以往任何时候都更加易于管理和灵活。


例如,你可能已经在电脑上安装了 Flathub 或 Flatpak,或者你已经在工作中使用 Kubernetes 和/或 OpenShift。不管怎样,如果“容器”这个术语对你来说仍然模糊不清,则可以 通过 Linux 容器从背后获得对容器的实际理解。


LKMM(4.17)


2018 年,Jade Alglave、Alan Stern、Andrea Parri、Luc Maranget、Paul McKenney 以及其他几个人的辛勤工作的成果被合并到主线 Linux 内核中,以提供正式的内存模型。Linux 内核内存[一致性]模型(LKMM)子系统是一套描述 Linux 内存一致性模型的工具,同时也产生用于测试的用例(特别命名为 klitmus)。


随着系统在物理设计上变得越来越复杂(增加了更多的中央处理器内核,高速缓存和内存增长,等等),它们就越难知道哪个中央处理器需要哪个地址空间,以及何时需要。例如,如果 CPU0 需要将数据写入内存中的共享变量,并且 CPU1 需要读取该值,那么 CPU0 必须在 CPU1 尝试读取之前写入。类似地,如果值是以一种顺序方式写入内存的,那么期望它们也以同样的顺序被读取,而不管哪个或哪些 CPU 正在读取。


即使在单个处理器上,内存管理也需要特定的任务顺序。像 x = y 这样的简单操作需要处理器从内存中加载 y 的值,然后将该值存储在 x 中。在处理器从内存中读取值之前,是不能将存储在 y 中的值放入 x 变量的。此外还有地址依赖:x[n] = 6 要求在处理器能够存储值 6 之前加载 n。


LKMM 可以帮助识别和跟踪代码中的这些内存模式。它部分是通过一个名为 herd 的工具来实现的,该工具(以逻辑公式的形式)定义了内存模型施加的约束,然后列举了与这些约束一致性的所有可能的结果。


低延迟补丁(2.6.38)


很久以前,在 2011 年之前,如果你想在 Linux 上进行多媒体工作,你必须得有一个低延迟内核。这主要适用于录音时添加了许多实时效果(如对着麦克风唱歌和添加混音,以及在耳机中无延迟地听到你的声音)。有些发行版,如 Ubuntu Studio,可靠地提供了这样一个内核,所以实际上这没有什么障碍,这只不过是当艺术家选择发行版时的一个重要提醒。


然而,如果你没有使用 Ubuntu Studio,或者你需要在你的发行版提供之前更新你的内核,你必须跳转到 rt-patches 网页,下载内核补丁,将它们应用到你的内核源代码,编译,然后手动安装。


后来,随着内核版本 2.6.38 的发布,这个过程结束了。Linux 内核突然像变魔术一样默认内置了低延迟代码(根据基准测试,延迟至少降低了 10 倍)。不再需要下载补丁,不用编译。一切都很顺利,这都是因为 Mike Galbraith 编写了一个 200 行的小补丁。


对于全世界的开源多媒体艺术家来说,这是一个规则改变者。从 2011 年开始事情变得如此美好,到 2016 年我自己做了一个挑战,在树莓派 v1(型号 B)上建造一个数字音频工作站(DAW),结果发现它运行得出奇地好。


RCU(2.5)


RCU,即 读-拷贝-更新(Read-Copy-Update),是计算机科学中定义的一个系统,它允许多个处理器线程从共享内存中读取数据。它通过延迟更新但也将它们标记为已更新来做到这一点,以确保数据读取为最新内容。实际上,这意味着读取与更新同时发生。


典型的 RCU 循环有点像这样:


  • 删除指向数据的指针,以防止其他读操作引用它。
  • 等待读操作完成它们的关键处理。
  • 回收内存空间。


将更新阶段划分为删除和回收阶段意味着更新程序会立即执行删除,同时推迟回收直到所有活动读取完成(通过阻止它们或注册一个回调以便在完成时调用)。


虽然 RCU 的概念不是为 Linux 内核发明的,但它在 Linux 中的实现是该技术的一个定义性的例子。


对于 Linux 内核创新的问题的最终答案永远是协作。你可以说这是一个好时机,也可以称之为技术优势,称之为黑客能力,或者仅仅称之为开源,但 Linux 内核及其支持的许多项目是协作与合作的光辉范例。


它远远超出了内核范畴。各行各业的人都对开源做出了贡献,可以说都是因为 Linux 内核。Linux 曾经是,现在仍然是自由软件的主要力量,激励人们把他们的代码、艺术、想法或者仅仅是他们自己带到一个全球化的、有生产力的、多样化的人类社区中。


你最喜欢的创新是什么?


这个列表偏向于我自己的兴趣:容器、非统一内存访问(NUMA)和多媒体。无疑,列表中肯定缺少你最喜欢的内核创新。在评论中告诉我。


1.1内核在操作系统中的位置


为了更具象地理解内核,不妨将Linux计算机想象成有三层结构:


  1. 硬件:物理机(这是系统的底层结构或基础)是由内存(RAM)、处理器(或 CPU)以及输入/输出(I/O)设备(例如存储、网络和图形)组成的。其中,CPU 负责执行计算和内存的读写操作。
  2. Linux 内核:操作系统的核心。(没错,内核正处于核心的位置)它是驻留在内存中的软件,用于告诉 CPU 要执行哪些操作。
  3. 用户进程:这些是内核所管理的运行程序。用户进程共同构成了用户空间。用户进程有时也简称为进程。内核还允许这些进程和服务器彼此进行通信(称为进程间通信或 IPC)。


系统执行的代码在CPU上以以下两种模式之一运行:内核模式或用户模式。运行在内核态的代码可以不受限制地访问硬件,而用户态会限制SCI对CPU和内存的访问。内存也有类似的分离(内核空间和用户空间)。这两个小细节构成了一些复杂操作的基础,比如安全保护,构建容器和虚拟机的权限分离。


这也意味着,如果进程在用户模式下失败,损失是有限且无害的,并且可以由内核修复。另一方面,由于内核进程要访问内存和处理器,内核进程的崩溃可能会导致整个系统的崩溃。因为用户进程之间会有适当的保护措施和权限要求,所以一个进程的崩溃通常不会造成太多问题。


此外,由于Linux内核在实时补丁期间可以连续工作,因此在应用补丁进行安全修复时不会出现宕机。


1.2Linux 内核的作用是什么?


内容有以下四项作用:


  1. 内存管理:追踪记录有多少内存存储了什么以及存储在哪里
  2. 进程管理:确定哪些进程可以使用中央处理器(CPU)、何时使用以及持续多长时间
  3. 设备驱动程序:充当硬件与进程之间的调解程序/解释程序
  4. 系统调用和安全防护:从流程接受服务请求


正确实现时,内核对用户是不可见的,它在自己的小世界(称为内核空间)中工作,从中分配内存,跟踪所有内容的存储位置。用户看到的东西(比如Web浏览器和文件)叫做用户空间。这些应用程序通过系统调用接口(SCI)与内核交互。


可以这样理解:内核就像一个忙碌的私人助理,为高管(硬件)服务。助理的工作是将员工和公众(用户)的信息和请求(流程)传递给高管,记住存储的内容和位置(内存),并确定谁可以在任何给定的时间访问高管,以及会议时间有多长。


1.3学习Linux内核准备工作:


  1. 熟悉C语言,这个是最基本的
  2. 了解编译连接过程,如果写过ld、lcf类的链接文件最好,这样就能理解类似percpu变量的实现方法
  3. 学过或者自学过计算机组成原理或者微机原理,知道smp、cpu、cache、ram、hdd、bus的概念,明白中断、dma、寄存器,这样才能理解所谓的上下文context、barrier是什么


Linux内核的特点:结合了unix操作系统的一些基础概念


640.jpg

Linux内核的任务:


  • 1.从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
  • 2.从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。在实际工作中内核抽象了相关细节。
  • 3.内核是一个资源管理程序。负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。
  • 4.内核就像一个库,提供了一组面向系统的命令。系统调用对于应用程序来说,就像调用普通函数一样。


内核实现策略:


1.微内核。最基本的功能由中央内核(微内核)实现。所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。


2.宏内核。内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。内核中的每一个函数都可以访问到内核中所有其他部分。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。


哪些地方用到了内核机制?


  • 1.进程(在cpu的虚拟内存中分配地址空间,各个进程的地址空间完全独立;同时执行的进程数最多不超过cpu数目)之间进行通 信,需要使用特定的内核机制。
  • 2.进程间切换(同时执行的进程数最多不超过cpu数目),也需要用到内核机制。
  • 进程切换也需要像FreeRTOS任务切换一样保存状态,并将进程置于闲置状态/恢复状态。
  • 3.进程的调度。确认哪个进程运行多长的时间。

Linux进程


  • 1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init进程是进程树的根,所有的进程都直接或者间接起源于该进程。
  • 2.通过pstree命令查询。实际上得系统第一个进程是systemd,而不是init(这也是疑问点)
  • 3.系统中每一个进程都有一个唯一标识符(ID),用户(或其他进程)可以使用ID来访问进程。


Linux内核源代码的目录结构


Linux内核源代码包括三个主要部分:


  1. 内核核心代码,包括第3章所描述的各个子系统和子模块,以及其它的支撑子系统,例如电源管理、Linux初始化等
  2. 其它非核心代码,例如库文件(因为Linux内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、KVM(虚拟机技术)等
  3. 编译脚本、配置文件、帮助文档、版权说明等辅助性文件使用ls命令看到的内核源代码的顶层目录结构,具体描述如下。include/ ---- 内核头文件,需要提供给外部模块(例如用户空间代码)使用。

kernel/ ---- Linux内核的核心代码,包含了3.2小节所描述的进程调度子系统,以及和进程调度相关的模块。
mm/ ---- 内存管理子系统(3.3小节)。fs/ ---- VFS子系统(3.4小节)。
net/ ---- 不包括网络设备驱动的网络子系统(3.5小节)。
ipc/ ---- IPC(进程间通信)子系统。
arch// ---- 体系结构相关的代码,例如arm, x86等等。
arch//mach- ---- 具体的machine/board相关的代码。
arch//include/asm ---- 体系结构相关的头文件。
arch//boot/dts ---- 设备树(Device Tree)文件。init/ ---- Linux系统启动初始化相关的代码。
block/ ---- 提供块设备的层次。
sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。
drivers/ ---- 设备驱动(在Linux kernel 3.10中,设备驱动占了49.4的代码量)。lib/ ---- 实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。
crypto/ ----- 加密、解密相关的库函数。
security/ ---- 提供安全特性(SELinux)。
virt/ ---- 提供虚拟机技术(KVM等)的支持。
usr/ ---- 用于生成initramfs的代码。
firmware/ ---- 保存用于驱动第三方设备的固件。samples/ ---- 一些示例代码。
tools/ ---- 一些常用工具,如性能剖析、自测试等。Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。COPYING ---- 版权声明。
MAINTAINERS ----维护者名单。
CREDITS ---- Linux主要的贡献者名单。
REPORTING-BUGS ---- Bug上报的指南。Documentation, README ---- 帮助、说明文档。

二、为什么要学习 Linux 内核


大部分程序员可能永远没有机会开发Linux内核或者驱动Linux,那么我们为什么还需要学习Linux内核呢?


Linux的源代码和架构都是开放的,我们可以学到很多操作系统的概念和实现原理。Linux的设计哲学体系继承了UNIX,现在整个设计体系相当稳定和简化,这是大部分服务器使用Linux的重要原因。


那学习Linux内核的原因就在于此。


进一步了解内核的原理,有助于你更好地使用命令和程序设计,让你的面试和开发更上一层楼。但是不建议直接看源代码,因为Linux代码太大,容易丢失。


而最好的办法是,先了解一下Linux内核机制,知道基本的原理与流程。


不过,Linux内核机制也非常复杂,而且其中互相关联。

640.jpg

比如说,进程运行要分配内存,内存映射涉及文件的关联,文件的读写需要经过块设备,从文件中加载代码才能运行起来进程。这些知识点要反复对照,才能理清。


但是一旦攻克!你会发现Linux这个复杂的系统开始透明起来。


二、如何学习Linux内核?


内核的知识就像下面的绳结一样,一环扣一环,我们要解开它们,就必须要先找到线头也就是内核中的函数接口。初学阶段,我们一般不深入的研究内核代码,会使用内核的接口函数就不错了。


下面提供了如何学习这些内核函数的方法,就像解绳子一样


在我们学习Linux内核之前,我们首先需要掌握以下几点:


(1)如何学习内核,先了解Linux内核由哪些组成?

(2)须知Linux内核源码(下载的链接 )组织结构?

(3)重点需要学习地知识点有哪些?

(4)最后依据我为大家提供的的学习资料,开启我们的Linux内核学习之旅。

(5)全网最牛Linux内核Makefile系统文件详解(纯文字代码)

(6)全网最详细的Intel CPU体系结构分析(内核源码)

(7)深入理解Linux Kernel内核整体架构(图文详解)

(8)QEMU调试Linux内核环境搭建

(9)网友说Linux驱动讲不彻底,原来这才是Linux驱动

(10)一文让你深度了解Linux内核架构和工作原理

(11)从Linux内核看socket底层的本质(IO)

(12)Linux用户空间与内核空间通信(Netlink通信机制)


二,学习资料


(1)系统调用接口【视频讲解】


SCI 层提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。


(2)操作系统原理【视频讲解】


操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。


【 强烈推荐阅读】一文带你彻底了解,零拷贝Zero-Copy技术(图解)


Linux操作系统学习——启动、


Linux操作系统学习——内核运行


Linux操作系统学习——内核初始化


操作系统原理(一):操作系统原理与概述(流程图)


操作系统原理(二):Linux操作系统基础的常用命令


操作系统原理(三):Linux操作系统I/O机制原理(流程图详解)


操作系统原理(四):内存管理RAID磁盘阵列与配置


操作系统原理(五):内存管理之磁盘高速缓存机制原理


操作系统原理(六):存储管理之页式、段式、段页式存储


系统操作原理(七):进程的状态和转换(五态模型)


操作系统原理(八):进程同步的几种方式及基本原理


操作系统原理(九):处理器调度基本准则和实现原理


系统操作原理(十):多进程,多线程,并发执行中的死锁问题


系统操作原理(十一):操作系统原理:进程同步的几种方式及基本原理


系统操作原理(十二):趣谈操作系统原理,存储管理之页式、段式、段页式存储


系统操作原理(十三):操作系统:通过实战理解CPU上下文切换


汇编语言基础(十一):汇编语言基础知识(图文代码)


汇编语言入门(十二):汇编指令入门级整理,这些你必须要知道


汇编语言指令(十三):汇编语言的所有指令总结,一篇就够了


汇编语言进阶(十四):ARM体系结构处理器机制原理与实现


汇编语言进阶(十五):ARM指令集与汇编语言程序设计


(3)内存管理专题【视频讲解】


内核管理的另一个重要资源是内存。为了提高效率,如果虚拟内存由硬件管理,那么内存就按照所谓的内存分页法(大多数架构是4KB)来管理。Linux包括管理可用内存的方式和用于物理和虚拟映射的硬件机制。但是,内存管理需要管理4KB以上的缓冲区。Linux提供了4KB缓冲区的抽象,比如slab分配器。这种内存管理模式以4KB缓冲区为基数,然后从中分配结构,并跟踪内存页面的使用情况,比如哪些页面已满,哪些页面未完全使用,哪些页面为空。这允许该模式根据系统需求动态调整内存使用。为了支持多个用户使用内存,有时会耗尽可用内存。因此,可以将页面移出内存,放入磁盘。这个过程称为交换,因为页面是从内存交换到硬盘的。内存管理的源代码可以在。/linux/mm。


【 强烈推荐阅读】尽情阅读,技术进阶,详解mmap原理


内存是什么?一文让你了解内存是怎么实现的


嵌入式开发必备技能,Linux内核源码组织结构


一文了解Linux内存管理,malloc、free 实现原理


内存管理系列(一):Linux操作系统内存管理(思维导图详解)


内存管理系列(二):Linux内存管理原理知识大总结


内存管理系列(三):学完操作系统内存管理,能回答这8个问题吗?


内存管理系列(四):理解 Memory barrier(内存屏障)


内存管理系列(五):内存回收之LRU链表机制原理


内存管理系列(六):虚拟内存和物理内存机制原理


内存管理系列(七):Malloc缺页中断不同情况处理总结及反向映射RMAP


内存管理系列(八):C/C++开发中的Malloc函数的实现原理


内存管理系列(九):深入理解glibc malloc:内存分配器实现原理


内存管理系列(十):操作系统是如何对内存进行管理的,内存与CPU之间的关系


内存管理系列(十一):为什么Linux需要虚拟内存,虚拟内存对操作系统有哪些作用


内存管理系列(十二):用户态内存内存映射函数Mmap的好处


内存管理系列(十三):内存管理:详解虚拟地址空间-MMU


内存管理系列(十四):C语言中的Malloc/free是如何分配内存的


内存管理系列(十五):从虚拟寻址到开源项目,Linux下的内存管理详解


内存管理系列(十六):一文带你了解,虚拟内存、内存分页、分段、段页式内存管理


内存管理系列(十七):Linux应用程序究竟消耗了多少内存


内存管理系列(十八):虚拟地址到物理地址,是什么时候开始映射


内存管理系列(十九):浅析Linux内存管理中SLAB分配器(源码分析)


内存管理系列(二十):基于Linux内存管理的内存分配(伙伴算法和slab算法)


内存管理系列(二十一):探索内存原理的内存映射文件(图文详解)


内存管理系列(二十二):吊打字节面试官,CPU缓存一致性协议MESI


内存管理系列(二十三):深入理解Linux内核页表映射分页机制原理


内存管理系列(二十四):谈谈物理内存与虚拟内存之间的映射(超详细~)


内存管理系列(二十五):内存管理:C/C++开发中的malloc函数的实现原理


内存管理系列(二十六):熬夜肝翻Linux内存管理所有知识点(图解)


内存管理进阶部分(一):brk/kmalloc/vmalloc系统调用分析


内存管理进阶部分(二):不连续内存分配器原理


内存管理进阶部分(三):页表缓存(TLB)与巨型页


内存管理进阶部分(四):TLB表项格式及管理


内存管理进阶部分(五):ASID原理/VMID原理


内存管理进阶部分(六):处理器对巨型页的支持


内存管理进阶部分(七):标准巨型页原理及查看


内存管理进阶部分(八):LRU算法与反向映射


内存管理进阶部分(九):缺页异常分析


内存管理进阶部分(十):写时复制缺页异常


内存管理进阶部分(十一):do_ page_ fault函教分析


内存管理进阶部分(十二):文件映射缺页中断


内存管理进阶部分(十三):匿名页面缺页异常


内存管理进阶部分(十四):内存反碎片技术


内存管理进阶部分(十五):内存碎片整理算法


内存管理进阶部分(十六):虚拟可移动区域技术原理


内存管理进阶部分(十七):内存检测与死锁检测


内存管理进阶部分(十八):内核调优参数


内存管理进阶部分(十九):/proc/sys/kernel/


内存管理进阶部分(二十):/proc/sys/ vm/


内存管理进阶部分(二十一):/proc/sys/fs/


内存管理进阶部分(二十二):内存屏障与内核互斥原理


内存管理进阶部分(二十三):编译器屏障


内存管理进阶部分(二十四):处理器屏障


内存管理进阶部分(二十五):ARM64处理器内存屏障分析


内存管理进阶部分(二十六):内存与Kasan工具分析


内存管理进阶部分(二十七):五大常见内存访问错误


内存管理进阶部分(二十八):Kasan内核检测工具应用


内存管理进阶部分(二十九):页回收原理机制


内存管理进阶部分(三十):发起页回收


内存管理进阶部分(三十一):计算扫描页数


内存管理进阶部分(三十二):收缩活动页链表


内存管理进阶部分(三十三):回收不活动页


内存管理进阶部分(三十四):页交换与回收slab缓存


内存管理进阶部分(三十五):缓存着色


内存管理进阶部分(三十六):内存缓存数据结构


内存管理进阶部分(三十七):空闲对象链表及着色


内存管理进阶部分(三十八):内核调试方法printk/oops分析


内存管理实战操作(一):SIab块分配器实现


内存管理实战操作(二):进程地址空间在内核(VMA实现)


内存管理实战操作(三):内存池原理及实现


内存管理实战操作(四):perf性能分析工具


内存管理实战操作(五):perf原理机制与安装配置


内存管理实战操作(六):perf采集数据命令-29种工具应用


内存管理实战操作(七):perf采集数据至火焰图分析


(4)进程管理专题【视频讲解】


进程管理的重点是流程的实施。在内核中,这些进程称为线程,代表单个处理器虚拟化(线程代码、数据、堆栈和CPU寄存器)。在用户空间中,通常使用术语进程,但是Linux实现没有区分这两个概念(进程和线程)。内核SCI提供了一个应用程序编程接口(API)来创建一个新的进程(fork,exec或可移植操作系统接口[POSIX]函数),停止进程(kill,exit),并进行通信和同步(signal或POSIX机制)。


进程管理还包括处理活动进程之间共享CPU的需求。内核实现了新的调度算法,无论多少个线程争夺CPU,都可以在固定的时间内运行。这种算法被称为O(1) scheduler,这意味着它调度多个线程所用的时间与调度一个线程所用的时间相同。O(1)调度器也可以支持多处理器(称为对称多处理器或SMP)。您可以在中找到流程管理的源代码。/linux/kernel,以及。/linux/arch。


进程管理系列(一):Linux进程管理原理详解(代码演示)


进程管理系列(二):十分钟让你像大佬一样快速了解进程状态(二种模型)


进程管理系列(三):作为互联网程序员,应该了解Linux进程六种状态吗?


进程管理系列(四):五分钟让你快速了解Linux进程管理实时调度与SMP


进程管理系列(六):浅析Linux的进程优先级(代码演示)


进程管理系列(七):进程管理|浅析C语言中并发同步与原子操作,锁三者是什么关系


进程管理系列(八):进程管理|深入理解Linux进程述符和进程状态


进程管理系列(九):一文读懂Linux内核中的任务间调度策略


进程管理系列(十):Linux内核之进程和线程的创建和派生


进程管理系列(十一):基于Linux有几种进程状态


进程管理系列(十二):操作系统的几种CPU调度策略


进程管理系列(十二):Linux 进程管理之调度和进程切换


进程管理系列(十三):一文搞懂六大进程通信机制原理(全网最详细)


进程管理系列(十四):超详细的Socket通信原理和实例讲解(白嫖走起~)


进程管理系列(十五):这是一份很全很全的IO基础知识与概念


进程管理系列(十六):深入理解Linux内核进程的管理与调度(全知乎最详细)


进程管理基础(十七):Linux内核源码组织结构分析


进程管理基础(十八):Linux内核(五大子系统关系)


进程管理基础(十九):内核源码目录结构详解


进程管理基础(二十):如何快速掌握阅读内核源码方法与技巧


存储器结构与分区存储管理(一):主存储器结构及技术指标


存储器结构与分区存储管理(二):分配策略与分区回收


存储器结构与分区存储管理(三):页表与交换技术


存储器结构与分区存储管理(四):物理内存与虚拟内存


x86_ _ARM处理器架构(一):x86架构整体部件分析


x86_ _ARM处理器架构(二):ARM处理器架构分析


x86_ _ARM处理器架构(三):64位通用寄存器结构


x86_ _ARM处理器架构(四):汇编基础与寻址方式


x86_ _ARM处理器架构(五):SMP架构与NUMA架构


x86_ _ARM处理器架构(六):ARM Cortex-A9处理器架构


x86_ _ARM处理器架构(七):ARM常用指令系统详解


进程原理与生命周期及系统调用(一):写时复制原理


进程原理与生命周期及系统调用(二):进程内存布局


进程原理与生命周期及系统调用(三):进程堆栈管理


进程原理与生命周期及系统调用(四):系统调用实现


进程原理与生命周期及系统调用(五):调度器及CFS调度器


进程原理与生命周期及系统调用(六):实时调度类及SMP和NUMA


进程原理与生命周期及系统调用(七):task_ struct数据结构分析


进程原理与生命周期及系统调用(八):进程内核do_ fork()/kernel_ _clone()函数分析


进程原理与生命周期及系统调用(九):RCU机制及内存优化屏障


进程原理与生命周期及系统调用(十):内核内存布局和堆管理.


进程原理与生命周期及系统调用(十一):实战操作:内核数据结构(链表和红黑树)

相关文章
|
21天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
2月前
|
Shell Linux C语言
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
30 1
|
21天前
|
存储 Linux
linux查看系统版本、内核信息、操作系统类型版本
linux查看系统版本、内核信息、操作系统类型版本
56 9
|
1月前
|
Ubuntu Linux
linux查看系统版本及内核信息
在Linux中检查系统版本和内核信息,可使用`uname -r`查看内核版本,`uname -a`获取详细信息,或者查看`/proc/version`。要了解发行版版本,尝试`lsb_release -a`(如果安装了)或查阅`/etc/os-release`。Red Hat家族用`/etc/redhat-release`,Debian和Ubuntu系用`/etc/issue`及相关文件。不同发行版可能需不同命令。
32 3
|
23小时前
|
算法 大数据 Linux
深入理解Linux内核的进程调度机制
【4月更文挑战第30天】操作系统的核心职能之一是有效地管理和调度进程,确保系统资源的合理分配和高效利用。在众多操作系统中,Linux因其开源和高度可定制的特点,在进程调度机制上展现出独特优势。本文将深入探讨Linux内核中的进程调度器——完全公平调度器(CFS),分析其设计理念、实现原理及面临的挑战,并探索未来可能的改进方向。
|
1天前
|
算法 安全 Linux
深度解析:Linux内核内存管理机制
【4月更文挑战第30天】 在操作系统领域,内存管理是核心功能之一,尤其对于多任务操作系统来说更是如此。本文将深入探讨Linux操作系统的内核内存管理机制,包括物理内存的分配与回收、虚拟内存的映射以及页面替换算法等关键技术。通过对这些技术的详细剖析,我们不仅能够理解操作系统如何高效地利用有限的硬件资源,还能领会到系统设计中的性能与复杂度之间的权衡。
|
2天前
|
弹性计算 网络协议 Shell
自动优化Linux 内核参数
【4月更文挑战第29天】
5 1
|
2天前
|
弹性计算 网络协议 Linux
自动优化 Linux 内核参数
【4月更文挑战第28天】
9 0
|
14天前
|
算法 Linux 调度
深入理解Linux内核的进程调度机制
【4月更文挑战第17天】在多任务操作系统中,进程调度是核心功能之一,它决定了处理机资源的分配。本文旨在剖析Linux操作系统内核的进程调度机制,详细讨论其调度策略、调度算法及实现原理,并探讨了其对系统性能的影响。通过分析CFS(完全公平调度器)和实时调度策略,揭示了Linux如何在保证响应速度与公平性之间取得平衡。文章还将评估最新的调度技术趋势,如容器化和云计算环境下的调度优化。
|
18天前
|
缓存 网络协议 Windows
FFmpeg开发笔记(六)如何访问Github下载FFmpeg源码
在国内访问GitHub不稳定时,可以采取三种解决方法。首先,通过网站(<https://ping.chinaz.com/github.com>)找到快速响应的GitHub IP,将其添加到本地hosts文件,然后刷新DNS缓存以正常访问。其次,使用代下载网站如(<https://d.serctl.com/>)下载GitHub上的压缩包。最后,可从国内镜像站点,如码云(<https://gitee.com/mirrors/ffmpeg>),下载FFmpeg等开源代码。这些方法有助于绕过访问限制,确保FFmpeg学习与开发的顺利进行。
31 3
FFmpeg开发笔记(六)如何访问Github下载FFmpeg源码