一

{"type":"编程笔记"}


  • Home

  • Archives
  • Search

vim killer plugin vim-im chinese input method

Posted on 2019-03-20   |   In vim

vimim 中文输入法插件

原版插件地址

安装

下载简化版本

原来的这个插件功能很强大,并支持云输入法,我对插件作者vimim表示由衷的钦佩和感谢。

我将原插件的功能做了精简,并把 python 相关的脚本也都移除了,安装方式如下:

 git clone https://github.com/yuweijun/vim-im.git

复制安装

将vim-im/plugin目录下面的 2 个文件,复制到 vim 的plugin目录里即可,或者是使用vundle和vim-plug来管理 vim 插件。

vundle 管理安装

使用vundle管理安装如下:

set nocompatiblefiletype offset rtp+=~/.vim/bundle/Vundle.vimcall vundle#begin()" Plugin ...Plugin 'yuweijun/vim-im'call vundle#end()filetype plugin indent on
Read more »

java nio need to known

Posted on 2019-03-18   |   In java

NIO 开发需知

Selector 在不同线程中对象锁竞争问题

多路复用器 selector 的register(...)和select(...)操作会有锁冲突,在 reactor pattern skeleton example 文章中已经简单说明了多路复用器上有很多同步操作,锁竞争很严重,并可能阻塞线程,为了避免在 selector 及其属性对象上有同步操作,可以引入一层用以解耦,如示例 reactor pattern time server example 里将 MainReactor 新接入的 socketChannel 加入到对应 SubReactor 线程的不同队列里,可以看源码注释说明。

Netty 中因为在selector.select(1000)操作之后,后面还有处理定时任务相关的逻辑,线程不会一直持有selector.publicKeys对象锁,所以其他线程可以注册新的通道到EventLoop#selector上。

Selector 维护的各种集合

Selector 可以在多线程环境中使用,但是其各种键集合并非是线程安全的。

Selector 维护三种选择键:

  1. keys: 保存了所有已注册且没有 cancel 的选择键,Set 类型,可以通过selector.keys()获取。
  2. selectedKeys: 已选择键集,即前一次操作期间,已经准备就绪的通道所对应的选择键,此集合为 keys 的子集,通过selector.selectedKeys()获取。
  3. canceledKeys: 已取消键,已经被取消但尚未取消注册的选择键,此集合不可被访问,为 keys 的子集。

Selector 本身对各种 key 集合的操作都是同步的,当然为了避免死锁问题,其同步的顺序也是一致的,比如在执行select(...)操作时,其他线程的register(...)操作将会阻塞,可以在任意时刻关闭通道或者取消键,因为select(...)操作并未对 cancelledKeys 同步,因此有可能再 selectedKey 中出现的 key 是已经被取消的,这一点需要注意,需要校验key.isValid() && key.isReadable()。

Selector#wakeup() 方法

某个线程调用select(...)方法后阻塞了,即使没有通道已经就绪,也有办法让其从select(...)方法返回。只要在其他线程上调用Selector#wakeup()方法即可,阻塞在select(...)方法上的线程会立即返回。

如果有其它线程调用了wakeup()方法,但当前没有线程阻塞在select(...)方法上,下个调用select(...)方法的线程会立即wakeup。

如果多个线程阻塞,事实上 wakeup 只能让正在阻塞的一个线程返回。

有二种情况会导致线程阻塞在 select 操作上:

  1. 因为 selector keys 集合同步阻塞
  2. 因为 selector IO 阻塞

wakeup()方法是让基于 pipe IO 阻塞的操作返回。但是因为 keys 是同步锁的阻塞,wakeup 也无能为力,wakeup 是一种对底层操作消耗较为严重的操作,需要对此操作的调用频度有所留意。

为什么要唤醒 Selector#wakeup()

  1. 注册了新的 channel 或者事件
  2. channel 关闭,取消注册
  3. 优先级更高的事件触发(如定时器事件),希望及时处理

wakeup 的原理

  1. Linux 上利用 pipe 调用创建一个管道
  2. Windows 上则是一个 loopback 的 TCP 连接,这是因为 win32 的管道无法加入 select fd set
  3. 将管道或者 TCP 连接加入 select fd set
  4. wakeup 往管道或者连接写入一个字节
  5. 阻塞的 select 因为有 IO 事件就绪,立即返回
  6. wakeup 的调用开销不可忽视
JNIEXPORT void JNICALL Java_sun_nio_ch_EPollArrayWrapper_interrupt(JNI Env *env, jobject this, jint fd){    int fakebuf[1];    fakebuf[0] = 1;    if (write(fd, fakebuf, 1) < 0) {        JNU_ThrowIOExceptionWithLastError(env," write to interrupt fd failed");    }}
Read more »

reactor pattern time server example

Posted on 2019-03-16   |   In java

下面是Reactor Pattern中多Reactor多线程模型的简单示例,可以简单响应客户端的请求,但是没有处理TCP/IP传输数据包的粘包/分包相关问题。

直接运行此类的main()方法,里面有一个简单的同步阻塞的客户端实现。

Read more »

reactor pattern skeleton example

Posted on 2019-03-16   |   In java

下面这个示例代码基本都是从Doug Lea的这个 PPT,Scalable IO in Java 中复制的,只是简单做了修改,以便这个Server能够初步可以运行起来。

以下为这个示例的源代码:

ReactorMain.java

package com.example.nio.reactor.pattern;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;public class ReactorMain {    private static final Logger LOGGER = LoggerFactory.getLogger(ReactorMain.class);    public static void main(String[] args) throws IOException {        Reactor reactor = new Reactor(8080);        Thread thread = new Thread(reactor);        thread.setName("MAIN-REACTOR");        thread.start();        LOGGER.info("reactor start on port : 8080");    }}
Read more »

doug lea - scalable io in java

Posted on 2019-03-15   |   In java

PPT: Scalable IO in Java

Author: Doug Lea

Outline

  • Scalable network services
  • Event-driven processing
  • Reactor pattern
    1. Basic version
    2. Multithreaded versions
    3. Other variants
  • Walkthrough of java.nio nonblocking IO APIs

Network Services

  • Web services, Distributed Objects, etc
  • Most have same basic structure:
    1. Read request
    2. Decode request
    3. Process service
    4. Encode reply
    5. Send reply
  • But differ in nature and cost of each step
    1. XML parsing, File transfer, Web page
    2. generation, computational services, ...

Classic Service Designs

Each handler may be started in its own thread

Read more »
1234…99
yuweijun

yuweijun

492 posts
12 categories
RSS
GitHub Twitter
© 2021 yuweijun
Powered by Hexo
Theme - NexT.Mist.KISS