liunx内核
文章平均质量分 89
量子学习法
这个作者很懒,什么都没留下…
展开
-
一个HTTP的流程
一个HTTP的流程原创 2023-07-10 22:19:59 · 670 阅读 · 0 评论 -
Linus I/O之io_ring
由于调用系统调用时,会从用户态切换到内核态,从而进行上下文切换,而上下文切换会消耗一定的 CPU 时间。:I/O 请求完成后,SQ内核线程会将 I/O 请求的结果写入到。为了减少或者摒弃系统调用,采用了用户态与内核态。:SQ内核线程发起 I/O 请求。中读取到 I/O 操作的结果。中读取 I/O 操作。提交 I/O 操作。:应用程序可以通过从。原创 2023-07-09 20:45:22 · 372 阅读 · 0 评论 -
Linux 内核级通用内存池 —— kmalloc 体系
当申请内存块的尺寸超过 192 字节时,内核会通过 fls 函数来计算 kmalloc_info 数组中的通用 slab cache 索引。原创 2023-07-09 19:50:34 · 465 阅读 · 0 评论 -
slab 内存池的设计与实现
伙伴系统内存分配原理的相关内容来看,。也就是说,当我们向伙伴系统申请内存时,至少要申请一个物理内存页。内核实际运行过程中来看,无论是从内核态还是从用户态的角度来说,对于内存的需求量往往是以字节为单位,通常是几十字节到几百字节不等,远远小于一个页面的大小。如果我们仅仅为了这几十字节的内存需求,而专门为其分配一整个内存页面,这无疑是对宝贵内存资源的一种巨大浪费。于是在内核中,这种专门针对小内存的分配需求就应运而生了,而本文的主题—— slab 内存池就是专门应对小内存频繁的分配和释放的场景的。原创 2023-07-03 22:55:58 · 575 阅读 · 0 评论 -
深度剖析 Linux 伙伴系统的设计与实现
/ 被伙伴系统所管理的物理页数// 伙伴系统的核心数据结构首先伙伴系统会将物理内存区域 zone 中的空闲内存页按照分配阶 order 将相同尺寸的内存块组织在 free_area[MAX_ORDER] 数组中:随后在 struct free_area 结构中伙伴系统近一步根据这些相同尺寸内存块的页面迁移类型 MIGRATE_TYPES,将相同迁移类型的物理页面组织在 free_list[MIGRATE_TYPES] 数组中,最终形成了完整的伙伴系统结构。原创 2023-07-02 22:04:49 · 448 阅读 · 0 评论 -
深入理解 Linux 物理内存分配全链路实现
结合 Linux 内核 5.19 版本源码详细讨论了物理内存分配在内核中的整个链路实现。在整个链路中,内存的分配整体分为了两个路径:快速路径 fast path:该路径的下,内存分配的逻辑比较简单,主要是在 WMARK_LOW 水位线之上快速的扫描一下各个内存区域中是否有足够的空闲内存能够满足本次内存分配,如果有则立马从伙伴系统中申请,如果没有立即返回。原创 2023-07-01 21:57:21 · 860 阅读 · 0 评论 -
深入理解linux物理内存
四种 LRU 链表(匿名页的 active 链表,inactive 链表和文件页的active 链表, inactive 链表)之外,内核还有一种链表,比如进程可以通过 mlock() 等系统调用把内存页锁定在内存里,保证该内存页无论如何不会被置换出去,比如出于安全或者性能的考虑,页面中可能会包含一些敏感的信息不想被 swap 到磁盘上导致泄密,或者一些频繁访问的内存页必须一直贮存在内存中。page 与 VMA 是一对多的关系,这里的 _mapcount 就表示该物理页映射到了多少个进程的虚拟内存空间中。原创 2023-07-01 10:29:37 · 416 阅读 · 0 评论 -
linux虚拟内存管理
虚拟内存区域 VMA 由许多的虚拟页 (page) 组成,每个虚拟页需要经过页表的转换才能找到对应的物理页面。页表中关于内存页的访问权限就是由 vm_page_prot 决定的。通过这一系列的介绍,我们可以看到 vm_flags 就是定义整个虚拟内存区域的访问权限以及行为规范,而内存区域中内存的最小单位为页(4K),虚拟内存区域中包含了很多这样的虚拟页,对于虚拟内存区域 VMA 设置的访问权限也会全部复制到区域中包含的内存页中。原创 2023-06-30 15:41:00 · 920 阅读 · 0 评论 -
page cache 在内核中的数据结构
page cache 在内核中的数据结构是一个叫做 address_space 的结构体:struct address_space。原创 2023-06-29 22:46:44 · 340 阅读 · 0 评论 -
内核角度看IO模型
当网络数据帧通过网络传输到达网卡时,网卡会将网络数据帧通过DMA的方式放到中。RingBuffer是网卡在启动的时候分配和初始化的环形缓冲队列。当的时候,新来的数据包就会被丢弃当DMA操作完成时,网卡会向CPU发起一个硬中断,告诉CPU有网络数据到达。CPU调用网卡驱动注册的硬中断响应程序。网卡硬中断响应程序会为网络数据帧创建内核数据结构sk_buffer,并将网络数据帧拷贝到sk_buffer中。然后发起软中断请求,通知内核有新的网络数据帧到达。sk_buff缓冲区,是一个维护网络帧结构的双向链表。原创 2023-06-29 22:32:06 · 533 阅读 · 0 评论