图解操作系统
文章平均质量分 94
没有什么是不能图解的
小林coding
公众号 : 「小林coding」 专注图解计算机基础,期待你的关注,保证把你图解的明明白白。
展开
-
在 4GB 物理内存的机器上,申请 8G 内存会怎么样?
大家好,我是小林。看到读者在群里讨论这些面试题:其中,第一个问题「在 4GB 物理内存的机器上,申请 8G 内存会怎么样?」存在比较大的争议,有人说会申请失败,有的人说可以申请成功。这个问题在没有前置条件下,就说出答案就是耍流氓。这个问题要考虑三个前置条件:所以,我们要分场景讨论。应用程序通过 malloc 函数申请内存的时候,实际上申请的是虚拟内存,此时并不会分配物理内存。当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,原创 2022-06-08 10:58:48 · 14318 阅读 · 8 评论 -
腾讯一面:内存满了,会发生什么?
作者:小林coding计算机八股文刷题网站:https://xiaolincoding.com大家好,我是小林。前几天有位读者留言说,面腾讯时,被问了两个内存管理的问题:先来说说第一个问题:虚拟内存有什么作用?第一,由于每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的。进程也没有办法访问其他进程的页表,所以这些页表是私有的。这就解决了多进程之间地址冲突的问题。第二,页表里的页表项中除了物理地址之外,还有一些标记属性的比特,比如控制一个页的读写权限,标记该页是否存在等。在.原创 2022-05-24 10:19:36 · 4667 阅读 · 4 评论 -
为什么要有虚拟内存?
4.1 为什么要有虚拟内存?本篇跟大家说说内存管理,内存管理还是比较重要的一个环节,理解了它,至少对整个操作系统的工作会有一个初步的轮廓,这也难怪面试的时候常问内存管理。干就完事,本文的提纲:虚拟内存如果你是电子相关专业的,肯定在大学里捣鼓过单片机。单片机是没有操作系统的,所以每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来。另外,单片机的 CPU 是直接操作内存的「物理地址」。在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新原创 2022-04-28 19:37:18 · 5881 阅读 · 8 评论 -
malloc 是如何分配内存的?
大家好,我是小林。很早之前写了一篇图解虚拟内存的文章:真棒!20 张图揭开内存管理的迷雾,瞬间豁然开朗最近想多写一些内存管理的文章,这次我们就以 malloc 动态内存分配为切入点,我在文中也做了小实验:malloc 是如何分配内存的?malloc 分配的是物理内存吗?malloc(1) 会分配多大的内存?free 释放内存,会归还给操作系统吗?free() 函数只传入一个内存地址,为什么能知道要释放多大的内存?发车!Linux 进程的内存分布长什么样?在 Linux 操作系统中,原创 2022-04-07 09:29:57 · 12538 阅读 · 30 评论 -
微信一面:什么是一致性哈希?用在什么场景?解决了什么问题?
大家好,我是小林。在逛牛客网的面经的时候,发现有位同学在面微信的时候,被问到这个问题:第一个问题就是:一致性哈希是什么,使用场景,解决了什么问题?这个问题还挺有意思的,所以今天就来聊聊这个。发车!如何分配请求?大多数网站背后肯定不是只有一台服务器提供服务,因为单机的并发量和数据量都是有限的,所以都会用多台服务器构成集群来对外提供服务。但是问题来了,现在有那么多个节点(后面统称服务器为节点,因为少一个字),要如何分配客户端的请求呢?其实这个问题就是「负载均衡问题」。解决负载均衡问题的算法原创 2022-02-21 12:11:51 · 2169 阅读 · 1 评论 -
一个进程最多可以创建多少个线程?
大家好,我是小林。昨天有位读者问了我这么个问题:大致意思就是,他看了一个面经,说虚拟内存是 2G 大小,然后他看了我的图解系统 PDF 里说虚拟内存是 4G,然后他就懵逼了。其实他看这个面经很有问题,没有说明是什么操作系统,以及是多少位操作系统。因为不同的操作系统和不同位数的操作系统,虚拟内存可能是不一样多。Windows 系统我不了解,我就说说 Linux 系统。在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址 空间的范围也不同。比如最常原创 2021-07-15 09:23:19 · 17053 阅读 · 21 评论 -
面试官:什么是 Reactor 和 Proactor?
小林,来了。这次就来图解 Reactor 和 Proactor 这两个高性能网络模式。别小看这两个东西,特别是 Reactor 模式,市面上常见的开源软件很多都采用了这个方案,比如 Redis、Nginx、Netty 等等,所以学好这个模式设计的思想,不仅有助于我们理解很多开源软件,而且也能在面试时吹逼。发车!演进如果要让服务器服务多个客户端,那么最直接的方式就是为每一条连接创建线程。其实创建进程也是可以的,原理是一样的,进程和线程的区别在于线程比较轻量级些,线程的创建和线程间切换的成本要小原创 2021-04-26 22:17:00 · 11229 阅读 · 24 评论 -
面试官:为什么 0.1 + 0.2 == 0.300000004 ?
我们在 JavaScript 里执行 0.1 + 0.2,会得到下面这个结果:那今天,我们来思考几个问题:为什么负数要用补码表示?十进制小数怎么转成二进制?计算机是怎么存小数的?0.1 + 0.2 == 0.3 吗?…别看这些问题都看似简单,但是其实还是有点东西的这些问题。为什么负数要用补码表示?十进制转换二进制的方法相信大家都熟能生巧了,如果你说你还不知道,我觉得你还是太谦虚,可能你只是忘记了,即使你真的忘记了,不怕,贴心的小林在和你一起回忆一下。十进制数转二进制采用的是除 2原创 2021-04-21 09:05:52 · 29259 阅读 · 117 评论 -
答应我,这次搞懂 I/O 多路复用!
这次,我们以最简单 socket 网络模型,一步一步的过度到 I/O 多路复用。但我不会具体细节说到每个系统调用的参数,这方面书上肯定比我说的详细。好了,发车!最基本的 Socket 模型要想客户端和服务器能在网络中通信,那必须得使用 Socket 编程,它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。Socket 的中文名叫作插口,咋一看还挺迷惑的。事实上,双方要进行网络通信前,各自得创建一个 Socket,这相当于客户端和服务器都开了一个“口子”,双方读取和发送数据的原创 2021-04-12 13:47:12 · 16950 阅读 · 22 评论 -
什么是死锁?怎么排查死锁?怎么避免死锁?
突然发现我的图解系统缺了「死锁」的内容,这就来补下。在面试过程中,死锁也是高频的考点,因为如果线上环境真多发生了死锁,那真的出大事了。这次,我们就来系统地聊聊死锁的问题。死锁的概念;模拟死锁问题的产生;利用工具排查死锁问题;避免死锁问题的发生;死锁的概念在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。那么,当两个线程为了保护两个不同的共享资源而使用了两个原创 2021-04-01 08:48:43 · 5663 阅读 · 2 评论 -
Linux 内核和 Windows 内核有什么区别?
微信搜索「小林coding」,更多图解系、网络文章等你来撩哦!Windows 和 Linux 可以说是我们比较常见的两款操作系统的。Windows 基本占领了电脑时代的市场,商业上取得了很大成就,但是它并不开源,所以要想接触源码得加入 Windows 的开发团队中。对于服务器使用的操作系统基本上都是 Linux,而且内核源码也是开源的,任何人都可以下载,并增加自己的改动或功能,Linux 最大的魅力在于,全世界有非常多的技术大佬为它贡献代码。这两个操作系统各有千秋,不分伯仲。操作系统核心的东西.原创 2021-02-20 09:47:23 · 12440 阅读 · 13 评论 -
带宽、延时、吞吐率、PPS 这些都是啥?
Linux 网络协议栈是根据 TCP/IP 模型来实现的,TCP/IP 模型由应用层、传输层、网络层和网络接口层,共四层组成,每一层都有各自的职责。应用程序要发送数据包时,通常是通过 socket 接口,于是就会发生系统调用,把应用层的数据拷贝到内核里的 socket 层,接着由网络协议栈从上到下逐层处理后,最后才会送到网卡发送出去。而对于接收网络包时,同样也要经过网络协议逐层处理,不过处理的方向与发送数据时是相反的,也就是从下到上的逐层处理,最后才送到应用程序。网络的速度往往跟用户体验是挂钩的,那原创 2020-12-15 15:05:36 · 8112 阅读 · 6 评论 -
你不好奇 CPU 是如何执行任务的吗?
前言你清楚下面这几个问题吗?有了内存,为什么还需要 CPU Cache?CPU 是怎么读写数据的?如何让 CPU 能读取数据更快一些?CPU 伪共享是如何发生的?又该如何避免?CPU 是如何调度任务的?如果你的任务对响应要求很高,你希望它总是能被先调度,这该怎么办?…这篇,我们就来回答这些问题。正文CPU 如何读写数据的?先来认识 CPU 的架构,只有理解了 CPU 的 架构,才能更好地理解 CPU 是如何读写数据的,对于现代 CPU 的架构图如下:可以看到,一个 CP..原创 2020-11-06 17:43:44 · 5356 阅读 · 0 评论 -
学完计组后,我马上在「我的世界」造了台显示器,你敢信?
前言今天的主题十分有趣,我们将在我的世界(Minecraft)这个游戏里,靠一个个逻辑门来组合实现一个简单的七段显示器,可以实现将选择的数字输出在显示器上。我会从最基础的与或非实现开始,亲自画出电路原理图,并且用我的世界来带领大家领略数字电子技术的精妙之处。本文所涉及的数电知识包括电路编码、基本逻辑门、组合电路。当然,由于电路的精密性以及游戏里实现的复杂性,实现完整的电路是非常困难的,也会让人难以看懂,一下子就劝退了,这也就违背了我们学习知识的初衷。所以,我会适当的对电路进行化简,让人看起来简单易原创 2020-10-30 16:34:34 · 5122 阅读 · 6 评论 -
10 张图打开 CPU 缓存一致性的大门
前言直接上,不多 BB 了。正文CPU Cache 的数据写入随着时间的推移,CPU 和内存的访问性能相差越来越大,于是就在 CPU 内部嵌入了 CPU Cache(高速缓存),CPU Cache 离 CPU 核心相当近,因此它的访问速度是很快的,于是它充当了 CPU 与内存之间的缓存角色。CPU Cache 通常分为三级缓存:L1 Cache、L2 Cache、L3 Cache,级别越低的离 CPU 核心越近,访问速度也快,但是存储容量相对就会越小。其中,在多核心的 CPU 里,每个核心..原创 2020-10-27 18:35:42 · 6196 阅读 · 5 评论 -
作为技术人,我们如何画出精美的技术配图?我把我画上百张图片的经验,分享给你们
小林写这么多篇图解文章,你们猜我收到的最多的读者问题是什么?没错,就是问我是使用什么画图工具,看来对这一点大家都相当好奇,那干脆不如写一篇介绍下我是怎么画图的。如果我的文章缺少了自己画的图片,相当于失去了灵魂,技术文章本身就很枯燥,如果文章中没有几张图片,读者被劝退的概率飙飙升,剩下没被劝退的估计看着看着就睡着了。所以,精美的图片可以说是必不可少的一部分,不仅在阅读时能带来视觉的冲击,而且图片相比文字能涵盖更多的信息,不然怎会有一图胜千言的说法呢?这时,可能有的读者会说自己不写文章呀,是不是没有必要了解原创 2020-10-24 13:08:29 · 6203 阅读 · 6 评论 -
如何写出让 CPU 跑得更快的代码
前言代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重 CPU 的执行效率,否则将会大大影响系统性能。CPU 内部嵌入了 CPU Cache(高速缓存),它的存储容量很小,但是离 CPU 核心很近,所以缓存的读写速度是极快的,那么如果 CPU 运算时,直接从 CPU Cache 读取数据,而不是从内存的话,运算速度就会很快。但是,大多数人不知道 CPU Cache 的运行机制,以至于不知道如何才能够写出能够配合 CPU Cache ..原创 2020-10-18 17:12:57 · 17025 阅读 · 27 评论 -
天啦噜!知道硬盘很慢,但没想到比 CPU L1 Cache 慢 10000000 倍
前言大家如果想自己组装电脑的话,肯定需要购买一个 CPU,但是存储器方面的设备,分类比较多,那我们肯定不能只买一种存储器,比如你除了要买内存,还要买硬盘,而针对硬盘我们还可以选择是固态硬盘还是机械硬盘。相信大家都知道内存和硬盘都属于计算机的存储设备,断电后内存的数据是会丢失的,而硬盘则不会,因为硬盘是持久化存储设备,同时也是一个 I/O 设备。但其实 CPU 内部也有存储数据的组件,这个应该比较少人注意到,比如寄存器、CPU L1/L2/L3 Cache 也都是属于存储设备,只不过它们能存储的数据非常原创 2020-10-14 09:39:31 · 6800 阅读 · 4 评论 -
CPU 执行程序的秘密,藏在了这 15 张图里
前言代码写了那么多,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗?软件用了那么多,你知道软件的 32 位和 64 位之间的区别吗?再来 32 位的操作系统可以运行在 64 位的电脑上吗?64 位的操作系统可以运行在 32 位的电脑上吗?如果不行,原因是什么?CPU 看了那么多,我们都知道 CPU 通常分为 32 位和 64 位,你知道 64 位相比 32 位 CPU 的优势在哪吗?64 位 CPU 的计算性能一定比 32 位 CPU 高很多吗?不知道也不用慌张,接下来就循序渐进..原创 2020-10-10 23:29:52 · 11885 阅读 · 15 评论 -
掏心掏肺分享,大学四年我是怎么学操作系统和计算机网络的?
最近收到不少读者留言,关于怎么学「操作系统」和「计算机网络」的留言,小林写这一块的内容也有半年多了,啃非常多的书,也看了很多视频,有好的有差的,今天就掏心掏肺地分享给大家。原创 2020-09-28 19:34:14 · 22911 阅读 · 32 评论 -
原来 8 张图,就可以搞懂「零拷贝」了
前言磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。这次,我们就以「文件传输」作为切入点,来分析 I/O 工作方式,以及如何优化传输文件的性能。正文为什么要有 DMA 技术?在没有 DMA 技术前,I/O 的过程是这样的:CPU 发出对应的指令给磁盘控制器,然后返回;磁盘控制器收到..原创 2020-09-23 17:07:44 · 23246 阅读 · 36 评论 -
互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等,不同种类的锁自然适用于不同的场景。如果选择了错误的锁,那么在一些高并发的场景下,可能会降低系统的性能,这样用户体验就会非常差了。所以,为了选择合适的锁,我们不仅需要清楚知道加锁的成本开销有多大,还需要分析业务场景中访问的共享资源的方式,再来还要考虑并发访问共享资源时的冲突概率。原创 2020-09-15 20:22:07 · 18950 阅读 · 14 评论 -
进程调度算法/页面置换算法/磁盘调度算法,20 张图一举拿下
前言最近,我偷偷潜伏在各大技术群,因为秋招在即,看到不少小伙伴分享的大厂面经。然后发现,操作系统的知识点考察还是比较多的,大厂就是大厂就爱问基础知识。其中,关于操作系统的「调度算法」考察也算比较频繁。所以,我这边总结了操作系统的三大调度机制,分别是「进程调度/页面置换/磁盘调度算法」,供大家复习,希望大家在秋招能斩获自己心意的 offer。正文进程调度算法进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU 调度的。当 CPU 空闲时,操作系统就选择内存中的某个「就绪状态」的进程,..原创 2020-09-08 10:59:05 · 14417 阅读 · 5 评论 -
键盘敲入A 字母时,期间发生了什么?
前言键盘可以说是我们最常使用的输入硬件设备了,但身为程序员的你,你知道「键盘敲入A 字母时,操作系统期间发生了什么吗」?那要想知道这个发生的过程,我们得先了解了解「操作系统是如何管理多种多样的的输入输出设备」的,等了解完这个后,我们再来看看这个问题,你就会发现问题已经被迎刃而解了。正文设备控制器我们的电脑设备可以接非常多的输入输出设备,比如键盘、鼠标、显示器、网卡、硬盘、打印机、音响等等,每个设备的用法和功能都不同,那操作系统是如何把这些输入输出设备统一管理的呢?为了屏蔽设备之间的差异,..原创 2020-08-23 20:34:53 · 11677 阅读 · 9 评论 -
一口气搞懂「文件系统」,就靠这 25 张图了
前言不多 BB,直接上「硬菜」。正文文件系统的基本组成文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。Linux 最经典的一句话是:「一切皆文件」,不仅普通的文件和目录,就连块设备、管道、socket 等,也都是统一交给文件系统管理的。Linux 文件系统会为每个..原创 2020-08-13 21:48:43 · 53495 阅读 · 71 评论 -
凉了!张三同学没答好「进程间通信」,被面试官挂了....
前言开场小故事炎炎夏日,张三骑着单车去面试花了 1 小时,一路上汗流浃背。结果面试过程只花了 5 分钟就结束了,面完的时候,天还是依然是亮的,还得在烈日下奔波 1 小时回去。面试五分钟,骑车两小时。你看,张三因面试没准备好,吹空调的时间只有 5 分钟,来回路上花了 2 小时晒太阳,你说惨不惨?所以啊,炎炎夏日,为了能延长吹空调的时间,我们应该在面试前准备得更充分些,吹空调时间是要自己争取的。很明显,在这一场面试中, 张三在进程间通信这一块没复习好,虽然列出了进程间通信的方式,但这只是..原创 2020-07-29 23:33:12 · 15791 阅读 · 26 评论 -
看我稳住「多线程」翻车的现场!
前言先来看看虚构的小故事已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕。没办法这段时间公司业绩增长中,需求自然也多了起来,加班自然也少不了。天气变化莫测,这时窗外下起了蓬勃大雨,同时闪电轰鸣。但这一丝都没有影响到小明,始料未及,突然一道巨大的雷一闪而过,办公楼就这么停电了,随后整栋楼都在回荡着的小明那一声撕心裂肺的「卧槽」。此时,求小明的心里面积有多大?等小明心里平复后,突然肚子非常的痛,想上厕所,小明心想肯定是晚上吃的某堡王有问题。整栋楼都停了电,..原创 2020-07-20 18:34:17 · 16434 阅读 · 19 评论 -
进程、线程基础知识全家桶,30 张图一套带走
前言先来看看一则小故事我们写好的一行行代码,为了让其工作起来,我们还得把它送进城(进程)里,那既然进了城里,那肯定不能胡作非为了。城里人有城里人的规矩,城中有个专门管辖你们的城管(操作系统),人家让你休息就休息,让你工作就工作,毕竟摊位不多,每个人都要占这个摊位来工作,城里要工作的人多着去了。所以城管为了公平起见,它使用一种策略(调度)方式,给每个人一个固定的工作时间(时间片),时间到了就会通知你去休息而换另外一个人上场工作。另外,在休息时候你也不能偷懒,要记住工作到哪了,不然下次到你工作..原创 2020-07-12 21:27:32 · 7659 阅读 · 16 评论 -
20 张图揭开「内存管理」的迷雾,瞬间豁然开朗
每日英语,每天进步一点点前言之前有不少读者跟我反馈,能不能写图解操作系统?既然那么多读者想看,我最近就在疯狂的复习操作系统的知识。操作系统确实是比较难啃的一门课,至少我认为比计算机网络难太多了,但它的重要性就不用我多说了。学操作系统的时候,主要痛苦的地方,有太多的抽象难以理解的词语或概念,非常容易被劝退。即使怀着满腔热血的心情开始学操作系统,不过 3 分钟睡意就突然袭来。。。该啃的还是得啃的,该图解的还是得图解的,万众期待的「图解操作系统」的系列来了。本篇跟大家说说内存管理,内存管理还是原创 2020-06-30 14:40:44 · 33328 阅读 · 49 评论