使用C++ boost从零构建一个异步文件IO系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C++ boost从零构建一个异步文件IO系统相关的知识,希望对你有一定的参考价值。

前言

  • 因为本科毕业设计中要做一个分布式文件系统,其中一个模块需要实现文件IO。为了验证我对异步IO的理解,决定造一个异步文件IO的轮子。操作系统已经给出各种异步操作的API,如重叠IO, IOCP,kqueue,select,poll,epoll等机制,而且C++也有很多跨平台的异步IO库,如libevent,boost::asio等。我参考已有的实现来完善这个小系统的功能。
  • 渣技术,渣代码,出现问题请各位指出。

概述

  • 同步与异步:

  同步:假如我想对一个文件(socket也同理)进行处理,那么一般的流程就是:

  

1 fstream file;
2 file.open();
3 file.read();
4 //do something
5 file.close();

  通常情况下,当这个线程运行到read()时会被阻塞,直到文件读取完成。

  异步:

  还是上面的代码,我在read()时通过操作系统或库提供的异步机制,告诉操作系统我想读一个文件,数据读完后执行某个功能;而当前线程在交代完操作系统该做什么工作之后,还可以做些别的事情(线程不必等待文件IO完成)。

  • 线程池

  为了避免IO阻塞线程导致程序无响应,完全可以为每一个文件操作创建一个线程,这样就可以同时处理多个文件了。但是创建线程,切换线程,销毁线程也是一笔资源开销,如果想重复使用已有的线程,就可以使用线程池。作为线程池,至少要提供创建线程和提交任务的功能,复杂一点可以智能控制线程池里的线程数量。这个文件系统中就会使用线程池。Windows API中的ThreadPool就很好用,但既然是造轮子,那么为了造轮子而造轮子也没什么关系,干脆就写个简单的线程池出来。

  • 使用的库

  这个模块只使用stl 和boost 两个库。

  stl主要涉及容器和fstream。boost涉及到智能指针shared_ptr,线程同步shared_mutex,lock_guard, boost::filesystem中的path和一些文件操作,线程操作创建退出等。

  •  智能指针

  自古以来内存管理都是C/C++中的重头戏,智能指针的功能就是分配出来的内存由库管理,如果某个智能指针指向的内存,通过其他的智能指针也能访问到(即有多个引用),那么该智能指针即时被销毁,指向的内存也不会销毁;只有这块内存没有引用,才会被库释放。

  • boost::filesystem

  这个库提供了一些跨平台文件操作的API,如文件夹遍历,查看属性,删除文件等。path类可以记录跨平台的路径。

  • 因为水平有限,这个模块基本不会出现跟模板有关的实现。(以后再说)

实现: Talk is cheap,show me the code.

https://github.com/nemoofnemo/Cluster/tree/master/FileSystem

--未完待续

以上是关于使用C++ boost从零构建一个异步文件IO系统的主要内容,如果未能解决你的问题,请参考以下文章

Boost asio基本概念

Boost Asio总结异步通信

boost::asio::ip::tcp实现网络通信的小例子

boost::asio::io_service类

C++ Boost Asio 简单聊天教程

C++ - 几个 Boost.Asio 相关问题