Java如何实现零拷贝

什么是零拷贝

在操作系统中,从内核的形态区分,可以分为内核态(Kernel Space)和用户态(User Space)。

在传统的IO中,如果把数据通过网络发送到指定端的时候,数据需要经历下面的几个过程:

IO

  1. 当调用系统函数的时候,CPU执行一系列准备工作,然后把请求发送给DMA处理(DMA可以理解为专门处理IO的组件),DMA将硬盘数据通过总线传输到内存中。
  2. 当程序需要读取内存的时候,这个时候会执行CPU Copy,内存会有内核态写入用户的缓存区。
  3. 系统调用write()方法时,数据从用户态缓冲区写入到网络缓冲区(Socket Buffer), 由用户态编程内核态。
  4. 最后由DMA写入网卡驱动中,传输到网卡的驱动。
阅读更多

Java中实现顺序IO

顺序IO和随机IO


对于磁盘的读写分为两种模式,顺序IO和随机IO。 随机IO存在一个寻址的过程,所以效率比较低。而顺序IO,相当于有一个物理索引,在读取的时候不需要寻找地址,效率很高。

网上盗了一个图(侵权删)
IO

阅读更多

Netty02--Netty实现心跳

心跳机制

心跳机制是常用的一个健康监测的机制,说白了就是每隔一段时间向服务器发送一个心跳的报文,服务收到报文后,就认为当前的客户端在活动的状态,否则会进入异常的机制,比如说主从切换

既然存在一个通信,就一定会有服务端和客户端。服务端开启监听,客户端发起心跳报文,然后服务就再次响应。

阅读更多

网络IO模型

IO本质上是对数据缓冲区的读写,主要分为文件IO和网络IO,基本模型有很多,可以从两个方面去认识 同步和异步,阻塞和非阻塞。根据上面分类可以分为下面五类:

  1. 阻塞I/O(blocking I/O)
  2. 非阻塞I/O (nonblocking I/O)
  3. I/O复用(select 、poll和epoll) (I/O multiplexing)
  4. 信号驱动I/O (signal driven I/O (SIGIO))
  5. 异步I/O (asynchronous I/O )
阅读更多

select,poll,epoll的区别

在多路复用的IO的模型中,存在三种机制,分别是selectpollepoll.为了便于理解,可以使用简单的伪代码来表示一个原始的IO的读写:

1
2
3
4
5
6
7
8
9
10
while(true)  
{
for(Stream i: streamArr)
{
if(i.isNotReady()){
continue;
}
doSomething();
}
}
阅读更多

Spring学习笔记-06. 如何与Spring集成

全局组件初始化

对于组件的全局的初始化,可以使用前面所说的ImportBeanDefinitionRegistrar这个方法来指定初始化方法,以开源的队列QMQ的源码为例:

@EnableQmq实现方式

1
2
3
4
5
6
7
8
9
10
11
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(QmqConsumerRegister.class)
public @interface EnableQmq {

String appCode();

String metaServer();
}

阅读更多

Netty01---Netty实现简单通信

这个Demo的功能是客户端向服务端发送一个Hello Netty的消息,然后服务端又把消息返回给客户端

Server端

这些都是一些公共的代码,代码比较简单,服务端负责监听端口,Handler负责处理业务逻辑

阅读更多

Spring学习笔记-05. Spring事务的使用

配置HikariDataSource测试环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
public class RzConfig {
@Bean
public DataSource dataSource() {
//此处也可以写到配置文件中
final HikariConfig cpConfig = new HikariConfig();
cpConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
cpConfig.setJdbcUrl("jdbc:mysql://localhost:3306/rzframe?characterEncoding=utf8&useSSL=true&autoReconnect=true&failOverReadOnly=false&serverTimezone=UTC");
cpConfig.setUsername("root");
cpConfig.setPassword("abc12345");
cpConfig.setMaximumPoolSize(10);
HikariDataSource hikariDataSource = new HikariDataSource(cpConfig);
return hikariDataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(dataSource());
}
}
阅读更多

ServiceLoader的使用

获得接口的实现类有点困难

在Java中,由于反射的局限性,无法直接获取一个接口的所有实现子类,所以为了能够实现一个接口动态的注入实现的子类对象,需要借助ServiceLoader

简单的Demo使用

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

public interface IService {
void doSomeThing();
}

public class DefalutService implements IService{
@Override
public void doSomeThing() {
RzLogger.info("默认服务");
}
}

public class LogService implements IService {
@Override
public void doSomeThing() {
RzLogger.info("日志服务");
}
}


public static void main(String[] args) {
ServiceLoader<IService> loader = ServiceLoader.load(IService.class);
for (IService service : loader) {
service.doSomeThing();
}
}

阅读更多

Spring学习笔记-04.Spring AOP的使用

AOP的使用


所谓AOP的思想是现在程序设计中常用的一种设计思想,主要是为了能够更好的监控程序的运行的情况。 在Spring中AOP的思想展现的淋漓尽致。

实现一个简单的AOP。

1
2
3
4
5
6
7
8
@Component
public class OrderBiz {

public void doSomething(int x, int y) {
System.out.println(x + y);
}
}

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×