自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 资源 (2)
  • 收藏
  • 关注

转载 web服务器负载均衡实现

摘要: 负载均衡(Load Balance)是集群技术(Cluster)的一种应用。负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力。目前最常见的负载均衡应用是Web负载均衡。根据实现的原理不同,常见的web负载均衡技术包括:DNS轮询、IP负载均衡和CDN。其中IP负载均衡可以使用硬件设备或软件方式来实现。什么是web负载均衡服务器集群(Cluster)使得多个服务器节点能够协同工

2017-09-03 17:47:55 1440

转载 valgrind——Linux下内存泄漏检测工具

【引言】Valgrind的主要作者Julian Seward刚获得了2006年的Google-O’Reilly开源大奖之一──Best Tool Maker。让我们一起来看一下他的作品。Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏

2017-09-02 10:08:36 406

转载 setsockopt函数解释

1. 每个套接口都有一个发送缓冲区和一个接收缓冲区。 接收缓冲区被TCP和UDP用来将接收到的数据一直保存到由应用进程来读。 TCP:TCP通告另一端的窗口大小。 TCP套接口接收缓冲区不可能溢出,因为对方不允许发出超过所通告窗口大小的数据。这就是TCP的流量控制,如果对方无视窗口大小而发出了超过宙口大小的数据,则接收方TCP将丢弃它。 UDP:当接收到的数据报装不进套接口接收缓冲区时,此数据报

2017-09-01 15:38:33 965

原创 netstat工具

1、netstat是什么? netstat是在内核中访问网络相关信息的程序,它能够提供TCP连接、TCP和UDP监听、进程内存管理的状态。netstat也是一种控制台命令,是一个监控TCP/IP网络的非常有用的工具,他可以显示路由表、实际网络连接以及每一个网络接口设备的状态信息。使用netstat可以让用户知道有哪些网络连接正在运作,使用时如果不带参数,netstat显示活动的TCP连接。2、命

2017-08-30 15:44:48 542

转载 震惊! 程序员以后写代码要按行收费

程序员总工会发布了一条消息:以后我们的代码要按行收费。客户们立即就炸了锅,按代码收费?那你程序员不是想怎么写就怎么写,我们让你们做个项目,你写个空行,写点注释什么的,谁来管 物竞天择。有人有需求就立即有人响应。正当这些客户无所适从的时候,一个职业产生了:代码缩行师。客户在审查项目交付的时候会先去缩行事务所请一位缩行师。缩行师的职责就是,在保证不改变原有系统功能的前提下,将程序最大程度的缩减行数,缩

2017-08-15 22:13:05 3867 3

原创 基于C/S模型的讨论组实现

受到微信、QQ等聊天工具的其他,结合着自己所学的系统、网络编程,我打算实现一个自己的聊天系统。 一、来先爬到巨人的肩上 当今发达的互联网,总能找到可以拿来学习和借鉴的各种工具,我调研了QQ的实现和微信的实现,用来实现我自己的聊天系统。 腾讯旗下QQ底层运用UDP协议实现传输。使用UDP协议的原因是因为UDP无连接,传输速率快,占用系统开销小,但是UDP协议的缺陷是不可靠,它没有TCP的可靠性保

2017-08-15 22:09:39 624

原创 C语言连接mysql数据库

一: 分配或初始化与mysql_real_connect()相适应的MYSQL对象。用mysql_init()函数。MYSQL *mysql_init(MYSQL *mysql) 描述 : 分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init

2017-08-14 22:48:40 814

原创 初探C++11

【引言】学了那么长时间的C++98,是时候进入新世界(C++11)的大门了! ————致敬C++ 一、新增的类型 c++11新增了 long long int 和unsigned long long int 支持64位或者更宽的整数; 新增了char16_t , char32_t来支持16位和32位的字符表示; 二、统一的初始化 C++增强了{ }的能力,加大了它的使用范围。 可以

2017-08-09 23:46:05 186

原创 mysql入门(四)

【引言】接着上篇文章的节奏来讲 一、事务 【例题】:假设某银行的数据库,用户A给B用户B转账1000,此时A用户账号上余额应该减少1000, 此时B用户的账户应该多出1000。 但是当A操作完后,A用户的账号钱也减少了,这时突然停电了。。。B用户的钱没变; 现实当中遇到这样的事情,这就很坑了! 这时候事务就排上用场了,事务会保证两个操作要么都完成,就是成功,只要两个全没完成就失败;

2017-08-09 12:56:29 196

原创 mysql入门(三)

【引言】接着总结上次剩下的sql数据库 一、查询: 查询语句 select (1)查询所有表成员 select * from 【tablename】 (2)条件查询 where select * form 【tablename】where 【条件】 (3)限制 limit select * from 【tablename】limit 【对于第一个的偏移量】 图为,以a

2017-08-09 00:31:13 296

转载 Linux解压命令

.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压1:gunzip FileName.gz 解压2:gzip -d FileName.gz 压缩:gzip FileName.tar.gz 和 .tgz 解压:tar zxvf Fil

2017-08-07 20:39:17 242

原创 mysql入门(二)

一、表操作(增删查改) 注意: 1.创建库、表名是不要使用mysql关键字或者保留字; 2.使用mysql时出现中文乱码,创表时加入charset utf8; 3.一般不推荐使用中文数据库; 一、查看创建表的语句:show create table 【tablename】 1.修改表名:rename table 【old name】to 【newname】 2.查看表内容:sele

2017-08-04 12:02:19 208

原创 编译原理:(一)

编译原理:一个陌生又熟悉的词 对程序员来说:学习编译原理可以帮助程序员更深层的了解程序语言和内部机制。让我们更加深入了解计算机思想。 简单介绍计算机语言发展史:机器语言——>汇编语言——>早期高级语言——>高级语言——>面向对象语言,语言发展越来越高级,人类的文明也越来越辉煌! 编译程序、编译原理:通俗的讲就是把高级语言翻译成计算机可以读的机器语言的翻译过程,大概的流程是:词法分析、语法分析、

2017-07-31 23:53:16 837

原创 mysql入门(一)

由于mysql免费试用、配置简单、稳定性好、性能优良等特点,被广泛应用到各个行业中。下面简单介绍mysql的简单操作以及SQL语句 一、SQL语句是美国标准局规定的标准关系型数据库语言,基本上大多数关系型数据库都支持SQL语言。 SQL分类 1.DDL语句:数据定义语句,主要定义数据段、数据库、表、列、索引等 2.DML语句:数据操作语句,增、删、查、改数据库的数据 3.DCL语句:数据控

2017-07-30 21:26:09 228

原创 C++ STL库中vector/list使用

学习C++我们必然要接触到两个库,STL库和Boost库。 Boost库是C++中一个功能强大涵盖算法、泛型编程、容器等免费开源的一个外部库。这里不谈 STL是C++标准模板库,涵盖六大组件:容器、迭代器、空间配置器、算法、适配器。这篇文章主要了解STL常见容器实现和接口的使用。 一、vector vector是一个动态增容的顺序表,当顺序表容量到达上限时,系统会重新开辟一块更大的连续内存,

2017-07-29 16:32:09 438

转载 IP地址和MAC地址的区分

什么是MAC地址? MAC地址也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。IP地址与MAC地址在计算机里都是以二进制表示的,IP地址是32位的,而MAC地址则是48位的。MAC地址的长度为48位(6个字节),通常表示为12个16进制数,每2个16进制数之间用冒号隔开,如:08:00:20:0A:8C:6D就是一个MAC地址,其中前6位16进制数08:00:20代表网络硬件

2017-07-23 22:19:18 1061

原创 TCP协议的可靠性传输,流量、拥塞控制

以前我们提到TCP协议的三次握手和四次挥手中的细节,接下来讲讲TCP被称为可靠性传输协议的依据。 一、停止等待协议 1.无差错传输:在理想情况下,A发送数据后,等待B接受,B发出确认收到后A才开始发送下一组数据。 2.出现差错:由于某种未知原因,A发出数据后丢失了,该数据丢失了。此时B未收到,一定时间后出发超时重传机制。 超时重传:A发出数据后,自身暂时还保留着该数据(以便重传),每当一组数

2017-07-21 16:26:08 874

原创 Shell 脚本学习记录(一)

一、浅谈Shell 学习Shell脚本之前,我们有必要先来认识认识什么叫Shell? 谈到这个问题,我们首先来回忆一下计算机自底向上的体系,最下层是硬件,上面是驱动,上面是操作系统,在上面是Shell,所谓的外壳。 Shell其实是用户和操作系统进行人机互动的一个interface。主要通过命令行来使系统完成某种工作,因此Shell最简单的定义为—命令解释器: 可以把用户的信息传递给操作系统

2017-07-15 15:24:13 639

转载 布隆过滤器(BloomFilter)

Bloom Filter简介 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误

2017-07-13 19:26:51 292

原创 排序算法合集

算法中很重要的一个问题就是排序,以下总结几种常用的排序算法:(以下都按升序来算) 一、插入排序 1.思路:数组从前往后遍历,将一个小于前面有序队列的数插入前面的数中,插入之前这些数字后移。 时间复杂度:O(N^2), 稳定性:稳定 最差情况:序列较长,逆序最差 最好情况:序列较短、接近有序 代码:void InsertSort(int *a, size_t n){ for

2017-07-12 22:05:59 221

原创 网络地址转换NAT与代理服务器

一、虚拟专用网 我们首先说说虚拟专用网VPN(Virtual Private Netwock)。 什么是VPN呢? 首先我们知道一个计算机能连接上因特网,必须申请一个全球唯一的IP地址。也叫全球地址,但是随着计算机网络的普及,全球IP地址所剩无几,一个机构申请的全球地址往往少于这个场所内所有计算机的数目,考虑到这个组织的所有主机不一定全都接入外部的因特网,例如商场或者宾馆。但是其内部所有主机还

2017-07-06 16:17:56 717

原创 TCP协议的"三次握手"和"四次挥手"

传输层是计算机网络体系结构中关键的一层,要了解传输层首先要深入了解两个协议:1.用户数据报协议(UDP) 2.传输控制协议(TCP) 简单介绍一下UDP协议,重点介绍TPC协议: UDP协议: UDP是一个快速高效的传输协议,传送数据之前不需要建立连接,是无连接传输,但有一个缺点就是,不能保证可靠性传输。 主要特点: 1.无连接的。 2.UDP尽最大努力交付,不能保证可靠交付。 3.

2017-07-01 11:40:12 266

原创 TopK问题——统计大家最爱玩的游戏

问题:统计大家最爱玩的前K种游戏 思路:大体思路是用库里的map来存放数据pair< string,int>可以统计。然后再比较int的值建大堆,堆排序之后取出前K的元素,存放在数组里返回。 代码://核心代码#include<algorithm>#include<map>#include<string>#include<vector>using namespace std;clas

2017-06-29 10:04:13 248

原创 STL下的map和set

一、set set是库里提供的近似平衡二叉搜索树,底层用红黑树实现的,所以是近似平衡,而不是绝对的平衡。#include<set>template < class T, // set::key_type/value_type class Compare = less<T>, // set::key_compare/

2017-06-26 17:54:56 238

原创 CRC校验

一、什么是CRC校验 这里要介绍一下数据链路层的三个基本问题: 1.封装成帧 加上首部和尾部,尾部包含FCS冗余校验码(专门为了检错而添加的帧验证序列)。 说明:CRC和FCS,没有关系,添加的FCS码既可以用CRC校验,也可以用其他方法校验。 2.透明传输 这里的透明传输是指任何东西否可以封装成帧来传输,就是透明传输。 3.差错校验 数据链路层广泛采用CRC校验。 循环冗

2017-06-20 16:15:24 3501

原创 守护进程(daemon)

守护进程也叫精灵进程(daemon):它独立于控制终端,并且周期性的执行某些操作或者等待某个任务,是一种很有用的进程。Linux下的服务器大多是由守护进程实现的,比如说web服务器,Internet服务器等等,守护进程不收终端登录和注销影响,他们是独立的,自成终端。一、查看守护进程: 用命令 ps axj 查看进程,得到TPGID一列为-1,说明没有控制终端,就是所谓的守护进程。 二、守护

2017-06-16 16:30:38 651

原创 线程安全和可重入函数

线程安全问题 1.线程安全问题: 当用线程编写程序时,必须小心地编写那些具有称为线程安全性(thread safety)属性的函数。多线程访问运行时,当一个线程访问数据时采用加锁机制,对数据进行保护,保证了数据不会出现错乱。 2.产生线程不安全的原因: 多线程程序对全局变量或者静态变量进行修改。 3.以下几类函数是线程不安全的: 1)返回指向静态变量指针的函数; 2)函数

2017-06-10 10:55:34 229

原创 Linux 下信号(二)和线程安全

六、信号捕捉 1.内核是如何捕捉信号的: 如果信号的处理动作是用户自定义的,那么这个信号递达的时就会调用这个函数,称为信号捕捉。下图阐述了 捕捉信号 的过程: sigaction()函数可以捕捉信号。#include<signal.h>int sigaction(int signo,const struct sigaction *act,struct sigaction *oact)

2017-06-10 09:35:37 304

原创 Linux下的信号(signal)

一、信号的概念: 要理解信号,我们先来进入一个场景。用户在shell下打开一个前台进程,正在运行。在键盘上按下ctrl+C的组合键,当前前台进程会中断。是因为键盘上输入的信号通过硬件传输给驱动程序,将ctrl+C转化为SIGNAL传给该进程的PCB,修改了PCB里的某些字段,也就是说给进程发送了一个信号。 输入指令:kill -l 可以查看信号 二、信号产生的几个主要条件: 1.硬件异常

2017-06-06 15:11:07 422 1

原创 线程

我们都知道进程有各自的PCB。并且在各自独立的地址空间上运行。那么什么是线程呢?一、线程概念 有时候一个进程中同时需要执行多个控制流程。比如,你开着迅雷下载电影,还能一边下载一边观看。并且能够拖动边框。这时候就是线程排上用场的地方了。 1.很多时间我们会听到,线程是在进程里运行的。这句话其实是说线程是在进程的地址空间内部运行的。所有线程是进程内部的一个执行流,线程只拥有进程的一部分资源。理所当然

2017-06-02 15:55:05 452

原创 死锁问题

一、死锁原理 死锁可以被定义为一组竞争系统资源或互相通信的进程间的“永久”阻塞。当一个进程集合中所有进程都在等待请求资源的分配,而只有在进程集合中的其他阻塞的进程才能触发该事件。这时就称为进程死锁。 如图Ra,Rb占有一个单位资源,当P1占有Rb 同时申请Ra,P2占有Ra,同时申请Rb,两个进程互相都在请求对方占有的唯一资源。发生死锁。 二、死锁条件 若要发生死锁,必定出现四个条件:

2017-06-02 10:46:37 200

原创 进程间通讯————消息队列

Linux支持system V 提供的进程间通信机制:消息队列、信号(semaphores)和共享内存。称为system V的IPC对象,可以通过系统调用(system call)对对象的创建者设置这些对象的存取权限。和文件的存取一样,这些对象的存取也要存取权限。内核(Kernel)为每一个IPC对象维护了一个结构体如下:struct ipc_perm { key_t __key; /* K

2017-05-31 16:40:28 302

原创 进程间通信————管道

进程间通信 首先,每个进程有各自不同的地址空间,任何一个进程都不能看到别的进程的系统资源。因此,进程间通信的主要方式是通过内核,首先在内核中开辟出一个缓冲区。把进程1的要沟通的数据写到缓冲区中去,然后通过进程2读走缓冲区的内容,这样才实现了进程间的通信(IPC)。 一、匿名管道 1.管道是一种简单的进程间通信方法,有IPC机制。通过调用pipe函数在内核中创建出缓冲区(管道) #inc

2017-05-26 17:24:39 371

原创 两个队列实现一个栈

这道题我们先应该搞清楚栈和队列这两种数据结构。队列:队列(queue)特点:先进先出(FIFO) 栈:(stack)特点:后进先出(FILO)。 思路: 创建一个栈,存放两个队列,一个队列用来存数据,一个队列中转数据。例如 1,2,3,4 在queue1中,要实现后进先出,则把前面三个数据移到queue2中,pop() 出queue1 ,最后再把queue2的数据移动到queue1中。

2017-05-23 16:33:03 190

原创 僵尸进程和孤儿进程

Linux下进程的状态: 1.R ( running ) 可执行行态。 2.S ( sleeping ) 可中断睡眠态。 3.D (disk sleep)不可中断的睡眠,也叫硬盘睡眠。 4.T (Stop)暂停或跟踪状态。 5.X (Dead)即将被销毁。 6.Z (zombie)僵尸状态,等待回收资源。 僵尸状态: 当一个进程退出时,它并不是完全消失,而是等到它的父进程通过调用wa

2017-05-18 14:58:47 299

原创 1+2+3+.........+N 的n种解法

1+2+3+…+N的几种求法。 一、普通循环 这个就不多说了,普通循环得到答案int GetSumByCir(size_t N)//普通循环{ int sum = 0; for (int idx = 1; idx <=N; idx++) { sum += idx; } return sum;} 二、递归解决 通过控制递归条件递归求解in

2017-05-17 16:13:44 2333

原创 Linux中文件描述符fb和文件指针FILE*的区别

1.文件描述符: linux中,当一个进程打开一个文件或者是创建一个新文件时,内核向进程返回一个文件描述符来标示该文件。文件描述符是一个非负整数,实际上它是一个索引,指向内核为进程所维护的一个文件记录表。 任何程序运行起来都会打开三个默认的流,标准输入流,标准输出流,标准错误流通常情况下对应的硬件为键盘,显示器,显示器。 三个流的文件标示符为 0,1,2 因为默认的三个流已经设置好,后

2017-05-11 10:57:43 1659

原创 如何创建一个只能在堆上产生对象的类

题目:如何创建一个只能在堆上产生对象的类一、分析: 1.定义一个只能在堆上产生对象的类,自然联想到new、malloc、calloc等动态分配内存的方法来产生对象。但在C++中,产生对象要调用构造函数,当然选择new来解决。 2.只能在堆上而不能在栈上创建对象,想到可以把构造函数定义成private或者protected 里面,防止在类外的栈空间上调用构造函数来创建对象。 3.可以定义一个成员

2017-05-11 00:10:25 809

原创 smart_pointer

引入: C++程序员最痛苦的莫过于对内存管理,没有像C#和Java那样的内存回收机制,C++程序员在复杂的程序中容易造成内存泄漏,即便是程序员非常小心,异常的产生也会造成部分内存泄漏。(由于异常而导致delete语句没有释放动态分配的内存)从而引出了智能指针(smart_pointer)。 什么是智能呢? 这种指针实质是一个包装了一个指针的类,通过RAII机制来自动释放内存。下面会详细介绍RA

2017-05-08 15:10:42 294

原创 C++——模板

在c++中为了提高代码的复用率,提出了模板。模板分为模板函数、模板类。一、模板函数 假如要实现一个加法函数使其可以通用任何类型。 当然能通过宏来实现 #define Add(a,b) ( (a)+(b) ) 但是宏的缺点显而易见。不能进行参数检测,安全性太差了。 还可以写出一下的函数模板。template<class T>//模板的参数列表T Add(T left, T right){

2017-05-04 11:57:44 187

linux shell脚本使用

shell

2017-08-26

C语言三子棋实现

C语言 编写三子棋

2016-12-26

空空如也

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

TA关注的人

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