<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Tian_Ex的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Tian_Ex</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Tian_Ex]]></copyright><item><title><![CDATA[Nginx：正向代理与反向代理的区别]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53512498</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53512498</guid><author>Tian_Ex</author><pubDate>Thu, 08 Dec 2016 01:30:20 +0800</pubDate><description><![CDATA[正向代理的概念

正向代理,也就是传说中的代理,他的工作原理就像一个跳板,
简单的说,
我是一个用户,我访问不了某网站,但是我能访问一个代理服务器
这个代理服务器呢,他能访问那个我不能访问的网站
于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容
代理服务器去取回来,然后返回给我

从网站的角度,只在代理服务器来取内容的时候有一次记录
有时候并不知道是用户的请求,也隐藏]]></description><category></category></item><item><title><![CDATA[浅谈操作系统的内存管理]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53446833</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53446833</guid><author>Tian_Ex</author><pubDate>Sat, 03 Dec 2016 18:53:40 +0800</pubDate><description><![CDATA[为了支持多进程（同一时间允许多个进程），解决直接操作内存带来的各种问题，引入了地址空间——允许每个进程都拥有自己的地址，硬件上需要两个寄存器——基址寄存器（保存进程开始地址）和界址寄存器（保存上界，防止内存溢出）。当我们执行一条指令，实际的物理内存地址是根据基址和偏移量来计算得到。而每个进程拥有的地址空间是不同的，因此也就使得多进程成为可能。


考虑到内存大小很难容纳下所有并发执行的进程—]]></description><category></category></item><item><title><![CDATA[Linux内核详解（五）]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53319132</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53319132</guid><author>Tian_Ex</author><pubDate>Thu, 24 Nov 2016 13:04:31 +0800</pubDate><description><![CDATA[Linux块I/O层
系统能够随机访问固定大小数据块的硬件设备称作块设备，比如硬盘/闪存；按照字符流的方式被有序访问就是字符设备，比如键盘。两者的区别在于是否可以随机访问数据。


块设备中最小的可寻址单元是扇区，扇区大小一般是2的整数倍（512B），虽然物理磁盘寻址是以扇区为基本单位的，但内核执行的所有磁盘操作都是以块为基本单位的。块是文件系统的一种抽象——只能基于块来访问文件系统。内核]]></description><category></category></item><item><title><![CDATA[Linux内核详解（四）]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53312554</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53312554</guid><author>Tian_Ex</author><pubDate>Wed, 23 Nov 2016 21:57:09 +0800</pubDate><description><![CDATA[Linux内核时间和定时器管理
硬件为内核提供了一个系统定时器用来计算时间，系统定时器以某种频率自动触发时钟中断，该频率可通过编程预定，称作节拍率。当时钟中断发生时，内核就通过一种特殊的中断处理程序对其进行处理。因为预编的节拍率对内核来说是可知的，所以内核知道连续两次时钟中断的间隔时间（节拍），它等于节拍率分之一秒。内核就是通过这种已知的时钟间隔来计算墙上（实际）时间和系统运行时间的。另外内核也]]></description><category></category></item><item><title><![CDATA[Linux内核详解（三）]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53306592</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53306592</guid><author>Tian_Ex</author><pubDate>Wed, 23 Nov 2016 16:04:22 +0800</pubDate><description><![CDATA[Linux中断处理
中断使硬件发出通知给cpu，cpu接收到中断后即停止当前工作并立刻向操作系统告知此信号的到来（中断控制器连接着多路中断管线，当接收到一个中断后，中断控制器便向cpu发送一个电信号）。
硬件设备生成中断并不考虑与处理器的时钟同步——中断随时可以产生，内核随时被中断。不同的设备对应不同的中断，每个中断都有一个唯一的数字标志，这样操作系统就可以给不同的中断提供对应的中断处理程序。]]></description><category></category></item><item><title><![CDATA[Linux内核详解（二）]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53293050</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53293050</guid><author>Tian_Ex</author><pubDate>Tue, 22 Nov 2016 22:56:48 +0800</pubDate><description><![CDATA[Linux调度程序
Linux调度程序负责决定执行哪个（处于可运行状态的）进程，何时执行以及执行多长时间。


多进程操作系统分为两种：抢占式和非抢占式；Linux实现了抢占式机制，即有调度程序决定何时挂起一个正在运行的进程，而让其他进程能够执行；非抢占式下的进程除非自己主动挂起（yield），否则将会一直执行。


调度策略决定何时让什么进程运行。进程可以被分为I/O密集型（比如G]]></description><category></category></item><item><title><![CDATA[Linux内核详解（一）]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53292114</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53292114</guid><author>Tian_Ex</author><pubDate>Tue, 22 Nov 2016 21:32:34 +0800</pubDate><description><![CDATA[Linux内核描述
通常Linux内核有负责响应中断的中断服务程序，负责管理多个进程从而分享cpu时间的调度程序，负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序组成。在系统中运行的应用程序通过系统调用来与内核通信，通常是调用库函数（比如C库函数），再由库函数通过系统调用让内核完成各种不同任务。另外库函数和系统调用并不一定是一一对应的。
内核还要负责管理系统的硬件设备，当硬件]]></description><category></category></item><item><title><![CDATA[子进程和线程的区别]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53285865</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53285865</guid><author>Tian_Ex</author><pubDate>Tue, 22 Nov 2016 14:51:37 +0800</pubDate><description><![CDATA[相同点：

二者都具有ID，一组寄存器，状态，优先级以及所要遵循的调度策略；
每个进程都有一个进程控制块，线程也拥有一个线程控制块；
线程和子进程共享父进程中的资源；线程和子进程独立于它们的父进程，竞争使用处理器资源；线程和子进程的创建者可以在线程和子进程上实行某些控制，比如，创建者可以取消、挂起、继续和修改线程和子进程的优先级；线程和子进程可以改变其属性并创建新的资源；
不同的：]]></description><category></category></item><item><title><![CDATA[Redis时延分析]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53283871</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53283871</guid><author>Tian_Ex</author><pubDate>Tue, 22 Nov 2016 11:54:31 +0800</pubDate><description><![CDATA[Redis采用Reactor模式，Reactor模式将事件驱动逻辑和具体的业务逻辑分离，同时将不同类型请求通过面向对象的方式分离，在Reactor上提供了注册/移除事件等方法，供应用代码使用，而事件分发方法，通常是一个循环调用，Reactor模式一般都是单线程的，好处是每个事件处理时不需要考虑共享资源的互斥访问，缺点是不能高效利用CPU，对于时间驱动，程序向中间人注册一个Event
 Handl]]></description><category></category></item><item><title><![CDATA[Redis学习笔记]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53256074</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53256074</guid><author>Tian_Ex</author><pubDate>Mon, 21 Nov 2016 09:09:22 +0800</pubDate><description><![CDATA[Redis是一个远程内存数据库，复制特性和提供了不同类型的数据结构，非关系数据库可以存储键和五种不同类型的值之间的映射，可以将存储在内存的键值对数据持久化到硬盘，可以使用复制特性来扩展读性能，使用客户端分片来扩展写性能，用户可以将Redis扩展成一个能够包含数百GB数据，上百万TPS的系统。Redis不使用表，也不会预定义或强制去要求用户对Redis存储的数据进行关联。Memcached和Redi]]></description><category></category></item><item><title><![CDATA[Redis计数在新浪微博的应用]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53231096</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53231096</guid><author>Tian_Ex</author><pubDate>Sat, 19 Nov 2016 15:50:32 +0800</pubDate><description><![CDATA[微博业务的迅速发展，对基础架构层面的要求也越来越高。新浪作为国内最早使用redis，并且是国内最大的redis使用者，在redis的使用上，也在逐步优化和提高。

作为微博中一项重要的数据，计数类业务在微博业务中占的比重和重要性逐步提高。计数结果的准确度直接影响用户体验，并且很容易引起用户的投诉。在计数业务上，在不断的优化和改进中，我们主要经历了以下三个阶段：

初级阶段

从2010]]></description><category></category></item><item><title><![CDATA[微博关系服务与Redis的故事]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53230643</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53230643</guid><author>Tian_Ex</author><pubDate>Sat, 19 Nov 2016 15:17:13 +0800</pubDate><description><![CDATA[新浪微博的工程师们曾经在多个公开场合都讲到过，微博平台当前在使用并维护着可能是世界上最大的Redis集群，其中最大的一个业务，单个业务使用了超过 10T 的内存，这里说的就是微博关系服务。

风起

2009年微博刚刚上线的时候，微博关系服务使用的是最传统的 Memcache+Mysql 的方案。Mysql 按 uid hash 进行了分库分表，表结构非常简单：



业务方存在两]]></description><category></category></item><item><title><![CDATA[Select和Epoll]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53213161</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53213161</guid><author>Tian_Ex</author><pubDate>Fri, 18 Nov 2016 10:12:26 +0800</pubDate><description><![CDATA[当有数以万计的并发连接存在时，可能每一毫秒只有数百个活跃连接，当调用select返回活跃连接时，它需要将所有待监控连接传入，且需要在内核中遍历所有传递进来的fd，同时在高并发下会频繁调用。而epoll使用了三个方法来完成select要做的事情，这样就区分了频繁调用和不频繁调用的操作；比如对于创建epoll描述的epoll_create方法和用于添加/删除待监控连接的epoll_ctrl方法是不太频]]></description><category></category></item><item><title><![CDATA[TCP协议详解]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/53213149</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/53213149</guid><author>Tian_Ex</author><pubDate>Fri, 18 Nov 2016 10:11:24 +0800</pubDate><description><![CDATA[在TCP协议中客户端和服务端之间的交互主要分为3个部分：客户端与服务端建立一个TCP连接；客户端和服务端在该连接上接收和发送数据；关闭TCP连接。
当服务端调用ServerSocket的bind方法绑定并监听某个端口时，内核就会建立该端口的SYN队列和ACCEPT队列。当客户端调用Socket的connect方法向服务端发起连接建立请求，一个TCP连接的建立需要经过三次握手：首先客户端向服务端发]]></description><category></category></item><item><title><![CDATA[Java线程池]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/51580923</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/51580923</guid><author>Tian_Ex</author><pubDate>Fri, 03 Jun 2016 18:45:27 +0800</pubDate><description><![CDATA[线程池的关闭


我们可以通过调用线程池的shutdown方法或者shutdownNow方法来关闭线程池，其原理是遍历线程池中的所有工作线程，然后逐个调用线程的interrupt方法来中断线程。这也就意味着无法响应中断的线程可能就无法终止。


shutdown方法按顺序中断之前已提交的任务，同时拒绝接收新的任务。这个方法不会等待之前已提交任务执行完成，可通过调用awaitTermin]]></description><category></category></item><item><title><![CDATA[几种排序算法总结]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/51049890</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/51049890</guid><author>Tian_Ex</author><pubDate>Sun, 03 Apr 2016 13:40:14 +0800</pubDate><description><![CDATA[归并排序
归并排序是将一个待排序记录构成的文件看做是由多个有序子文件构成，通过对有序子文件使用若干次归并的方法得到一个有序文件。该算法是采用分治法的一个非常典型的应用。
归并排序的基本思路是，首先将待排序文件分为一个个的有序子文件（具体做法是将文件分成两部分，接下来对分出来的两部分各自分成两部分，以此类推，当分出来的部分中只有一个元素时，就可以认为该部分已经有序了），然后依次合并相邻的两个子文]]></description><category></category></item><item><title><![CDATA[非阻塞算法]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/51012249</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/51012249</guid><author>Tian_Ex</author><pubDate>Wed, 30 Mar 2016 10:37:52 +0800</pubDate><description><![CDATA[在基于锁的算法中可能会由于线程在持有锁或者内存页缺失导致I/O阻塞，从而引发活跃性问题。而在非阻塞算法中，一个线程的失败不会导致其他线程也失败或挂起。通常我们会使用CAS来协调各个线程之间的操作，无竞争的CAS总能执行成功，并且如果有多个线程竞争同一个CAS，那么总会有一个线程在竞争中胜出并执行下去。
创建非阻塞算法的关键在于，要找出如何将原子修改的范围缩小到单个变量上，同时还要维护数据的一致性]]></description><category></category></item><item><title><![CDATA[把Java数组转换为List时的注意事项]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/50811988</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/50811988</guid><author>Tian_Ex</author><pubDate>Sun, 06 Mar 2016 09:32:24 +0800</pubDate><description><![CDATA[现在将一个Java数组转换成List。对此，Arrays这个类中提供了一个asList的方法，但是如果没有慎重思考就随便使用可能会产生一些糟糕的后果。比如执行下面的代码：
System.out.println(
                Arrays.asList(new String[] { "a", "b" }));
 
System.out.println(]]></description><category></category></item><item><title><![CDATA[布隆过滤器]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/50721579</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/50721579</guid><author>Tian_Ex</author><pubDate>Tue, 23 Feb 2016 11:02:22 +0800</pubDate><description><![CDATA[哈希函数
哈希函数（Hash）是将一个大的数据集映射到一个小的数据集上，这些小的数据集叫做哈希值或散列值。
一个应用是Hash table（散列表，也叫哈希表），是根据哈希值 (Key value) 而直接进行访问的数据结构。也就是说，它通过把哈希值映射到表中一个位置来访问记录，以加快查找的速度。下面是一个典型的 hash 函数 / 表示意图：


哈希函数有两个特点：

如果根据同]]></description><category></category></item><item><title><![CDATA[Java内存模型]]></title><link>https://blog.youkuaiyun.com/Tian_Ex/article/details/50655413</link><guid>https://blog.youkuaiyun.com/Tian_Ex/article/details/50655413</guid><author>Tian_Ex</author><pubDate>Fri, 12 Feb 2016 20:09:53 +0800</pubDate><description><![CDATA[假设有一个线程为变量 aVariable 赋值：
aVariable = 10;
内存模型需要解决的问题是：在什么条件下，读取 aVariable 的线程将看到这个新值。通常而言，如果缺少同步，那么将会有许多因素使得线程无法立即甚至永远看到另一个线程的操作结果：在编译器中生成的指令顺序，可以与源代码中的顺序不同；编译器可能会把变量保存在寄存器而不是内存中；处理器可以采取乱序或并行等方式来执行指]]></description><category></category></item></channel></rss>