自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(132)
  • 收藏
  • 关注

原创 14万字,《计算机底层的秘密》开源了

大家好,我是小风哥。作为程序员这些年写过很多代码,但在一个阳光明媚的午后我盯着自己屏幕上的代码脑海里浮现出了一个疑问,“这些代码在底层到底是怎么运行起来的,我写的每一行代码到底是什么意思?”然而我并没有答案,尽管大部分情况下我的代码“看起来”好像也能“正确”完成工作,可是一旦遇到一些相对“高级”的问题时往往束手无策,比如程序运行Core Dump、内存泄漏、程序运行起来很慢等等,这个思考结果着实让我大吃一惊吓出一身冷汗,我竟然对自己所写的代码“一无所知”。于是我的脑海里紧接着就出现了一个画面,自

2021-12-29 22:06:46 9082 8

原创 彻底理解C语言中的指针

大家好,我是小风哥。假定给你一块非常小的内存,这块内存只有8字节,这里也没有高级语言,没有操作系统,你操作的数据单位是单个字节,你该怎样读写这块内存呢?注意这里的限定,再读一遍,没有高级语言,没有操作系统,在这样的限制之下,你必须直面内存读写的本质。这个本质是什么呢?本质是你需要意识到内存就是一个一个装有字节的小盒子,这些小盒子从0到N编好了序号。这时如果你想计算1+2,那么你必须先把1和2分别放到两个小盒子中,假设我们使用Store指令,把数字1放到第6号小盒子,那么用指令表示就是

2021-12-08 22:42:19 1102

原创 操作系统 OS 与内核 Kernel 有什么区别?

在正文之前先和各位读者大人们汇报个事情:为了能和大家更好的沟通,这周我要准备开通留言功能了,届时大家会收到这样一个通知:这个通知是说要把留言功能迁移到这个公众号来,大家收到这个通知后什么都...

2021-06-17 08:15:00 1964

原创 iOS 15 只是一个更好看的 Linux 吗?

尽管 iOS 已经来到第15个版本,但iOS明显要更年轻,从按辈分讲,Linux可能要管 iOS 叫大爷。乔布斯与NeXT在2007年iPhone发布会上,那时候iOS还叫iPhone O...

2021-06-08 08:10:00 302

原创 不懂精简指令集还敢说自己是程序员?

在上一篇文章《CPU进化论:复杂指令集》中我们从历史的角度讲述了复杂指令集出现的必然,随着时间的推移,采用复杂指令集架构的CPU出现各种各样的问题,面对这些问题一部分人开始重新思考指令集到...

2021-06-07 08:15:00 997

原创 CPU 进化论:复杂指令集 CISC

英国生物学家达尔文于 1859 年出版了震动整个学术界和宗教界的《物种起源》,达尔文在这本书里提出了生物进化论学说,认为生命在不断演变进化,物竞天择适者生存。没有历史的计算机生命是这样,实...

2021-05-27 08:15:00 1006

原创 上帝视角:程序员为什么需要理解 CPU?

大家好,我是小风(人设建立中。。。),今天给大家带来一篇胜似技术文的非技术文。最近陆陆续续写了几篇关于CPU的文章,可能有的同学会问,程序员写代码就好了,为什么需要去理解CPU啊?不嫌累啊...

2021-05-18 08:15:00 307

原创 CPU 是如何识数的?

先来看一个简单的问题:小孩子都知道数数:1,2,3,4,5,6,7,8,9,10,可为什么要这样数呢?为什么不是1,2,3,4,5,6,10呢?一种比较流行的解释是因为人类有10个手指:所...

2021-05-10 08:14:21 264

转载 程序员自学编程,推荐一些高质量自学网站?

小伙伴们周末快乐。今天分享一波适用于编程开发学习的自学网站,主要涉及编程学习和练手、提问交流、计算机公开课、在线刷题、以及问题搜索等几个方面,希望能有帮助。C语言网该网站有很多C语言相关的教程、资源、博客和练手习题,同时也有很多题库和比赛,比较实用。网址:https://www.dotcpp.com/cppreferencecppreference是一个免费网站,上面包含了关于C语言和C++的编程知识、库函数、以及诸多代码示例,目前连最新的C++20标...

2021-05-07 12:17:48 680

原创 你管这破玩意叫 CPU ?

每次回家开灯时你有没有想过,用你按的简单开关实际上能打造出复杂的 CPU 来,只不过需要的数量会比较多,也就几十亿个吧。伟大的发明过去200年人类最重要的发明是什么?蒸汽机?电灯?火箭?这...

2021-04-26 08:15:00 488 3

原创 程序员到底为什么要掌握数据结构与算法?

周末了,闲聊几句。当代程序员,也就是我们,其实是非常幸运的,为什么?因为前人,也就是那些大牛已经为你铺好路了。大牛铺路导致的后果就是整个计算机系统像这个汉堡包一样是分层的:越是上层越抽象,...

2021-04-18 15:25:00 350 3

原创 特斯拉遇上 CPU:程序员的心思你别猜

18世纪流水线的诞生带来了制造技术的变革,人类当今拥有琳琅满目物美价廉的商品和流水线技术的发明密不可分,因此当你喝着可乐、吹着空调、坐在特斯拉里拿着智能手机刷这篇文章时需要感谢流水线技术。...

2021-04-08 08:15:00 354

原创 绝地求生,把命运掌握在自己手中

大家好,我是码农的荒岛求生这个号的博主陆小风,正值假期,和大家闲聊几句,推荐一部电影。码农的荒岛求生这个名字其实来源于一部我很喜欢的电影,汤姆汉克斯主演的《荒岛余生》,中学英语课本上讲到过...

2021-04-04 09:40:00 443 3

原创 假如你来发明编程语言

聪明的人类发现把简单的开关组合起来可以表达复杂的bool逻辑,在此基础之上构建了 CPU ,因此 CPU 只能简单的理解开关,用数字表达就是0和1。创世纪:聪明的笨蛋CPU 相当原始,就像...

2021-03-25 08:33:27 241

原创 推荐一本书:《深入理解计算机系统》

最近有很多读者问博主推荐书,想来想去如果让我只推荐一本的话,《深入理解计算机系统》这本书是很不错的。这本书讲了什么呢?我觉得用一句话概括说就是:计算机中那些本质的不变的东西。从某种意义上讲...

2021-03-20 16:49:10 1136

原创 CPU 空闲时在干嘛?

人空闲时会发呆会无聊,计算机呢?假设你正在用计算机浏览网页,当网页加载完成后你开始阅读,此时你没有移动鼠标,没有敲击键盘,也没有网络通信,那么你的计算机此时在干嘛?有的同学可能会觉得这个问...

2021-03-11 08:15:00 1357 4

原创 炫技!bug 排查大曝光,涉及Linux 内核的那种

那些编程高手除了写代码很厉害之外,调试代码找 bug 更是手到擒来。编写代码只是程序员的工作之一,调试代码的时间甚至会超过编写代码,之前为大家讲解了很多关于系统、架构、编程等方面的内容,这...

2021-03-01 08:15:00 331

原创 10 个内存引发的大坑,你能躲开几个?

对程序员来说内存相关的 bug 排查难度几乎和多线程问题并驾齐驱,当程序出现运行异常时可能距离真正有 bug 的那行代码已经很远了,这就导致问题定位排查非常困难,这篇文章将总结涉及内存的一...

2021-02-22 08:15:00 349 2

原创 硬核!13 篇高质量编程内功文章陪你过大年

恭喜发财,大吉大利首先祝各位读者大大们,新~年~快~乐~这一年里博主在“码农的荒岛求生”这个公众号更新了超过 40 篇原创文章,其中广受欢迎的是“高性能、高并发”这个系列,目前已经更新了 ...

2021-02-10 08:15:00 260

原创 自己动手实现一个malloc内存分配器 | 30图

对内存分配器透彻理解是编程高手的标志之一。如果你不能理解malloc之类内存分配器实现原理的话,那你可能写不出高性能程序,写不出高性能程序就很难参与核心项目,参与不了核心项目那么很难升职...

2021-01-06 08:15:00 1044 15

原创 线程安全代码到底是怎么编写的?

相信有很多同学在面对多线程代码时都会望而生畏,认为多线程代码就像一头难以驯服的怪兽,你制服不了这头怪兽它就会反过来吞噬你。夸张了哈,总之,多线程程序有时就像一潭淤泥,走不进去退不出来。可...

2020-12-28 08:15:00 566

原创 线程间到底共享了哪些进程资源?

进程和线程这两个话题是程序员绕不开的,操作系统提供的这两个抽象概念实在是太重要了。关于进程和线程有一个极其经典的问题,那就是进程和线程的区别是什么?相信很多同学对答案似懂非懂。记住了不一...

2020-12-14 08:15:00 555 2

原创 程序员应如何理解高并发中的协程

作为程序员,想必你多多少少听过协程这个词,这项技术近年来越来越多的出现在程序员的视野当中,尤其高性能高并发领域。当你的同学、同事提到协程时如果你的大脑一片空白,对其毫无概念。。。那么这篇...

2020-11-30 08:15:00 278

原创 函数运行时在内存中是什么样子?

在开始本篇的内容前,我们先来思考几个问题。1. 我们先来看一段简单的代码:voidfunc(inta) { if(a>100000000)return;...

2020-11-16 08:15:00 717

原创 10张图让你彻底理解回调函数

不知你是不是也有这样的疑惑,我们为什么需要回调函数这个概念呢?直接调用函数不就可以了?回调函数到底有什么作用?程序员到底该如何理解回调函数?这篇文章就来为你解答这些问题,读完这篇文章后你的武器库将新增一件功能强大的利器。一切要从这样的需求说起假设你们公司要开发下一代国民App“明日油条”,一款主打解决国民早餐问题的App,为了加快开发进度,这款应用由A小组和B小组协同开发。其中有一个核心模块由A小组开发然后供B小组调用,这个核心模块被封装成了一个函数,这个函数就叫make_youtia.

2020-11-10 13:32:08 1055 6

原创 高并发高性能服务器是如何实现的

当在读这篇文章的时候,你有没有想过,服务器是怎么把这篇文章发送给你的呢?说简单也简单,不就是一个用户请求吗?服务器根据请求从数据库中捞出这篇文章,然后通过网络发回去。说复杂也复杂,服务器...

2020-11-09 08:15:00 5243 9

原创 从小白到高手,你需要理解同步与异步

承接上文《终于明白了,一文彻底理解I/O多路复用》。在这篇文章中我们来讨论一下到底什么是同步,什么是异步,以及在编程中这两个极为重要的概念到底意味着什么。相信很多同学遇到同步异步这两个词的时候大脑瞬间就像红绿灯失灵的十字路口一样陷入一片懵逼的状态:是的,这两个看上去很像实际上也很像的词汇给博主造成过很大的困扰,这两个词背后所代表的含义到底是什么呢?我们先从工作场景讲起。苦逼程序员假设现在老板分配给了你一个很紧急并且很重要的任务,让你下班前必须完成(万恶的资本主义)。为了督促进度.

2020-10-30 22:07:12 751 4

原创 用锤子发射导弹,程序员的世界你不懂

世界上有三种人,男人、女人、以及程序员。弱势群体近些年好像都在比拼谁是弱势群体,但那些自称小白兔的弱势群体一个比一个神兽,一个比一个社会。说真的,有我们程序员在好意思说自己弱势嘛,程序员...

2020-10-22 08:15:00 173

原创 终于明白了,一文彻底理解I/O多路复用

本篇是高性能、高并发系列的第三篇,承接上文《读取文件时,程序经历了什么》,在讲解了进程、线程以及I/O后,我们来到了高并发中又一关键技术,即I/O多路复用。在讲解该技术之前,我们需要预习一下文件以及文件描述符。什么是文件程序员使用I/O最终都逃不过文件这个概念。在Linux世界中文件是一个很简单的概念,作为程序员我们只需要将其理解为一个N byte的序列就可以了:b1, b2, b3, b4, ....... bN实际上所有的I/O设备都被抽象为了文件这个概念,一切皆文件,Ev.

2020-10-12 21:36:14 670 3

原创 意想不到,这个神奇的bug让我加班到深夜

给大家分享一个近期解决的线上问题,起因是这样的,近期参与公司的一个项目,工程量很大,代码编写测试过后终于到了紧张的上线时刻。项目上线上线前照例忐忑不安了一番,因为工程量比较大,预估可能不会很顺利,但还不至于到了祈祷服务器不要出bug的地步,bug对于程序员来说简直是家常便饭,没有bug反而可能会嘀咕半天,这都是职业病,没治。紧张了一会儿,我屏气凝神,点了上线按钮,那一刻简直就像在点核按钮一样,生怕点下去后服务器会轰的一声炸掉。结果一切正常。。。这不对啊,这时博主的职业病又犯了,.

2020-09-29 11:05:28 209

原创 读取文件时,程序经历了什么?

承接上文《一文彻底理解高性能高并发中的线程与线程池》,这是高性能、高并发系列的第二篇文章,在这里我们来到了I/O这一话题。你有没有想过当我们执行I/O操作时计算机底层都发生了些什么?在回答这个问题之前,我们先来看下为什么对于计算机来说I/O是极其重要的。不能执行I/O的计算机是什么?相信对于程序员来说I/O操作是最为熟悉不过的了:当我们使用C语言中的printf、C++中的"<<",Python中的print,Java中的System.out.println等时,这是I.

2020-09-24 21:43:55 625 1

原创 看完这篇还不懂高并发中的线程与线程池你来打我

从这篇开始将会开启高性能、高并发系列,本篇是该系列的开篇,主要关注多线程以及线程池。一切要从CPU说起你可能会有疑问,讲多线程为什么要从CPU说起呢?原因很简单,在这里没有那些时髦的概念,你可以更加清晰的看清问题的本质。CPU并不知道线程、进程之类的概念。CPU只知道两件事:1. 从内存中取出指令2. 执行指令,然后回到1你看,在这里CPU确实是不知道什么进程、线程之类的概念。接下来的问题就是CPU从哪里取出指令呢?答案是来自一个被称为...

2020-09-08 22:20:53 1041 2

原创 程序员应如何理解机器学习

什么是机器学习人工智能领域先锋Arthur Samuel曾给出过一个很好的关于机器学习的定义,是这样说的:这一领域的研究主要是在不明确的编写程序的情况下赋予计算机学习的能力。另一个定义也同样简洁但直指其本质,Drew Conway这样说过机器学习:it's just statistics made by computers.个人更喜欢后一种说法。一般来说,机器学习基于给定的数据进行预测,在没有机器学习之前程序员可能要自己设计特定算法并编写程序实现出来,假设给定的是一堆数据集A

2020-08-15 14:24:27 327

原创 进程退出后占用的内存都去哪儿了?

本文是《深入理解操作系统》第四章,从本章开始将开启第一个重要的主题:进程,彻底理解进程对程序员来说是极为重要的,本章就从程序员的角度来讲解到底什么是进程、操作系统是如何实现进程的。本文承接上篇《进程是如何运行的》,以下为本篇目录: 进程自愿退出 操作系统终止进程 进程终止进程 进程退出后占用的内存去哪了? 总结 本节是进程三部曲的最后一篇,在经历了进程创建和进程运行之后,进程迎来终结,是的,任何进程都不会一直运行,当进程终止后,程序不再运行,进程所占用的资源

2020-08-15 14:22:15 2820

原创 编程高手必备的思维模式:为什么抽象在计算机科学中如此重要

计算科学中的所有问题都可以通过增加一层抽象来解决。All problems in computer science can be solved by another level of indirection.没有抽象的世界想象这样一种场景,如果我们的语言中没有代词这种形式,那么我们想表达“张三是个好人“该怎么说呢?可能是这样的:”你还记得我说过的人吧,穿着邋邋遢遢的,公司在中关村,整天背着个双肩包,写代码的,天天996,这个人是个好人“,看到了吧,在没有代词的情况下我们想表达一件事是非.

2020-08-15 14:20:12 1283

原创 链表排序都写不出来能通过BAT面试吗?

链表排序是各大厂面试官经常会问到的一个面试题,这个题目很好的将排序和链表操作结合在一起,有较高的区分度,如果你在面试中被问到了这个问题,你该怎样解决呢?在往下看前先仔细想一想。简单思路相信很多同学都对数组排序比较熟悉,冒泡、堆排、快排等等简直手到擒来,但当被问到要用链表来排序时很多同学是一脸懵逼的,表示从来没想过链表还要排序,这才是真正考验你对排序理解深度的时刻,如果你真的彻底理解了排序,那么这个问题简直不要太简单,但仅仅浮于表面含糊其辞的话是通不过后续写代码环节的。很多同学都能答上来用冒.

2020-08-15 14:18:28 335

原创 程序员应如何理解include

相信很多同学在学习C/C++后都有这样的疑问,#include这句话到底是怎么意思?这句话的背后隐含了什么?我们常用的stdio.h存放在了哪里?这篇文章就来解答这个问题。谁来处理头文件有上述疑问的同学很可能是因为不熟悉一个叫预编译器(preprocessor)的东西。让我们简单的了解一下可执行程序的生成过程。程序员写的大家都可读的代码是不能被CPU直接执行的,CPU可以执行的代码是二进制机器指令,因此一定有某个过程将程序员写的程序转换为了机器指令,这就是编译器。以上..

2020-08-15 14:14:45 852

原创 程序员应如何理解多态

面向对象编程领域有个非常重要的概念,那就是多态,但是你真的理解这到底是什么意思吗?程序员该如何理解多态?英文中的多态多态一词其英文为“polymorphism”,在讲解多态之前让我们来分析一下这个单词。这个单词其实包含了两部分,一部分是poly;另一部分是morph,这两个词在希腊语中是很多词的词根: poly,在希腊语中原指许多的意思,包含poly这个词根的有:polygon,即多边形;polygolt,即多语言。 morph,原指形态,包含morph这个词根的有:mor.

2020-08-15 14:10:57 528

原创 程序员应如何理解标准库

记得当年在学了C/C++语言后一直有这样的疑惑,常用的printf函数以及C++中的cout函数到底是在哪里实现的?相信不止我有这个疑问,这篇文章就来回答这个问题。C/C++语言是怎样实现的相信有的同学一定觉得编程语言是十分神秘的,实际上不是这样的。一门编程语言的本质是什么?本质上一门语言不过就是一堆规则(rules)而已,就像汉语中的主谓宾一样,就像 if之后必须是一个括号(),这个括号中必须是一个bool表达式 while之后必须是一个括号(),这个括号中必须是.

2020-08-15 14:06:41 483

原创 程序员应如何理解编译器

对于程序员来说编译器是非常熟悉的,每天都在用,但是当你在点击“Run”这个按钮或者执行编译命令时你知道编译器是怎样工作的吗?这篇文章就为你解答这个问题。编译器就是一个普通程序,没什么大不了的什么是编译器?编译器是一个将高级语言翻译为低级语言的程序。首先我们一定要意识到编译器就是一个普通程序,没什么大不了的。在没有弄明白编译器如何工作之前你可以简单的把编译器当做一个黑盒子,其作用就是输入一个文本文件输出一个二进制文件。基本上编译器经过了以下几个阶段,等等,这句话..

2020-08-15 13:59:52 549

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除