加载中…
个人资料
crk_world
crk_world
  • 博客等级:
  • 博客积分:0
  • 博客访问:107,952
  • 关注人气:55
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
访客
加载中…
好友
加载中…
评论
加载中…
留言
加载中…
博文

    拖了很久,也没有补全这一块。今天在这篇里简单描述下nginx output_filter中关于输出响应的部分,换言之就是ngx_chain_t和ngx_buf_t的用法。本人对这一块经历了无知不解、一知半解,现在终于进化到三知两解的程度了,即与大家分享,希望大家以后别走弯路。

    首先是copy filter,这个模块是极为重要的。因为首先这个模块的执行时机非常早,是第三个被执行的filter,更重要的是,这个模块的执行结果会影响后续filter模块的处理逻辑。我们先来看ngx_buf_t结构。ngx_buf_t中有两个标示内容存放地点的标志:memory和in_file,分别代表内容在内存中,或者在文件中。我们的常识是,每个ngx_buf_t中的memory和in_file标志只能二者选其一,非此即彼。然而在copy filter执行以后,可能产生出memory和in_file标志同时为1的状态。

    可能大家觉得晕了。这里我来介绍一下这个状态的前因后果。nginx有一个sendfile指令,指示调用sendfile()系统调用直接发送静态文件。sendfile()系统调用是内核函数,它直接在内核中将指定句柄的文件内容(全部或部分)读出,并发送到另一个文件句柄。这个操作节省了数据在内核空间和用户空间

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

android

apk

签名

分类: Android研究
1. 签名有三个文件
MANIFEST.MF
XXX.SF
XXX.RSA
这很多文章都提到了

2. MANIFEST.MF文件是在打jar包或者apk包的时候生成的,但是只生成基本内容(这里是jar打包)

Manifest-Version: 1.0
Created-By: 1.8.0_45-internal (Oracle Corporation)


3. signapk或者jarsigner以后,会生成XXX.SF和XXX.RSA文件,同时补全MANIFEST.MF的内容。

4. XXX.RSA也可能是XXX.DSA或者XXX.PGP,对于普通jar包是这样,具体是看签名所用的算法。Android好像只能RSA。

5. 这三个文件的关系很多博客都有介绍。但有一个问题没有解决,就是XXX.SF文件是必须的吗?
完全看不出有什么必要性,直接用XXX.RSA对MANIFEST.MF签
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

编译器

32位

64位

arm

x86

分类: Android研究
记一下,免得后面又混乱了。
只是参数列表定长的函数,变参的参数不在这里。

arm:
32位:
R0-R4对应从左往右的4个参数。剩下的参数压栈,顺序从右往左,每项占4B。
64位:
从左往右的前8个参数对应W0-W7(int),或者X0-X7(long)
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

nginx模块开发

it

分类: 技术沙盘
nginx中有两个容易混淆的cleanup回调的数据结构。
其中一个是ngx_pool_cleanup_t
另一个是ngx_http_cleanup_t
从语义上讲,前者是内存池析构,后者是http析构。

如果混淆了,那么会遭遇到两个回调执行时机上的细微差别。这个差别在于
ngx_pool_cleanup_t的回调具体是在log完成调用
而ngx_http_cheanup_t的回调是在log完成之前。

这个差异意味着,
在log阶段的一些数据引用可能出现异常,无法理解的异常,非常难查到原因的异常,结局非常悲惨。


OVER
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2015-03-21 09:33)
两年没有写博客了,原因是密码忘了。两年没有找回密码的原因是新浪博客的找回密码太麻烦了,用着没有一丝愉悦感。这样就怠慢的读者,很多想法已经忘记,也不可追溯了。

我感觉现在的系统越来越难用了。罪魁在哪里?在手机。为什么有这种感觉,是因为现在娱乐在手机、支付在手机、衣食住行在手机、地理定位在手机、身份验证在手机。什么都在手机,手机成了生活的中心点。结果,手机很轻,手机也很重啊。而且现在的系统,一旦只有一部分功能移到手机上,在整体易用度上都会打折扣。为什么,因为之前完成一件事用一个平台就好,现在需要涉及多个平台,最典型的就是找回密码。先绑定手机,然后手机交互一轮,接着PC再交互一轮,没手机就没办法证明我自身了吗,我受不了。


阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2015-03-21 09:12)
标签:

nginx模块开发

it

分类: Nginx模块开发
配置解析阶段:
Syntax: resolver address ... [valid=time];
ngx_http_core_resolver()
clcf->resolver = ngx_resolver_create()
• 设置cleanup的handler (ngx_resolver_cleanup)
• 初始化保存域名节点信息的红黑树 (r->name_rbtree)
• 初始化重传和过期队列 (r->name_resend_queue r->name_expire_queue)
• 设置超时事件的handler (ngx_resolver_resend_handler)
• 解析dns server的ip并设置到地址数组 (r->udp_connections)
• 解析参数 (valid, ipv6 等)

请求构造阶段:
proxy_pass http://$host;
ngx_resolver_ctx_t ctx 每次域名解析都会生成这个结构体, 直接malloc,未使用r->pool.
ctx = ngx_resolve_start()
• 如果$host是ip地址, 直接设置ctx->quick = 1, 表示后续逻辑不需要走dns解析逻辑.
• 如果r->udp_connections 不存在, 返回NGX_NO_RESOLVER, 最终请求返回502.
初始化ctx参数
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
分类: Nginx模块开发
1. nginx是异步非阻塞的多进程模型,每个进程并发的服务于多个请求,所以所有nginx模块都必须是异步非阻塞。如果有阻塞操作,开线程或创建进程执行。
2. nginx可以服务于HTTP所有版本,包括0.9、1.0、1.1。所有模块都需要考虑这一点,避免与HTTP某些版本不兼容,尤其是0.9版本。
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2013-06-07 15:11)
标签:

乌镇

游记

分类: 生活拼盘
    游乌镇就是游江南水乡。当然你不一定非去乌镇不可,比如苏州也可以看到。但是如果确定游乌镇,我的这篇游记可能能够帮到你。
    乌镇位于浙江省桐乡市,在杭州以北,上海以西,宁波的西北,交通都很方便(话说不方便也没法搞旅游业)。比如杭州去乌镇,在九堡汽车站上车,1.5小时就到了。乌镇很小,从乌镇汽车站到景区(东栅)走路最多30分钟,还有315路公交车可到景区。另外,乌镇很多民宿都是提供接送业务的。所以,跟团、叫麻木都是没有意义的
    乌镇可以玩一天,但可以分开到两天玩。我是懒人,分两天玩的。如果是分两天,那就需要预订一个住的地方,一般在去哪网上订个民宿就好了。不建议住在景区,一晚上600人民币起,景区旁边的标间才一百多一晚,而且房子都还可以。我是住在西栅旁边慈云路上的一家民宿,业主姓汪,租的20平米的标间,价格178RMB。乌镇的民宿很多都是家族生意,比如我住的这家,就是业主他们家什么二婶、三姨、五娘舅的家宅的某一层打扫出来统一出租的。我们到了乌镇汽车站,老板出来接我们到民宿。
    说完了住宿,然后说门票。日票西栅120,东栅
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 

前天看了普空的博客

http://blog.sina.com.cn/u/2015038597

文章涉及到两个proc参数,tcp_timestamps和tcp_tw_recycle,原来这两个参数对tcp协议的影响还是非常大的,这里再总结一下。

tcp_tw_recycle的用处是快速回收TIME_WAIT状态的套接字。tcp_tw_recycle的工作原理是依据RTO(Retransmission Timeout)来计算TIME_WAIT状态的等待时间,而非默认超时TCP_TIMEWAIT_LEN(Linux 2.6.32 内核是60s),因为RTO是根据RTT计算得到,所以这个超时是practical的,而不是ideal的。但是tcp_tw_recycle只有在打开tcp_timestamps时才是有效的(可能是因为不用timestamps算出来的RTT不准确,因为考虑到超时重发的情况下不用timestamps是算不出来当前RTT的)。

tcp_timestamps则可以使tcp包携带一个发送时间的options,这个options在ACK报文中也会echo出来,所以打开tcp_timestamps以后,tcp协议栈可以根据ACK报文中的options计算RTT。

此外,如普空的博客所说,同时使用tcp_tw_recycle和tcp_timestamps还会对tcp协议栈造成另外一个影响,对于相同IP的syn报文(为什么不将port纳入考量),tcp协议栈会根据timestamps时戳扔掉逆序的包。所以需要处

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 

I have finished part 1 of chapter 11. this part is mainly about the common flow of configuration parser. in particular, it describes all the results reaped by ngx_http_block() function in detail, because they are vital when nginx processes requests. 

I expect people will understand how nginx understands its configuration, and what it has built at the edge between its parser and processor.

the next step is to talk about the servers[] and the locations[], so we will understand how nginx fabricate its control data.

wish you like it. call me when you have any problem or advice about this passage.

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2013-03-07 10:30)
标签:

时间轮

分类: 技术沙盘

    时间轮就好比传统的齿轮钟表。在传统钟表上,齿轮的每一个齿都对应了一段时间,而且这个对应是有周期性的。比如控制秒钟旋转的齿轮,轮上每一个齿在每分钟内对应其中固定的一秒。从这个类比可以看到,时间轮有两个维度:时间宽度和时间精度。这两个维度可以用三个因素中的任意两个来确定:时间轮旋转一周所经过的时间、时间轮每一个齿对应的时间、时间轮中的齿的数量。

    时间轮是怎样组织数据的?作为一个计算机数据结构,时间轮的实现是一个开链哈希表。哈希的键是数据的时间因素与时间轮的时间精度的模,而时间轮的开链是一个双链表。那么时间轮有什么特点?最大的特点是时间轮的维护非常简单。因为哈希的时间复杂度是O(1),双链表的添删的时间复杂度也是O(1),那么又说明什么问题呢?后面结合具体的例子来讲。时间轮第二大特点是在齿数固定的情况下,时间宽度和时间精度不可兼得。固定齿轮数量可以控制时间轮的内存消耗,鉴于这个目的,所以齿轮数一般都不会很大。有个特例,是计算机时钟,他使用一个2^32-1个齿轮的时间轮,但是它不需要存储值,因为它的值就是键值。所以使用时间轮时,我们必须考虑好内存占用、时间精度和时间

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有