• AIO in C

    |

    AIO, 即异步非阻塞I/O,允许了包括I/O与处理计算的重叠。在大量并发任务下,理论上可以提高相应的处理计算性能。在此简单记录一下C语言中的AIO,方便后续有需要时候查询。

  • Synchronous vs. Asynchronous, Blocking vs. Non-Blocking I/O

    |

    背景

    在Unix环境下,有5种基本的I/O模型:

    • blocking I/O
    • nonblocking I/O
    • I/O multiplexing (select and poll)
    • signal driven I/O (SIGIO)
    • asynchronous I/O (the POSIX aio_ functions)

    对于一个操作I/O的程序来说,首先,程序会由用户态向内核发出请求,由内核态去对相关的硬件进行交互。在数据已经准备完毕后,再由内核拷贝到相应的进程中。这是一个两段执行的过程。

    假设我们目前进行的是Network I/O,我们用Socket去进行数据的读取。首先,我们会等待数据达到我们的网络设备,当数据到达以后,它将会被存储在内核的缓存中。然后,这个数据会从内核的缓存中拷贝到程序的缓存中,以供使用。

  • Basic Network I/O Techniques

    |

    经常能在各种地方看到这么一句话:

    Everything in Unix is a file

    当Unix程序做任何的I/O时,本质上他们也是通过读/写相应的文件的描述符(file descriptor)来进行操作。

    在Unix系统中,文件描述符是一个泛化的概念,它是一个代表了某个打开的‘文件’的一个整型值(integer)。此处的‘文件’既可以是一个字面意义上存储在磁盘上的一个数据文件,也可以是一个网络通信,一个FIFO,一个Pipe…等。

    本文中,我将研究一下基本的C语言下的Network I/O。

  • Memory Layout

    |
    • { C }

    今天做了一个简单的测试,简单地探究了一下GCC下的Memory Layout。

  • typedef in C

    |
    • { C }

    笔者对C语言只是知道简单的使用方法,并不是非常精通。近日在Redis的 server.h 文件中发现了这样的代码:

    1
    2
    3
    4
    5
    6
    typedef void redisCommandProc(client *c);
    struct redisCommand {
    char *name;
    redisCommandProc *proc;
    ......
    };

    对于此处的 typedef 语句感到较为迷惑。就以前所知,C语言中的 typedef 就是用于创建一个数据类型的别名的关键字。此处的 typedef 语句应该是一个函数指针类型的别名. 而在结构体redisCommand中的 proc成员应该就是一个指向函数的指针,该函数接受一个client指针作为参数,返回为空。

  • 用hexo快速搭建个人博客

    |

    写在前面

    如果你跟我一样,想要开辟出一块自留地来记录自己在技术学习过程中的各种收获,却又懒于搭建个人博客的繁琐,也对各种免费空间无爱,那么我相信Hexo会是一个不错的选择。

    Hexo是一个快速、简洁且高效的博客框架,并且可以支持使用Markdown来解析文章。对于“颜控”,还有各种各样的主题可供使用。同时,Hexo搭建的博客还可以部署在github上,免去了自己购买空间的花费,又能获得无限的空间。

    本文主要介绍作者在使用Hexo时的实践心得。关于更加深入的内容,可以查阅Hexo官方的文档以求得更详尽的解答。