分类 Principle 下的文章

翻译:理解TCP/IP网络栈&编写网络应用(下)

原文地址:原文地址
原作者:Hyeongyeop Kim
翻译:@蛋疼的axb http://2baxb.me
上篇地址:翻译:理解TCP/IP网络栈&编写网络应用(上)

数据结构

以下是一些关键数据结构。我们了解一下这些数据结构再开始查看代码。

sk_buff_structure

首先,sk_buff结构或skb结构代表一个数据包。图6展现了sk_buff中的一些结构。随着功能变得更强大,它们也变得更复杂了。但是还是有一些任何人都能想到的基本功能。

图6 图6:数据包结构

包含数据和元数据

这个结构直接包含或者通过指针引用了数据包。在图6中,一些数据包(从Ethernet到Buffer部分)使用了指针,一些额外的数据(frags)引用了实际的内存页。

一些必要的信息比如头和内容长度被保存在元数据区。例如,在图6中,mac_header、network_header和transport_header都有相应的指针,指向链路头、IP头和TCP头的起始地址。这种方式让TCP协议处理过程变得简单。… Read the rest

翻译:理解TCP/IP网络栈&编写网络应用(上)

原文地址:原文地址
原作者:Hyeongyeop Kim
翻译:@蛋疼的axb http://2baxb.me

概述

我们难以想象没有了TCP/IP之后的网络服务。所有我们开发并在NHN(原文发布的网站)使用的网络服务都基于TCP/IP这个坚实的基础。理解数据如何通过网络传输可以帮助你通过调优、排查或引进新技术之类的手段提升性能。

本文将基于Linux OS和硬件层的数据流和控制流来描述网络栈的整体运行方式。

TCP/IP的关键特性

我如何设计一个能在快速传输数据的同时保证数据顺序并且不丢失数据的网络协议?TCP/IP在设计时就基于这个考虑。以下是在了解整体网络栈前需要知道的TCP/IP的主要特性:

TCP和IP
从技术上讲,TCP和IP处于不同的层,应该分别解释它们。但在这里我们把他们看做一个整体。

  1. 面向连接

    首先,传输数据前需要在两个终端之间建立连接(本地和远程)。在这里,“TCP连接标识符(TCP

Read the rest

初探lowmem_reserve_ratio

背景

最近小伙伴们在排查一个线上关于内存oom的问题,前些天来问我某篇文章里的一句话是什么含义:

每次申请的block大小比较有讲究,Linux内核分为LowMemroy和HighMemroy,LowMemory为内存紧张资源,LowMemroy有个阀值,通过free -lm和/proc/sys/vm/lowmem_reserve_ratio来查看当前low大小和阀值low大小。低于阀值时候才会触发oom killer,所以这里block的分配小雨默认的256M,否则如果每次申请512M(大于128M),malloc可能会被底层的brk这个syscall阻塞住,内核触发page cache回写或slab回收。

出自:

http://blog.csdn.net/gugemichael/article/details/24017515

感觉这句话里混淆了好几个概念,并且一些概念跟自己的理解有冲突,在此说一下自己的理解。对内核研究不深,一些概念可能理解有误,因此文章里给出了比较可靠的参考文档,有兴趣可以进一步了解详情。

lowmem与highmem

关于lowmem和highmem的定义在这里就不详细展开了,推荐两篇文章:… Read the rest

图解JDK7的Comparison method violates its general contract异常

背景

先说一下为什么要研究这个异常,前几天线上服务器发现日志里有偶发的异常:

出错部分的代码如下:… Read the rest

finalize、Finalizer和Finalizer Queue的原理

finalize()和Finalizer的创建

首先,如果某个类Override了finalze方法的话,parse这个class时会把_has_finalizer置为TRUE。

share/vm/classfile/classFileParser.cpp

java序列化与blockdata

现象

待序列化的对象实现了Externalizable接口:

有关线程同步方式的总结

Windows下的线程同步

临界区(Critical Section)

通过对多线程的串行化来访问 公共资源或一段代码,速度快,适合控 制数据访问。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将 被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。

临界区包含两个操作原语:

EnterCriticalSection() 进入临界区

LeaveCriticalSection() 离开临界区

EnterCriticalSection() 语句执行后代码将进入临界区以后无论发生什么,必须确保与之匹配的LeaveCriticalSection()都能够被执行到。否则临界区保护的共享资 源将永远不会被释放。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。… Read the rest

马尔可夫链与搜索词联想(一)

引言

前几日,QQ群里有个人提了两个问题:

1、现有一组关键词,如:{internet; music; video…},给定一篇文章,请统计出文章中这些关键词分别出现的词频。请描述数据结构、算法,相应的时间复杂度,可以用伪代码加注释或者文字辅助说明的方式。
2、实现搜索的联想功能,比如“liu”出现刘德华,刘若英,在继续输入刘德,就剩1个了。

对于这两个问题,我的第一反应是:
1、做hash,扫描一遍统计次数。
2、字典树,输入的时候遍历字典树当前节点下的子节点,之后将拼音转化为中文。

我认为问题2的答案优化空间很大,但是想了一会又始终不得要领。群里有人回复“马尔可夫链”,在网上搜索一通,似乎和这个问题风马牛不相及,直到找到一篇论文:《基于Markov链的整句输入算法研究与实现》,研究一番,不由得感慨:自己的过去对问题的认识实在太肤浅。… Read the rest

分类目录