#原理

零拷贝技术介绍

发布于:2020-04-01

为什么需要零拷贝 传统的Linux系统的标准I/O接口(read、write)是基于数据拷贝的,也就是数据都是copy_to_user或者copy_from_user 这样做的好处是,通过中间缓存的机制,减少磁盘I/O的操作,但是坏处也很明显,大量数据的拷贝,用户态和内核态的频繁切换,会消耗大量的CPU资源,严重影响数据传输的性能 以下是一个原始数据拷贝操作的例子,假如一个应用需要从某个磁盘文件中读取内容通过网络发出去,其过程需要经过以下4个步骤,整个过程涉及2次 CPU拷贝、2 次DMA拷贝总共4次拷贝,以及4次上下文切换。 read(file_fd, tmp_buf, len); …...

进入阅读

流量复制技术

发布于:2019-09-20

为什么需要流量复制 对于一些有并发要求的业务,特别是对接外部流量时,产品上线前一定要做的就是压力测试,但是常规的压力测试并不能覆盖所有情况。以gemeter、ab,、webbench、http_load为例,这些通过模拟请求的压测工具,只能发送特定的参数,对于一些参数异常导致的程序处理异常是无法考虑到的,所以就需要一款能复制真实流量,并且不影响线上业务的工具。 流量复制工具有很多,例如Gor、tcpreplay、tcpcopy等,这些工具贴合真实场景,能模拟真实流量,并支持流量的放大或缩小,更容易测试出程序的瓶颈和潜在问题。 常见的流量复制工具有如下几种: …...

进入阅读

使用Dockerfile来定制Docker镜像

发布于:2019-07-12

Dockerfile定制镜像 Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令,Docker程序将读取Dockerfile,根据指令生成定制的image。 Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层, 因此每一条指令的内容,就是描述该层应当如何构建。 一般的,Dockerfile 分为四部分: 基础镜像信息 维护者信息 镜像操作指令 容器启动时执行指令 Dockerfile示例 #基础镜像信息 FROM ubuntu # …...

进入阅读

分布式系统最终一致性理论——BASE

发布于:2019-06-20

BASE理论 BASE理论是Basically Available(基本可用),Soft State(软状态)和Eventually Consistent(最终一致性)三个短语的缩写,由eBay架构师提出的,BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网分布式系统实践的总结,是基于CAP定律逐步演化而来。 其核心思想是即使无法做到强一致性,但每个应用都可以根据自身业务特点,才用适当的方式来使系统打到最终一致性 BASE思想的主要实现有: 按功能划分数据库 sharding碎片 基本可用(Basically Available) 基本可用是指分布式系统在出现故障的时候, …...

进入阅读

常见排序算法原理——Go语言实现

发布于:2019-06-17

冒泡排序——Bubble Sort 算法原理 它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~3,直到排序完成。 package main import "fmt" func main() { arr := []int{1, 3, 45, 32, …...

进入阅读

分布式系统设计理论——CAP

发布于:2019-06-15

CAP定理 CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这三个基本需求,最多只能同时满足其中的2个。 CAP的具体定义: Consistency(一致性):指数据在多个副本之间能够保持一致的特性,一般特指写操作之后的读操作,必须返回该值。举例来说,某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。 Availability(可用性):指系统提供的服务必须一直处于可用的状 …...

进入阅读

分布式事务原理

发布于:2019-01-05

分布式事务 在分布式系统中,为了保证数据的高可用,通常,我们会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上。为了对用户提供正确的增\删\改\差等语义,我们需要保证这些放置在不同物理机器上的副本是一致的。 分布式事务是指会涉及到操作多个数据库的事务。其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚) DTP模型和XA事务协议 DTP模型X/Open组织定义的分布式事务处理模型。XA是DTP定义的 …...

进入阅读

HashMap的数据结构

发布于:2018-10-11

HashMap HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。实质是一个哈希数组结构,但是在元素插入的时候,存在发生hash冲突的可能性。 从结构实现来讲,HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下如所示。 HashMap类的数据结构 HashMap类包含5个关键参数: threshold:表示容器所能容纳的 key-value 对极限。 loadFactor:负载因子。 modCount:记录修改次数。 size:表示实际存在的键值对数量。 table:一个哈希桶数组,键值对就存放在里面。 public class …...

进入阅读

iptables简介及使用说明

发布于:2018-07-17

什么是iptables iptables是Linux平台最著名的防火墙工具,运行在用户空间通过控制Linux内核netfilter模块来管理网络数据包的处理和转发的一个命令行工具。可以把iptables理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到netfilter netfilter/iptables组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换等功能。 iptables操作需要超级用户权限,其可执行文件通常位于 /sbin/iptables …...

进入阅读

Goroutine间的通信——channel机制

发布于:2018-06-25

并发与并行 关于并发和并行的区别,引用一个经典的描述: 并发是同一时间应对(dealing with)多件事情的能力。 并行是同一时间动手(doing)做多件事情的能力。 雨痕老师《Go 语言学习笔记》上的解释: 并发是指逻辑上具备同时处理多个任务的能力;并行则是物理上同时执行多个任务。 并发是代码的特性,并行是正在运行的程序的特性。随着抽象层次的降低,并发模型实际上变得更难也更重要,而越低层次的并发模型对我们也越重要。要想并发程序正确地执行,就要深入研究并发模型。 要想一段并发的代码没有任何bug,是非常困难的。有些并发bug是在系统上线数年后才发现的,原因常常是很诡异的,比如用户数 …...

进入阅读

Goroutine的调度机制——MPG模型

发布于:2018-06-23

goroutine goroutine是Go语言原生支持并发的具体实现,Go代码都无一例外地跑在goroutine中。 可以启动许多甚至成千上万的goroutine,但它们并不是被操作系统所调度执行,Go的runtime负责对goroutine进行调度执行。 除了被系统调用阻塞的线程外,Go运行库最多会启动$GOMAXPROCS个线程来运行goroutine。 和所有其他并发框架里的协程一样,goroutine里所谓“无锁”的优点只在单线程下有效,如果$GOMAXPROCS > 1并且协程间需要通信,Go运行库会负责加锁保护数据 goroutine调度 goroutine调度就是决定何时 …...

进入阅读

Docker简介和基本使用

发布于:2018-05-12

Docker是什么 Docker属于Linux容器技术的一种封装,提供简单易用的容器使用接口,它是目前最流行的Linux容器解决方案。 Docker使用Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 Docker将应用程序与该程序的依赖打包在一个文件里面(镜像)。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。 基于Docker的沙箱环境可以实现轻型隔离,多个容器间不会相互影响。 Docker和虚拟机的区别 虚拟机(virtual …...

进入阅读

MySQL中的锁机制

发布于:2018-05-02

MySQL中锁类型分类概述 按锁的粒度可划分为:表锁、行锁、页锁 按锁的机制可划分为:乐观锁、悲观锁 按锁的兼容性可划分为:共享锁、排他锁 按锁的算法模式可划分为:记录锁、间隙锁、临键锁、意向锁、插入意向锁 锁粒度 表锁 表锁的锁定颗粒度在MySQL中是最粗的,InnoDB、MyISAM引擎中都有应用,对当前整张表加锁。 表锁不适合高并发的场景,但开销小,加锁快,不会出现死锁,发生锁冲突的概率最大。 手动加锁方式: LOCK TABLES xx READ/WRITE; 行锁 行锁的锁定颗粒度在MySQL中是最细的,应用于InnoDB存储引擎,只针对操作的当前行进行加锁。并发情况下,产生锁等待的 …...

进入阅读

GC垃圾回收原理解析

发布于:2017-12-16

GC GC(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。 GC机制是区别C++的一个重要特征,C++需要开发者自己实现垃圾回收的逻辑,而JAVA开发者则只需要专注于业务开发,因为垃圾回收这件繁琐的事情JVM已经为我们代劳了。 GC分代和收集算法 现代的垃圾收集器基本都是采用分代收集算法,其主要思想: 将Java的堆内存逻辑上分成块:新生代、老年代,处理堆内存外还有一个特殊的区域叫永久代,针对不同存活周期、不同大小的对象采取不同的垃圾回收策略。 新生代(Young Generation) …...

进入阅读

Go的异常处理-panic,defer,recover

发布于:2017-12-14

Go的异常处理 Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。 在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。 Go的异常处理可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理 panic Golang里比较常见的错误 …...

进入阅读

JIT即时编译原理解析

发布于:2017-10-15

JIT JIT是(just in time)的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速Java程序的执行速度。 Java编译器通常通过javac将程序源代码编译,转换成java字节码,JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢很多。为了提高执行速度,引入了JIT技术。 JIT编译狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT技术,将字节码编译成平台相关的原生机器码,并进行各个层次的优化,这些机器码会被缓存起来,以备下次使用。 如果JIT对每条字节码都进行编 …...

进入阅读

JVM原理解析

发布于:2017-07-11

JVM JVM是Java虚拟机(Java virtual machine)的简称,是运行Java程序必不可少的机制。编译后的Java程序指令并不直接在硬件系统的CPU上执行,而是由JVM执行。 JVM实现了Java语言最重要的特征:即平台无关性。JVM屏蔽了与具体平台相关的信息,使Java语言编译程序只需要生成在JVM上运行的目标字节码(.class),就可以在多种平台上不加修改地运行。 JVM是编译后的Java程序(.class文件)和硬件系统之间的接口。javac是收录于JDK中的Java语言编译器,该工具可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机 …...

进入阅读

数据库并发控制——事务隔离

发布于:2017-03-02

事务隔离与并发控制 事务隔离定义了数据库系统中一个事务中操作的结果在何时以何种方式对其他并发事务操作可见。 并发控制描述了数据库事务隔离以保证数据正确性的机制。为了保证并行事务执行的准确执行,数据库和存储引擎在设计的时候着重强调了并发控制这一点。典型的事务相关机制限制数据的访问顺序以满足可序列化和可恢复性,限制数据访问意味着降低了执行的性能,并发控制机制就是要保证在满足这些限制的前提下提供尽可能高的性能。 两阶段锁是关系数据库中最常见的提供了可序列化和可恢复性的并发控制机制。为了访问一个数据库对象,事务首先要获得这个对象的锁。对于不同的访问类型(如对对象的读写操作)和锁的类型,如果另外一个事务 …...

进入阅读

Maven的使用简介

发布于:2016-10-12

maven maven是一个JAVA项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。 maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性,利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。 Pom pom是指project object Model。pom是一个xml文件,在maven2里为pom.xml。是maven工作的基础,在执行task或者goal时,maven会去项目根目录下读取pom.xml获得需要的配置信息 pom文件中包含了项目 …...

进入阅读

MySQL高可用架构

发布于:2016-08-23

前言 Mysql数据库作为最基础的数据存储服务之一,在整个系统中有着非常重要的地位,因此要求其具备高可用性是无可厚非的。有很多解决方案能实现不同的SLA(服务水平协定),这些方案可以保证数据库服务器在硬件或软件出现故障时服务继续可用。 理解高可用系统 高可用,英文叫High Availability(Wikipedia词条),基本上来说,就是要让我们的计算环境(包括软硬件)做到full-time的可用性。在设计上一般来说,需要做好如下的设计: 对软硬件的冗余,以消除单点故障。任何系统都会有一个或多个冗余系统做standby 对故障的检测和恢复。检测故障以及用备份的结点接管故障点。这也就 …...

进入阅读

Linux IO模式

发布于:2016-08-09

前言 服务器端编程经常需要构造高性能的IO模型,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)这4中IO模型,那么这四种模型具体如何定义,有何区别?本文将介绍相关的内容。 一些基本概念 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。 …...

进入阅读

数据库事务理论——ACID

发布于:2016-05-01

ACID理论 ACID,是指数据库管理系统在写入或更新资料的过程中,为保证事务是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。 在数据库系统中,一个事务是指由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和构成一个完整的逻辑过程,不可拆分。 原子性(Atomicity) 一个事务中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。 通常一个事务关联的操作具有共同的目 …...

进入阅读

Mysql查询执行计划—Explain

发布于:2016-04-06

explain 在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句。找出这些SQL语句并不意味着完事了,我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。 explain语法和示例 explain select * from servers; …...

进入阅读

MYSQL主从架构

发布于:2016-01-04

MySQL主从复制 随着数据量不断的增加,由单台Mysql作为独立的数据库有的时候是不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力这样的方案来进行部署与实施的。 使用mysql主从复制的好处有: 采用主从服务器这种架构,稳定性得以提升。如果主服务器发生故障,我们可以使用从服务器来提供服务。 在主从服务器上分开处理用户的请求,可以提升数据处理效率。 将主服务器上的数据复制到从服务器上,保护数据免受意外的损失。 主从复制原理 复制过程 …...

进入阅读

MySQL索引原理

发布于:2015-12-24

索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。 最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。 如果稍微分析一下会发现,每种查找算法都只能应用于特定的数 …...

进入阅读

PHP底层——变量及其数据结构

发布于:2015-12-03

前言 众说周知PHP是一门弱类型语言,PHP中的一个变量可以声明为任意的PHP数据类型,在程序的运行阶段也可以几乎任意的进行类型转换。这是PHP一个灵活而高效的设计,那么PHP的变量是如何进行存储的呢?这篇文章将介绍相关的知识。 PHP类型 PHP是弱类型语言,这并不表示PHP没有类型,在PHP中,存在8种变量类型,可以分为三类: 类型 描述 标量类型 布尔类型——boolean、整型——integer、浮点型——float(double)、字符类型——string 复合类型 关联数组——array、对象——object 特殊类型 资源——resource、常 …...

进入阅读

RESTful架构

发布于:2015-08-02

什么是REST和RESTful REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的,REST(英文:Representational State Transfer,一般译为"表现层状态转化")是一种思维方式,而非协议或标准。它是设计基于命名资源而非消息的松耦合应用程序的一种风格。如果一个架构符合REST原则,就称它为RESTful架构。 REST的三个要素是唯一的资源标识, 简单的方法, 一定的表达方式。REST是以资源为中心, 名词即资源的地址, 动词即施加于名词上的一些有限操作, 表达是对各种资源形态的抽象。 以HTTP为例, 名词 …...

进入阅读

序列化和反序列化解决方案

发布于:2015-07-26

什么是序列化和反序列化 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程,与之相对应的过程称之为反序列化(Unserialization)。序列化和反序列化主要用于解决在跨平台和跨语言的情况下, 模块之间的交互和调用,但其本质是为了解决数据传输问题。 早期的序列化和序列化解决方案中主要是文本协议的方案,即实现了对象和字符串之间的相互转换,然后在实际的传输过程中再将字符串转化为二进制数据,Xml、Json等等都是解决了对象与字符串之间的相互转换问题。 当大数据时代来临的时候, 大家发现基于XML, 甚至Json的文本协议的方案的传输效率很成问题 所 …...

进入阅读

算法研究(PHP版本)——拓扑排序问题

发布于:2015-06-02

问题 假设一个工程分为若干阶段,每个阶段需要耗费一定的天数,有些工程的开始必须以其他一个和多个工程的结束为前提。假设每次只能同时进行一个阶段,问如何安排执行工程的阶段确保工程能顺利的完成。 解决问题的思路 用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网,简称AOV (Activity On Vertex network)网。 在AOV网没有回路的前提下,我们将全部活动排列成一个线性序,使得若AOV网中有弧<i,j>存在,则在这个序列中,,i一定排在j的前面,具有这种性质的线性序列称为拓扑有序序 …...

进入阅读

算法研究(PHP版本)——带权二分图最佳匹配问题

发布于:2015-05-13

问题 假设要给5位工人分配不同的5项工作,每位工人都能完成这5项工作,但是每一位工人完成不同工作能带来的效益是不一样的,如何分配工作能使得总效益达到最大值。 解决问题的思路 对于这个问题最容易想到的解决思路是请举所有的排列组合,然后计算总的效益后取最大值即可。上述问题的因子是5,5求全排列一共有120种组合,对于计算机而言,循环求120次求解不是很难的问题,效率也高,但是一旦问题变大,例如因子变为20,那么时间复杂度和空间复杂度都会呈现几何级数级别的上升。 上述问题可定义为寻找带权二分图最佳匹配,解决这个问题的著名算法是KM算法。 对KM算法的描述,基本上可以概括成以下几个步骤: 初始化可行 …...

进入阅读

算法研究(PHP版本)——最大匹配问题

发布于:2015-05-07

问题 假设某一婚介单位要给10位男生和10位女生安排1对1相亲,每个男生都有自己喜好的几位女生(喜好程度假设相同)。问如何进行男女匹配使得男生最大限度的能和自己喜好的女生进行约会,即使得能安排到喜好女生的男生数目最大。 解决问题的思路 此问题实质上是经典的二分图最大匹配问题,求解二分图最大匹配问题的一个算法是匈牙利算法。 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。 二分图以及匹配相关概念 二分图 简单来说,如果图中点可以被分 …...

进入阅读

关于javascript原型与继承的那点事

发布于:2015-03-09

JavaScript中的对象、类、原型、原型链 真正意义上来说Javascript并不是一门面向对象的语言,没有提供传统的继承方式,但是它提供了一种原型继承的方式,利用自身提供的原型属性来实现继承。 JavaScript中并没有类和实例的概念(ECMAScript 6中出现了class关键字),全是对象。这指的是传统意义上的对象,也就是“一个包含了状态和行为的单一实体”。 通常我们会将function函数模仿“类”来使用,但是并不像在 C++、Java 或 C# 中了解的经典继承模式一样,JavaScript中的继承是通过原型和原型链的形式实现的。 在Javascript中,每 …...

进入阅读

算法研究(PHP版本)——妖怪与和尚过河问题

发布于:2015-03-09

问题 有三个和尚(或传教士)和三个妖怪(或食人怪)过河,只有一条能装下两个人(和尚或妖怪)的船,在河的任何一方或者船上,如果妖怪的人数大于和尚的人数,那么和尚就会有被吃掉的危险。你能不能找出一种安全的渡河方法呢? 解决问题的思路 题目的初始条件是三个和尚和三个妖怪在河的一边(还有一条船),解决问题后的终止条件是三个和尚和三个妖怪安全地过到河的对岸,如果把任意时刻妖怪和和尚的位置看作一个“状态”,则解决问题就是找到一条从初始状态变换到终止状态的路径。 从初始状态开始,每选择一批妖怪或和尚过河(移动一次小船),就会从原状态产生一个新的状态,如果以人类思维解决这个问题,每次都会选择最佳的妖怪与和尚组 …...

进入阅读

算法研究(PHP版本)——三只水桶等分水问题

发布于:2015-03-05

问题 有一个容积为8升的水桶里装满了水,另外还有一个容积为3升的空桶和一个容积为5升的空桶,如何利用这两个空桶等分8升水?附加条件是三个水桶都没有体积刻度,也不能使用其它辅助容器。 解决问题的思路 如果我们把某一时刻三个水桶中存水的容积称为一个状态,则问题的初始状态是8升的水桶装满水,求解的解出状态(最终状态)是8升水桶中4升水,5升水桶中4升水。穷举法的实质就是把从初始状态开始,根据某种状态变化的规则搜索全部可能的状态,每当找到一个从初始状态到最终状态的变化路径,就可以理解为找到了一种答案。 这样的状态变化搜索的结果通常是得到一棵状态搜索树,根节点是初始状态,叶子节点可能是最终状态,也可能是 …...

进入阅读

Linux编译器GCC简介

发布于:2015-01-11

编译和编译器 对于计算机科学来说“编译”是一个很重要的概念,它指的是利用编译器从源语言编写的源程序产生目标程序的过程。对于计算机而言真正能识别的语言是2进制语言,但是在我们在进行软件开发的时候是不太可能直接用二进制语言进行开发的,那么问题来了,软件工程师开发出来的代码是怎么转变成计算机能识别的2进制语言呢?答案就是编译!编译的过程就是把人所写的代码“翻译”成2进制语言的过程,也就是从人的语言到机器的语言的过程。 编译器是一种计算机程序,它会将用某种编程语言写成的源代码,转换成另一种编程语言。它主要的目的是将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的低阶 …...

进入阅读

PHP执行原理

发布于:2015-01-07

前言 PHP是一个被广泛应用的脚本语言,因为它的成功,所以很多时候我们应用PHP的时候是不需要考虑底层到底是怎么实现的。但是了解和掌握一下PHP底层的体系和运行结构会有助于我们开发出更高效的代码,这篇文章将会介绍一下有关PHP底层相关的东东。 PHP体系结构 PHP的构成可以划分成以下4个部分: Zend引擎 Extensions内政函数及拓展 SAPI接口 Application应用 Zend引擎 Zend引擎整体用纯c实现,是php的内核部分。它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行Opcode的处理并实现相应的处理方法、实现了基本的数据结构( …...

进入阅读

浅谈PHP-FPM

发布于:2014-12-16

什么是PHP-FPM PHP-FPM是只用于PHP的FastCGI管理器。对于PHP5.3.3之前的php来说,是一个补丁包,旨在将FastCGI进程管理整合进PHP包中,PHP5.3.3之后PHP的默认安装包直接集成了php-fpm,作为官方默认推荐的FastCGI管理器。 PHP-FPM的特性功能 支持平滑停止/启动的高级进程管理功能 可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置) stdout 和 stderr 日志记录 在发生意外情况的时候能够重新启动并缓存被破坏的 opcode 文 …...

进入阅读

javascript类型判断

发布于:2014-10-06

javascript的数据类型 js数据分为两种类型:原始数据类型和引用数据类型。 原始数据类型有:string、number、boolean、undefined和null 引用数据类型有:Function、Object、Date、RegExp、Number、String、Boolean和自定义类等. 其中原始数据类型也称基础数据类型,是不可拆分的数据类型,他存在于栈中;而引用数据类型也是通常意义上所说的类,存在于堆中。 这两者的一个重要的区别在于原始数据类型在赋值的时候使用的是传值的方式,而引用数据类型在赋值时使用的是传址(指针)的方式。 var str1 = …...

进入阅读

javascript异步编程4种实现方式

发布于:2014-09-22

javascript异步编程 javascript语言的执行环境是“单线程”的。所谓“单线程”,就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。为了解决这个问题,Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异 …...

进入阅读

PHP拓展模块安装

发布于:2014-08-01

PHP拓展模块安装 PHP的源码中不光包含了PHP的核心源代码,同时还包含了PHP的许多拓展库(在PHP源码的ext目录中),在编译安装PHP的过程中并不需要将这些拓展全部选择,只需要选择必须的拓展即可。那么问题来了,如果在往后的使用中如果发现还需要增加一些拓展模块,那么怎么办呢?重新编译PHP是一个解决办法,但是一般正常人都不会选择这种方式,PHP提供了多种多样的拓展模块安装方式。 PEAR(PHP扩展与应用库) PEAR是“PHP Extension and Application Repository”的缩写,即PHP扩展和应用仓库。它是一个PHP扩展及应用的一个代码仓库。PEAR是 …...

进入阅读

PHP源代码安装

发布于:2014-06-11

前言 由于安装PHP的人目的不同,我们不能要求每个人都如此这般精通Linux再去安装PHP,特别是有些PHP程序员仅仅是想搭建一个完整的PHP环境,然后就要迅速转入编程工作,自然对linux环境不甚熟悉。对于PHP在Linux上的安装,大多数开发者通常都会选择使用包管理工具(如yum或者apt-get)进行快速安装配置,这样确实能很快的搭建出一套PHP的环境,但是一旦涉及到如设置PHP的安装目录、PHP的升级或需要对PHP做特殊的配置时还是需要自己动手的,所以学习如何在Linux上进行PHP的源代码安装是非常有必要的。 下载PHP源代码 直接www.php.net官网下载PHP的源代码,当然也 …...

进入阅读

PHP运行模式

发布于:2014-02-11

PHP运行模式 PHP运行模式,就是PHP的执行方式,一种是独立的可执行程序(通常是exe程序),一种是以模块的形式嵌入到服务器程序里运行(通常是DLL程序)。独立执行,用到的是CGI(Common Gateway Interface,通用网关接口)技术;而另外一种,在IIS里被称为ISAPI(Internet Server Application Programming Interface,因特网服务器应用程序接口),Apache里则被称为Module(模块)。 PHP目前比较常见的五大运行模式: CGI(通用网关接口 / Common Gateway Interface) …...

进入阅读

MYSQL中InnoDB和MyISAM存储引擎的区别

发布于:2013-10-08

前言 为了适应各种不同的运行环境,MYSQL提供了多种不同的存储引擎,在应用程序开发这个层面上,开发者可以根据不同的需求选择适合的存储引擎方案,更为灵活的是,你可以根据每张表将要存储数据的特点,选择不同的存储引擎,也就是说,在一个MYSQL数据库中,可以混合使用多种不同的存储引擎。InnoDB和MyISAM是在使用MySQL最常用的两个存储引擎,各有优缺点,视具体应用而定。 MyISAM 这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比 …...

进入阅读

MYSQL索引理解和应用

发布于:2013-08-18

什么是索引 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引的目的在于提高查询效率,对相关列使用索引是提高SELECT操作性能的最佳途径。 索引的优点 创建唯一性索引,保证数据库表中每一行数据的唯一性。 大大加快数据的检索速度,这也是创建索引的最主要的原因。 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。 索引的缺点 索引可以加快数据检索操作,但会使数据修 …...

进入阅读

分类

开发
    --go (9)
    --java (5)
    --php (11)
    --mysql (9)
    --javascript (3)
    --html (1)
    --算法 (6)
架构
    --理论 (9)
    --网络 (3)
    --服务器 (2)
    --消息队列 (3)
    --容器 (5)
    --监控 (1)
    --搜索引擎 (3)
    --大数据 (0)
    --测试 (1)
系统
    --linux (10)
    --mac (2)
    --windows (1)
足球
    --世界杯 (60)
    --欧洲杯 (28)
    --文迷 (3)
大学时光
    --校园生活 (96)
    --假期生活 (17)
    --广院杯那些事 (14)
    --北京奥运 (6)
    --胡思乱写 (17)


最近发布

零拷贝技术介绍

服务网格技术简介

C语言标准和标准库简介

Kubernetes简介及环境搭建

Go语言开发的顶级项目


归档

2006 (109)
2007 (40)
2008 (47)
2009 (10)
2010 (6)
2012 (10)
2013 (14)
2014 (27)
2015 (15)
2016 (6)
2017 (8)
2018 (11)
2019 (17)
2020 (5)