原创 go中的sync.Map

Go 1.9中的sync.Map提供了線程安全的map,它的優點總結如下:(網上找的)1.空間換時間。 通過冗餘的兩個數據結構(read、dirty),實現加鎖對性能的影響。2.使用只讀數據(read),避免讀寫衝突。3.動態調整,mis

原创 jdk的nio之selector(3)

來看看selector最核心的select()方法吧我們之前分析了Selector默認是WindowSelectorImpl的一個實例,調用selector(timeout),timout是給Selector設置的時間參數,之後調用loc

原创 netty內存池之PoolArena

之前做了那麼多鋪墊,在這篇博文,我們將看清netty內存池管理的全貌。PoolArena是一個抽象類,其子類爲HeapArena和DirectArena對應堆內存(heap buffer)和堆外直接內存(direct buffer),除了

原创 jdk的nio之selector(2)

上篇博文分析了selector的建立,在這之後selector跟ServerSocketChannel,SocketChannel配合使用,在這裏我將會介紹在selector.open();之後,我們以服務器端爲切入點,重點關注下面兩個方

原创 Linux內核源碼解析 - CFS調度算法

進程調度,那麼先從進程描述符的數據結構開始 struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *st

原创 Dubbo源碼之服務端暴露流程

我們從AnnotationBean#postProcessAfterInitialization爲入口分析 public Object post

原创 Netty內存池之PoolChunk

netty4之後,netty中加入了內存池管理,看了netty後突然對這塊很感興趣,怎麼辦?最簡單的方式無非看源碼唄。我們順着思路強行分析一波。分析下簡單需求,爲了能夠簡單的操作內存,必須保證每次分配到的內存時連續的。我們來看下netty

原创 netty內存池之poolSubpage

PoolChunk負責內存的分配與釋放,其內部最小的分配單元爲page,page的默認大小爲8k。如果我們申請很多小塊內存時,都按照page來分配,那麼資源浪費可不是一點半點。針對這個問題,netty將page拆成了更小的內存塊eleme

原创 Netty源碼之服務端啓動與綁定

通常我們用ServerBootstrap引導服務器,public final class SimpleServer { public static void main(String[] args) throws Exception

原创 netty內存池之PoolChunkList

PoolChunk的上層還抽象出一個管理類,PoolChunkList,它負責多個chunk的生命週期,以及一些內存分配的優化,直接看源碼吧。    private static final Iterator<PoolChunkMetri

原创 Netty源碼之客戶端建立與連接

netty引導客戶端啓動類的代碼如下EventLoopGroup group = new NioEventLoopGroup(); try { + Bootstrap b = new Bootstra

原创 jdk的nio之selector(1)

看了netty源碼後發現,它不過是封裝在jdk的nio之上的框架,雖然大致猜到nio的原理,但還是忍不住要去jdk底層一探究竟。要用selector,第一句話無非Selector selector = Selector.open();但裏

原创 go中的sync.Mutex

golang中的互斥鎖定義在src/sync/mutex.go源碼中給出了互斥量公平的解釋,差不多意思如下:互斥鎖可以處於兩種操作模式:normal和starvation。在normal模式下,新加入競爭鎖隊列的協程也會直接參與到鎖的競爭

原创 Dubbo源碼@SPI

SPI機制,即對同一個接口會有不同的實現類,我們可以根據應用場景通過配置來選擇使用不同的實現類。在Dubbo中,protocol的選擇就是通過@SPI來實現。其SPI目的是遵守開閉原則的面向對象設計,對於變化點的可擴展性,利用配置式服務發

原创 Dubbo源碼之消費者端代理調用

由上一篇博客我們知道,消費者端調用服務,實際上是調用代理的invoke方法,內部是調用傳入的handler的invoke()方法。這裏是調用了InvokerInvocationHandler的invoke()方法,我們來看下具體邏輯。