bitcoin-master code reading record(2) SetupEnviroment

根据上篇Main()运行 flow, 依序进行 查看Code 具体实现。

一.SetupEnvirment()

file位置:src\util.cpp

函数:初始化运行环境

具体内容:

1.控制 内存分配:

bitcoin-master code reading record(2) SetupEnviroment_第1张图片

解析说明:

sizeof(void*) == 4:判断系统为32bit(64bit 系统结果为8)

mallopt(M_ARENA_MAX, 1):由用户自定义arena 个数 .

设置为0:表示系统按CPU进行自动设置

相关概念:

mallopt :是控制内存分配的函数,原型为:

int mallopt(int param,int value)//控制内存分配的函数

glibc: c运行库,是Linux 系统中最底层api

glibc为了分配内存的性能的问题,使用了很多叫做arena的memory pool,缺省配置在64bit下面是每一个arena为64M,一个进程可以最多有 cores * 8个arena。假设你的机器是4核的,那么最多可以有4 * 8 = 32个arena,也就是使用32 * 64 = 2048M内存。 当然你也可以通过设置环境变量来改变arena的数量.例如export MALLOC_ARENA_MAX=1

hadoop推荐把这个值设置为4。当然了,既然是多核的机器,而arena的引进是为了解决多线程内存分配竞争的问题,那么设置为cpu核的数量估计也是一个不错的选择。设置这个值以后最好能对你的程序做一下压力测试,用以看看改变arena的数量是否会对程序的性能有影响。


arena: memory pool .  Linux 内存管理参考,其中有arena 的介绍,包括数量限制、多arena的处理方式,可进入了解

bitcoin-master code reading record(2) SetupEnviroment_第2张图片

如上式,过多的arena 分配会造成虚拟空间的浪费,所以初始化时 由用户自定义改为1.


2.默认系统区域设置

bitcoin-master code reading record(2) SetupEnviroment_第3张图片

解析说明:

检测到非定义的某些操作系统,则初始化为默认的系统区域设置

std::locale(""); :根据当前运行环境正确设置locale(当前 locale 无效时 返回runtime error)

setenv("LC_ALL", "C", 1);  覆盖所有LC_*的设置值,采用默认。


参考:C++中的Locate 设置

C/C++程序中,locale(即系统区域设置,即国家或地区设置)将决定程序所使用的当前语言编码、日期格式、数字格式及其它与区域有关的设置,locale设置的正确与否将影响到程序中字符串处理(wchar_t如何输出、strftime()的格式等)。因此,对于每一个程序,都应该慎重处理locale设置。

C locale和C++ locale是独立的。C locale用setlocale(LC_CTYPE, “”)初始化,

C++ locale用std::locale::global(std::locale(“”))初始化。这样就可以根据当前运行环境正确设置locale。

备注说明(以下为百度百科摘录):

Locale是某一个地域内的人们的语言习惯和文化传统和生活习惯,是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。

Locale是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。

在locale环境中,有一组变量,代表国际化环境中的不同设置:

1.    LC_COLLATE       定义该环境的排序和比较规则

2.    LC_CTYPE            用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。

3.    LC_MONETARY     货币格式

4.    LC_NUMERIC         非货币的数字显示格式

5.    LC_TIME                 时间和日期格式

6.    LC_MESSAGES     提示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。LANGUAGE参数可同时设置多种语言信息,如LANGUANE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"。

7.    LANG                      LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL。

8.    LC_ALL

它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。

"C"是系统默认的locale,"POSIX"是"C"的别名。所以当我们新安装完一个系统时,默认的locale就是C或POSIX。


相关概念:

POSIX :可移操作系统接口,定义了操作系统应该为应用程序提供的接口标准

setenv:查询和显示环境变量


3.本地语言输出设置

bitcoin-master code reading record(2) SetupEnviroment_第4张图片

解析说明:

fs::path::imbue(loc);  :

imbue函数是指对象引用,表示输出时,使用的区域语言对象: 本地区域语言

函数原型:locale basic_ios::imbue( const locale& loc);

参数说明:loc: const 对象引用,表示输出时,使用的区域语言对象

返回值:之前的使用的区域语言

相关概念:

locale::classic


参考:

LC_ALL=C的含义  

C++中的locale设置 (即系统区域设置)

百度百科


区块链研习社源码研读班 姝婧

你可能感兴趣的:(bitcoin-master code reading record(2) SetupEnviroment)