系统内核在收发事件、消息时使用的消息传递函数。可以理解为多进程之间的一种通讯调用机制。
一、简介 使用Mybatis有一段时间了,但是一直没有专门去阅读MyBatis框架的源码,Mybatis是一个非常值得我们去阅读的框架,源码里面运用了很多常见的设计模式,如构建者模式、代理模式、模板方法模式等等 下面我们就以搭建一个源码阅读环境开始,一起来看看Mybatis的源码。 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 官网地址:mybatis.org/mybatis-3/z… 如果对Mybatis还不熟悉的小伙伴,建议还是先去官网熟悉Mybatis是如何使用的,熟悉以后我们再来看其源码实现。 下面我们搭建一个简单的Mybatis 源码Debug环境。 通过上面的示例,我们总结一下Mybatis使用的大体流程,如下图所示: 可以看到,主要分为了如上图的几个步骤,这几个步骤也是Mybatis的核心了,所以我们阅读源码也是从这几个部分切入,逐步逐步去了解里面的实现细节
= list.size(); Assert.assertEquals("a", one); Assert.assertEquals(4, size); } 下面,将从构造函数开始读取源码
这个web服务器涉及到进程、线程、管道、socket等内容,源码只有五六百行,非常适合初学者阅读。 程序阅读顺序:可以先大概看看这些函数的功能,再从主函数顺着看一下主体,主函数中先调用startup创建socket连接。
所以说关于阅读源码的话题,一直是伴随着我们的。 为什么阅读源码 可以说阅读源码就像读书一样,如果只是自己摸索,知识的积累往往会异常缓慢。而通过读书,可以快速的学到自己想要学习的知识。 但是阅读源码需要一定的编程基础,并不建议你从一开始接触编程就上手阅读源码,因为此时你并没有形成自己的知识结构,盲目的阅读源码可能并不能收获你想要的内容,可能还会加深你的理解难度。 很多时候如果不用阅读源码也可以学习到他人的架构思想以及内部运行原理,那么可能就不会有人去阅读源码了。 阅读源码除了可以提高你自身的编码技巧和逻辑思维能力,还可以帮助你从源码出发快速定位问题所在,分析原因并找到解决方案,源码中的创新点和最佳实践同样可以激发你的技术创新等等,总之就是阅读源码,一定是值得的。 阅读源码有哪些好方式与好步骤呢 个人理解的阅读源码的好方式就是你debug跟源代码,正如我当时改造单点登录系统源码时,一步一步debug源码,最终才解决了遇到的问题。
ArrayList源码阅读ArrayList简介ArrayList的底层是数组队列,相当于一个动态数组。与Java中的数组相比,它的容量能动态增粘,并且支持随即插入。 ArrayList核心源码解读以下为JDK1.8的ArrayList部分源码:展开代码语言:JavaAI代码解释packagejava.util;importjava.util.function.Consumer Integer.MAX_VALUE:MAX_ARRAY_SIZE;}System.arraycopy()和Arrays.copyOf()方法阅读源码的话,我们就会发现ArrayList中大量调用了这两个方法 System.arraycopy()方法源码:展开代码语言:JavaAI代码解释//我们发现arraycopy是一个native方法,接下来我们解释一下各个参数的具体意义/***复制数组*@paramsrc inti=0;i<a.length;i++){System.out.print(a[i]+"");}}}结果:展开代码语言:JavaAI代码解释01992300000Arrays.copyOf()方法源码
size/2) % size 比如size是8,缩容后就是4,所以对size为8的遍历就是 0->4 1->5 2->6 3->7 基于idx与idx + size/2这个公式得到的bucket 源码里把这用一个数学公式体现
,调用yaf_call_user_method回调用户空间的controller类的action方法 如果遇到未加载的类,会按照psr4规则加载,这就是yaf的基本加载运行流程,详情可以参考yaf的源码
经典的源码像诗,值得细细品味 1. 明确目的 阅读书籍和源码最好带着自己的问题和目的,这样可以避免“看了就忘”的尴尬状态。 读研期间,为了掌握嵌入式开发,读了很多Linux的内核源码,摸索清楚了一个Linux系统从系统加电到控制台出现的流程。 最近开始阅读RocketMQ的源码,目的有两个: 学习MQ的通用知识(可靠发送、可靠消费、顺序消息、消息优先级等等)、RocketMQ自己的实现,以及不同MQ之间的比较。 基本流程 源码阅读是有一定的套路的。 以RocketMQ为例,分享下我的方法: (1)我会先去学会基本的使用; (2)阅读官网的文档,了解该中间件的整体架构、核心概念; (3)梳理基本功能的实现,例如系统启动、发送消息、消费消息的过程; (
问题导读 1.阅读源码不同的情况该如何阅读源码? 2.如果为了面试,该如何快速懂得源码? 3.阅读源码的难点在什么地方? 为何要阅读源码? 1.面试要求 如果因为面试,去阅读源码,其实我们可以借助外力,帮助我们,比如通过阅读源码的书籍、视频。 1.面试阅读源码 为了面试阅读源码,如果我们采用传统的,按部就班的去搭建环境,调试等,这样的想法和执行。 《通用源码阅读指导书》 Hadoop可以阅读《大数据处理系统:Hadoop源代码情景分析》 想获取上面两本书籍也可以加微信w3aboutyun获取,附上“源码” 2.提升编码能力 阅读源码,对我们的编码能力提升还是比较大 所以阅读源码多了,我们在代码能力、代码功底就会有很大的提升。 我们在阅读代码前,首先是需要对你所阅读的代码有一个整体的认知,就比如我们阅读Hadoop源码。
HashMap源码阅读HashMap简介HashMap主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一,是非线程安全的。 JDK1.8HashMap的hash方法源码:JDK1.8的hash方法相比于JDK1.7hash方法更加简化,但是原理不变。 相关源码这里就不贴了,重点关注treeifyBin()方法即可! Node节点类源码:展开代码语言:JavaAI代码解释//继承自Map.Entry<K,V>staticclassNode<K,V>implementsMap.Entry<K,V>{finalinthash if(Objects.equals(key,e.getKey())&&Objects.equals(value,e.getValue()))returntrue;}returnfalse;}}树节点类源码
参考资料:http://www.apkbus.com/blog-705730-60158.html 用法:
本文是本人学习Cocos Creator、LayaAir、EgretWing 游戏引擎源码(包括渲染流程、资源加载、音频、图片、网络、动画等模块)总结出来的源码阅读技巧 一、看教程视频快速上手 起初刚接触 GitHub 项目架构 谷歌搜索Cocos 源码的 GitHub 项目,起初不清楚其有多个版本,因此看了cocos2d-x 的 C++版本的源码,之后看博客文章才清楚其 cocos2d-js 才是 js 版本的cocos creator引擎源码,位于其 engine 文件夹下,之后结合搜索对应js版本的cocos creator源码的分析文章,熟悉了调试过程以及大概了解了一些模块。 第三遍开始认真调试流程,阅读函数代码,先整体浏览梳理逻辑,思维导图搭好框架,之后梳理内部细节,输出文档 具体可查看本人的 cocos 源码分析文章:https://www.yuque.com/qiuchen-z6ajg /ks1fop/qpiub9#1b024ad2 四、向有经验的人请教 与他人交流最好是自己先有梳理过一遍代码,这样效率高一点,他人不同的角度有助于理解源码。
Webbench是一个在Linux下使用的非常简单的网站侧压工具。它使用fork()模拟多个客户端同时访问url,测试网站在压力下工作的性能。 只有socket.c和webbench.c两个文件.
ConcurrentSkipListMap源码阅读简介ConcurrentSkipListMap是什么ConcurrentSkipListMap是JDK1.6提供的又一个线程安全有序的map集合,在高并发场景下有着不错的存取效率 每级索引都会有个头节点,即我们的HeadIndex,从源码中可以看到HeadIndex继承了Index,它不仅可以记录节点引用、下级索引引用、后继索引引用,还增加了一个level用于记录当前索引层级。 对应的源码和注释如下,读者可自行参阅:展开代码语言:JavaAI代码解释privateNode<K,V>findPredecessor(Objectkey,Comparator<? 这一步的源码如下:展开代码语言:JavaAI代码解释splice:for(intinsertionLevel=level;;){//拿到最新的索引级别intj=h.level;//从高级别索引开始遍历, 可以看到源码中的get方法会将key传入doGet方法中,再将doGet的结果返回。
SparkContext是spark的入口,通过它来连接集群、创建RDD、广播变量等等。
ThreadLocal源码比较简单,整体了解起来比较容易。
查看InheritableThreadLocal源码 重写了getMap和createMap方法。
ioredis源码阅读[1] 上次针对 redis 的源码阅读涉及普通的 client,这次针对 cluster 模式下的 client 源码进行分析。 具体的源码路径就是在 lib/cluster 目录下了。 127.0.0.1", }, { port: 6381, host: "127.0.0.1", }, ]) cluster.get('someKey').then() 从源码上来看
openldap-clients openldap-servers gd gd2 gd-devel gd2-devel perl-CPAN pcre-devel libicu-devel wget # 下载指定版本源码 RUN mkdir ~/php71 && tar -xvf /tmp/php.tar.gz --strip-components 1 -C ~/php71 # 安装目录 /var/php71 # 源码目录 已挂载进容器 docker-compose exec centos bash php-fpm nginx # 查看 worker 进程号 ps aux | grep fpm gdb --pid=xxx 阅读工具 推荐使用Understand 尝试过CLion和Visual Studio 很多代码都不能进行跳转 需自行下载一个与Dockerfile中PHP版本相同的源码用于阅读 增加扩展(可选) 依赖 下载已经安装的 PHP按本的PHP源码 进入扩展源码目录比如curl cd ~/php71/ext/curl 执行phpize(编译PHP扩展的工具,主要是根据系统信息生成对应的configure文件) /var/