Giter VIP home page Giter VIP logo

psyduck's Introduction

Hello there 👋

Pythonista,会写 Golang 和 C++,喜欢使用 XMind 和图片的方式描绘计算机世界中的精妙设计。

  • 🔥 Psyduck,使用 XMind 记录和总结操作系统,数据库,计算机网络,以及 Golang 等底层设计。

  • 💡 Snorlax,总结常用的数据结构和算法,包含图论。

  • 🐳 Reading source code of leveldb,leveldb 源码阅读,分析 DB 运作流程与 WAL、SSTable 等文件格式与 Compaction 过程。

psyduck's People

Contributors

smartkeyerror avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

psyduck's Issues

Linux Virtual Memory 细节补充

在虚拟内存优化一节中,已经提到了多级页表的使用,但仍有一些细节可以补充。
并且强烈建议改变虚拟地址中 页号数组下标 的说法和思路!

多级页表优点:查找高效

一如大家都提到的节省内存的优点,多级页表的设计同样大大提高了 CPU 对页面的查找效率

32位 CPU的虚拟地址为例,一条4字节的虚拟地址其页表基址占20位:
如果采用一级页表的方式查找,其时间复杂程度为 O(2^20);
如果采用二级页表的方式查找,其时间复杂程度为 O(2*2^10)

多级页表如何分级

多级页表的分级方式由CPU 位数以及页面大小共同决定

在过去32位 CPU 中,页面通常设置为4KB

还是以32位 CPU的虚拟地址为例,一条4字节的虚拟地址由20位页表基址和12位偏移地址构成,
那么是否有疑问:我们为什么只凭地址的高20位就能找到对应的页面呢?

在二级页表下,每级页表基址占10位,这里的基址是作为索引去对应的目录表项和页表项遍历查找的。

页式映射

而具体每个目录表项和页表项的结构实际上如下图所示:

E结构

所以并不存在页号这一不规范且容易误解的说法(在每一项里面并不存在“页号”这一事物)
而”索引“更不应该引喻为“数组下标”,会让人有一种“随机存取”的错觉:
无论分不分级,这些表项都是需要存储在内存中(多级页表节省内存的根本所在),
而在内存中的查找是字节或者字为单位逐个遍历的。

我们会发现,每一个目录表项和页表项的大小为4B,共有1024个目录表项及每个目录表项对应的1024个页表项,恰好可以存放在一个个4KB的页面中而不会出现跨页面存放现象。
也正是因此,页面表和页面的起始地址总是在 4K 字节的边界上,这些地址的低12位永远为0.

反过来我们可以思考64位 CPU 的虚拟内存地址,采用4KB页面
先预留低12位的偏移地址,再考虑页表设计;
将每一级目录(按级数划分)的大小限定在一个页面也就是4KB内,而一条地址占有8字节,
作除法可以得到每一级目录中有512个条目,每个条目还可以继续往下一级目录分512条,
所以最少的情况下我们采用一级目录需要9位的页面基址,当然我们可以用更多级目录,那么就要留 n*9 位作为目录基址。
当然我们不必用目录基址将64位全部填满,剩余位可用于其他用途。

以上就是我学习虚拟内存的一些想法和理解,如果有错误欢迎批评指正。

建议优化

内容很好,但是对他人学习不友好
每个知识点就一张图,哪怕提供下ref了哪些书籍中的相关章节,他人也可以参考学习

催更来了

催更来了,希望作者有时间能再完善完善kubernetes部分呢?多谢

Repository translation

Is there a plan of translating this repository?

As it contemplate a very interesting content, translating it would help spreading the content.

画的太棒了,请教个问题

不得不说,画的实在太棒了,通俗易懂,简洁精炼,比较好奇,里面的这些数据结构,也都是借助 xmind 画出来了吗?还是说借助了其他的工具?
image

go-map

go-map 中可以加入并发访问时导致panic的情况

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.