Idea Buffer

桑健的博客


  • 首页

  • 分类

  • 归档

  • 标签

  • 搜索
close

Netty4源码分析-ServerBootstrap

发表于 2017-09-19   |   分类于 Netty源码   |   阅读次数   |   978 字   |   5 min

ServerBootstrap与Bootstrap类似,只不过这个是用于服务端的启动。下面看下具体的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class TimeServer {
public void bind(int port) throws Exception {
// 配置服务端的NIO线程组
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.childHandler(new ChildChannelHandler());
// 绑定端口,同步等待成功
ChannelFuture f = b.bind(port).sync();
// 等待服务端监听端口关闭
f.channel().closeFuture().sync();
} finally {
// 优雅退出,释放线程池资源
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
private class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel arg0) throws Exception {
arg0.pipeline().addLast(new TimeServerHandler());
}
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
int port = 8080;
if (args != null && args.length > 0) {
try {
port = Integer.valueOf(args[0]);
} catch (NumberFormatException e) {
// 采用默认值
}
}
new TimeServer().bind(port);
}
}
阅读全文 »

Netty4源码分析-Bootstrap

发表于 2017-09-17   |   分类于 Netty源码   |   阅读次数   |   1,434 字   |   7 min

Bootstrap是Netty提供的一个便利的工具类, 通过Bootstrap类能够容易地启动一个客户端使之与服务器端进行通信。

下面的代码用于从服务器中获取时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class TimeClient {
public static void main(String[] args) throws Exception {
int port = 8080;
if (args != null && args.length > 0) {
try {
port = Integer.valueOf(args[0]);
} catch (NumberFormatException e) {
}
}
new TimeClient().connect(port, "127.0.0.1");
}
public void connect(int port, String host) throws Exception {
// 配置客户端NIO线程组
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group).channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch)
throws Exception {
ch.pipeline().addLast(new TimeClientHandler());
}
});
// 发起异步连接操作
ChannelFuture f = b.connect(host, port).sync();
// 当代客户端链路关闭
f.channel().closeFuture().sync();
} finally {
// 优雅退出,释放NIO线程组
group.shutdownGracefully();
}
}
}
阅读全文 »

NIO技术概览

发表于 2017-08-13   |   分类于 开发手册 , 计算机系统   |   阅读次数   |   8,051 字   |   32 min

NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。

IO模型的分类

按照《Unix网络编程》的划分,I/O模型可以分为:阻塞I/O模型、非阻塞I/O模型、I/O复用模型、信号驱动式I/O模型和异步I/O模型,按照POSIX标准来划分只分为两类:同步I/O和异步I/O。

如何区分呢?首先一个I/O操作其实分成了两个步骤:发起IO请求和实际的IO操作。同步I/O和异步I/O的区别就在于第二个步骤是否阻塞,如果实际的I/O读写阻塞请求进程,那么就是同步I/O,因此阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O都是同步I/O,如果不阻塞,而是操作系统帮你做完I/O操作再将结果返回给你,那么就是异步I/O。

阻塞I/O和非阻塞I/O的区别在于第一步,发起I/O请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞I/O,如果不阻塞,那么就是非阻塞I/O。

阅读全文 »

【转】认真分析mmap:是什么 为什么 怎么用

发表于 2017-07-16   |   分类于 开发手册 , 计算机系统   |   阅读次数   |   4,599 字   |   16 min

原文链接:认真分析mmap:是什么 为什么 怎么用

mmap基础概念

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如下图所示:

200501092691998.png
阅读全文 »

Random源码解析

发表于 2017-06-23   |   分类于 开发手册 , 计算机系统   |   阅读次数   |   2,714 字   |   11 min

Random类的实例用于生成伪随机数流。此类使用 48 位的种子,使用线性同余公式 (linear congruential form) 对其进行了修改(请参阅 Donald Knuth的The Art of Computer Programming, Volume 3,第 3.2.1 节)。

Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。

相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同。

阅读全文 »

计算机中浮点数的二进制表示

发表于 2017-05-17   |   分类于 开发手册 , 计算机系统   |   阅读次数   |   2,625 字   |   10 min

最近看了一些代码,忽然发现double类型的数据可表示的范围比long类型的数据表示的范围要大的多,同样是占用64位大小,差距竟如此之大。后来发现,工作了两三年,竟然现在还不太熟悉计算机中浮点数的表示方式,确实有些惭愧。

下面的内容参考自《深入理解计算机系统(原书第三版)》。

IEEE 浮点表示

IEEE浮点标准用 $V=(-1)^s\times M\times 2^E$ 来表示一个数:

  • 符号(sign):$s$ 决定是负数($s=1$)还是正数($s=0$);
  • 尾数(significand):$M$ 是一个二进制小数,它的范围是$1\thicksim 2-\varepsilon$,或者是$0\thicksim 1-\varepsilon$;
  • 阶码(exponent):$E$ 代表2的次幂(可能是负数)。
阅读全文 »

Java8使用@sun.misc.Contended避免伪共享

发表于 2017-05-12   |   分类于 开发手册 , JVM   |   阅读次数   |   2,937 字   |   12 min

什么是伪共享

缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。

缓存行上的写竞争是运行在SMP系统中并行线程实现可伸缩性最重要的限制因素。有人将伪共享描述成无声的性能杀手,因为从代码中很难看清楚是否会出现伪共享。

为了让可伸缩性与线程数呈线性关系,就必须确保不会有两个线程往同一个变量或缓存行中写。两个线程写同一个变量可以在代码中发现。为了确定互相独立的变量是否共享了同一个缓存行,就需要了解缓存行和对象的内存布局,有关缓存行和对象内存布局可以参考我的另外两篇文章理解CPU Cache和Java对象内存布局。

阅读全文 »

理解CPU Cache

发表于 2017-05-07   |   分类于 开发手册 , JVM   |   阅读次数   |   1,518 字   |   6 min

CPU Cache介绍

随着CPU频率的不断提升,内存的访问速度却并没有什么突破。所以,为了弥补内存访问速度慢的硬伤,便出现了CPU缓存。它的工作原理如下:

  • 当CPU要读取一个数据时,首先从缓存中查找,如果找到就立即读取并送给CPU处理;
  • 如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。

为了充分发挥CPU的计算性能和吞吐量,现代CPU引入了一级缓存、二级缓存和三级缓存,结构如下图所示:

CPU-Cache.jpg
阅读全文 »

Java对象内存布局

发表于 2017-05-06   |   分类于 开发手册 , JVM   |   阅读次数   |   3,628 字   |   15 min

我们知道在Java中基本数据类型的大小,例如int类型占4个字节、long类型占8个字节,那么Integer对象和Long对象会占用多少内存呢?本文介绍一下Java对象在堆中的内存结构以及对象大小的计算。

对象的内存布局

一个Java对象在内存中包括对象头、实例数据和补齐填充3个部分:

ObjectMemoryLayout.png
阅读全文 »

java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

发表于 2017-04-21   |   分类于 开发手册 , JVM   |   阅读次数   |   5,035 字   |   18 min

原文出处:http://blog.csdn.net/zqz_zqz/article/details/70233767

理解锁的基础知识

如果想要透彻的理解java锁的来龙去脉,需要先了解以下基础知识。

基础知识之一:锁的类型

锁从宏观上分类,分为悲观锁与乐观锁。

乐观锁

乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。

java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。

悲观锁

悲观锁是就是悲观思想,即认为写多,遇到并发写的可能性高,每次去拿数据的时候都认为别人会修改,所以每次在读写数据的时候都会上锁,这样别人想读写这个数据就会block直到拿到锁。java中的悲观锁就是Synchronized,AQS框架下的锁则是先尝试cas乐观锁去获取锁,获取不到,才会转换为悲观锁,如RetreenLock。

阅读全文 »
123…5
Nicky

Nicky

More Articles,More Ideas

45 日志
9 分类
33 标签
RSS
© 2016 - 2020 Nicky
由 Hexo 强力驱动
主题 - NexT.Mist
京ICP备16045239号-1