源码

庖解Chrome源码(1)——线程模型

折月煮酒 提交于 2020-03-08 04:30:17
  很多人喜欢Chrome,喜欢它的简洁,喜欢它的“快”。 简洁大家一目了然,无需多言,这里重点要说的是它的“快”。什么是“快”呢?大概不少人第一反应就是cnBeta上的日经Javascript跑分贴,Chrome那叫一个快啊。(其实每次点开这类文章时,我都是想去同情一下我们可怜的IE同学的,不过最近IE9着实又让人充满了期待。)但Javascript跑分真的这么重要吗,我们真的能体会到很大的差距吗?反正我是感觉不太出来。那凭啥还说Chrome快呢?Chrome快就快在UI Responsive(UI响应性)上。说白了就是你双击一下桌面图标,它能很快启动起来(Firefox用户应该深有感触吧);点击某个超链接,它能瞬间给你弹出个新页面来(用IE的朋友也没少遇过假死的现象吧)。因此,Chrome并不只是个跑分的工具。那Chrome良好的UI Responsive是如何做到的呢?这就要得益于它的线程模型了。   为了避免重复制造轮子, 这里我并不打算阐述Chrome线程模型的总体框架,而是将更多的精力放在具体实现上 。对Chrome线程模型框架不熟悉的朋友可以阅读一下duguguiyu的 这篇文章 。有条件的朋友可以到 这里 去下载一份Chromium的源码,或者到 这里 在线查看。闲话少说, Let's Go! NO.1 Smart Pointers

CentOS 7 搭建nginx网页服务

 ̄綄美尐妖づ 提交于 2020-03-07 23:34:18
概述 Nginx专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消耗,以及对HTTP并发链接的高处理能力(单台服务器可支持30000 ~ 50000个并发请求)。 正因为如此,大量提供社交网络、新闻资讯、电子商务及虚拟主机等服务的企业纷纷选择Nginx来提供Web服务。 源码包安装步骤 1.编译工具包下载 yum -y install pcre-devel zlib-devel gcc-c++ make wget -y 2.创建用户,组 建立nginx用户,不建立宿主文件夹,禁止登陆shell环境 useradd -M -s /sbin/nologin nginx 3.下载源码包 cd /usr/local wget http://nginx.org/download/nginx-1.8.1.tar.gz 4.解压源码包 tar xvf nginx-1.8.1.tar.gz 5.配置 cd nginx-1.8.1 配置nginx ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module 解释如下: --prefix=/usr/local/nginx \ #nginx安装目录 --user=nginx --group

跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?(源码感悟)

白昼怎懂夜的黑 提交于 2020-03-07 23:33:41
1 前言 由于现在微服务很流行,越来越多企业采用了SpringCloud微服务架构,而SpringBoot则是快速构建微服务项目的利器。于是 源码笔记 以此为切入点,将SpringBoot作为我们源码分析的第一个开源项目,之后还会对更多开源项目进行源码分析。要进行源码分析,笔者结合自身经历来跟大家聊聊 我们为什么要学习源码 这个话题,大家一起探讨学习。 我们程序员在开发代码时每天都在使用别人写好的框架,无论你是在使用Spring生态的Spring核心,SpringMVC,SpringBoot和SpringCloud等框架,还是在使用阿里系的Dubbo,RocketMQ,Seata,Druid等中间件框架,亦或你是搞大数据的,在使用Apache组织的Zookeeper,Hadoop,Hive,Spark等大数据组件框架,这些开源框架都给我们的项目编码带来了极大的方便,促进了我们的开发效率。是的,这些都是开源大神们帮我们造好的轮子,我们直接使用即可,而且用起来很少出bug,因为这些框架一般都是经过考验的才能流行起来。 可能大部分人会认为,这些轮子都已经造好了,我们直接用即可。是的,这些开源框架对我们使用来说是透明的,它们就像一个个黑盒子。至于这些黑盒里面装的是什么东西,里面是怎样构造的,如果没有去探究这些黑盒的话,我们无从得知。但是,我们做开发的天天跟这些黑盒打交道

分析开源项目源码,我们该如何入手分析?(授人以渔)

点点圈 提交于 2020-03-07 23:27:37
1 前言 本文接上篇文章 跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗? ,那么本篇文章再继续跟小伙伴们聊聊源码这个话题。 在工作之余开始写SpringBoot源码分析专栏前,跟小伙伴们聊聊“ 分析开源项目源码,我们该如何入手分析? ”这个话题,我们就随便扯皮,反正是跟小伙伴们一起学习交流,没必要太正式。 小伙伴们看完本文后,若有自己的源码阅读心得可以在下面进行评论或私聊我进行分享, 让我从小伙伴们身上GET多点源码阅读的一些技巧 ,嘿嘿。 2 学习开源框架源码到底难不难? 那么,先跟小伙伴们聊聊学习开源框架源码的感受,请问你们认为学习开源框架源码到底难不难?这是一个开放的话题,可谓仁者见仁,智者见智。有一些开源大牛们会说, So easy! ;有一些有源码阅读习惯且工作多年的小伙伴们会说, 还好。 ;有一些刚开始学习源码的小伙伴们会说, 太难了! 。是的,不同工作经验不同技术层次的人的回答是不一样的。 那么刚开始学习开源项目源码难不难呢?应该对绝大部分小伙伴们来说应该是偏难的。为什么呢? 可能有以下四点原因 : 一个能流行起来的成熟的开源项目必定功能齐全,可扩展,而功能齐全可扩展的开源项目必定很复杂,代码量大 。比如Spring5框架的源码行数达到了六七十万行,SpringBoot的源码行数达到了25万行左右,Dubbo和RocketMQ的源码行数达到了10万行

Idea导入tomcat源码

痴心易碎 提交于 2020-03-07 21:39:17
1.下载资源 下载主要包含两个包,已经编译的包和源码包,如图所示。 链接地址为: http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.93/bin/apache-tomcat-7.0.93-windows-x64.zip http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.93/src/apache-tomcat-7.0.93-src.zip 2解压文件 1)解压 源码压缩包 apache-tomcat-7.0.93-src.zip,并在解压后的目录中创建home文件夹 2)解压 二进制压缩包 apache-tomcat-7.0.93-windows-x64.zip,将下图中的文件放入上面创建的home文件夹中 3.编译文件 <? xml version ="1.0" encoding ="UTF-8" ?> < project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns: xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi :schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache

sofa-bolt源码阅读(5)-日志

浪尽此生 提交于 2020-03-07 20:43:11
6.1 日志类型 bolt的日志文件默认位于/logs/bolt目录下 文件名 说明 common-default.log 普通日志 common-error.log 错误级别日志 connection-event.log 连接相关的日志 remoting-rpc.log rpc协议相关的日志 6.2 日志实现 bolt只依赖SLF4j门面框架,可以支持三种类型的日志实现:log4j, log4j2, 和 logback。运行时根据具体项目引入的日志框架,实现日志的自适应打印。 日志隔离的功能是工具包sofa-common-tools实现的。 日志的入口类是BoltLoggerFactory private static final Logger logger = BoltLoggerFactory.getLogger("CommonDefault"); 获取名称为CommonDefault的日志,这个名称是在日志配置文件中配置的。 <AsyncLogger name="CommonDefault" level="${LOG_LEVEL}" additivity="false"> <appender-ref ref="CommonDefaultAppender"/> <appender-ref ref="ERROR-APPENDER"/> </AsyncLogger> 日志空间

spring——AOP原理及源码(四)

﹥>﹥吖頭↗ 提交于 2020-03-07 20:04:40
前情回顾:    上文 我们一路分析了从容器创建开始直到我们的AOP注解导入的核心组件AnnotationAwareAspectJAutoProxyCreator执行postProcessBeforeInstantiation()方法的整个过程   分析得到: 在所有bean创建之前,都会调用resolveBeforeInstantiation方法来试图返回一个代理对象 本篇预告 下图可以看到resolveBeforeInstantiation方法包含了 applyBeanPostProcessorsBeforeInstantiation(targetType, beanName); applyBeanPostProcessorsAfterInitialization(bean, beanName); 两个方法 在本篇我们将完整走完 resolveBeforeInstantiation 全过程,并一直到返回代理对象为止 调试的起点    开始调试,还是一路跳到下一断点,直到AbstractAutoProxyCreator.postProcessBeforeInstantiation()(从resolveBeforeInstantiation方法进入到这里的过程上一篇已经分析了) 可以看到当前的bean为org.springframework.context.event

SDWebImage源码解读(四)UIButton+WebCache

早过忘川 提交于 2020-03-07 18:53:45
UIButton+WebCache .h 文件 1.获取当前button的图片url。 - (nullable NSURL *)sd_currentImageURL; 2.根据不同的状态获取图片url。 - (nullable NSURL *)sd_imageURLForState:(UIControlState)state; 3.设置按钮不同状态的url,然后异步加载,并且缓存。 1 - (void)sd_setImageWithURL:(nullable NSURL *)url 2 forState:(UIControlState)state; 3 4 - (void)sd_setImageWithURL:(nullable NSURL *)url 5 forState:(UIControlState)state 6 placeholderImage:(nullable UIImage *)placeholder; 7 8 - (void)sd_setImageWithURL:(nullable NSURL *)url 9 forState:(UIControlState)state 10 placeholderImage:(nullable UIImage *)placeholder 11 options:(SDWebImageOptions)options; 12 13 -

SDWebImage4.0.0 源码解析

放肆的年华 提交于 2020-03-07 18:38:03
在开发 iOS 的客户端应用时,经常需要从服务器下载图片,虽然系统提供了下载工具:NSData、NSURLSession等等方法,但是考虑到图片下载过程中,需要考虑的因素比较多,比如:异步下载、图片缓存、错误处理、编码解码等,以及实际需要中根据不同网络加载不同画质的图片等等需求,因此下载操作不是一个简单的下载动作就可以解决。 针对上述问题,目前常用的开源库就是 SDWebImage ,它很好的解决了图片的异步下载、图片缓存、错误处理等问题,得到了广泛的应用,使得设置 UIImageView 、 UIButton 对象的图片十分方便。本文就从源码的角度,剖析一下这款优秀的开源库的具体实现。 类结构图 SDWebImage 的源码的类结构图和下载流程图在官方的 说明文档 里有介绍,通过 UML 类结构图详细的介绍了该框架的内部结构,以及通过流程图介绍了具体的下载过程。 下图是我总结的 SDWebImage 的结构图,简单的把 SDWebImage 源码文件按照功能进行了划分,方便在阅读源码时,能快速的对源码有一个总体的认识,加快阅读效率。 ![](//upload-images.jianshu.io/upload_images/1843940-c51585b28704fae9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Spark源码系列(二)RDD详解

十年热恋 提交于 2020-03-07 11:57:40
1、什么是RDD? 上一章讲了Spark提交作业的过程,这一章我们要讲RDD。简单的讲,RDD就是Spark的input,知道input是啥吧,就是输入的数据。 RDD的全名是Resilient Distributed Dataset,意思是容错的分布式数据集,每一个RDD都会有5个特征: 1、有一个分片列表。就是能被切分,和hadoop一样的,能够切分的数据才能并行计算。 2、有一个函数计算每一个分片,这里指的是下面会提到的compute函数。 3、对其他的RDD的依赖列表,依赖还具体分为宽依赖和窄依赖,但并不是所有的RDD都有依赖。 4、可选:key-value型的RDD是根据哈希来分区的,类似于mapreduce当中的Paritioner接口,控制key分到哪个reduce。 5、可选:每一个分片的优先计算位置(preferred locations),比如HDFS的block的所在位置应该是优先计算的位置。 对应着上面这几点,我们在RDD里面能找到这4个方法和1个属性,别着急,下面我们会慢慢展开说这5个东东。 //只计算一次 protected def getPartitions: Array[Partition] //对一个分片进行计算,得出一个可遍历的结果 def compute(split: Partition, context: TaskContext):