操作系统
文章平均质量分 93
操作系统
迪崽~
I do what I love.
展开
-
零拷贝之mmap和sendfile
内存映射文件从硬盘上将文件读入内存,都要经过文件系统进行数据拷贝,并且数据拷贝操作是由文件系统和硬件驱动实现的,理论上来说,拷贝数据的效率是一 样的。但是通过内存映射方法访问硬盘上的文件,效率要比read和write系统调用高,这是为什么呢?原因是read()是系统调用,其中进行了数据拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,如图中过程1,然后再将这些数据拷贝到用户空间,如图中过...原创 2019-12-01 22:01:19 · 3516 阅读 · 0 评论 -
常见锁相关
Linux 锁futex: 所有的futex同步操作都应该从用户空间开始,首先创建一个futex同步变量,也就是位于共享内存的一个整型计数器。当进程尝试持有锁或者要进入互斥区的时候,对futex执行"down"操作,即原子性的给futex同步变量减1。如果同步变量变为0,则没有竞争发生, 进程照常执行。如果同步变量是个负数,则意味着有竞争发生,需要调用futex系统调用的futex_wait操作休眠当前进程。sys_futex系统调用进入kernel mode进行处理 用来挂起或者唤醒进程来挂起或者唤原创 2020-07-27 12:16:06 · 2160 阅读 · 0 评论 -
linux 内存分配
内存管理一、malloc的底层实现Malloc函数用于动态分配内存。为了减少内存碎片和系统调用的开销,malloc其采用内存池的方式,先申请大块内存作为堆区,然后将堆区分为多个内存块,以块作为内存管理的基本单位。当用户申请内存时,直接从堆区分配一块合适的空闲块。Malloc采用隐式链表结构将堆区分成连续的、大小不一的块,包含已分配块和未分配块;同时malloc采用显示链表结构来管理所有的空闲块,即使用一个双向链表将空闲块连接起来,每一个空闲块记录了一个连续的、未分配的地址。当进行内存分配时,Malloc原创 2021-01-11 15:58:06 · 1258 阅读 · 0 评论 -
文件读写的并发操作分析
一、内存映射和共享内存的区别1.1、内存映射之mmap函数:将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。需要注意的是在mmap之后,并没有在将文件内容加载到物理页上,只上在虚拟内存中分配原创 2020-12-29 11:37:47 · 4041 阅读 · 0 评论 -
VMA与page fault
一、 红黑树与VMA红黑树的应用:广泛用于 C++ 的 STL 中,set 和 map 是用红黑树实现的;Linux 的的进程调度,用红黑树管理进程控制块,进程的虚拟内存空间都存储在一颗红黑树上,每个虚拟内存空间都对应红黑树的一个节点,左指针指向相邻的虚拟内存空间,右指针指向相邻的高地址虚拟内存空间;IO 多路复用的 epoll 采用红黑树组织管理 sockfd,以支持快速的增删改查;Nginx 中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前最小的定时器;Java 的 Tre原创 2021-05-12 20:34:32 · 699 阅读 · 0 评论 -
浅析page cache
一、进程的文件寻址内核维护的3个数据结构。进程级的文件描述符表、 系统级的打开文件描述符表、文件系统的i-node表(1)每个进程都有一个进程表,表中记录了文件描述符和对应的文件表指针。表项中包含的内容如下a.文件描述符 fd。b.指向一个进程文件表项的指针。(2)内核为进程打开文件维持一张进程级的文件描述符表。每个文件表项包含:a.文件描述符及打开方式b.系统打开文件表索引(3)内核为所有进程打开文件维持一张系统级的文件描述符表。每个文件表项包含:a.文件状态标志(读、原创 2021-01-05 15:58:38 · 1375 阅读 · 0 评论 -
cpu 原子操作的多核扩展性
一、lock free和wait freelock-free和wait-free算法是指对于共享的数据并非对其加锁来控制访问(非阻塞操作),而是多个线程并行的访问。通过该算法可以达到对共享对象并发的读写而不会破坏对象本身。所谓lock-free是指对于线程不加锁,让系统执行所有的步骤。lock-free提到的不加锁是指不使用类似于互斥锁或者信号量之类的排他机制。因为一旦对线程加锁的话,当线程执行中断时,那么对于这个系统来说运行也中断了。所谓wait-free是指,不管其他线程执行什么操作,线程无论有什原创 2020-11-20 18:55:56 · 439 阅读 · 0 评论 -
cpu cache一致性和内存屏障机制
1、cache 局部性原理:引入 Cache 的理论基础是程序局部性原理,包括时间局部性和空间局部性。即最近被CPU访问的数据,短期内CPU 还要访问(时间);被 CPU 访问的数据附近的数据,CPU 短期内还要访问(空间)。因此如果将刚刚访问过的数据缓存在Cache中,那下次访问时,可以直接从Cache中取,其速度可以得到数量级的提高。比如对一维数组来说,访问了地址x上的元素,那么以后访问地址x+1、x+2上元素的可能性就比较高;现在访问的数据,在不久之后再次被访问的可能性也比较高。局部性分为“时间局部.原创 2020-11-17 15:54:08 · 1264 阅读 · 0 评论 -
操作系统角度分析helloworld程序的执行
操作系统角度分析helloworld程序的执行#include <stdio.h>int main(int argc, char *argv[]){ puts("hello,world"); return 0;}一、用户通过命令行或双击打开的方式告知操作系统执行helloworld程序。二、操作系统分析程序程序是经过编译链接过程的可执行文件。操作系统找到helloworld程序的相关信息,检查其类型是否是可执行文件;并通过程序首部信息,确定代码和数据在可执行文件中的原创 2020-07-22 23:54:50 · 1291 阅读 · 1 评论 -
操作系统角度分析文件的操作
文件系统基础文件目录: 统一管理每个文件的元数据,以支持文件名到文件物理地址的转换 ;将所有文件的管理信息组织在一起,即构成文件目录。文件目录通常以文件的形式存放在磁盘上,当文件很多时,文件目录可能要占用大量的盘块,在查找的过程中,先将存放目录文件的第一个盘块中的目录调入内存,然后把用户所给定的文件名和目录项中的文件名逐一对比。若未找到指定文件,则再将下一个盘块中的目录项调入内存。在检索目录文件时,只用到了文件名,仅当找到一个目录项(即其中的文件名与指定要查找的文件名相匹配)时,才需要从该目录项中读出该文原创 2020-07-23 11:59:43 · 567 阅读 · 1 评论 -
操作系统的调度基础
操作系统的cpu调度把内核线程当成内核中的一个进程去理解。任务系统的三个核心特征是:权限分级、数据隔离和任务切换。以X86_64架构为例,权限分级通过CPU的多模式机制和分段机制实现,数据隔离通过分页机制实现,任务切换通过中断机制和任务机制(TR/TSS)实现。用户态内核态: 在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。所以,CPU 将指令分为特权指令和非特权指令,对于那些危险的指原创 2020-07-25 09:57:47 · 1137 阅读 · 1 评论 -
操作系统的cpu调度算法
一、linux调度算法CFS调度器Completely Fair Scheduler. 这个也是在2.6内核中引入的,具体为2.6.23,即从此版本开始,内核使用CFS作为它的默认调度器。CFS它不计算优先级,而是通过计算进程消耗的CPU时间(标准化以后的虚拟CPU时间)来确定谁来调度。从而到达所谓的公平性。绝对公平性:cfs定义了一种新的模型,其基本思路很简单,他把CPU当做一种资源,并记录下每一个进程对该资源使用的情况,在调度时,调度器总是选择消耗资源最少的进程来运行。这就是所谓的“完全公平”原创 2020-07-25 17:20:38 · 1502 阅读 · 0 评论