- 博客(65)
- 资源 (1)
- 收藏
- 关注
原创 深入理解喷泉码------喷泉码度分布生成流程
引言 在上篇文章中我们讲到了LT码的编译码算法流程,这次我们着重来讲度分布生成流程,编译码算法是教会你怎么用,但如果你想理解LT码的核心原理,那么你一定要对度分布的生成有一点直观的感觉。OK,这篇文章会尽量的从简单的角度来引导你思考为什么要怎么去设计度分布,度分布的设计的理念和意义在哪里。但是本文并不会告诉你为什么最终选择了这样一个度分布(好吧,其实可能Luby也是拍脑袋想出来的,...
2019-06-11 16:33:33 6234 2
原创 深入理解喷泉码------喷泉码的编译码算法详解及实现
引言 喷泉码不算一个特别新的码字了,2002年Luby就提出了喷泉码的概念,当年Luby也拿着这个东西去创业了,好像后面还是死掉了,但不管怎么说,这个码字还是十分有应用价值的,核心在于其编解码算法理解简单,实现也比较简单,就是对于其度分布的核心生成的推导十分复杂。系列文章分为两篇,第一篇主要是对于典型的喷泉码,LT码的编译码算法的详解,第二篇会对于其度分布生成的推导过程进行引导性的...
2019-06-11 15:53:49 26976 41
原创 深入理解TCP拥塞控制——从BIC到CUBIC
引言 网上的各种博文一提到tcp的拥塞控制,都是清一水的慢启动,拥塞避免,快速重传,呃...虽然没什么问题,但是这都9012年了,tcp的拥塞控制算法已经演变了很多了,在linux内核2.6.8中,就默认采用BIC拥塞控制算法了,在2.6.18中,默认的拥塞控制算法采用了CUBIC,网上各种讲CUBIC的不算太多,个人觉得这篇博文讲的还不错,但该文偏向于从宏观和趋势的角度去理解CU...
2019-06-10 17:25:27 9688 2
原创 centos7.0修改内核中tcp拥塞控制算法的方法
目前tcp拥塞控制算法已有很多种,典型的如tcp_reno,tcp_vegas,tcp_cubic等,很多拥塞控制算法是针对都是相应网络情况的优化,比如tcp_bic和tcp_cubic就很适合长距离且高速低丢包的网络情况,我们可以针对我们自己的网络需求开启相应的拥塞控制算法,下面介绍在centos中修改tcp拥塞控制算法的方法(具体拥塞控制算法的针对场景以及支持的内核版本请自行查阅) ...
2019-06-08 21:45:45 5826
原创 由浅入深网络协议——从一个文件的传输流程来看TCP的流量控制和拥塞控制
不知道你有没有这样的疑惑,在你下载一个文件的过程中,为什么开始的传输速率慢,后面越来越快,最后又稳定在一个固定的值,中间的原理是什么呢?本文将会从原理上讲述一下典型的TCP流量控制和拥塞控制算法,虽然TCP的流量控制和拥塞控制已经是一个老生常谈的问题了,但现在很多网上给出的相关说明都是基于很老的TCP版本或者资料来进行的说明,在实际应用中会给人很多的疑惑。因此,本文会以一个文件传输的实例,...
2019-05-30 12:30:32 1310
转载 golang学习-------goland的基本快捷键
快捷键:移动行 Alt + Shift + up/down 行内(选中)移动(到头尾/删除) Ctrl(Shift) + left/rignt(Home/End/Backspace) 插入新行 Shift + Enter 替换变量、函数名 Shift + F6 配置快捷键:跳转到函数定义 回退 查找函数使用 File/Settings/Keymap ...
2018-10-17 15:42:45 4634 2
原创 golang学习------golang的目录管理以及go install,go build的使用
一个优秀的项目离不开良好的代码管理,golang通过package提供一些代码的管理封装,那么我们应该如何来设计我们的代码结构呢?我们假设我们需要完成一个项目,项目的功能如下:在基于package的目录思路下,目录结构如下在main文件夹中实现package main,方便用户进行调用在test文件夹中就可以通过import "ImageServer/imageFu...
2018-10-16 16:57:14 2803
原创 linux 基本操作及网络命令
tar 解压 tar -xvf file zip -r filetar 打包 tar -zcvf 文件名.tar.gz 文件路径查找某个文件位置 find ./ -name "filename"查找含有某字符串的文件 grep -rn "string" ./添加环境变量export PATH=$PATH:/opt/software/node-v8.9.3-linux-x...
2018-09-26 10:37:19 375
原创 golang学习-------------认识golang的接口(interface)
golang从设计之初本不是一个面向对象的语言,但是为了更高效的开发,又提供了一些面向对象的能力,golang的面象对象主要就是通过interface来实现的,今天我们就来聊一聊golang的这个interface。首先呢先聊点形式化的东西,golang的interface的设计哲学呢是靠近ducking type的,什么是ducking type呢?简单的来说,就是由使用者来定义我要用的这个...
2018-09-11 15:06:02 751
原创 简单docker使用命令
拉取镜像 docker pull 镜像名运行镜像 docker run -itd 镜像名 /bin/bash(在容器内执行/bin/bash操作)(-i表示以交互模式运行,一般与-t一起用-t表示为容器重新分配一个伪终端-d表示后台运行容器,并返回一个容器号-p 8081:8080 将主机8081端口映射到容器8080端口-e username="admin"表示设...
2018-08-23 15:08:29 241
转载 golang学习(一)---------golang的命名规范
gofmt大部分的格式问题可以通过gofmt解决,gofmt自动格式化代码,保证所有的go代码一致的格式。正常情况下,采用Sublime编写go代码时,插件GoSublilme已经调用gofmt对代码实现了格式化。注释在编码阶段同步写好变量、函数、包注释,注释可以通过godoc导出生成文档。注释必须是完整的句子,以需要注释的内容作为开头,句点作为结尾。程序中每一个被导出的(...
2018-08-22 14:41:41 3649
原创 手把手教你用nginx开发自己的服务器------利用nginx实现负载均衡(一)------负载均衡的整体架构
之前我们讲的是用nginx做一个简单的helloworld功能,帮助大家了解一下nginx中的基本框架,今天我们就来学习下如何用nginx实现一个负载均衡服务器。为什么要先讲nginx的负载均衡模块呢?主要是nginx现在在各个大厂的应用场景主要就是做7层负载均衡和一些CDN能力了。我们还是先不急讲如何开发,先来聊聊什么是负载均衡,大厂都是怎么做负载均衡的。首先什么是负载均衡呢?很简单,就...
2018-07-14 19:34:10 1335 2
原创 手把手教你用nginx开发自己的服务器------利用nginx开发一个helloWorld程序(三)
之前两篇文章已经说明了过程,今天稍微把过程说细一点,毕竟知其然还要知其所以然嘛,整个调用的逻辑是怎完整的呢?其实上两篇文章看似简单的将nginx处理一个请求的过程说出来了,但实际过程一点也不简单,一个连接处理的过程,主要是复杂在准备阶段(也就是各种回调函数的挂载,上下文的准备,从各种池内申请资源等等),一个http连接的准备过程分为两个部分,一个是http部分,一个event部分。得益于nginx...
2018-07-04 22:21:22 2581
原创 手把手教你用nginx开发自己的服务器------利用nginx开发一个helloWorld程序(二)
现在我们正式开始编写nginx的helloWorld功能,该从哪下手呢?别急,我们在上一篇文章中提到了事件驱动对吧。nginx是怎么样事件驱动的呢?我们来看看ngx_worker_process_cycle()这个函数的一部分for ( ;; ) { if (ngx_exiting) { if (ngx_event_no_timers_left() == ...
2018-06-21 10:24:48 2454
原创 手把手教你用nginx开发自己的服务器------利用nginx开发一个helloWorld程序(一)
能开始学习nginx的你,肯定也撸了不少代码了,相信你学习代码都是从helloWorld开始的,那么,今天我们就用nginx开发一个helloWorld,我们将要实现的功能就是当浏览器来访问你的服务器时,你的终端打印一个helloWorld。先别急着开始撸代码,先聊一聊自己为什么想写这个专栏,其实本人也是个服务器开发菜鸟,感觉年纪稍微大了一点,反应和记忆力就下降的很厉害了,必须得写点什么帮助自己记...
2018-06-21 10:24:00 8350
原创 Nginx学习之路(十)编写一个Nginx的模块-----基本的模块编写步骤
在Nginx上做二次开发大部分时候都是做的模块(module)的开发,今天就来介绍一下Nginx中的module开发的基本步骤,先来认识一下Nginx中的module。一个基本的module框架(叫框架可能不太准确,这里的意思是需要编写的地方)由以下3个部分组成:首先是必须要实现的一个command结构体struct ngx_command_s { ngx_str_t ...
2018-05-23 21:46:18 6667 4
原创 Nginx学习之路(九)Nginx中的事件驱动过程详解-----connection事件的注册过程
在上一篇文章Nginx学习之路(八)Nginx中的事件驱动过程详解-----以listenfd注册过程为例
2018-05-15 21:28:02 600
原创 Nginx学习之路(八)Nginx中的事件驱动过程详解-----以listenfd注册过程为例
Nginx的高效得益于它的事件驱动机制,整个事件驱动机制基本框架就是linux下的select,poll,epoll这几个IO多路复用模式,但是nginx绝不单单只是使用它们这么简单,今天以epoll模式为例,从nginx最开始的listenfd的监听的过程来说明nginx是怎么实现的事件驱动。首先需要说明的是,整个事件模型(event)是一个模块(module),module在nginx中是一个...
2018-05-15 21:13:16 1519
原创 详解TLS1.3的握手过程
最近学习了一下TLS几个版本的协议,今天来着重说明下TLS1.3的握手过程,通过对握手过程的说明你就可以清晰的明白为什么TLS1.3要比TLS1.2快那么多了,话不多说,先上TLS1.3的握手流程图: 图中的ClientHello具体内容说明如下:(1)客户端支持的ssl的最高版本号(2)客户端支持的加密套件列表(3)确定的会话ID(4)客户...
2018-05-08 22:00:37 23417
原创 Linux虚拟机简单扩容的方法
最近在搭建一个go语言的liteIDE的环境时,安装QT过程中发现linux的磁盘容量不够了,之前分配的太少,需要扩容,下面简单的说下扩容的步骤首先现在VMware中为虚拟机分配多一点的磁盘空间然后进入虚拟机系统:终端输入:df -h 可以看到当前磁盘的信息,我们需要的就是将刚才新分配的空间挂载到一个新的目录下输入fdisk /dev/sda输入:p 看自己磁盘的信息,我的如下:然后需要将刚...
2018-04-17 14:33:09 485
原创 简单的git使用手册
git基本操作篇git安装(centos7):yum install git创建版本库:1.创建一个目录 mkdir gitTest 2.git init添加文件到版本库:git add yourfile(git add . 则表示将所有文件添加)提交修该:git commit -m "your comment of this commi...
2018-04-13 18:07:46 687
原创 Nginx学习之路(七)NginX中的内存管理之---Nginx中的内存池
上一篇文章Nginx学习之路(六)NginX中的内存管理之---Nginx中的内存对齐和内存分页说到了Nginx中的内存对齐机制和内存分页机制,今天就来说下Nginx中的内存池,内存池是一个使用非常广泛的技术,在web服务器的高并发情况下可能存在平凡的malloc()和free()过程,通过内存池的方式可以将这一过程的开销极大程度的减少,Nginx的内存池的设计相比经典的sgi stl中的allo...
2018-04-13 16:26:31 1657
原创 Nginx学习之路(六)NginX中的内存管理之---Nginx中的内存对齐和内存分页
Nginx由于极高的性能受到大家的追捧,而Nginx的高性能与它优秀的内存管理方式是分不开的,今天就来聊一聊Nginx中的内存对齐和内存分页。先说下Nginx中的内存对齐,Nginx中的内存对齐机制是它高性能的关键因素之一,先说点基础的东西,什么是内存对齐呢? 内存对齐是操作系统为了快速访问内存而采取的一种策略。那么为什么要内存对齐呢?因为处理器读写数据,并不是以字节为单位,而是以块(2,4,8,...
2018-04-13 16:21:20 968
原创 Nginx学习之路(五)NginX的主进程循环
在上一篇文章Nginx学习之路(四)NginX的子进程主循环中,说明了nginx的worker进程主要的任务,今天,就来讲解下nginx的主进程(worker进程)的主要任务。首先要先区分一下概念,虽然nginx也是一个reactors式的服务器(用陈硕老师的话来说就是reactors in process),但它和主从reactor式服务器又有一定的区别,区别主要就是这个master进程,这个m...
2018-04-10 16:10:24 1279
原创 Nginx学习之路(四)NginX的子进程主循环
在上一篇文章Nginx学习之路(三)NginX的子进程生产过程中说道了生产子进程过程中的proc处理过程,也就是这段代码: //调用传入的回调函数,子进程的正式主循环开始,回调函数的实体是ngx_worker_process_cycle proc(cycle, data); 今天就来介绍一下这个proc的具体过程:首先,proc函数是一个随ngx_spawn_process()...
2018-04-09 21:14:31 730
原创 Nginx学习之路(三)NginX的子进程生产过程
上一篇文章中讲了Nginx的main函数的主要流程,这次就继续上次来说明一下Nginx中的worker进程是怎么生成的。从main函数的//进入master-worker工作模式,开始创建多个Nginx的子进程。并进入进程循环。 ngx_master_process_cycle(cycle);开始进入生成子进程的过程//开始生成worker进程 ngx_start_work...
2018-04-09 13:21:00 1100
原创 Nginx学习之路(二)NginX的main函数基本流程
之前介绍了nginx的由来和基本操作,现在开始深入学习nginx,本人觉得学习这种工程类的优秀作品一定要从源码学习才能学得深入,而学习c语言编写的代码个人感觉尽量从main函数入手,因为main()中一般会将整个软件的框架的大致思路表现出来,了解了整体框架然后再针对某一块深入学习效率可能就会更高一些,今天就来聊一聊nginx中的main(),也就是说一下main函数到底做了哪些工作。再分享一点我的...
2018-04-01 21:40:43 988
原创 聊一聊模拟退火算法
最近在做华为的一个比赛,用到了退火算法来实现设备的最大资源利用率的分配问题,先来说下具体问题吧,这个问题是个典型的装箱问题,比如你有5个设备种类,每个种类需要占用一定量的资源1和一定量的资源2,现在你有很多箱子,每个箱子可以容纳一定的资源1和资源2,现在要保证用最少的箱子装配所有的设备,你要如何分配?这就是一个典型的装箱问题,解决思路有很多,典型的贪心算法或者动态规划都可以对其求解,但是贪心算法不...
2018-03-31 21:13:25 2980
原创 Nginx学习之路(一)NginX的基本配置和操作
最近在学习NginX,因此来写个博客记录一下学习过程中的关键部分,以便于以后复习和总结。首先,就先来说明一下Nginx的一些基本操作。在说操作之前,还是要简单介绍下Nginx,Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。那么Nginx有哪些优点...
2018-03-28 20:43:26 665
原创 聊一聊服务器和客户端会话过程中的端口
之前在TCP/IP的网络通信的学习中,主要关注的都是高并发,高性能的方面,忽略了一些基本的概念,特别是端口这个东西,这个东西在服务器开发过程中可能看起来也不是很麻烦,在服务器上就是一个bind(),在客户端指定一下目标端口就行了,也没有太深入理解其中的东西,今天就来好好的总结梳理一下。还是以服务器和客户端的会话为例,什么是端口呢?如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只...
2018-03-27 19:46:21 6489 1
原创 Linux下的sleep()和sched_yield()
阿里四面被问到了这个问题,一脸懵逼,下来也没找到什么阐述这个的文章,就自己查man来对比总结一下吧:sched_yield()的man手册描述如下:DESCRIPTION sched_yield() causes the calling thread to relinquish the CPU. The thread is moved to the end of the q...
2018-03-20 13:47:44 17359
原创 浅谈用户态和内核态以及用户空间和内核空间
要了解什么是用户态,什么是内核态,我们需要先了解什么是进程的用户空间和内核空间:Linux虚拟内存的大小为2^32(在32位的x86机器上),内核将这4G字节的空间分为两部分。最高的1G字节(从虚地址0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而较低的3G字节(从虚地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间”。也就是说,在这4G的...
2018-03-17 14:52:41 5126
原创 shell操作练习(编写shell脚本完成统计文件中的每个月份设备的出现次数)
对于shell的操作一直不太熟,最近在做一个比赛,恰好用到了shell来处理一些数据,下面总结下shell的一些基本用法,并练习编写shell脚本完成统计文件中的每个月份设备的出现次数首先有5个数据文件要做处理数据格式如图先练习将5个数据文件中的第2列和第3,4列提取出来(这里提一下shell中的数字和字符串互相转换的过程,数字默认可以进行字符串操作,字符串转数字有以下几种方法例如:a="024"...
2018-03-10 13:02:55 2227
转载 读写锁的实现方法
对于某个临界资源的访问,读操作和写操作是要区别对待的。读操作可以多个线程同时进行,写操作必须互斥进行。读写锁:当已经被加了读锁时,其他的读模式锁请求仍然可以访问,但是写模式锁不能访问;当写模式锁加锁时,其他的请求都不能访问。本文尝试用四种方法来完成读写锁的操作,都包含有写模式和读模式各自所要做的事情。1、直接使用POSIX提供的读写锁2、用条件变量实现读写锁3、用互斥量实现读写锁4、用信号量实现读...
2018-03-06 15:02:25 3244
转载 自旋锁和互斥锁的区别
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API。线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间共 享的临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。Pthreads提供了多种锁机制:(1...
2018-03-06 13:38:38 491
转载 GET和POST区别详解
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出的他们的区别,你非常清楚知道什么时候该用什么。当你在面试中被问到这个问题,你的内心充满了自信和喜悦。你轻轻松松的给出了一个“标准答案”:GET...
2018-03-02 16:26:08 3748 1
转载 HTTP简介
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,...
2018-03-02 16:25:12 217
转载 用户空间地址和内核空间地址说明
● 用户程序编译连接形成的地址空间在什么范围内? ● 内核编译后地址空间在什么范围内? ● 要对外设进行访问,I/O的地址空间又是什么样的?于是就有了这篇文章,从大概上把内存相关知识点介绍一下,减少同学们在驱动课时对内存的困惑先回答第一个问题。Linux最常见的可执行文件格式为elf(Executable and Linkable Format)。在e...
2018-03-02 15:01:33 3867
原创 Linux下磁盘的IO的各种机制
要说Linux下的IO过程,就要先说下Linux的地址空间问题,首先,Linux有一段虚拟内存,以32位x86系统为例,虚拟内存为2^32 即4G的内存空间,内核将这4G的空间分为两个部分,高位的1G字节(从虚地址0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而较低的3G字节(从虚地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间”。因为每...
2018-03-02 14:54:36 1719
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人