Skip to content

日常学习笔记归档

CoderSong edited this page Feb 1, 2017 · 11 revisions

通用编程基础

Linux并发编程

  1. io多路复用之epoll 函数原型:
    阻塞等待事件返回

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

  1. 进程池/线程池

Linux系统编程

两种IO事件处理模型

Reactor模型,Preactor模型(需要OS的异步IO的支持)。

Reactor模型主线程监听是否有IO事件发生(实际上包含了IO事件,signal事件,timer事件三类事件),当事件发生时,将事件通知给工作线程处理,主线程不做任何事情。

Reactor模型的工作流程:

  1. 主线程往epoll内核事件表中注册socket读就绪事件。
  2. epoll_wait等待socket可读事件。
  3. epoll_wait通知主线程,将可读事件放入请求队列。
  4. 睡眠在请求队列上的子线程被唤醒,并且读socket上的数据,并处理客户请求,完成后将socket的写就绪事件注册到epoll内核事件表中。
  5. 当socket可写时,epoll_wait通知主线程,主线程将写就绪事件放入请求队列。
  6. 睡眠在请求队列上的子线程被唤醒,子线程将数据写入socket,处理客户请求。

preactor模型的工作流程:

  1. 主线程通过aio_read向内核中注册socket上的读完事件,告诉内核用户读缓冲区的位置,以及读完如何通知应用程序。
  2. 主线程做自己的事情。
  3. 内核将socket数据读入用户缓冲区后,通过信号通知用户程序(数据已可用)。
  4. 应用程序信号处理函数中选择一个工作线程去处理IO数据(用户的业务逻辑),工作线程处理完用户的请求后,将需要写给用户的数据通过aio_write函数,告诉内核用户写缓冲区的位置,并注册socket写完成的事件。
  5. 主线程做自己的事情。
  6. 用户处理结果内核发送完成后,通过信号通知应用程序。应用程序定义的信号处理函数中选择一个工作线程来做善后处理。如决定是否关闭socket等工作。

自己的理解

reactor模型,主线程获取的是读/写就绪事件,获取事件后交由子线程来处理。
preactor模型,主线程获取的是读/写完成事件,子线程处理读/写完成后,用户的请求逻辑。

分布式系统相关

docker相关

Clone this wiki locally