![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
计算机内功
文章平均质量分 74
码农的荒岛求生
微信公众号「码农的荒岛求生」,微信号escape-it。
助你逃离估计技术点的禁闭岛,实现技术进阶。
展开
-
线程安全代码到底是怎么编写的?
相信有很多同学在面对多线程代码时都会望而生畏,认为多线程代码就像一头难以驯服的怪兽,你制服不了这头怪兽它就会反过来吞噬你。夸张了哈,总之,多线程程序有时就像一潭淤泥,走不进去退不出来。可...原创 2020-12-28 08:15:00 · 584 阅读 · 0 评论 -
10张图让你彻底理解回调函数
不知你是不是也有这样的疑惑,我们为什么需要回调函数这个概念呢?直接调用函数不就可以了?回调函数到底有什么作用?程序员到底该如何理解回调函数?这篇文章就来为你解答这些问题,读完这篇文章后你的武器库将新增一件功能强大的利器。一切要从这样的需求说起假设你们公司要开发下一代国民App“明日油条”,一款主打解决国民早餐问题的App,为了加快开发进度,这款应用由A小组和B小组协同开发。其中有一个核心模块由A小组开发然后供B小组调用,这个核心模块被封装成了一个函数,这个函数就叫make_youtia.原创 2020-11-10 13:32:08 · 1085 阅读 · 6 评论 -
从小白到高手,你需要理解同步与异步
承接上文《终于明白了,一文彻底理解I/O多路复用》。在这篇文章中我们来讨论一下到底什么是同步,什么是异步,以及在编程中这两个极为重要的概念到底意味着什么。相信很多同学遇到同步异步这两个词的时候大脑瞬间就像红绿灯失灵的十字路口一样陷入一片懵逼的状态:是的,这两个看上去很像实际上也很像的词汇给博主造成过很大的困扰,这两个词背后所代表的含义到底是什么呢?我们先从工作场景讲起。苦逼程序员假设现在老板分配给了你一个很紧急并且很重要的任务,让你下班前必须完成(万恶的资本主义)。为了督促进度.原创 2020-10-30 22:07:12 · 766 阅读 · 4 评论 -
终于明白了,一文彻底理解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 · 691 阅读 · 3 评论 -
意想不到,这个神奇的bug让我加班到深夜
给大家分享一个近期解决的线上问题,起因是这样的,近期参与公司的一个项目,工程量很大,代码编写测试过后终于到了紧张的上线时刻。项目上线上线前照例忐忑不安了一番,因为工程量比较大,预估可能不会很顺利,但还不至于到了祈祷服务器不要出bug的地步,bug对于程序员来说简直是家常便饭,没有bug反而可能会嘀咕半天,这都是职业病,没治。紧张了一会儿,我屏气凝神,点了上线按钮,那一刻简直就像在点核按钮一样,生怕点下去后服务器会轰的一声炸掉。结果一切正常。。。这不对啊,这时博主的职业病又犯了,.原创 2020-09-29 11:05:28 · 219 阅读 · 0 评论 -
读取文件时,程序经历了什么?
承接上文《一文彻底理解高性能高并发中的线程与线程池》,这是高性能、高并发系列的第二篇文章,在这里我们来到了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 · 634 阅读 · 1 评论 -
看完这篇还不懂高并发中的线程与线程池你来打我
从这篇开始将会开启高性能、高并发系列,本篇是该系列的开篇,主要关注多线程以及线程池。一切要从CPU说起你可能会有疑问,讲多线程为什么要从CPU说起呢?原因很简单,在这里没有那些时髦的概念,你可以更加清晰的看清问题的本质。CPU并不知道线程、进程之类的概念。CPU只知道两件事:1. 从内存中取出指令2. 执行指令,然后回到1你看,在这里CPU确实是不知道什么进程、线程之类的概念。接下来的问题就是CPU从哪里取出指令呢?答案是来自一个被称为...原创 2020-09-08 22:20:53 · 1054 阅读 · 2 评论 -
程序员应如何理解机器学习
什么是机器学习人工智能领域先锋Arthur Samuel曾给出过一个很好的关于机器学习的定义,是这样说的:这一领域的研究主要是在不明确的编写程序的情况下赋予计算机学习的能力。另一个定义也同样简洁但直指其本质,Drew Conway这样说过机器学习:it's just statistics made by computers.个人更喜欢后一种说法。一般来说,机器学习基于给定的数据进行预测,在没有机器学习之前程序员可能要自己设计特定算法并编写程序实现出来,假设给定的是一堆数据集A原创 2020-08-15 14:24:27 · 335 阅读 · 0 评论 -
进程退出后占用的内存都去哪儿了?
本文是《深入理解操作系统》第四章,从本章开始将开启第一个重要的主题:进程,彻底理解进程对程序员来说是极为重要的,本章就从程序员的角度来讲解到底什么是进程、操作系统是如何实现进程的。本文承接上篇《进程是如何运行的》,以下为本篇目录: 进程自愿退出 操作系统终止进程 进程终止进程 进程退出后占用的内存去哪了? 总结 本节是进程三部曲的最后一篇,在经历了进程创建和进程运行之后,进程迎来终结,是的,任何进程都不会一直运行,当进程终止后,程序不再运行,进程所占用的资源原创 2020-08-15 14:22:15 · 2890 阅读 · 0 评论 -
编程高手必备的思维模式:为什么抽象在计算机科学中如此重要
计算科学中的所有问题都可以通过增加一层抽象来解决。All problems in computer science can be solved by another level of indirection.没有抽象的世界想象这样一种场景,如果我们的语言中没有代词这种形式,那么我们想表达“张三是个好人“该怎么说呢?可能是这样的:”你还记得我说过的人吧,穿着邋邋遢遢的,公司在中关村,整天背着个双肩包,写代码的,天天996,这个人是个好人“,看到了吧,在没有代词的情况下我们想表达一件事是非.原创 2020-08-15 14:20:12 · 1335 阅读 · 0 评论 -
链表排序都写不出来能通过BAT面试吗?
链表排序是各大厂面试官经常会问到的一个面试题,这个题目很好的将排序和链表操作结合在一起,有较高的区分度,如果你在面试中被问到了这个问题,你该怎样解决呢?在往下看前先仔细想一想。简单思路相信很多同学都对数组排序比较熟悉,冒泡、堆排、快排等等简直手到擒来,但当被问到要用链表来排序时很多同学是一脸懵逼的,表示从来没想过链表还要排序,这才是真正考验你对排序理解深度的时刻,如果你真的彻底理解了排序,那么这个问题简直不要太简单,但仅仅浮于表面含糊其辞的话是通不过后续写代码环节的。很多同学都能答上来用冒.原创 2020-08-15 14:18:28 · 341 阅读 · 0 评论 -
程序员应如何理解include
相信很多同学在学习C/C++后都有这样的疑问,#include这句话到底是怎么意思?这句话的背后隐含了什么?我们常用的stdio.h存放在了哪里?这篇文章就来解答这个问题。谁来处理头文件有上述疑问的同学很可能是因为不熟悉一个叫预编译器(preprocessor)的东西。让我们简单的了解一下可执行程序的生成过程。程序员写的大家都可读的代码是不能被CPU直接执行的,CPU可以执行的代码是二进制机器指令,因此一定有某个过程将程序员写的程序转换为了机器指令,这就是编译器。以上..原创 2020-08-15 14:14:45 · 864 阅读 · 0 评论 -
程序员应如何理解多态
面向对象编程领域有个非常重要的概念,那就是多态,但是你真的理解这到底是什么意思吗?程序员该如何理解多态?英文中的多态多态一词其英文为“polymorphism”,在讲解多态之前让我们来分析一下这个单词。这个单词其实包含了两部分,一部分是poly;另一部分是morph,这两个词在希腊语中是很多词的词根: poly,在希腊语中原指许多的意思,包含poly这个词根的有:polygon,即多边形;polygolt,即多语言。 morph,原指形态,包含morph这个词根的有:mor.原创 2020-08-15 14:10:57 · 552 阅读 · 0 评论 -
程序员应如何理解标准库
记得当年在学了C/C++语言后一直有这样的疑惑,常用的printf函数以及C++中的cout函数到底是在哪里实现的?相信不止我有这个疑问,这篇文章就来回答这个问题。C/C++语言是怎样实现的相信有的同学一定觉得编程语言是十分神秘的,实际上不是这样的。一门编程语言的本质是什么?本质上一门语言不过就是一堆规则(rules)而已,就像汉语中的主谓宾一样,就像 if之后必须是一个括号(),这个括号中必须是一个bool表达式 while之后必须是一个括号(),这个括号中必须是.原创 2020-08-15 14:06:41 · 498 阅读 · 0 评论 -
程序员应如何理解编译器
对于程序员来说编译器是非常熟悉的,每天都在用,但是当你在点击“Run”这个按钮或者执行编译命令时你知道编译器是怎样工作的吗?这篇文章就为你解答这个问题。编译器就是一个普通程序,没什么大不了的什么是编译器?编译器是一个将高级语言翻译为低级语言的程序。首先我们一定要意识到编译器就是一个普通程序,没什么大不了的。在没有弄明白编译器如何工作之前你可以简单的把编译器当做一个黑盒子,其作用就是输入一个文本文件输出一个二进制文件。基本上编译器经过了以下几个阶段,等等,这句话..原创 2020-08-15 13:59:52 · 565 阅读 · 0 评论 -
通往编程高手之路:《深入理解操作系统》
亚达斯密在其经济学巨著《国富论》中提出了“看不见的那只手”的概念,意指市场机制对经济发展的作用,作为普通的个人来说我们在平时的生活中可能很难感受到市场机制所发挥的作用,但这只看不见的手却无时无刻不在发挥着它的作用。而对于程序员来说,在程序的运行环境中也会有一只看不见的手,这只看不见的手无时无刻不在影响着程序的运行,但你可能对此却浑然不知,对于程序员来说这只看不见的手就是操作系统,这只看不见的手就是本书的主题。作为程序员我们要知道,操作系统从本质上讲也是一个普通的程序,和我们平时所编写的程序没有什么本质的原创 2020-07-18 17:03:57 · 47076 阅读 · 1 评论 -
如何在C++和Python间优雅的共享数据
前几天工作中遇到一个需求,C++和Python混合编程,这个刚开始没有多想,内心觉得这应该很简单,无非就是把C++代码暴露出C接口,并且编译成动态链接库的形式供Python加载起来就好了。有的同学可能会想为什么需要用Python去调用C++代码呢?我们都知道,Python代码是解释执行的,用起来非常方便,但是解释执行的代码都有一个缺点,那就是运行起来非常慢;而C++是编译型语言,性能不是问题,但...原创 2020-03-31 12:14:09 · 2254 阅读 · 0 评论 -
给程序员推荐一款代码开发神器
作为程序员如果你的开发环境是Linux,而且是不带图形环境的Linux,比如互联网公司的开发机,远程服务器、云端服务器等等,那么在这种情况下你一般都使用什么代码编辑器来进行开发呢?当然是Vim,只要开发环境能使用SSH登录上去,但是真的所有同学都喜欢用Vim这种代码编写方式吗?有没有其它选择?答案当然是肯定的,比如优秀的Sublime Text、VS Code等,这些在当今程序员圈里是比较流行...原创 2020-03-07 21:58:11 · 505 阅读 · 0 评论 -
使用多线程会加快文件读取速度吗?
前几天遇到一个很有意思的问题,提炼出来就是使用多线程去读取文件的话会加快读取速度吗?在往下看之前先自己想一想,同样如果在面试中问你这个问题该怎么回答呢?假设有一个文件大小为10G,我们需要将其读取到内存中(假设内存能容纳下该文件),那么使用多个线程分块去读取的话会加快读取速度吗,比如我们创建两个线程,一个线程读取前5G数据;另一个线程读取后5G数据,这会比只是用一个线程将其读入内存快吗?先说...原创 2020-03-07 21:57:19 · 6679 阅读 · 4 评论 -
为什么数据结构与算法如此重要?
我想这是许多人的疑问,是啊,为什么数据结构与算法很重要呢?实际上之所以有很多问题我们不明白不理解,是因为我们所处的角度的问题,在这里如果你站在老板的角度上思考问题一切就简单了。升职加薪老板开公司的目的是为了什么?钱啊,数据结构与算法有什么用呢,能为老板省钱啊,能为老板省钱的技术你说重要不重要。同样一个程序,你的运行起来需要10台服务器,另一个人的只需要2台,如果你是老板的话该为谁升职加薪呢?...原创 2020-03-07 21:54:40 · 1629 阅读 · 0 评论 -
中间商只会赚差价?论接口的重要性
前几天在思考代码中接口(Interface)的重要性,恰好翻到了Hacker News上一篇关于讨论接口的帖子,看到其中一个程序员的评论顿觉非常有趣,现翻译一下:当我开始思考接口时,我会告诉自己回忆一下我手头上的DVD是如何工作的。作为世界工厂,DVD可能是中国的某一家工厂生产出来的,这家工厂里的工人与我素不相识,但是我依然可以把手上的光碟不大不小完美的放到DVD中播放,而且这些光碟可能是美国...原创 2020-03-07 21:53:31 · 484 阅读 · 0 评论 -
一个嘴贱引发的内存异常bug
文章目录项目上线期待的剧情出现了问题分析Oom Killer问题排查如何在大量的改动中排查问题总结记得我在上一篇文章《一个耗时4小时的内存泄漏问题》链接中的封面说过这样的一句话:当出现bug时不要疑惑不要心急有bug的日子里需要镇静相信吧下一个bug很快来临让你嘴贱!下一个bug真的很快就来临了。上一篇文章中讲到的bug出自笔者正在进行的一个并行化项目,由于该项目改动较大,因此代...原创 2019-11-08 13:17:21 · 1007 阅读 · 3 评论 -
一个耗时4小时的内存泄漏问题
文章目录问题排查Debug多线程问题的关键——共享数据经验教训内存泄漏检测工具总结上周像往常一样例行检查线上机器性能,突然发现一个服务的内存使用率是这样的:很显然该服务存在内存泄漏问题,赶紧排查问题。 问题排查首先确定内存泄漏问题出现的时间,发现在该时间点的上线有两次代码提交,其中一个就是我的。于是立刻排查这两次代码的改动,确定了另一个同事的代码不可能会有内存问题后(因为另一...原创 2019-11-08 13:13:37 · 1120 阅读 · 2 评论 -
神奇又有趣的短链服务系统
文章目录为什么要使用短链?如何实现短链?62进制实现短链服务总结大家在刷微博或者在接收短信时应该都会注意过类似这样的链接url:weibo.com/4yBWUweibo.com/42Ipfweibo.com/2BmFLweibo.com/23rwx这些链接通常非常简短,仅此被称为短链,但是当你点击这些短链后却会发现真实的url其实是一个很长的链接,类似这样:weibo.com/pr...原创 2019-11-08 13:09:52 · 475 阅读 · 0 评论 -
一道决定面试成败的算法题
文章目录理解题意思考过程求数组中和等于给定值的最长子数组代码实现总结前几天公司社招面了几个同学,和其它面试官交流后听到了其中一个同事常用的一个算法题,这道算法题几乎决定了能否通过该面试官,题目比较有意思,是这样的,给定一个数组,求出奇数和偶数个数相同的最长连续子数组,有的同学可能听过这个题目,没有听过的同学可以先自己想想该怎么解决这个问题。 理解题意这是什么意思呢,假设给定数组[...原创 2019-11-08 13:07:38 · 316 阅读 · 0 评论 -
图解LeetCode4:Median of Two Sorted Arrays
文章目录理解题意思路1:最直观解法思路2:二分查找代码实现结论Leetcode算法系列将详细讲解一些经典的面试算法题。今天的算法是LeetCode中第四个题目,Median of Two Sorted Arrays,也就是给定两个有序数组求出中位数。 理解题意首先给定的是两个有序数组,比如{1,3}以及{2},那么合并这两个数组就是{1,2,3},因此很显然中位数是2;再给定...原创 2019-11-08 13:00:38 · 398 阅读 · 0 评论 -
彻底理解二叉树的遍历
什么是二叉树在计算机科学中二叉树,binary tree,是一种数据结构,在该数据结构中每个节点最多有两个子节点,如图所示:二叉树的定义就是这样简单,但这种看起来很简单的数据结构遍历起来一点都不简单。如何遍历二叉树所谓遍历简单的讲就好比在迷宫中寻宝,宝物就藏在某一个树节点当中,但我们并不知道具体在哪个节点上,因此要找到宝物就需要将全部的树节点系统性的搜索一遍。那么该怎么系统性的搜索一遍...原创 2019-08-15 21:41:47 · 21155 阅读 · 9 评论 -
彻底理解堆
文章目录什么是堆如何在给定数组上创建堆增加堆节点以及删除堆节点删除节点增加节点堆的应用排序求最大(最小)的K个数定时器是如何实现的总结什么是堆在计算机科学中堆是一种很有趣的数据结构,实际上通常用数组来存储堆中的元素,但是我们却可以把数组中元素视为树,如图所示:这就是一个普通的数组,但是我们可以将其看做如下图所示的树:这是怎么做到的呢?原来虽然我们是在数组中存储的堆元素,但是这里面有一...原创 2019-08-15 21:36:36 · 983 阅读 · 2 评论 -
三次握手与Socket API
什么是三次握手?所谓三次握手其实指的是三次信息交换过程,三次信息交换完毕后我们就可以认为一个“连接”建立好了,那么什么是一个“连接”呢?一个连接唯一确定了发送方和接收方,除此之外一个连接还确定了双方“说话的方式”,三次握手规定:双方在说话前都要加一个数字,该数字用来记录这是彼此的第几句话了,比如:A: 1,今天天气不错啊 1,对啊 :B ...原创 2019-08-10 14:21:25 · 1158 阅读 · 0 评论 -
四次挥手与Socket API
在《三次握手与Socket API》中我们详细讲解了三次握手以及与之相关的API,三次握手是TCP协议的初始阶段,用来建立双方通信连接,显然有建立连接就有断开连接,那么TCP是如何断开连接的呢? 奇怪的四次挥手TCP协议建立连接需要进行三次信息交互,断开连接时却需要四次信息交互,这四次信息交互被形象的称为四次挥手,那么TCP在断开连接时为什么需要奇怪的四次挥手而不是三次挥手呢?要想...原创 2019-08-14 15:33:13 · 364 阅读 · 0 评论 -
如何实现一个简单的智能指针
所谓智能指针指的是一种用起来像指针但又无需关心内存管理的一种机制。 普通指针的问题C/C++中指针极为常见,但普通指针最大的问题就在于需要程序员记住分配内存后要手动释放,否则就会有内存泄漏或者引用野指针的风险。比如有这样一个简单的类:class person {public: person() {} ~person(){ cout<<"delete...原创 2019-08-04 19:38:59 · 1240 阅读 · 0 评论 -
进程切换与线程切换的区别?
注意这个题目问的是进程切换与线程切换的区别,不是进程与线程的区别。当然这里的线程指的是同一个进程中的线程。这个问题能很好的考察面试者对进程和线程的理解深度,有比较高的区分度。要想正确回答这个问题,面试者需要理解虚拟内存。 虚拟内存解放生产力对于程序员来说,我们在编程时实际上是不怎么操心内存问题的,对于使用Java、Python、JavaScript等动态类型语言的程序员来说更是...原创 2019-07-25 17:00:04 · 16378 阅读 · 13 评论 -
彻底理解操作系统:1,什么是程序?
虽然在这里我们主要关注的是操作系统,但毕竟操作系统的目的就是能更好的运行用户程序,而且该教程主要是站在程序员的角度来讲解操作系统的,作为程序员是绕不开程序这个话题的。因此在深入理解操作系统之前还是有必要来聊一聊程序是怎么一回事。那究竟是什么是程序呢?我们引用Wikipedia对计算机程序的定义:A computer program is a collection of instructio...原创 2019-07-06 16:20:24 · 14770 阅读 · 5 评论 -
如何查看进程开启了多少线程
如何查看进程开启了多少线程####概念澄清####背景知识与原理####实验开始####结论####广告时间 :)为什么要知道某个进程开启了多少线程?好奇性能调优####概念澄清这里所说的线程指的是内核级别的线程,不是用户态线程,所谓用户态线程是指不依赖操作系统而是在用户态下实现的执行流调度。这里的线程个数指的是进程运行时的线程个数,这个数值会随着线程的创建和销毁而...原创 2018-09-29 11:10:52 · 4820 阅读 · 0 评论