2017年11月总结

这个月休了一个一周的小长假,回了家,额外的收获有两个:见到了老友,读完了《平凡的世界》第二部。

工作上不是太忙,来新公司一年了,这个月把这一年的工作收了个尾,同时也为下一年的工作做了一个计划。

业余时间看看C++,写了几篇文章。也许今年不会有什么开源代码贡献了。

Arch Linux —— 一个不错的Linux发行版

使用Arch Linux差不多有一年的时间了,总体感觉它是一个很不错的Linux发行版。

Arch Linux采用的是“滚动发布”(rolling release)模式,只需一个“pacman -Syu”命令,就可以用上最新的内核和软件包。这对那些对软件版本“追求极致”的开发者们(比如我),无疑是个“福音”。此外,Arch Linux的安装包做的很“人性化”。例如,我最近尝试使用clang开发OpenMP程序,不同于gccclang需要安装额外的包。而在安装clang时,系统会给出详细的提示信息:

# pacman -S clang
......
Optional dependencies for clang
    openmp: OpenMP support in clang with -fopenmp
    python2: for scan-view and git-clang-format
......

可以看到,除了表明需要openmp安装包外,系统还指出使用clang时要使用-fopenmp选项,这充分反映了安装包“考虑”的很“周全”。而在使用其它的一些Linux发行版时,安装clangOpenMP开发包时就很费一番周折。

另外,Arch Linux已经正式宣布不再支持i686平台了,这也提醒我们,也许是时候考虑和32位处理器说再见了。

如何计算进程占用的物理内存

How to get the process resident set size一文不仅介绍了在WindowsUnix(包括LinuxBSDmacOS等等)操作系统上如何获取进程所使用的峰值和实时物理内存,并提供了现成的代码。在这里我只分析一下Linux上相关功能的实现:

(1)获取峰值内存:

size_t getPeakRSS() {
    struct rusage rusage;
    getrusage(RUSAGE_SELF, &rusage);
    return (size_t)(rusage.ru_maxrss * 1024L);
}

getrusage函数获取进程资源的使用情况。当第一个参数时RUSAGE_SELF时,表示得到当前进程的统计数据。struct rusage中的ru_maxrss即表示该进程物理内存的使用峰值,因为度量单位是kilobytes,故而需要乘以1024

(2)获得实时内存:

size_t getCurrentRSS() {
    long rss = 0L;
    FILE* fp = NULL;
    if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL )
        return (size_t)0L;      /* Can't open? */
    if ( fscanf( fp, "%*s%ld", &rss ) != 1 )
    {
        fclose( fp );
        return (size_t)0L;      /* Can't read? */
    }
    fclose( fp );
    return (size_t)rss * (size_t)sysconf( _SC_PAGESIZE);
}

/proc/self/statm文件共包含7个字段,第二个即是进程当前时刻占用的物理内存,单位是页面大小。要获得精确的字节数,还需通过sysconf系统调用获得页面所占据的空间,通常为4096

 

Linux垄断超级计算机

top500网站公布的统计数据显示,目前世界排名前500的超级计算机使用的全部都是Linux操作系统:1
这就意味着之前“500强”中仅存的2Unix也终于“沦陷”了:

2

看一下关于Linux发行版的统计数据:

3

占据份额最大的是“Linux”,是因为不能确定具体的发行版?还是自己组装的,所以不属于任何发行版?我没有找到解释。但是“屈居亚军”的是CentOS,这倒也反映了这个RHEL的“免费社区版本”的稳定性以及受欢迎程度。如果你想选一个不花钱,又可靠的操作系统,CentOS可能是一个不错的选择。

此外,中国的超级计算机数量首次超越美国,成为世界第一:

4

最后,我的前东家HPE在生产厂商的排名中继续高居榜首,联想和浪潮,这两个来自中国的企业紧随其后:

5