摘要: 在Trie树那节我们讲过,利用Trie树,可以实现搜索引擎的关键词提示功能,这样可以节省用户输入搜索关键词的时间。实际上,搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。 当你在搜索框中,一不小心输错单词时,搜索引擎会非常智能地检测出你的拼写错误,并且用对应的正确单词来进行搜 阅读全文
posted @ 2022-12-30 16:15 易先讯 阅读(43) 评论(0) 推荐(0)
摘要: 上一节,我通过两个非常经典的问题,向你展示了用动态规划解决问题的过程。现在你对动态规划应该有了一个初步的认识。 今天,我主要讲动态规划的一些理论知识。学完这节内容,可以帮你解决这样几个问题:什么样的问题可以用动态规划解决?解决动态规划问题的一般思考过程是什么样的?贪心、分治、回溯、动态规划这四种算法 阅读全文
posted @ 2022-12-30 16:08 易先讯 阅读(40) 评论(0) 推荐(0)
摘要: 淘宝的“双十一”购物节有各种促销活动,比如“满200元减50元”。假设你女朋友的购物车中有n个(n>100)想买的商品,她希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200元),这样就可以极大限度地“薅羊毛”。作为程序员的你,能不能编个代码来帮她搞定呢? 阅读全文
posted @ 2022-12-30 16:08 易先讯 阅读(23) 评论(0) 推荐(0)
摘要: 我们在第31节提到,深度优先搜索算法利用的是回溯算法思想。这个算法思想非常简单,但是应用却非常广泛。它除了用来指导像深度优先搜索这种经典的算法设计之外,还可以用在很多实际的软件开发场景中,比如正则表达式匹配、编译原理中的语法分析等。 除此之外,很多经典的数学问题都可以用回溯算法解决,比如数独、八皇后 阅读全文
posted @ 2022-12-30 16:07 易先讯 阅读(35) 评论(0) 推荐(0)
摘要: MapReduce是Google大数据处理的三驾马车之一,另外两个是GFS和Bigtable。它在倒排索引、PageRank计算、网页分析等搜索引擎相关的技术中都有大量的应用。 尽管开发一个MapReduce看起来很高深,感觉跟我们遥不可及。实际上,万变不离其宗,它的本质就是我们今天要学的这种算法思 阅读全文
posted @ 2022-12-30 16:07 易先讯 阅读(25) 评论(0) 推荐(0)
摘要: 基础的数据结构和算法我们基本上学完了,接下来几节,我会讲几种更加基本的算法。它们分别是贪心算法、分治算法、回溯算法、动态规划。更加确切地说,它们应该是算法思想,并不是具体的算法,常用来指导我们设计具体的算法和编码等。 贪心、分治、回溯、动态规划这4个算法思想,原理解释起来都很简单,但是要真正掌握且灵 阅读全文
posted @ 2022-12-30 16:07 易先讯 阅读(47) 评论(0) 推荐(0)
摘要: 很多支持用户发表文本内容的网站,比如BBS,大都会有敏感词过滤功能,用来过滤掉用户输入的一些淫秽、反动、谩骂等内容。你有没有想过,这个功能是怎么实现的呢? 实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的字典,当用户输入一段文字内容之后,通过字符串匹配算法,来查找用户输入的 阅读全文
posted @ 2022-12-30 15:57 易先讯 阅读(22) 评论(0) 推荐(0)
摘要: 搜索引擎的搜索关键词提示功能,我想你应该不陌生吧?为了方便快速输入,当你在搜索引擎的搜索框中,输入要搜索的文字的某一部分的时候,搜索引擎就会自动弹出下拉框,里面是各种关键词提示。你可以直接从下拉框中选择你要搜索的东西,而不用把所有内容都输入进去,一定程度上节省了我们的搜索时间。 尽管这个功能我们几乎 阅读全文
posted @ 2022-12-30 15:56 易先讯 阅读(19) 评论(0) 推荐(0)
摘要: 上一节我们讲了BM算法,尽管它很复杂,也不好理解,但却是工程中非常常用的一种高效字符串匹配算法。有统计说,它是最高效、最常用的字符串匹配算法。不过,在所有的字符串匹配算法里,要说最知名的一种的话,那就非KMP算法莫属。很多时候,提到字符串匹配,我们首先想到的就是KMP算法。 尽管在实际的开发中,我们 阅读全文
posted @ 2022-12-30 15:56 易先讯 阅读(30) 评论(0) 推荐(0)
摘要: 文本编辑器中的查找替换功能,我想你应该不陌生吧?比如,我们在Word中把一个单词统一替换成另一个,用的就是这个功能。你有没有想过,它是怎么实现的呢? 当然,你用上一节讲的BF算法和RK算法,也可以实现这个功能,但是在某些极端情况下,BF算法性能会退化的比较严重,而RK算法需要用到哈希算法,设计一个可 阅读全文
posted @ 2022-12-30 15:55 易先讯 阅读(42) 评论(0) 推荐(0)
摘要: 从今天开始,我们来学习字符串匹配算法。字符串匹配这样一个功能,我想对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言提供的字符串查找函数,比如Java中的indexOf(),Python中的find()函数等,它们底层就是依赖接下来要讲的字符串匹配算法。 字符串匹配算法很多,我会 阅读全文
posted @ 2022-12-30 15:54 易先讯 阅读(47) 评论(0) 推荐(0)
摘要: 上一节我们讲了图的表示方法,讲到如何用有向图、无向图来表示一个社交网络。在社交网络中,有一个六度分割理论,具体是说,你与世界上的另一个人间隔的关系不会超过六度,也就是说平均只需要六步就可以联系到任何两个互不相识的人。 一个用户的一度连接用户很好理解,就是他的好友,二度连接用户就是他好友的好友,三度连 阅读全文
posted @ 2022-12-30 15:33 易先讯 阅读(37) 评论(0) 推荐(0)
摘要: 微博、微信、LinkedIn这些社交软件我想你肯定都玩过吧。在微博中,两个人可以互相关注;在微信中,两个人可以互加好友。那你知道,如何存储微博、微信等这些社交网络的好友关系吗? 这就要用到我们今天要讲的这种数据结构:图。实际上,涉及图的算法有很多,也非常复杂,比如图的搜索、最短路径、最小生成树、二分 阅读全文
posted @ 2022-12-30 15:24 易先讯 阅读(39) 评论(0) 推荐(0)
摘要: 搜索引擎的热门搜索排行榜功能你用过吗?你知道这个功能是如何实现的吗?实际上,它的实现并不复杂。搜索引擎每天会接收大量的用户搜索请求,它会把这些用户输入的搜索关键词记录下来,然后再离线地统计分析,得到最热门的Top 10搜索关键词。 那请你思考下,假设现在我们有一个包含10亿个搜索关键词的日志文件,如 阅读全文
posted @ 2022-12-30 15:22 易先讯 阅读(26) 评论(0) 推荐(0)
摘要: 我们今天讲另外一种特殊的树,“堆”(HeapHeap)。堆这种数据结构的应用场景非常多,最经典的莫过于堆排序了。堆排序是一种原地的、时间复杂度为O(n\log n)O(nlogn)的排序算法。 前面我们学过快速排序,平均情况下,它的时间复杂度为O(n\log n)O(nlogn)。尽管这两种排序算法 阅读全文
posted @ 2022-12-30 15:22 易先讯 阅读(26) 评论(0) 推荐(0)
摘要: 今天,我们来讲这种数据结构的一种特殊应用,递归树。 我们都知道,递归代码的时间复杂度分析起来很麻烦。我们在第12节《排序(下)》那里讲过,如何利用递推公式,求解归并排序、快速排序的时间复杂度,但是,有些情况,比如快排的平均时间复杂度的分析,用递推公式的话,会涉及非常复杂的数学推导。 除了用递推公式这 阅读全文
posted @ 2022-12-30 15:21 易先讯 阅读(26) 评论(0) 推荐(0)
摘要: 红黑树是一个让我又爱又恨的数据结构,“爱”是因为它稳定、高效的性能,“恨”是因为实现起来实在太难了。我今天讲的红黑树的实现,对于基础不太好的同学,理解起来可能会有些困难。但是,我觉得没必要去死磕它。 我为什么这么说呢?因为,即便你将左右旋背得滚瓜烂熟,我保证你过不几天就忘光了。因为,学习红黑树的代码 阅读全文
posted @ 2022-12-30 15:21 易先讯 阅读(22) 评论(0) 推荐(0)
摘要: 上两节,我们依次讲了树、二叉树、二叉查找树。二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是O(logn)。 不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于log2n的情况,从而导致各个操作的效率下降。极 阅读全文
posted @ 2022-12-30 15:20 易先讯 阅读(22) 评论(0) 推荐(0)
摘要: 上一节我们学习了树、二叉树以及二叉树的遍历,今天我们再来学习一种特殊的二叉树,二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。 我们之前说过,散列表也是支持这些操作的,并且散列表的这些操作比二叉查找树更高效,时间复杂度是O(1)。既然有了这么高效的散列表,使用二叉树 阅读全文
posted @ 2022-12-30 15:20 易先讯 阅读(21) 评论(0) 推荐(0)
摘要: 前面我们讲的都是线性表结构,栈、队列等等。今天我们讲一种非线性表结构,树。树这种数据结构比线性表的数据结构要复杂得多,内容也比较多,所以我会分四节来讲解。 我反复强调过,带着问题学习,是最有效的学习方式之一,所以在正式的内容开始之前,我还是给你出一道思考题:二叉树有哪几种存储方式?什么样的二叉树适合 阅读全文
posted @ 2022-12-30 15:19 易先讯 阅读(27) 评论(0) 推荐(0)
摘要: 上一节,我讲了哈希算法的四个应用,它们分别是:安全加密、数据校验、唯一标识、散列函数。今天,我们再来看剩余三种应用:负载均衡、数据分片、分布式存储。 你可能已经发现,这三个应用都跟分布式系统有关。没错,今天我就带你看下,哈希算法是如何解决这些分布式问题的。 应用五:负载均衡 我们知道,负载均衡算法有 阅读全文
posted @ 2022-12-30 15:19 易先讯 阅读(6) 评论(0) 推荐(0)
摘要: 还记得2011年CSDN的“脱库”事件吗?当时,CSDN网站被黑客攻击,超过600万用户的注册邮箱和密码明文被泄露,很多网友对CSDN明文保存用户密码行为产生了不满。如果你是CSDN的一名工程师,你会如何存储用户密码这么重要的数据吗?仅仅MD5加密一下存储就够了吗? 要想搞清楚这个问题,就要先弄明白 阅读全文
posted @ 2022-12-30 15:11 易先讯 阅读(9) 评论(0) 推荐(0)
摘要: 我们已经学习了20节内容,你有没有发现,有两种数据结构,散列表和链表,经常会被放在一起使用。你还记得,前面的章节中都有哪些地方讲到散列表和链表的组合使用吗?我带你一起回忆一下。 在链表那一节,我讲到如何用链表来实现LRU缓存淘汰算法,但是链表实现的LRU缓存淘汰算法的时间复杂度是O(n),当时我也提 阅读全文
posted @ 2022-12-30 15:11 易先讯 阅读(9) 评论(0) 推荐(0)
摘要: 通过上一节的学习,我们知道,散列表的查询效率并不能笼统地说成是O(1)。它跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因子过高,都可能导致散列冲突发生的概率升高,查询效率下降。 在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后, 阅读全文
posted @ 2022-12-30 15:10 易先讯 阅读(4) 评论(0) 推荐(0)
摘要: Word这种文本编辑器你平时应该经常用吧,那你有没有留意过它的拼写检查功能呢?一旦我们在Word里输入一个错误的英文单词,它就会用标红的方式提示“拼写错误”。Word的这个单词拼写检查功能,虽然很小但却非常实用。你有没有想过,这个功能是如何实现的呢? 其实啊,一点儿都不难。只要你学完今天的内容,散列 阅读全文
posted @ 2022-12-30 15:10 易先讯 阅读(15) 评论(0) 推荐(0)
摘要: 上两节我们讲了二分查找算法。当时我讲到,因为二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗? 实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫做跳表(Skip list),也就是今天要讲的 阅读全文
posted @ 2022-12-30 15:10 易先讯 阅读(7) 评论(0) 推荐(0)
摘要: 通过IP地址来查找IP归属地的功能,不知道你有没有用过?没用过也没关系,你现在可以打开百度,在搜索框里随便输一个IP地址,就会看到它的归属地。 这个功能并不复杂,它是通过维护一个很大的IP地址库来实现的。地址库中包括IP地址范围和归属地的对应关系。 当我们想要查询202.102.133.13这个IP 阅读全文
posted @ 2022-12-30 15:09 易先讯 阅读(15) 评论(0) 推荐(0)
摘要: 今天我们讲一种针对有序数据集合的查找算法:二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,很多非计算机专业的同学很容易就能理解,但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。 老规矩,我们还是来看一道思考题。 假设我们有1000万个整数数据,每个数 阅读全文
posted @ 2022-12-30 15:08 易先讯 阅读(8) 评论(0) 推荐(0)
摘要: 几乎所有的编程语言都会提供排序函数,比如C语言中qsort(),C++ STL中的sort()、stable_sort(),还有Java语言中的Collections.sort()。在平时的开发中,我们也都是直接使用这些现成的函数来实现业务逻辑中的排序功能。那你知道这些排序函数是如何实现的吗?底层都 阅读全文
posted @ 2022-12-30 15:07 易先讯 阅读(3) 评论(0) 推荐(0)
摘要: 上两节中,我带你着重分析了几种常用排序算法的原理、时间复杂度、空间复杂度、稳定性等。今天,我会讲三种时间复杂度是O(n)的排序算法:桶排序、计数排序、基数排序。因为这些排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作线性排序(Linear sort)。之所以能做到线性的时间复杂度,主要原因是 阅读全文
posted @ 2022-12-30 15:06 易先讯 阅读(5) 评论(0) 推荐(0)
摘要: 上一节我讲了冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是O(n2),比较高,适合小规模数据的排序。今天,我讲两种时间复杂度为O(nlogn)的排序算法,归并排序和快速排序。这两种排序算法适合大规模的数据排序,比上一节讲的那三种排序算法要更常用。 归并排序和快速排序都用到了分治思想 阅读全文
posted @ 2022-12-30 15:05 易先讯 阅读(15) 评论(0) 推荐(0)
摘要: 排序对于任何一个程序员来说,可能都不会陌生。你学的第一个算法,可能就是排序。大部分编程语言中,也都提供了排序函数。在平常的项目中,我们也经常会用到排序。排序非常重要,所以我会花多一点时间来详细讲一讲经典的排序算法。 排序算法太多了,有很多可能你连名字都没听说过,比如猴子排序、睡眠排序、面条排序等。我 阅读全文
posted @ 2022-12-30 15:01 易先讯 阅读(4) 评论(0) 推荐(0)
摘要: 推荐注册返佣金的这个功能我想你应该不陌生吧?现在很多App都有这个功能。这个功能中,用户A推荐用户B来注册,用户B又推荐了用户C来注册。我们可以说,用户C的“最终推荐人”为用户A,用户B的“最终推荐人”也为用户A,而用户A没有“最终推荐人”。 一般来说,我们会通过数据库来记录这种推荐关系。在数据库表 阅读全文
posted @ 2022-12-30 15:01 易先讯 阅读(4) 评论(0) 推荐(0)
摘要: 我们知道,CPU资源是有限的,任务的处理速度与线程个数并不是线性正相关。相反,过多的线程反而会导致CPU频繁切换,处理性能下降。所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来事先设置的。 当我们向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源了,这个时候线程池如何处理这 阅读全文
posted @ 2022-12-30 15:01 易先讯 阅读(4) 评论(0) 推荐(0)
摘要: 浏览器的前进、后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面a-b-c之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面b和a。当你后退到页面a,点击前进按钮,就可以重新查看页面b和c。但是,如果你后退到页面b后,点击了新的页面d,那就无法再通过前进、后退功能查看页面c了。 假设你是Ch 阅读全文
posted @ 2022-12-30 15:00 易先讯 阅读(9) 评论(0) 推荐(0)
摘要: 上一节我讲了链表相关的基础知识。学完之后,我看到有人留言说,基础知识我都掌握了,但是写链表代码还是很费劲。哈哈,的确是这样的! 想要写好链表代码并不是容易的事儿,尤其是那些复杂的链表操作,比如链表反转、有序链表合并等,写的时候非常容易出错。从我上百场面试的经验来看,能把“链表反转”这几行代码写对的人 阅读全文
posted @ 2022-12-30 14:59 易先讯 阅读(12) 评论(0) 推荐(0)
摘要: 今天我们来聊聊“链表(Linked list)”这个数据结构。学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是LRU缓存淘汰算法。 缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的CPU缓存、数据库缓存、浏览器缓存等等。 缓存的 阅读全文
posted @ 2022-12-30 14:59 易先讯 阅读(10) 评论(0) 推荐(0)
摘要: 提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊。 是的,在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构。尽管数组看起来非常基础、简单,但是我估计很多人都并没有理解这个基础数据结构的精髓。 在大部分编程语言中,数组都是从0开 阅读全文
posted @ 2022-12-30 14:59 易先讯 阅读(9) 评论(0) 推荐(0)
摘要: 上一节,我们讲了复杂度的大O表示法和几个分析技巧,还举了一些常见复杂度分析的例子,比如O(1)、O(logn)、O(n)、O(nlogn)复杂度分析。掌握了这些内容,对于复杂度分析这个知识点,你已经可以到及格线了。但是,我想你肯定不会满足于此。 今天我会继续给你讲四个复杂度分析方面的知识点,最好情况 阅读全文
posted @ 2022-12-30 14:58 易先讯 阅读(3) 评论(0) 推荐(0)
摘要: 我们都知道,数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是算法一个非常重要的考量指标。那如何来衡量你编写的算法代码的执行效率呢?这里就要用到我们今天要讲的内容:时间、空间复杂度分析。 其实,只要讲到数据结构与算法,就一定离不开时间、空 阅读全文
posted @ 2022-12-30 14:57 易先讯 阅读(21) 评论(0) 推荐(0)
摘要: 你是否曾跟我一样,因为看不懂数据结构和算法,而一度怀疑是自己太笨?实际上,很多人在第一次接触这门课时,都会有这种感觉,觉得数据结构和算法很抽象,晦涩难懂,宛如天书。正是这个原因,让很多初学者对这门课望而却步。 我个人觉得,其实真正的原因是你没有找到好的学习方法,没有抓住学习的重点。实际上,数据结构和 阅读全文
posted @ 2022-12-30 14:57 易先讯 阅读(8) 评论(0) 推荐(0)
摘要: 你是不是觉得数据结构和算法,跟操作系统、计算机网络一样,是脱离实际工作的知识?可能除了面试,这辈子也用不着? 尽管计算机相关专业的同学在大学都学过这门课程,甚至很多培训机构也会培训这方面的知识,但是据我了解,很多程序员对数据结构和算法依旧一窍不通。还有一些人也只听说过数组、链表、快排这些最最基本的数 阅读全文
posted @ 2022-12-30 14:56 易先讯 阅读(7) 评论(0) 推荐(0)
摘要: 你好,我是王争,毕业于西安交通大学计算机专业。现在回想起来,本科毕业的时候,我的编程水平其实是很差的。直到读研究生的时候,一个师兄给了我一本《算法导论》,说你可以看看,对你的编程会很有帮助。 没想到,从此我对算法的“迷恋”便一发不可收拾。之后,我如饥似渴地把图书馆里几乎所有数据结构和算法书籍都读了一 阅读全文
posted @ 2022-12-30 14:56 易先讯 阅读(5) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 2021年,我在极客时间上开设了我的第一门课程《操作系统实战45讲》,和你分享了我多年来研究操作系统的一些成就和经验。 我本以为在业务为王、各种新技术层出不穷的今天,很少有人会关注操作系统这种底层且异常复杂的技术。但出乎意料,这门课程一上线引起很多朋友的关注,曾经一度稳居极客时 阅读全文
posted @ 2022-12-30 11:35 易先讯 阅读(156) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 感谢你的一路相伴,我们的《操作系统实战45讲》专栏写到此处,你亦能学至此处,多半是出于兴趣,出于一种对操作系统的热爱,出于一种对事物本质发自内心的苛求…… 如果是这样,请你永远保持这份心性,它会给你带来更多意想不到的结果。走到这里,也让我们先停住前进的脚步,回忆一下这一路走来都 阅读全文
posted @ 2022-12-30 11:34 易先讯 阅读(131) 评论(0) 推荐(0)
摘要: 你好,我是艾恩凝。很高兴受邀来写用户故事,可以“吐槽”一下与我结缘的操作系统实战专栏。不对,是夸赞。 其实,这门课在去年底宣传的时候,我就知道了。那时朋友圈铺天盖地在发消息,可以说想不知道都难,当时我只以为是单纯的广告,所以并没有仔细了解。 就这样,我与这么好的一门课擦肩而过。现在回头看来,只是缘分 阅读全文
posted @ 2022-12-30 11:33 易先讯 阅读(84) 评论(0) 推荐(0)
摘要: 你好,我是yiyang。 先简单说说我自己吧,我是一名编程爱好者,这个爱好从小学就已经播下了种子。我从求学到就业,有过很多次机会接触计算机方面的学习和相关工作,可是一直没有真正动手编程。这次能接触到LMOS老师的《操作系统实战45课》,让我眼前一亮,当时就报名了这门课。 都说编程需要能掌握一些基础的 阅读全文
posted @ 2022-12-30 11:33 易先讯 阅读(236) 评论(0) 推荐(0)
摘要: 你好,我是leveryd。 先做个自我介绍,我在网络安全行业从事技术工作,目前在负责安全产品的研发工作,工作六年。 虽然在研发工作中,我们通常是遇到什么问题就去查,边查边学。虽然这样的学习方式能快速解决问题,但有时候这种方法也不灵,比方说学习语义分析时,就必须要把词法分析、语法分析先学了,一通搜索、 阅读全文
posted @ 2022-12-30 11:32 易先讯 阅读(76) 评论(0) 推荐(0)
摘要: 你好,我是宇新。 作为《操作系统实战45讲》的编辑。从专栏上线到现在已经有3个多月的时间了,感谢你一直坚持到现在。 留意过课程评论区的同学都知道,我们有几位常驻的同学一直在主动输出。那这些“课代表”是怎样学习专栏,又有什么学习诀窍? 为了满足咱们的好奇心,我特意策划了这次特别的采访,请到了在专栏里留 阅读全文
posted @ 2022-12-30 11:32 易先讯 阅读(121) 评论(0) 推荐(0)
摘要: 你好,我是spring Xu。我平时的工作就是做实时嵌入式系统,坐标上海。 写操作系统这件事一直是我的兴趣,我之前写过引导器,也有移植过uboot的基础,还读了不少操作系统的书。作为一名操作系统“发烧友”,我是怎样跟操作系统、跟LMOS这门课程结缘的呢?请你听我慢慢道来。 我是怎样与操作系统结缘的? 阅读全文
posted @ 2022-12-30 11:31 易先讯 阅读(166) 评论(0) 推荐(0)
摘要: 你好,我是pedro,目前是一名后端小研发。 很早的时候,就收到了小编的邀请,让我来写一写用户故事。但是因为我手上有很多事情,这事儿就被耽搁了下来,所以导致这篇小故事迟到了很久。 虽然是在操作系统这个专栏下,但是我不想受到领域的限制,我想和你们分享一下我的学习思路、学习方法和收获,真诚地和你说说话, 阅读全文
posted @ 2022-12-30 11:30 易先讯 阅读(73) 评论(0) 推荐(0)
摘要: 你好,我是Yason Lee。 先简单介绍一下我自己,我曾为腾讯、土巴兔、中兴等多家公司服务过,目前在国内某电商公司担任研发方面的工作。我跟LMOS相识多年,也是 Cosmos Psi 开源项目的贡献者之一。 受到极客时间和老彭(LMOS)邀请,这次加餐我想从我的视角给你说说,Cosmos项目的来龙 阅读全文
posted @ 2022-12-30 11:30 易先讯 阅读(89) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在今天,Andriod+ARM已经成了移动领域的霸主,这与当年的Windows+Intel何其相似。之前我们已经在Intel的x86 CPU上实现了Cosmos,今天我会给你讲讲ARM的AArch64体系结构,带你扩展一下视野。 首先,我们来看看什么是AArch64体系,然后分 阅读全文
posted @ 2022-12-30 11:29 易先讯 阅读(310) 评论(0) 推荐(0)
摘要: 你好,我是 LMOS。 前面两节课,我们一起学习了虚拟机和容器的原理,这些知识属于向上延展。而这节课我们要向下深挖,看看操作系统下面的硬件层面,重点研究一下CPU的原理和它的加速套路。 有了这些知识的加持,我还会给你说说,为什么去年底发布的苹果M1芯片可以实现高性能、低功耗。你会发现,掌握了硬件的知 阅读全文
posted @ 2022-12-30 11:28 易先讯 阅读(202) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课我带你通过KVM技术打开了计算机虚拟化技术的大门,KVM技术是基于内核的虚拟机,同样的KVM和传统的虚拟化技术一样,需要虚拟出一台完整的计算机,对于某些场景来说成本会比较高,其实还有比KVM更轻量化的虚拟化技术,也就是今天我们要讲的容器。 这节课我会先带你理解容器的概念, 阅读全文
posted @ 2022-12-30 11:28 易先讯 阅读(97) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课,我们理解了Linux里要如何实现系统API。可是随着云计算、大数据和分布式技术的演进,我们需要在一台服务器上虚拟化出更多虚拟机,还要让这些虚拟机能够弹性伸缩,实现跨主机的迁移。 而虚拟化技术正是这些能力的基石。这一节课,就让我们一起探索一下,亚马逊、阿里、腾讯等知名公司 阅读全文
posted @ 2022-12-30 11:27 易先讯 阅读(58) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课,我们通过实现一个获取时间的系统服务,学习了Cosmos里如何建立一个系统服务接口。Cosmos为应用程序提供服务的过程大致是这样的:应用程序先设置服务参数,然后通过int指令进入内核,由Cosmos内核运行相应的服务函数,最后为应用程序提供所需服务。 不知道你是否好奇过 阅读全文
posted @ 2022-12-30 11:27 易先讯 阅读(83) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 一路走来,咱们的Cosmos系统已经有内存管理,进程、文件、I/O了,这些重要的组件已经建立了,也就是说它们可以向应用程序提供服务了。 但就好像你去各政府部门办理业务证件一样,首先是前台工作人员接待你,对你的业务需求进行初级预判,然后后台人员进行审核并进行业务办理,最后由前台人 阅读全文
posted @ 2022-12-30 11:26 易先讯 阅读(79) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课,我们一起了解了套接字的工作机制和数据结构,但套接字有哪些基本接口实现呢?相信学完这节课,你就能够解决这个问题了。 今天我会和你探讨套接字从创建、协议接口注册与初始化过程,还会为你深入分析套接字系统,是怎样调用各个功能函数的。通过这节课,相信你可以学会基于套接字来编写网络 阅读全文
posted @ 2022-12-30 11:25 易先讯 阅读(83) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 前面我们了解了网络的宏观架构,建立了网络模块知识的大局观,也进行了实际的组网实践。现在我们来瞧一瞧Linux的网络程序,不过想要入门Linux的网络编程,套接字也是一个绕不开的重要知识点,正是有了套接字,Linux系统才拥有了网络通信的能力。而且网络协议的最底层也是套接字,有了 阅读全文
posted @ 2022-12-30 11:25 易先讯 阅读(76) 评论(0) 推荐(0)
摘要: 你好,我是 LMOS。 上节课我们对一次请求到响应的过程积累了一些宏观认识,相信你已经对整个网络架构有了一个整体蓝图。这节课,让我们来仔细研究一下网络数据是如何在内核中流转的,让你开阔视野,真正理解底层工程的实现思路。 凡事先问目的,在网络数据在内核中的流转,最终要服务于网络收发功能。所以,我会先带 阅读全文
posted @ 2022-12-30 11:23 易先讯 阅读(74) 评论(0) 推荐(0)
摘要: 你好,我是 LMOS。 从这节课起,我们就要开始学习网络篇的内容了。网络是一个极其宏大的知识结构,我会通过五节课带你了解计算机网络的关键内容。 具体我们是这样安排的。作为网络篇的开始,今天这节课我会从一个面试中高频出现的问题切入,带你梳理从输入URL到网卡的网络数据流动过程中都发生了什么事。如果你真 阅读全文
posted @ 2022-12-30 11:22 易先讯 阅读(78) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在前面的课程中,我们已经实现了Cosmos下的文件系统rfs,相信你已经感受到了一个文件系统是如何管理文件的。今天我们一起来瞧一瞧Linux是如何管理文件,也验证一下Linux那句口号:一切皆为文件。 为此,我们需要首先搞清楚什么是VFS,接着理清为了实现VFS所用到的数据结构 阅读全文
posted @ 2022-12-30 11:20 易先讯 阅读(102) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 我们在上一节课中,已经建立了仓库,并对仓库进行了划分,就是文件系统的格式化。有了仓库就需要往里面存取东西,对于我们的仓库来说,就是存取应用程序的文件。 所以今天我们要给仓库增加一些相关的操作,这些操作主要用于新建、打开、关闭、读写文件,它们也是文件系统的标准功能,自然即使我们这 阅读全文
posted @ 2022-12-30 11:20 易先讯 阅读(78) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上一节课中,我们已经设计好了文件系统数据结构,相当于建好了仓库的基本结构。 今天,我将和你一起探索仓库的划分,即什么地方存放仓库的管理信息,什么地方存放进程的“劳动成果”(也就是文件),对应于文件系统就是文件系统的格式化操作。 具体我是这样安排的,我们先来实现文件系统设备驱动, 阅读全文
posted @ 2022-12-30 11:18 易先讯 阅读(44) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 你有没有想过,蜜蜂把劳动成果变成蜜糖存放在蜂巢中,人类把劳动成果量化成财富存放在银行,但一个进程的劳动成果放在哪里呢? 看到这里,你可能有疑问,进程有劳动成果吗?当然有,进程加工处理的数据就是进程的劳动成果,可是这个“劳动成果”,如何表示、如何组织,又放在哪里呢?这些问题都会在 阅读全文
posted @ 2022-12-30 11:17 易先讯 阅读(70) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 前面我们已经完成了Cosmos的驱动设备的建立,还写好了一个真实的设备驱动。 今天,我们就来看看Linux是如何管理设备的。我们将从Linux如何组织设备开始,然后研究设备驱动相关的数据结构,最后我们还是要一起写一个Linux设备驱动实例,这样才能真正理解它。 感受一下Linu 阅读全文
posted @ 2022-12-30 11:16 易先讯 阅读(106) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在上一课中,我们实现了建立设备的接口,这相当于制定了部门的相关法规,只要遵守这些法规就能建立一个部门。当然,建立了一个部门,是为了干活的,吃空饷可不行。 其实一个部门的职责不难确定,它应该能对上级下发的任务作出响应,并完成相关工作,而这对应到设备,就是如何处理内核的I/O包,这 阅读全文
posted @ 2022-12-30 11:15 易先讯 阅读(37) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在上节课里,我们对设备进行了分类,建立了设备与驱动的数据结构,同时也规定了一个驱动程序应该提供哪些标准操作方法,供操作系统内核调用。这相当于设计了行政部门的规章制度,一个部门叫什么,应该干什么,这些就确定好了。 今天我们来继续探索部门的建立,也就是设备在内核中是如何注册的。我们 阅读全文
posted @ 2022-12-30 11:15 易先讯 阅读(58) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 小到公司,大到国家,都有各种下属部门,比如我们国家现在有教育部、科学技术部、外交部,财政部等,这些部门各自负责完成不同的职能工作,如教育部负责教育事业和语言文字工作,科学技术部负责推动解决经济社会发展的重大科技问题。 既然大道相通,那我们的Cosmos中是否也是类似这样的结构呢 阅读全文
posted @ 2022-12-30 11:14 易先讯 阅读(67) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在前面的课程中,我们已经写好了Cosmos的进程管理组件,实现了多进程调度运行,今天我们一起探索Linux如何表示进程以及如何进行多进程调度。 好了,话不多说,我们开始吧。 Linux如何表示进程 在Cosmos中,我们设计了一个thread_t数据结构来代表一个进程,Linu 阅读全文
posted @ 2022-12-30 11:14 易先讯 阅读(95) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课,我带你一起设计了我们Cosmos的进程调度器,但有了进程调度器还不够,因为调度器它始终只是让一个进程让出CPU,切换到它选择的下一个进程上去运行。 结合前面我们对进程生命周期的讲解,估计你已经反应过来了。没错,多进程调度方面,我们还要实现进程的等待与唤醒机制,今天我们就 阅读全文
posted @ 2022-12-30 11:13 易先讯 阅读(76) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课,我们了解了什么是进程,还一起写好了建立进程的代码。不知道你想过没有,如果在系统中只有一个进程,那我们提出进程相关的概念和实现与进程有关的功能,是不是就失去了意义呢? 显然,提出进程的目的之一,就是为了实现多个进程,使系统能运行多个应用程序。今天我们就在单进程的基础上扩展 阅读全文
posted @ 2022-12-30 11:12 易先讯 阅读(91) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在前面的课程里,我们已经实现了数据同步、hal层的初始化,中断框架、物理内存、内存对象、虚拟内存管理,这些都是操作系统中最核心的东西。 今天,我再给你讲讲操作系统里一个层次非常高的组件——进程,而它又非常依赖于内存管理、中断、硬件体系结构。好在前面课程中,这些基础知识我们已经搞 阅读全文
posted @ 2022-12-30 11:09 易先讯 阅读(82) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课我们学习了伙伴系统,了解了它是怎样管理物理内存页面的。那么你自然会想到这个问题:Linux系统中,比页更小的内存对象要怎样分配呢? 带着这个问题,我们来一起看看SLAB分配器的原理和实现。在学习过程中,你也可以对照一下我们Cosmos的内存管理组件,看看两者的内存管理有哪 阅读全文
posted @ 2022-12-30 11:08 易先讯 阅读(64) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 前面我们实现了Cosmos的内存管理组件,相信你对计算机内存管理已经有了相当深刻的认识和见解。那么,像Linux这样的成熟操作系统,又是怎样实现内存管理的呢? 这就要说到Linux系统中,用来管理物理内存页面的伙伴系统,以及负责分配比页更小的内存对象的SLAB分配器了。 我会通 阅读全文
posted @ 2022-12-30 11:07 易先讯 阅读(109) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 今天,我们继续研究操作系统如何实现虚拟内存。在上节课,我们已经建立了虚拟内存的初始流程,这节课我们来实现虚拟内存的核心功能:写出分配、释放虚拟地址空间的代码,最后实现虚拟地址空间到物理地址空间的映射。 这节课的配套代码,你可以点击这里下载。 虚拟地址的空间的分配与释放 通过上节 阅读全文
posted @ 2022-12-30 11:06 易先讯 阅读(173) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在现实中,有的人需要向政府申请一大块区域,在这块区域中建楼办厂,但是土地有限且已经被占用。所以可能的方案是,只给你分配一个总的面积区域,今年湖北有空地就在湖北建立一部分厂房,明年广东有空地就在广东再建另一部分厂房,但是总面积不变。 其实在计算机系统中也有类似的情况,一个应用往往 阅读全文
posted @ 2022-12-30 11:05 易先讯 阅读(96) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在前面的课程中,我们建立了物理内存页面管理器,它既可以分配单个页面,也可以分配多个连续的页面,还能指定在特殊内存地址区域中分配页面。 但你发现没有,物理内存页面管理器一次分配至少是一个页面,而我们对内存分页是一个页面4KB,即4096字节。对于小于一个页面的内存分配请求,它无能 阅读全文
posted @ 2022-12-30 11:05 易先讯 阅读(85) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 通过前面两节课的学习,我们已经组织好了内存页,也初始化了内存页和内存区。我们前面做了这么多准备工作,就是为了实现分配和释放内存页面,达到内存管理的目的。 那有了前面的基础,我想你自己也能大概实现这个分配和释放的代码。但是,根据前面我们设计的数据结构和对其初始化的工作,估计你也可 阅读全文
posted @ 2022-12-30 11:03 易先讯 阅读(138) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课,我们确定了用分页方式管理内存,并且一起动手设计了表示内存页、内存区相关的内存管理数据结构。不过,虽然内存管理相关的数据结构已经定义好了,但是我们还没有在内存中建立对应的实例变量。 我们都知道,在代码中实际操作的数据结构必须在内存中有相应的变量,这节课我们就去建立对应的实 阅读全文
posted @ 2022-12-30 10:58 易先讯 阅读(81) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 内存跟操作系统的关系,就像土地和政府的关系一样。政府必须合理规划这个国家的土地,才能让人民安居乐业。为了发展,政府还要进而建立工厂、学校,发展工业和教育,规划城镇,国家才能繁荣富强。 而作为计算机的实际掌权者,操作系统必须科学合理地管理好内存,应用程序才能高效稳定地运行。 内存 阅读全文
posted @ 2022-12-30 10:57 易先讯 阅读(81) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 今天我们继续来研究Linux的初始化流程,为你讲解如何解压内核,然后讲解Linux内核第一个C函数。最后,我们会用Linux的第一个用户进程的建立来收尾。 如果用你上手去玩一款新游戏做类比的话,那么上节课只是新手教程,而这节课就是更深入的实战了。后面你会看到很多熟悉的“面孔”, 阅读全文
posted @ 2022-12-30 10:57 易先讯 阅读(277) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在前面的课程中,我们建好了二级引导器,启动了我们的Cosmos,并进行了我们Cosmos的Hal层初始化。 我会用两节课带你领会Linux怎样做初始化。虽然我们自己具体实现过了初始化,不过我们也不妨看看Linux的初始化流程,借鉴一下Linux开发者的玩法。 这节课,我会先为你 阅读全文
posted @ 2022-12-30 10:49 易先讯 阅读(138) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 前面三节课,我们为调用Cosmos的第一个C函数hal_start做了大量工作。这节课我们要让操作系统Cosmos里的第一个C函数真正跑起来啦,也就是说,我们会真正进入到我们的内核中。 今天我们会继续在这个hal_start函数里,首先执行板级初始化,其实就是hal层(硬件抽象 阅读全文
posted @ 2022-12-30 10:47 易先讯 阅读(126) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课我们动手实现了自己的二级引导器。今天这节课我们将进入二级引导器,完成具体工作的环节。 在二级引导器中,我们要检查CPU是否支持64位的工作模式、收集内存布局信息,看看是不是合乎我们操作系统的最低运行要求,还要设置操作系统需要的MMU页表、设置显卡模式、释放中文字体文件。 阅读全文
posted @ 2022-12-30 10:46 易先讯 阅读(165) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课,我们建造了属于我们的“计算机”,并且在上面安装好了GRUB。这节课我会带你一起实现二级引导器这个关键组件。 看到这儿你可能会问,GRUB不是已经把我们的操作系统加载到内存中了吗?我们有了GRUB,我们为什么还要实现二级引导器呢? 这里我要给你说说我的观点,二级引导器作为 阅读全文
posted @ 2022-12-30 10:45 易先讯 阅读(84) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 经过前面那么多课程的准备,现在我们距离把我们自己操作系统跑起来,已经是一步之遥了。现在,你是不是很兴奋,很激动?有这些情绪说明你是喜欢这门课程的。 接下来的三节课,我们会一起完成一个壮举,从GRUB老大哥手中接过权柄,让计算机回归到我们的革命路线上来,为我们之后的开发自己的操作 阅读全文
posted @ 2022-12-30 10:44 易先讯 阅读(187) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 上节课,我们学习了解决数据同步问题的思路与方法。Linux作为成熟的操作系统内核,当然也有很多数据同步的机制,它也有原子变量、开启和关闭中断、自旋锁、信号量。 那今天我们就来探讨一下这些机制在Linux中的实现。看看Linux的实现和前面我们自己的实现有什么区别,以及Linux 阅读全文
posted @ 2022-12-30 10:43 易先讯 阅读(99) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 我们在前面的课程中探索了,开发操作系统要了解的最核心的硬件——CPU、MMU、Cache、内存,知道了它们的工作原理。在程序运行中,它们起到了至关重要的作用。 在开发我们自己的操作系统以前,还不能一开始就把机器跑起来,而是先要弄清楚数据同步的问题。如果不解决掉数据同步的问题,后 阅读全文
posted @ 2022-12-30 10:43 易先讯 阅读(144) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在前面的课程里,我们已经知道了CPU是如何执行程序的,也研究了程序的地址空间,这里我们终于到了程序的存放地点——内存。 你知道什么是Cache吗?在你心中,真实的内存又是什么样子呢?今天我们就来重新认识一下Cache和内存,这对我们利用Cache写出高性能的程序代码和实现操作系 阅读全文
posted @ 2022-12-30 10:42 易先讯 阅读(123) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 从前面的课程我们得知,CPU执行程序、处理数据都要和内存打交道,这个打交道的方式就是内存地址。 读取指令、读写数据都需要首先告诉内存芯片:hi,内存老哥请你把0x10000地址处的数据交给我……hi,内存老哥,我已经计算完成,请让我把结果写回0x200000地址的空间。这些地址 阅读全文
posted @ 2022-12-30 10:41 易先讯 阅读(82) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 我们在前面已经设计了我们的OS架构,你也许正在考虑怎么写代码实现它。恕我直言,现在我们还有很多东西没搞清楚。 由于OS内核直接运行在硬件之上,所以我们要对运行我们代码的硬件平台有一定的了解。接下来,我会通过三节课,带你搞懂硬件平台的关键内容。 今天我们先来学习CPU的工作模式, 阅读全文
posted @ 2022-12-30 10:41 易先讯 阅读(180) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 什么?你想成为计算机黑客? 梦想坐在计算机前敲敲键盘,银行账号里的数字就会自己往上涨。拜托,估计明天你就该被警察逮捕了。真正的黑客是对计算机技术有近乎极致的追求,而不是干坏事。 下面我就带你认识这样一个计算机黑客,看看他是怎样创造出影响世界的Linux,然后进一步了解一下Lin 阅读全文
posted @ 2022-12-30 10:40 易先讯 阅读(167) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 在上节课中,我们写了一个极简的操作系统——Hello OS,并成功运行,直观地感受了一下自己控制计算机的乐趣,或许你正沉浸在这种乐趣之中,但我不得不提醒你赶快从这种快乐中走出来。 因为我们的Hello OS虽然能使计算机运行起来,但其实没有任何实际的功能。 什么?没有实际功能, 阅读全文
posted @ 2022-12-30 10:39 易先讯 阅读(72) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 我们知道,在学习许多编程语言一开始的时候,都有一段用其语言编写的经典程序——Hello World。这不过是某一操作系统平台之上的应用程序,却心高气傲地问候世界。 而我们学习操作系统的时候,那么也不妨撇开其它现有的操作系统,基于硬件,写一个最小的操作系统——Hello OS,先 阅读全文
posted @ 2022-12-30 10:39 易先讯 阅读(176) 评论(0) 推荐(0)
摘要: 你好,我是LMOS。 欢迎来到操作系统第一课。在真正打造操作系统前,有一条必经之路:你知道程序是如何运行的吗? 一个熟练的编程老手只需肉眼看着代码,就能对其运行的过程了如指掌。但对于初学者来说,这常常是很困难的事,这需要好几年的程序开发经验,和在长期的程序开发过程中对编程基本功的积累。 我记得自己最 阅读全文
posted @ 2022-12-30 10:36 易先讯 阅读(157) 评论(0) 推荐(0)
摘要: 你好,我是宇新,《操作系统实战45讲》的专栏编辑。 除了负责更新课程里的内容,我也一直关注着小伙伴们的留言。这次,终于有机会自己也留一回言了,很开心能用编辑手记的方式,和你聊一聊我的想法。 这门课的独特之处 细心的小伙伴可能发现了,我们的开篇词标题是“为什么要学写一个操作系统?”注意,不只是学操作系 阅读全文
posted @ 2022-12-30 10:35 易先讯 阅读(228) 评论(0) 推荐(0)