Memcache initialization
1.signal(SIGINT, sig_handler);
2.seetings_init(); //初始化默认的设置,初始化全局变量struct setting settings
static void settings_init(void) {
settings.use_cas = true;
settings.access = 0700;
settings.port = 11211;
settings.udpport = 11211;
/* By default this string should be NULL for getaddrinfo() */
settings.inter = NULL;
settings.maxbytes = 64 * 1024 * 1024; /* default is 64MB */
settings.maxconns = 1024; /* to limit connections-related memory to about 5MB */
settings.verbose = 0;
settings.oldest_live = 0;
settings.evict_to_free = 1; /* push old items out of cache when memory runs out */
settings.socketpath = NULL; /* by default, not using a unix socket */
settings.factor = 1.25;
settings.chunk_size = 48; /* space for a modest key and value */
settings.num_threads = 4; /* N workers */
settings.num_threads_per_udp = 0;
settings.prefix_delimiter = ':';
settings.detail_enabled = 0;
settings.reqs_per_event = 20;
settings.backlog = 1024;
settings.binding_protocol = negotiating_prot;
settings.item_size_max = 1024 * 1024; /* The famous 1MB upper limit. */
settings.maxconns_fast = false;
settings.hashpower_init = 0;
}
3. while (-1 != (c = getopt(argc, argv, //对输入的参数进行相应的设置,这种demon,item_max_size 等等
4.getrlimit,setrlimit 是系统调用,用来修改最大连接数 struct rlimit .
5.去掉root权限. 如果是root 通过 -u 参数来启动
6.init_sasl() 是否开启 sasl
7.daemonize(maxcore, setting.verbose) 开启 daemonize 模式
8.main_base = event_init(); 初始化主线程
9.stats_init() 初始化全局变量stats.
10.assoc_init() 初始化hashtable, 默认calloc(2^16, sizeof(void *))个指针
11.conn_init() 初始化连接池conn, 默认的空闲连接池的个数是200 声明calloc(200, sizeof(conn *))
12.slabs_init(settings.maxbytes, setting.factor, preallocate) 初始化memcached. setting.maxbytes 是最大内存的大小,setting.factor 成长因子, preallocate是否预先声明空间 . 默认的最小的chunk_size 是48,成长因子是1.25.
13.sigignore(SIGPIPE) 忽略SIGPIPE信号。 在Linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,底层将抛出一个SIGPIPE信号。如果程序没有处理或没有忽略,这个信号将导致程序退出。这不是我们需要的.
14.thread_init(settings.num_threads, main_base); //初始化线程池模型
15.start_assoc_maintenance_thread() //在assoc里面,有一个独立的线程来维护从old_hashtable中的数据到相应的primary_hashtable中.开启这个线程
16.clock_handler(0, 0, 0); //初始化libevent的时间处理
17.server_socket_unix(settings.socketpath,settings.access) //建立tcp 或者 udp的socket连接sfd,dispatch_thread开始监听这个sfd连接.
server_sockets(settings.port, tcp_transport,portnumber_file) //可以让dispatch同时监听多个连接的端口. 到此 服务器初始化结束,等到client的连接
18.if (event_base_loop(main_base, 0) != 0) //循环main_base事件
19.stop_assoc_maintenance_thread(); //退出在assoc里面的维护hashtable线程