Operating Systems: three easy pieces

virtualization

CPU virtualization

fork、join、exec

trap

用户态和内核态

schedule

​ single cpu

​ multi cpu

​ cpu cache

​ work stealing

总结,cpu虚拟化是对程序调度、权限控制的虚拟化,在此基础上需要确保安全性和高效性,一系列的技术由此衍生出来。

memory virtualization

Adress space

docker笔记

基本概念

image:是镜像,就像是java中的一个类,静态资源

container:是容器,就像是java中的类实例,根据image运行起来的容器实例

基本命令

docker image ls:展示已有image

docker run -it <imageName>:以交互形式在一个新的container里面运行一个image

docker run -d:后台执行

docker container ls:显示已有container

docker build -t <tag>:讲一个dockerfile编译成一个image

docker ps:显示正在运行的container

docker exec:Run a command in a running container

docker stop:停止一个正在运行的container

docker start:启动一个container

docker rm:删除一个container

docker inspect:Return low-level information on Docker objects

docker network ls:展示已有网络

docker network create -d <driver> <name>:创建一个网络

docker network inspect <name>:查看一个网络的详情,比如包含了什么容器

docker网络

网络类型

  • bridge:网桥模式,最常用
  • host:共享host机器的网络命名空间
  • none:孤立的网络命名空间,只有本地通过docker exec才能访问

bridge模式

—-link:可以将一个容器连接到另外一个容器,然后可以通过容器名称访问,例子:docker run -d --name test1 --link test2 busybox,创建一个后台运行的busybox容器,名称为test1,与test2容器连接。

--network:

1
2
3
4
# 创建一个driver为bridge的网络my-bridge
docker network create -d bridge my-bridge
# 启动一个容器,加入my-bridge
docker run -d --name test3 --network my-bridge busybox

如用户自己创建了一个network(默认创建的容器都是加入docker0 bridge 网络),那么默认加入该网络的容器都可以通过容器名称访问。

端口映射

docker run -p <容器端口>:<需要映射到本地的端口>

设置环境变量:docker run -e <env_key>=<env_value>

docker数据持久化

  1. Data Valume:将container中运行产生的数据映射到本地路径。

    docker volume ls:列出当前所有volume

    docker volume inspect <id>:查看指定volume信息

    docker run -v <volumeName>:local/path:指定需要映射的路径和volume的名字,可以复用

  2. Bind Mounting:运行容器的时候指定本地路径和容器里面的路径,这两个路径将会同步共享

    docker run -v local/path:container/path

Java基础笔记(二):JMM内存模型

Java基础笔记(二):JMM内存模型

先抛出问题:JMM内存模型是什么,cas实现原理( CPU Lock前缀指令),它是如何保证其他cpu core的cache失效的,然后会问你volatile的实现原理,要结合java内存模型来讲,可见性是如何实现的(内存屏障),synchronized锁和reentrantlock的区别以及内部怎么实现的:常用的gc算法及优缺点,如何判断对象的存活性

Netty源码学习笔记——Netty服务端启动

问题

  1. 服务端的socket在哪里初始化?

    答:在io.netty.bootstrap.ServerBootstrap#init中初始化服务端的socket。

    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
    49
    50
    51
    52
    @Override
    void init(Channel channel) throws Exception {
    final Map<ChannelOption<?>, Object> options = options0();
    synchronized (options) {
    channel.config().setOptions(options);
    }

    final Map<AttributeKey<?>, Object> attrs = attrs0();
    synchronized (attrs) {
    for (Entry<AttributeKey<?>, Object> e: attrs.entrySet()) {
    @SuppressWarnings("unchecked")
    AttributeKey<Object> key = (AttributeKey<Object>) e.getKey();
    channel.attr(key).set(e.getValue());
    }
    }

    ChannelPipeline p = channel.pipeline();

    final EventLoopGroup currentChildGroup = childGroup;
    final ChannelHandler currentChildHandler = childHandler;
    final Entry<ChannelOption<?>, Object>[] currentChildOptions;
    final Entry<AttributeKey<?>, Object>[] currentChildAttrs;
    synchronized (childOptions) {
    currentChildOptions = childOptions.entrySet().toArray(newOptionArray(childOptions.size()));
    }
    synchronized (childAttrs) {
    currentChildAttrs = childAttrs.entrySet().toArray(newAttrArray(childAttrs.size()));
    }

    p.addLast(new ChannelInitializer<Channel>() {
    @Override
    public void initChannel(Channel ch) throws Exception {
    final ChannelPipeline pipeline = ch.pipeline();
    ChannelHandler handler = config.handler();
    if (handler != null) {
    pipeline.addLast(handler);
    }

    // We add this handler via the EventLoop as the user may have used a ChannelInitializer as handler.
    // In this case the initChannel(...) method will only be called after this method returns. Because
    // of this we need to ensure we add our handler in a delayed fashion so all the users handler are
    // placed in front of the ServerBootstrapAcceptor.
    ch.eventLoop().execute(new Runnable() {
    @Override
    public void run() {
    pipeline.addLast(new ServerBootstrapAcceptor(
    currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs));
    }
    });
    }
    });
    }

    在这里会将我们实际使用的代码中对serverbootstrap的配置初始化到服务端的channel上

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup)
    .channel(NioServerSocketChannel.class)
    .childOption(ChannelOption.TCP_NODELAY, true)
    .childAttr(AttributeKey.newInstance("childAttr"), "childAttrValue")
    .handler(new ServerHandler())
    .childHandler(new ChannelInitializer<SocketChannel>() {
    @Override
    public void initChannel(SocketChannel ch) {
    ch.pipeline().addLast(new AuthHandler());
    //..
    }
    });
  2. 在哪里accept连接?

io.netty.channel.nio.AbstractNioChannel#doBeginRead

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
protected void doBeginRead() throws Exception {
// Channel.read() or ChannelHandlerContext.read() was called
final SelectionKey selectionKey = this.selectionKey;
if (!selectionKey.isValid()) {
return;
}

readPending = true;

final int interestOps = selectionKey.interestOps();
if ((interestOps & readInterestOp) == 0) {
selectionKey.interestOps(interestOps | readInterestOp);
}
}

高性能mysql笔记——第四章

Schema与数据类型优化

数据类型的选择

  1. 更小的通常更好
  2. 简单就好,应该使用Mysql内建的类型而不是字符串来存储日期和时间;应该用整形存储IP地址。
  3. 尽量避免NULL;难优化,占用更多存储空间,特殊处理,索引记录需要额外的字节。

Java基础笔记(一):Collection、Map

Java基础笔记(一):Collection、Map

先抛出问题:collection接口下面有哪些集合,hashmap的实现原理,要把1.7和1.8的区别(红黑树)讲出来,map有哪些实现类以及使用场景,hashmap, hashtable, linkedhashmap,weakHashMap, treemap, concurrentmap,linkedhashmap和treemap排序的区别,concurrenthashmap如何实现线程安全,这里也要把1.7和1.8实现差异说出来(分段加锁和cas技术),说到这里以后就会问你cas实现原理( CPU Lock前缀指令),它是如何保证其他cpu core的cache失效的,然后会问你volatile的实现原理,要结合java内存模型来讲,可见性是如何实现的(内存屏障),synchronized锁和reentrantlock的区别以及内部怎么实现的:常用的gc算法及优缺点,如何判断对象的存活性