自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(472)
  • 收藏
  • 关注

原创 Lua源码分析 - 主流程篇 - 异常处理机制实现(09)

异常处理机制 -setjmp和longjmp在讲解Lua的异常处理机制的时候,我们首先要看一下C语言的setjmp和longjmp的实现机制。setjmp和longjmp分别承担非局部标号和goto作用。整体的逻辑如下:使用setjmp,保存一个当前环境到jmp_buf跳转点,默认返回的值为0 程序继续执行,到某个地方调用longjmp,传入上面保存的jmp_buf,设置另外一个值...

2020-02-12 18:43:17 2170 3

原创 Lua源码分析 - 主流程篇 - 函数调用栈的实现(08)

前面几章我们介绍了Lua常用的最重要的几个数据结构。这章节开始,我们开始讲解主流程篇。主流程,一般都是从lua.c的main方法开始。那我们就从main方法开始看整个链路和流程。调用栈操作 - pmain方法的调用总流程从main方法中,创建完基础的lua_State *L结构后,我们就能看到Lua向数据栈上push了一个c语言的闭包方法。该方法:pmain。pmain方法是整个L...

2020-02-10 19:35:19 4227 2

原创 Lua源码分析 - 数据结构篇 - Mem内存操作(07)

原先以为Lua的内存操作也是高大上的,但是仔细研究了一下,突然发现,这块代码绕来绕去,封装来封装去,有一些low low感。废话少说,直接上原理吧。这部分的代码,我也不画详细的图了。Mem内存操作 - 核心分配函数Lua的全局状态机里面,有两行代码,定义了内存分配的基础函数。底层的内存分配函数主要调用了c语言本身的内存分配函数(malloc、free、realloc等)。想要研究lin...

2020-02-02 16:01:54 3267 1

原创 Lua源码分析 - 数据结构篇 - Table实现(06)

Lua语言中,Table结构类型是比较强大的一个存在。和PHP的数组有些类似。比较万能和强大。Lua语言中Table的具体实现,主要在ltable.c文件中。Lua语言的Table有两个特性:1. Table使用关联数组,可以用任意类型来作为数组的索引键值2. Table没有固定大小,可以动态扩容。先看一下Lua中,如何使用Table:fruits = {"banana"...

2020-02-01 16:32:13 3472 1

原创 Lua源码分析 - 数据结构篇 - 字符串池实现(05)

前面两章我们讲解了Lua的整个栈操作。本篇文章开始,我们重点阅读一下Lua的几个重要数据结构:字符串、内存操作、对象操作等。字符串操作对应的文件:lstring.c字符串 - 数据结构Lua的字符串管理都会统一挂载到global_State全局状态机上。字符串都会存储在TString对象结构上。Lua的字符串管理分两种类型:链表方式存储(短字符串(<40)) 和 HashMa...

2020-01-31 17:45:37 3136 4

原创 Lua源码分析 - 栈结构篇 - 栈操作函数的实现(04)

上一章节讲解了Lua的栈结构,理解了上一篇的栈接口在看本片应该比较好理解。Lua常用的栈操作API主要在lapi.c(lapi.c也提供给外部使用)文件中。Lua栈操作 - 垃圾回收值处理Lua针对需要垃圾回收的元素,在压入栈时,都会在Lua(也就是Lua虚拟机中)生成一个副本。总之,C里面的值,被压入栈之后,lua不会在依赖这个值,而是通过拷贝副本的方式,自己管理对应的这个值了。...

2019-07-26 10:58:11 4029

原创 Lua源码分析 - 栈结构篇 - 数据栈和调用栈(03)

Lua栈结构 - 栈存储方式Lua栈结构主要是lua_State结构上。Lua的栈结构主要由两部分组成:数据栈和调用栈数据栈:主要由一个StkId结构的数组组成。所有的数据都通过lapi.c文件中的lua_push*函数向栈上压入不同类型的值(数字、字符串、函数等)。L->stack指向栈底部。每次将一个数据压入栈上,栈指针(L->top++)都会指向到下一个结构上。在栈结构初...

2019-07-25 17:14:18 7370 3

原创 Lua源码分析 - 基础篇 - 全局状态机的实现(02)

从main函数看整个状态机的初始化Lua的main函数方法中,lua_State *L = luaL_newstate(); ,主要用于创建全局状态机。luaL_newstate主要用来为每一个LUA线程创建独立的函数栈和线程栈,以及线程执行过程中需要用到的内存管理、字符串管理、gc等信息。lstate.c文件中,对全局状态机的初始化、销毁进行了实现。int main (int ...

2019-03-11 15:06:51 11548 7

原创 Lua源码分析 - 基础篇 - Lua源码的结构和架构图(01)

很久很久没有写博客了,一直忙于工作和项目,最近依然想静下来阅读一些好的源码。自从读完了Nginx和Memcache的源码后,对服务器端的基础开源软件的实现原理有了一定的认识,接下来想看看Lua这门精巧的语言是如何实现的。开启Lua源码阅读之旅Lua是一门用C语言编写的脚本语言,一共1w多行代码,非常的轻巧,适合做web脚本、游戏脚本、物联网等场景下使用。Lua可以进行独立编程,但是大部...

2018-11-26 17:43:41 29600 2

转载 转载和积累系列 - 分析服务器日志常用命令

1、查看有多少个IP访问:awk '{print $1}' log_file|sort|uniq|wc -l2、查看某一个页面被访问的次数:grep "/index.php" log_file | wc -l3、查看每一个IP访问了多少个页面:awk '{++S[$1]} END {for (a in S) print a,S[a]}' log_file > log.txtsort -n -t '

2017-06-12 12:55:38 1383

原创 Nginx源码分析 - 实战篇 - 编写一个阶段化的模块(25)

HTTP模块篇,我们讲过Nginx的HTTP阶段处理 《Nginx源码分析 - HTTP模块篇 - ngx_http_core_run_phases函数和HTTP模块的阶段处理PHASE handler》我们代码在《Nginx源码分析 - 实战篇 - 编写一个自定义的模块》的基础上,将定义一个回调函数挂载到HTTP处理的阶段上。先看代码:#include #include #include

2017-06-08 13:19:07 7385 8

原创 Nginx源码分析 - 实战篇 - 编写一个自定义的模块(24)

Nginx源码分析 - 实战篇 - 编写一个自定义的模块

2017-06-08 12:03:28 9946 1

原创 Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler(23)

上一章我们讲解了HTTP request的解析过程。我们基本知道了Nginx是如何解析HTTP的行和头。这一章我们主要讲解Nginx的阶段处理(PHASE 状态机实现)。阶段处理的概念如何理解,我举个例子:一个HTTP请求过来,除了解析HTTP的行和头外,还需要解析URI的rewrite、接受HTTP BODY中的POST数据、转发给后端JAVA/PHP服务器进行数据处理等等一系列的操作。Ngin

2017-06-07 14:49:26 7766

原创 Java深入 - jdk8特性

1. 接口提供默认方法Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可public interface Test { int get(); /* JAVA8 接口默认方法*/ default int getVal(int a) { return a * 2; }}public class Te

2017-04-27 14:03:42 1420

原创 Nginx源码分析 - HTTP模块篇 - HTTP Request解析过程(22)

这一章主要讲解read事件的核心处理函数:ngx_http_wait_request_handler和ngx_http_process_request_linengx_http_init_connection 初始化客户端连接从上一章知道,ngx_event_accept第一次建立连接的时候,会调用ngx_http_init_connection初始化一个客户端连接结构:ngx_connectio

2017-01-05 20:59:43 9523

原创 Nginx源码分析 - HTTP模块篇 - TCP连接建立过程(21)

上一章,我们讲解了HTTP模块是如何初始化的。这一章节,主要讲解监听套接字初始化函数ngx_http_optimize_servers和Nginx整个连接的过程监听套接字初始化函数ngx_http_optimize_serversngx_http_optimize_servers主要处理Nginx服务的监听套接字/** * ngx_http_optimize_servers:处理Nginx服务的

2016-12-18 19:11:42 7925

原创 Nginx源码分析 - HTTP模块篇 - HTTP模块的初始化(20)

前面几章整理了Nginx的事件模块,这一章开始整理HTTP模块。HTTP模块的初始化工作,都在src/http/nginx_http.c 中的ngx_http_block函数中进行的。http模块的配置在看nginx_http_block之前,我们还必须看一下nginx.conf中 HTTP大模块的配置文件,只有理解了HTTP模块的配置,才能更好的理解HTTP模块如何初始化的。配置如下:http

2016-12-17 10:14:52 8613

原创 Nginx源码分析 - Event事件篇 - Epoll事件模块(19)

这一篇主要讲解一下epoll事件模型。Nginx支持多种事件模型:epoll/pool/select/kqueue等。epoll比较常用,我们也比较熟悉。Nginx的epoll事件模块在/event/module/ngx_epoll_module.c

2016-11-03 19:30:33 10115

原创 Nginx源码分析 - Event事件篇 - Event模块的进程初始化(18)

前面一篇我们讲解了《Nginx源码分析 - Event事件篇 - Event模块和配置的初始化 》 ,了解了整个Event模块分为:ngx_events_module 事件模块 、ngx_event_core_module 事件核心模块 和 epoll/queue/win32_select事件模型模块这一篇,主要讲解一个重要的函数:ngx_event_process_initEvent事件的

2016-09-15 17:59:02 7063

原创 Nginx源码分析 - Event事件篇 - Event模块和配置的初始化(16)

Event的模块和配置的初始化,必须得结合我们讲过的两篇文章:《Nginx源码分析 - 主流程篇 - 模块的初始化》 和 《Nginx源码分析 - 主流程篇 - 解析配置文件》 前面我们讲解了模块的初始化以及核心模块的配置文件的解析。而Event的配置解析会比核心模块解析会复杂一些,但是原理是一样的。Event模块的配置数据结构event事件模块的配置:events {

2016-09-04 20:04:31 8440 3

转载 推荐算法和机器学习系列 - 协同过滤推荐算法和余弦相似性算法

编者按】推荐系统在各种系统中广泛使用,推荐算法则是其中最核心的技术点,InfoQ接下来将会策划系列文章来为读者深入介绍。推荐算法综述分文五个部分,本文作为第一篇,将会简要介绍推荐系统算法的主要种类。其中包括算法的简要描述、典型的输入、不同的细分类型以及其优点和缺点。在第二和第三篇中,我们将会详细介绍这些算法的区别,让你能够深入理解他们的工作原理。注:本文翻译自Building Recommende

2016-08-30 14:21:08 9733 3

转载 推荐算法和机器学习系列 - 推荐算法综述

【编者按】推荐系统在各种系统中广泛使用,推荐算法则是其中最核心的技术点,InfoQ接下来将会策划系列文章来为读者深入介绍。推荐算法综述分文五个部分,本文作为第一篇,将会简要介绍推荐系统算法的主要种类。其中包括算法的简要描述、典型的输入、不同的细分类型以及其优点和缺点。在第二和第三篇中,我们将会详细介绍这些算法的区别,让你能够深入理解他们的工作原理。注:本文翻译自Building Recommend

2016-08-30 14:14:04 2115

原创 Nginx源码分析 - Event事件篇 - Nginx的Event事件模块概览(17)

前一章,我们讲解了《Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理 》 中实际上已经涉及到了一部分事件模块的概念。细心的可以发现,Nginx的事件都是由nginx_event.c文件中的ngx_process_events_and_timers进程事件分发器这个函数开始的。这一章开始,我们会详细透彻的分析Nginx的event模块。如果你还对网络IO模型不太熟悉的,建议先把

2016-08-22 19:30:35 13232

原创 Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理(15)

Linux2.6版本之前还存在对于socket的accept的惊群现象。之后的版本已经解决掉了这个问题。惊群是指多个进程/线程在等待同一资源时,每当资源可用,所有的进程/线程都来竞争资源的现象。Nginx采用的是多进程的模式。假设Linux系统是2.6版本以前,当有一个客户端要连到Nginx服务器上,Nginx的N个进程都会去监听socket的accept的,如果全部的N个进程都对这个客户端的so

2016-08-21 14:05:28 17428 2

原创 Nginx源码分析 - 主流程篇 - 多进程实现(14)

默认情况下,Nginx都是多进程的运行模式。Nginx和Memcached不一样,是多进程的模式。采用多进程模式最大的好处:1. 每个进程的资源独立2. 不需要添加各种繁琐的锁了Nginx多进程实现的流程图

2016-08-21 09:15:33 12306

原创 Nginx源码分析 - 主流程篇 - 解析配置文件(13)

Nginx源码中比较重要的一块就是配置文件的解析。一般是解析/usr/local/nginx/conf/nginx.conf文件中的配置信息。前一篇文章,我们介绍了Nginx的模块化。Nginx的功能模块都是通过cycle->modules 模块进行管理的。而每个模块都会有自己的配置文件。

2016-07-14 18:47:30 15394 5

原创 Nginx源码分析 - 主流程篇 - 模块的初始化(12)

Nginx是高度模块化的,各个功能都会封装在模块中。例如core模块、HTTP模块等。也可以自定义模块。这一篇文章主要讲解模块的初始化。后续会有一篇文章教你如何编写Nginx的模块。Nginx实现模块管理的代码主要在:/src/core/ngx_module.c文件中。模块的数据结构结构体ngx_module_s主要用于管理每一个模块的详细信息。而模块的管理,主要放置在Nginx的全局变量cycl

2016-07-13 17:03:10 12484 2

原创 Nginx源码分析 - 主流程篇 - 全局变量cycle初始化(11)

Nginx的大部分初始化工作主要围绕一个类型为ngx_cycle_t类型的全局变量(cycle)展开。本文主要讲解cycle的数据结构以及初始化过程中干了什么事情。cycle的初始化过程在/src/core/cycle.c文件中。数据结构ngx_cycle_t的数据结构/** * Nginx全局变量cycle */struct ngx_cycle_s { void

2016-07-11 17:54:21 10599

原创 Nginx源码分析 - 主流程篇 - 平滑重启和信号控制(10)

平滑重启上一篇文章我们分析了Nginx的启动流程。其中ngx_add_inherited_sockets主要用于继承Socket文件句柄。Nginx有平滑重启的功能,通过平滑重启,可以让用户无感知并且不中断。#平滑重启 sudo kill -HUP `cat /usr/local/nginx-1.4.7/nginx.pid` 无感知不中断的过程,就需要Nginx继承原先的so

2016-07-06 18:56:36 11097

原创 Nginx源码分析 - 主流程篇 - Nginx的启动流程(09)

前几篇主要介绍了Nginx比较常用的一些基础数据结构,例如pool,buf,array,list等。通过对Nginx基础数据结构的理解,能更好的帮助我们读懂整个Nginx的源代码。这一章节开始主要分析Nginx的主流程。Nginx的主流程的实现函数在./src/core/nginx.c文件中。通过main()函数,我们可以窥探整个Nginx启动的流程。Nginx的启动过程m

2016-07-05 15:46:12 20624

原创 Linux c 开发 - 内存管理器ptmalloc

内存布局X86平台LINUX进程内存布局:Test Segment:存放程序代码,只读,编译的时候确定Data Segment:存放程序运行的时候就能确定的数据,可读可写BBS Segment:定义而没有初始化的全局变量和静态变量Heap:堆。堆的内存地址由低到高。Mmap:映射区域。Stack:栈。编译器自动分配和释放。内存地址由高到低。

2016-03-09 10:07:11 9147

原创 Nginx源码分析 - 基础数据结构篇 - 字符串结构 ngx_string.c(08)

Nginx的ngx_str_t字符串结构非常简单和好用。nxg_string.c文件中包含了很多常用的字符串操作方法,具体我们就不讲解了,主要简单来看下Nginx的字符串数据结构数据结构定义ngx_str_t 字符串结构/** * 字符串结构 */typedef struct { size_t len; //字符串长度 u_char *d

2016-02-17 18:50:12 6780 2

原创 Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c(07)

Nginx的hash表结构和我们之前阅读memcached的时候看到的会有很大的差别。Nginx的hash表结构主要几个特点:1. 静态只读。当初始化生成hash表结构后,是不能动态修改这个hash表结构的内容。2. 将内存利用最大化。Nginx的hash表,将内存利用率发挥到了极致,并且很多设计上面都是可以供我们学习和参考的。3. 查询速度快。Nginx的hash表做了内存对齐等

2016-02-16 16:25:34 8303 4

原创 Nginx源码分析 - 基础数据结构篇 - 单向链表结构 ngx_list.c(06)

Nginx的list单向链表的结构和Nginx的数组结构Array有点类似。Nginx的单向链表也是固定了每个元素的大小,并且用单向链表的方式连接。数据结构定义ngx_list_part_t 链表节点定义typedef struct ngx_list_part_s ngx_list_part_t;/** * 链表节点 每个节点大小 = size * nelts

2016-02-05 10:11:45 6264 6

原创 Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c(05)

Nginx的queue链表结构非常小巧和简单。设计的非常精巧。通过queue的简单和精巧的设计,让Nginx的queue的数据结构和具体业务依赖进行了解耦。一般我们在设计c语言程序的时候,完全可以学习Nginx的这种数据结构的设计方式。数据结构定义链表数据结构 ngx_queue_ttypedef struct ngx_queue_s ngx_queue_t;/**

2016-01-31 17:49:19 7216 3

原创 Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c(04)

Nginx的buf缓冲区数据结构,主要用来存储非常大块的内存。ngx_buf_t数据结构也贯穿了整个Nginx。缓冲区ngx_buf_t是nginx处理大数据的关键数据结构,它既应用于内存数据也应用于磁盘数据。数据结构定义缓冲区内存块的数据结构 ngx_buf_t/** * Nginx缓冲区 */struct ngx_buf_s { u_char

2016-01-30 13:32:53 13029 12

原创 Nginx源码分析 - 基础数据结构篇 - 数组结构 ngx_array.c(03)

前面一章我们介绍了Nginx的内存池的数据结构。Nginx的内存管理都是围绕内存池来实现的,包括array数组类型也是基于Nginx的pool来实现数据结构。Nginx的Array结构设计得非常小巧,主要用于存储小块内存。Nginx的数组每个元素的大小是固定的。数据结构定义ngx_array_t 数组的基础数据结构/* 数组Array数据结构 */typedef stru

2016-01-28 16:50:33 13061 14

原创 Nginx源码分析 - 基础数据结构篇 - 内存池 ngx_palloc.c(02)

Nginx的内存管理是通过内存池来实现的。Nginx的内存池的设计非常的精巧,很多场景下,我们可以将Nginx的内存池实现抽象出来改造成我们开发中的内存池。内存池一般我们使用malloc/alloc/free等函数来分配和释放内存。但是直接使用这些函数会有一些弊端:1. 虽然系统自带的ptmalloc内存分配管理器,也有自己的内存优化管理方案(申请内存块以及将内存交还给系统

2016-01-26 17:38:28 37814 27

原创 Nginx源码分析 - 初探Nginx的架构(01)

Nginx是我们日常使用非常多的一款服务器。Nginx的源码写的非常漂亮,是c语言学习和进阶的最好的学习资料。下面我们先看下Nginx的目录结构:Nginx的源码主要分布在src/目录下,而src/目录下主要包含三部分比较重要的模块。1. core:包含了Nginx的最基础的库和框架。包括了内存池、链表、hashmap、String等常用的数据结构。2. event:事件模

2016-01-25 19:20:44 44537 14

原创 Linux细节 - 常用Linux下排查服务器性能命令

uptime说明:此命令可以快速查看系统的负载值。负载值分别为1分钟、5分钟、15分钟。[root@localhost ~]# uptime 16:32:06 up 45 min, 2 users, load average: 0.00, 0.01, 0.05

2016-01-14 16:35:02 2870

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除