自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Gavin Guan的专栏

热爱编程,追随大师的脚步,成为卓越程序员

  • 博客(34)
  • 收藏
  • 关注

原创 理解Python事件驱动编程(Event Loop)

2年前我学习Python的时候只知道并发编程模型只有多进程和多线程,这两个模型的特点都是交由操作系统调度,无法人为控制,而且短板很明显,上下文切换和创建开销都是问题。后来又听说了Python的协程-用户级线程,可以人为调度,虽然轻量,但是本质上都是利用多个worker避免一个worker带来的阻塞问题。后来接触到Tornado,知道了Python的异步编程,号称单线程异步高性能web服务器。那个时

2017-09-11 17:42:12 7781

原创 深入理解Python描述符

最近在看《流畅的Python》关于描述符的章节,平时也不经意间会接触到cached_property、sqlalchemy的Column、甚至内置的property都是描述符。在网上也看到过关于描述符的讲解,但是并没有区分覆盖型描述符和非覆盖型描述符,因为这两者获取属性的优先级链不一样,下面来具体说说。为什么要区分覆盖型和非覆盖型?《流畅的Python》中写到,“Python存取属性的方式

2017-09-08 14:00:59 3190

原创 web app实现基站定位获取精确地理位置的一种简单方法

前提:这个方式只适用于在小范围提供地理位置服务,比如校园应用 做过web端地理位置定位的同学大概都知道不管是哪家地图的webservice api,最后定位误差都很大,没办法和手机app的定位比,这是因为手机app定位的原理是基于GPS或者基站定位,精确度高,而web端的只是通过ip地址定位,误差很大,所以我想告诉大家通过一个比较简单的方法就可以在web app上实现基站定位。

2017-08-23 12:51:20 12235 1

转载 Bloom Filter——大规模数据处理利器

转载地址:http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.html  Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一. 实例   为了说明Bloom Filte

2017-04-21 18:41:58 506

原创 Python字符串查找算法之BMHBNFS算法

最近面试阿里,第一个算法题就是字符串匹配算法,当时一脸懵逼,连朴素字符串匹配算法都不知道,面试官还问我有没有深入了解Python语言的字符串怎么查找的,顿时戳中痛点,想想自己学Python真的还是太浅了。于是就去把字符串匹配算法全学了一遍,有brute-force算法、Rabin-Karp算法、有限自动机算法、KMP算法、Boyer-Moore算法、Horspool算法还有Sunday算法等等。然

2017-04-21 17:59:24 1651 1

转载 Linux用户空间与内核空间(理解高端内存)

Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。Linux内核地址映射模型x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。段页式机制如下图。

2017-04-03 18:13:46 3865 1

转载 Linux系统内存管理之伙伴系统分析

1.伙伴系统概念  伙伴系统是一种经典的内存管理方法。Linux伙伴系统的引入为内核提供了一种用于分配一组连续的页而建立的一种高效的分配策略,并有效的解决了外碎片问题。 2.伙伴系统的组织结构  Linux中的内存管理的“页”大小为4KB。把所有的空闲页分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页块。最

2017-04-03 18:07:02 2862

原创 Linux内核之page cache和buffer cache

page cache也被称为页高速缓存,在VFS文件系统中,每个文件都会有一棵radix树管理文件的缓存页,这些被管理的缓存页被称之为page cache。所以,page cache是针对文件系统而言的。page cache是对文件数据的缓存buffer cache也被称为缓冲区高速缓存,是针对设备的,每个设备都会有一棵radix树管理数据缓存块,这些缓存块被称之为buffer cache。如

2017-04-03 18:01:11 2194

原创 Linux内核之自旋锁和信号量

Linux内核实现了多种同步方法,指令级支持的原子操作、自旋锁、信号量、互斥锁、完成量、大内核锁等等,我就挑比较有代表性的两个锁——自旋锁和信号量来分析。自旋锁Linux内核中最常用的锁就是自旋锁(spin lock),自旋锁最多只能被一个执行线程持有。如果一个执行线程试图获得一个被已经持有(即所谓争用)的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用。在任意时间,自旋锁都可以

2017-04-03 17:29:44 1152

原创 Linux内核之进程上下文和中断上下文

进程在执行的过程中始终会处于用户态和内核态中的一种,而内核态又分为运行于进程上下文(内核代表进程运行于内核空间)和中断上下文(内核代表硬件运行于内核空间)。进程上下文所谓的进程上下文就是进程在执行的时候拥有的寄存器值、打开的文件、堆栈、内存信息等内容,其中也包括用户空间的进程通过系统调用传递给内核的参数还有保存的寄存器值和变量,参数。执行系统调用或者运行内核线程时内核处于进程上下文,此时内

2017-04-03 15:23:16 1664

原创 Linux内核之核心调度器

在Linux中内核提供了两个调度器主调度器,周期性调度器主调度器是直接的, 比如进程打算睡眠或出于其他原因放弃CPU,schedule函数周期性调度器是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要,scheduler_tick查看当前进程是否运行太长时间,如果是,将进程的TIF_NEED_RESCHED置位,然后再中断返回时,调用schedule,进行进程切换操作两个调

2017-04-03 13:56:18 1783

原创 Linux内核之禁止中断和禁止内核抢占

禁止中断指的是Linux内核停工了一组接口用于操作机器上的中断状态。这些接口为我们提供了能够禁止当前处理器的中断系统,或者屏蔽掉整个机器的一条中断线的能力。通过禁止中断,可以确保某个中断处理程序不会抢占当前的代码。控制中断系统在Linux的实现有很多,以local_irq_disable()和 local_irq_enable()函数//我看不懂,反正就是依赖于体系结构,通过汇编调用实现st

2017-04-02 22:57:42 15576 2

原创 Linux内核之抢占

在Linux中抢占分为用户抢占和内核抢占1.need_reschedneed_resched标志在Linux内核中用来表明是否需要重新调度,每个进程都包含一个need_resched标志,为什么不维护一个全局的need_resched变量呢?这是因为访问进程描述符内的数值要比访问一个全局变量快(current宏速度很快并且描述符通常都在高速缓存中),need_resched标志在threa

2017-04-01 21:24:03 785

原创 Linux context_switch函数实现分析

转载至:http://blog.csdn.net/gatieme/article/details/51872659?locationNum=5,原文写的太乱了,但是写得很好,我重新组织了格式,删了一些话,加了一些自己的理解1.上下文切换的概念进程被抢占CPU时候, 操作系统保存其上下文信息, 同时将新的活动进程的上下文信息加载进来, 这个过程其实就是上下文切换, 而当一个被抢占的进

2017-04-01 19:23:54 2118

原创 linux进程,普通线程,内核线程

在Linux中,进程和线程的区别并不大,进程的创建主要依赖于fork函数(还有vfork函数),普通线程的创建则依赖于clone函数,内核线程比较特殊,后面再讲在Linux 2.6.32版本的内核中,三个函数的实现如下(体系结构为x86):asmlinkage int sys_fork(struct pt_regs regs){ return do_fork(SIGCHLD, regs

2017-04-01 10:47:09 661

原创 深入探究fork函数写时拷贝技术的实现

这几天在看《Linux内核设计与实现》,看到fork函数写时拷贝(copy on write)那一节,突然发现以前学习写时拷贝技术的时候只是大概理解了它的原理,并没有深入理解,本来想在网上找找有没有分析写时拷贝技术实现原理的博客,找了半天发现全是些介绍理论的,balabala一大堆,于是决定自己去看Linux的源码。我用的Linux内核源码是2.6.26版本。要学习copy on write,

2017-03-25 21:03:04 2911

原创 hadoop之docker伪分布式部署

配置环境: macbook、两台ubuntu 16.04 server虚拟机,用VMware Fusion创建的,虚拟机网络适配器模式是NAT模式(注意此处一定要是NAT模式)第一步:搭建虚拟网桥br0,br1这步可以按照网上的一些通用做法来做,没什么特别的,如这篇文章 http://blog.csdn.net/canot/article/details/52895897。不过我要

2017-03-08 20:41:11 1236 1

原创 记一次大型活动-圣诞苹果活动的心得

圣诞送苹果活动过去几天了,回顾一下这次活动是笑递第一次真正的大型活动,为了做好这次线上200抢两百个苹果的活动,三个星期前决定重构一遍笑递web前端的代码,从14周结课,我一直在想该怎么重构,之前的前端代码非常混乱,用的是python的flask框架,保存会话用的js的cookie,为什么说混乱。1. cookie的保存,很多地方都有,js的几个函数,还有python在返回头加Set-Cook

2016-12-27 15:39:33 2716

原创 http长连接、长轮询的理解

昨天翻了翻《HTTP权威指南》,看到HTTP连接管理这节,书中讲到了HTTP事务,突然发现事务一词在好多场合都用到了,事务简单来说就是一连串的事情,要么都做,要么都不做,中间出了问题,整个过程都失败,对于HTTP事务就是域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求ht

2016-12-27 14:02:36 11047

原创 从ESTABLISTEND到数据库连接池

今天在做一个Python应用的压力测试时,闲得没事看了一下网络连接的情况(netstat -an | grep tcp),一看惊呆了本宝宝,439个ESTABLISTEND连接,本来以为这种和大量TIME_WAIT或大量CLOSE_WAIT一样是TCP协议本身造成的,这里说下TIME_WAIT和CLOSE_WAITTIME_WAIT是主动发起关闭连接的一方在接收了FIN以及发送ACK之后所

2016-12-27 12:49:19 842

原创 Flask secret_key的设置对session有影响

今天打算部署一个Flask项目,用到了session,以前看到有文章说把secret_key设置成os.urandom(24)会很安全,于是就用了它,在本地调试的时候session管理没有问题,但是如果在服务器上用gunicorn+nginx部署,登录注册就乱掉了,基本上都能猜到是session的问题,但是为什么还不知道,于是就去google一下,很快就找到答案了。先贴个链接:http:/

2016-12-27 12:40:02 5675

原创 《美丽人生》观后感

先安利一下这部影片,由罗伯托·贝尼尼执导,1997年12月20日在意大利上映。1999年,该片在第71届奥斯卡奖获得了最佳外语片、最佳男主角、最佳配乐三项奖项,豆瓣评分9.4。这部影片给我的感觉是浪漫到不真实,但是电影本来就不需要那么真实,只要能让观众读懂它所要展示给我们的东西就是电影极大的成功。影片一开始是轻松愉悦的,讲述的是屌丝如何逆袭白富美,情节滑稽搞笑。但是,当纳粹的阴霾笼

2016-12-27 12:37:44 3042 1

原创 《偷影子的人》读后感

把《偷影子的人》看完了,温馨的亲情、不离不弃的友情、浪漫美好的爱情,这些都让我有无限的遐想和憧憬。吕克最后放弃了当医生的梦想,回去当面包师,他要找寻他想要的幸福,当他明白和父亲相处是最幸福的事之后,他更珍惜这份幸福了,其实这可能也是我想要寻找的幸福。主人公的妈妈总能给我感动,她也是我一直渴望的那个妈妈,但是现实又总是很残酷,压力总是存在,人们总是在拼命努力,以求得在社会中立足,我们

2016-12-27 12:36:08 2037

原创 进入实验室的一点感悟

最近加入石亮老师的实验室,我就从一个web开发者变成了一个伪研究人员,写了两年web项目,突然跑去研究linux内核,还是有点不习惯,但是who care?研究linux内核是一件很有趣的事,因为web项目这东西真的不需要太多数据结构和算法知识,所以大二的时候都没怎么学数据结构,所以...,看linux内核的时候简直是心累,各种高级数据结构,比如循环双向链表和哈希链表,还有红黑树,关键这些结构还不

2016-12-10 23:07:21 2410

原创 通用块层IO调度算法之deadline算法

在讲通用块层IO调度算法之前,我们先来回顾一下page是如何进入通用块层的,在文件系统中的writeback机制中,回写线程先将page变成buffer head,然后submit_bh函数又将buffer head变成了bio,最后调用submit_bio函数进入通用块层,在submit_bio函数中会调用一个通用的函数make_request_fn将bio提交,在块设备层中make_reque

2016-12-10 11:08:46 4497

原创 关于虚拟存储器、虚拟内存和交换空间的理解

虚拟存储器、虚拟内存和交换空间这三个概念从看CSAPP开始很长一段时间都在困扰着我,网上各说纷云,等快上完操作系统和计组课才算明白了!先说虚拟存储器,CSAPP上介绍的是虚拟存储器是对主存的抽象概念,为每一个进程提供了一致的地址空间形式,也就是虚拟地址空间(这个地址空间不是用什么数组存起来的,而是CPU要访问内存就产生一个虚拟地址,不断累积组成的虚拟地址空间),它是一种机制,一种将主存抽象成磁

2016-12-01 14:18:15 8127 1

原创 wireshark实验之TCP

计网学完传输层之后虽然书上的东西都差不多理解了,但是纸上学来终觉浅,还是实际感受一下TCP的整个传输过程才能理解得更深就从最经典的三次握手开始第一步源地址向目的地址发送一个SYN请求(seq=0),第二步目的地址向源地址发送一个SYN-ACK响应(seq=0,ack=1),第三步源地址向目的地址发送ACK确认(seq=1,ack=1),接下来分析看到的简略参数:seq和ack就

2016-11-30 18:11:49 7031

原创 《深入理解计算机系统》Tiny Web服务器实验

#include "csapp.h"/* *说明:在用telnet时,Host头域指定请求资源的Intenet主机和端口号 * 必须表示请求url的原始服务器或网关的位置。 * HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。 */void handler(int sig);void doit(int fd);void read_requesthdrs(rio

2016-01-26 21:31:07 3288

转载 文件描述符和文件指针的区别

文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。 文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件

2015-09-04 10:46:08 524

转载 虚拟存储器--虚拟地址与物理地址

计算机在运行程序时,需将代码加载入内存中,CPU读取内存中的代码并执行。早期的计算机在没有引入 虚拟存储器之前,需将整个待运行的程序加载到内存中,因为内存空间有限,当待加载的程序过大时就会出现问题(多进程,则需要占用更多的内存空间)。现代计算机引入虚拟存储器的概念,通过将对内存进行抽象,将其作为存储在硬盘上数据的高速缓存,只将当前进程部分代码缓存到主存中(当前进程的程序较少时,可以

2015-09-01 09:04:09 2080

原创 部署网站应用的流程

常见的网站部署流程一般有三层结构:web server -> application server -> DB server以python应用为例,对于web server主要有nginx,apache,iis等,有三个功能:高效率处理静态文件,web server都是用c开发,调用是native的函数,对IO,文件传输都做针对性的优化充当一个简易的网络防火墙,可以de

2015-08-30 19:54:36 617

原创 深入理解计算机系统第八章shell实验

/* * unix shell with job control *内建命令是fg,bg,jobs,echo,quit,& * @copyright 官加文 */#include#include#include#include#include#include#include#include#include/* 宏定义一些常数 */#define MAXLINE

2015-08-29 16:48:04 1826

转载 中断解析

一、中断是什么中断的汉语解释是半中间发生阻隔、停顿或故障而断开。那么,在计算机系统中,我们为什么需要“阻隔、停顿和断开”呢?举个日常生活中的例子,比如说我正在厨房用煤气烧一壶水,这样就只能守在厨房里,苦苦等着水开——如果水溢出来浇灭了煤气,有可能就要发生一场灾难了。等啊等啊,外边突然传来了惊奇的叫声“怎么不关水龙头?”于是我惭愧的发现,刚才接水之后只顾着抱怨这份无聊的差事,居然忘了这事,于

2015-08-03 21:56:44 1562

原创 Python模拟浏览器登录淘宝

因为前几天写了个Python登录教务网的爬虫,这几天又突然想到用Python登录淘宝试试,于是二话不说,代码走起。本来以为很简单,但一写我就傻眼了,登淘宝的涉及到很多东西,验证码,加密算法,用httpfox查看post数据又很多看不懂的,所以百度大神们的类似代码,经过几天痛苦的尝试,终于搞定了,登淘宝最重要的几点就是:一,验证码,我是用正则提取验证码地址,然后用webbrowser把验证码直接在浏

2015-02-17 20:57:24 5587

空空如也

空空如也

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

TA关注的人

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