JDK源码阅读-ByteBuffer

Buffer是Java NIO中对于缓冲区的封装。在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接。但是在Java NIO中,缓冲区这一概念变得复杂,可能是对应Java堆中的一块内存,也可能是对应本地内存中的一块内存。而byte数组只能用来指定Java堆中的一块内存,所以Java NIO中设计了一个新的缓冲区抽象,涵盖了不同类型缓冲区,这个抽象就是Buffer。

阅读全文

JDK源码阅读-InterruptibleChannel与可中断IO

Java传统IO是不支持中断的,所以如果代码在read/write等操作阻塞的话,是无法被中断的。这就无法和Thead的interrupt模型配合使用了。JavaNIO众多的升级点中就包含了IO操作对中断的支持。InterruptiableChannel表示支持中断的Channel。我们常用的FileChannel,SocketChannel,DatagramChannel都实现了这个接口。

阅读全文

Java日志-Log4j实现运行时修改日志级别

源码分析后,实现Log4j运行时修改日志级别思路就非常清晰了。

阅读全文

Java日志-Log4j源码分析

Log4j是一个历史非常悠久的库首次发布与2001年1月,有17年历史了,那个时候Java才发布1.3版本,所以也可以从Log4j的代码中看到他使用了很多古老的JDK类,比如Hashtable,可能是因为兼容性的考虑,后续的版本也一直没有升级这些地方。虽然Log4j历史悠久,但是应该还是使用最广泛的日志实现,我们分析其实现,还是能学到很多东西的,对于后续分析Log4j2或者Logback,都是有帮助的。

阅读全文

Java日志-SLF4J使用与源码分析

SLF4J全称The Simple Logging Facade for Java,Java简易日志门面,将接口抽象与实现隔离开,在不修改代码的情况下使用不同的日志实现。

阅读全文

自己动手写操作系统-计算机通电之后的操作

以前每次开机,先是看到一个黑屏幕上显示一些字符,然后会进入windows经典的启动界面。对于要编写操作系统来说,这种表面的认识是不够的,得需要知道一下通电后,执行的入口是哪里,启动的流程是如何跑起来的。

阅读全文

Bochs学习-安装配置篇

最近想学习如何从零编写一个操作系统,现在关于这个的资料蛮多的,《操作系统真象还原》,就是一本神级别的书,看得我醍醐灌顶。其他的书籍还有《Orange’S:一个操作系统的实现》,《30天自制操作系统》。

自己动手写操作系统,虚拟机是必不可少的,虽然我们的目标是写出一个物理机可以安装可以运行的操作系统,但是用物理机会非常的麻烦也花钱。虚拟机中,vmware和virtualbox比较出名,但是却不适合我们的场景,因为这两个虚拟机更注重效率,所以会使用硬件级的虚拟化,所以在硬件调试上,功能有限,而bochs这个开源虚拟机,是用软件虚拟了所有的硬件,所以调试可以做到非常细的粒度,比如每次cpu执行命令,我们都可以暂停,看寄存器状态,看内存状态,这对于操作系统开发调试的帮助太大太大了。所以我们使用bochs这个虚拟机来。

阅读全文

Java如何保证文件落盘?

在之前的文章Linux/UNIX编程如何保证文件落盘中,我们聊了从应用到操作系统,我们要如何保证文件落盘,来确保掉电等故障不会导致数据丢失。JDK也封装了对应的功能,并且为我们做好了跨平台的保证。

阅读全文

Linux/UNIX编程如何保证文件落盘

我们编写程序write数据到文件中时,其实数据不会立马写入磁盘,而是会经过层层缓存。每层缓存都有自己的刷新时机,每层缓存都刷新后才会写入磁盘。这些缓存的存在是为了加速读写操作,因为如果每次读写都对应真实磁盘操作,那么读写的效率会大大降低。带来的坏处是如果期间发生掉电或者别的故障,还未写入磁盘的数据就丢失了。对于数据安全敏感的应用,比如数据库,比如交易程序,这是无法忍受的。所以操作系统提供了保证文件落盘的机制。我们来看下这些机制的原理和使用。

阅读全文

MongoDB遍历方式对比

在处理数据时,需要遍历MongoDB全表数据。

阅读全文