memcached启动过程2(改用自己的语言来叙述)

来源:互联网 发布:java怎么打成jar 编辑:程序博客网 时间:2024/04/30 22:21

设置系统的RLIMIT_CORE当前值和最大值都为无限大


然后设置系统RLIMIT_NOFILE(系统内每个进程能打开的文件数)为全局结构体settings.maxconns


j接着是如果用户位root,则必须使用参数-u root,否则会打印输出,然后退出

取得登录用户的信息,根据此信息来设置组id和用户id



如果系统支持sasl则初始化


如果系统是在deamon情况下运行,则对SIGHUP信号的处理是忽略,调用daemon(调用fork生成子进程,父进程退出,然后设置子进程为进程组首进程,切换到根目录,把输入出处,错误输出都指向/dev/null) 


如果设定了参数-k,则调用mlockall将当前进程所使用的所有的内存空间锁在物理内存中,防止被操作系统交换到swap分区(操作系统把一些不活跃的进程转移到swap分区,(就是使用硬盘来作为虚拟内存);


调用libevent库函数event_init()来初始化事件


调用stats_init初始化全局结构体stats(在memcached客户端使用此命令可以输出此结构体的很多成员变量的值)


assoc_init 初始化primary_hashtable(从堆内分配65536个void*指针)


设置SIGPIPE信号的处理方法是忽略(写到管道时候,读进程已经终止,管道是子进程父进程直接通讯的ipc)


初始化线程(memcached采用多线程的方法处理客户连接,如果采用多进程,并且封装epoll的不适用libevent库,因为如果仅仅编一个软件使用一个库,浪费很大)根据settings.num_threads数目来创建线程数)第二个参数是struct event_base指针



调用clock_handler处理一下evtimer的事情


根据settings. socketpath创建管道,

保存当前进程id并保存为文件

然后一个event_base_loop(调用event_init的返回值,中间被线程初始化也掉用过一次)等待事件被触发,然后调用事件 的处理函数,此函数会一直运行,知道没有可以添加的函数,或者直到调用了event_base_loopbreak()或者evenet_base_loopexit()




0 0
原创粉丝点击