Index

  • 0. 简介
  • 1. 安装
  • 2. counter & memory

0. 简介

facebook开源的c工具库,不能算是一个框架,是一个集合了内存管理、数据结构、线程、事件处理等等的工具库。

github:https://github.com/facebook/libphenom

文档:http://facebook.github.io/libphenom/index.html

1. 安装

步骤就按github页面上的4步走,没啥悬念,记录下遇到的问题。

./configure 报错:

checking for pkg-config... /opt/local/bin/pkg-config
Package libcares was not found in the pkg-config search path.
Perhaps you should add the directory containing `libcares.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libcares' found
configure: error: c-ares is required

c-ares 这个第三方包没安装:

port -v install c-ares

然后编译能通过了,不过在make check的时候还是会报错:

...
FAIL: tests/dns.t
PASS: tests/variant.t
PASS: tests/bench/iopipes.t
============================================================================
Testsuite summary for phenom 0.1
============================================================================
# TOTAL: 13
# PASS: 12
# SKIP: 0
# XFAIL: 0
# FAIL: 1
# XPASS: 0
# ERROR: 0

搞了半天没解决这个问题,明显不是pkg-config的配置原因,也不是第三方包没安装的原因,这两个都没问题,如果有问题的话,刚才编译的时候就应该报错了。后来只能去问作者。

https://github.com/facebook/libphenom/issues/29

总算找到原因了,是因为中国这边DNS网络的原因造成test case无法通过。代码本身是没问题的,leave it。

pkg-config路径还是需要配置下:

sudo vim /etc/profile
添加:
export PKG_CONFIG_PATH=/opt/local/lib/pkgconfig:/opt/local/share/pkgconfig:/opt/X11/lib/pkgconfig:/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

安装就告一段落了。

2. counter & memory

程序构造中,基础中的基础就是内存管理,libPhenom对于内存管理有自己的一套解决方案。其实现是基于其另一套子系统counter系统之上进行的。说穿了其实就是带计数器的内存分配,方便进行监控和回收,并进行根据facility和name进行命名、识别、注册。

然后libPhenom还提供了系列的内存stat监控接口,方便调错和进行实时状态监控。

2.1 counter

counter子系统的概念还是比较简单的,这里主要简单介绍下内部概念,理解了基本上就没什么问题了。API也比较straight forward,直接查手册使用就可以了。

2.1.1 scope

scope就是一系列在逻辑上处于同一组的counter的集合概念。在使用counter的时候最初就需要创建scope。在定义scope的时候需要确定该scope内最多能有多少个counter注册进去,这个叫slot。切记申请创建的scope要手动释放。

2.1.2 slot

scope内可以存放的counter数量。

2.1.3 counter

计数器,我们需要的东西。不过这个概念是包含在scope里的,没有针对counter的实际数据结构(实际的数据结构就是scope)。

2.1.4 block

这个东西的概念有点搞,我们需要知道我们要创建block的scenario只有两个:

  • 当你在同一个线程内需要频繁进行计数器更新的时候
  • 当你在一个线程内对多个计数器进行更新,并期望这个操作尽可能快的时候

这个时候我们会创建一个“block”,然后利用它进行计数器更新。