自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 Nginx 源码阅读笔记9 http 模块初始化

http 模块的初始化个人认为十分复杂,主要数据之间的关系太乱了,那么先从 http 部分的配置解析开始,首先是 http 块的解析,也就是ngx_http_block函数,由于这些函数都特别特别地长,所以就挑重点看吧 首先保证只有一个 http 块,然后创建一个存放 http 块下所有模块配置信息的ngx_http_conf_ctx_t结构体if (*(ngx_http_conf_ctx_

2017-05-07 15:27:00 922

原创 Nginx 源码阅读笔记8 epoll 模块

终于到事件模块了,只看了 epoll 模块,其中忽略了异步 IO 和 eventfd 的部分 那么首先是初始化部分,也就是ngx_epoll_init函数epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module);if (ep == -1) { ep = epoll_create(cycle->connection

2017-05-03 16:37:29 1077

原创 Nginx 源码阅读笔记7 worker 主循环

worker 主循环位于ngx_worker_process_cycle函数,函数一开头出现了几个赋值ngx_int_t worker = (intptr_t) data;ngx_process = NGX_PROCESS_WORKER;ngx_worker = worker;这个data就是 master 进程生成子进程时传入的,表示这是第几个子进程,不一定与ngx_processe

2017-05-02 20:21:18 494

原创 Nginx 源码阅读笔记6 master 主循环

只看了 master 模式下的代码,没有考虑单进程的情况,主循环位于ngx_master_process_cycle函数,在main函数的最后被调用 首先是阻塞信号,这些信号的信号处理函数已经在main函数中设置了sigemptyset(&set);sigaddset(&set, SIGCHLD);sigaddset(&set, SIGALRM);sigaddset(&set, SIG

2017-04-23 12:33:38 595

原创 Nginx 源码阅读笔记5 初始化 cycle

距离上一篇过了有一个多星期,虽然没有写总结笔记,但是一直有在看代码,目前看完了 http 的发送,感兴趣的只剩下 subrequest 和 upstream 部分了,不得不说啊,这个异步的代码,看起来真的是难受,还有就是前几天发布了1.12.0版本,而我在看得是1.10.3版本,虽然没什么大问题,但是强迫症告诉我要看新的,于是搞了很久的diff和patch,由于代码中含注释太多,打起补丁来太麻烦了,

2017-04-21 19:04:26 674

原创 Nginx 源码阅读笔记4 启动流程

总体流程以下代码删掉了部分内容,也就是启动时指定-v -V -t -T选项时用于显示版本ngx_show_version,测试配置ngx_test_config,显示配置ngx_dump_config的相关代码,因为这里主要分析正常启动的流程,所以不关心这些参数int ngx_cdeclmain(int argc, char *const *argv){ ngx_buf_t

2017-04-12 18:45:03 526

原创 Nginx 源码阅读笔记3 时间管理

在 nginx 中,每个进程各自管理着自己的时间,而对于时间的管理则采用了缓存的方式,由于读取时间比更新时间频繁得多,而时间可能被信号处理函数或不同的线程(如果支持的话)更新,所以需要加锁,此时如果采用同一个变量来表示时间,则读取时间时也需要加锁,为了让读取操作免去加锁,nginx 使用了一个循环数组来缓存时间变量声明省略了一些相似的变量,比如描述 http 时间的字符串有好几种格式,所以有好几个数

2017-04-11 20:50:14 620

原创 Nginx 源码阅读笔记2 原子变量与互斥锁

原子变量原子变量主要看了 x86 的实现,位于ngx_gcc_automic_x86.hCAS#if (NGX_SMP) // SMP 多核架构下需要加锁#define NGX_SMP_LOCK "lock;"#else#define NGX_SMP_LOCK#endifstatic ngx_inline ngx_atomic_uint_tngx_atom

2017-04-10 20:00:22 655

原创 Nginx 源码阅读笔记1 内存池

在大体看完 unp 后本来想练手写一个小型 http 服务器的,但是感觉少了点什么,所以打算先学习一下 nginx 源码,看看大牛们是怎么设计的。然而突然发现自己好像不怎么了解 nginx,所以花了一个多星期翻完了《深入理解 Nginx》感兴趣的部分,加强了对 nginx 的了解。计划是以 linux 为系统环境,看完 http 核心模块,事件模块就看 epoll 模块,然后模仿着写一个小的(砍掉大

2017-04-09 19:54:58 133

原创 基于RTMP推送实时AAC+H264流(三)

推送流程:初始化、连接服务器、发送数据 这一部分主要用的是librtmp,由于是使用别人封装好的库,总的来说比较简单初始化简单地调用一下函数rtmp = RTMP_Alloc();RTMP_Init(rtmp);连接服务器四个函数分别代表:设置URL、使自己成为发送端、建立NetConnection,建立NetStreamRTMP_SetupURL(rtmp, ur

2017-03-08 20:16:07 5035 3

原创 基于RTMP推送实时AAC+H264流(二)

编码图像采用H264编码,声音采用AAC编码,用的是x264和faac这两个库x264这部分代码主要是配置,首先是使用配置ultrafast和zerolatency,这两个用来控制编码速度和质量,也就是事先帮我们设定好了一些参数,比如会关闭b帧 然后是设置高宽,帧率等参数,这里指定的输入格式是X264_CSP_I420,需要注意的是最大关键帧间隔i_keyint_max,默认值是25

2017-03-04 16:54:38 1996 2

原创 基于RTMP推送实时AAC+H264流(一)

最近在做视频监控的项目,搞了一个多星期,总结一下学到的东西,也希望可以帮到有需要的人 从整体来看,推流端大概是这么个流程:采集、处理、编码、封装、推送 如上图所示,图像采集线程和声音采集线程经过编码封装,将RTMP包写入到缓冲队列,发送线程从缓冲队列中读取RTMP包中并加上时间戳,然后送往RTMP服务器,由于一秒可能有上百个RTMP包,会造成大量的new和delete,所以实现了一个简单的内

2017-02-26 00:05:53 7445 3

原创 红黑树删除操作学习笔记

最近在尝试实现一个简单的STL,到了红黑树那个位置,由于侯捷老师的那本书只讲了插入操作,所以只能自己找资料学习删除操作,在此总结记录一下。首先是红黑树的几条性质,各种操作最终都要保证满足这些性质。1、每个节点或是红的,或是黑的。2、根节点是黑的。3、每个叶节点(NIL)是黑的。4、如果一个节点是红的,则它的两个儿子都是黑的。5、对于每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑节点。

2016-12-20 18:22:02 472

原创 Vim 插件配置

前言折腾了大半天,终于搞得像个样子了,自己的环境是 ubuntu 16.04,主要有以下插件VundleVim 管理插件YouCompleteMe 代码自动补全vim-airline 增强状态栏和标签栏TagList 查看函数和变量的定义NERDTree 文件目录树identline 显示缩进的对齐线delimitMate 自动补全括号和引号cscope 代码阅读接下

2016-06-22 18:50:56 2542 2

原创 MIT 6.828 学习笔记6 Lab4实验报告

Lab4实验报告Execrise 1Implement mmio_map_region in kern/pmap.c.// mmio_map_region()uintptr_t ret = base;size = ROUNDUP(size, PGSIZE);base = base + size;if (base >= MMIOLIM) { panic("larg

2016-06-09 23:31:50 9343

原创 MIT 6.828 学习笔记5 Lab3实验报告

Lab3 实验报告Exercise 1Modify mem_init() in kern/pmap.c to allocate and map the envs array.// mem_int()// 第一处envs = (struct Env *) boot_alloc(NENV * sizeof(struct Env));memset(pages, 0, NENV

2016-05-24 13:09:57 10002

原创 MIT 6.828 学习笔记4 Lab2实验报告

Lab2实验报告Execrise 1static void *boot_alloc(uint32_t n){ static char *nextfree; // 下一个空闲字节 if (!nextfree) { extern char end[]; // 第一个空闲字节 位于 .bss 之后 nextfree = ROUNDUP((char *) e

2016-05-01 22:31:57 6781 1

原创 MIT 6.828 学习笔记3 Lab1实验报告

Lab1实验报告Exercise 31. At what point does the processor start executing 32-bit code? What exactly causes the switch from 16- to 32-bit mode?在0x7c2d处的指令ljmp $PROT_MODE_CSEG, $protcseg跳转到了32位代码处,即从0x7c3

2016-04-27 20:25:39 8524

原创 MIT 6.828 学习笔记2 阅读main.c

#include #include /********************************************************************** * This a dirt simple boot loader, whose sole job is to boot // 一个简单的 Bootloader,用于读取内核 * an ELF kernel i

2016-04-14 15:58:40 2279

原创 MIT 6.828 学习笔记1 阅读boot.S

#include // mmu.h 内含有需要使用的宏定义与函数# Start the CPU: switch to 32-bit protected mode, jump into C. // 这些代码的作用为转换到 32 位保护模式,然后跳转到 main.c# The BIOS loads this code from the first sector of the hard di

2016-04-13 22:20:34 3051 1

原创 POJ2955 Brackets(区间DP)

题目大意:给定序列,求符合条件子序列的最大长度经典区间DP,状态dp[i][j]表示i到j区间的最大长度状态转移dp[i][j]=max(dp[i][j],dp[i][k-1]+dp[k+1][j-1]+1) (i#include #include int dp[105][105];char s[105];int max(int a,int b){

2015-05-23 23:23:33 74

原创 POJ1155 TELE(树形DP)

题目大意:一个电视台转播比赛,电视网络类似于树,树的节点为中转站或者用户节点的编号为1~N,其中1为总站,2到(N-M)为中转站,(N-M+1)到N为用户节点到节点间转移信号需要给定的费用,且每个用户愿意出给定的钱付费在电视台不亏本的前提下,求最多可以让多少用户看到比赛树形背包DP,容量为该点的子节点数量,价值为费用状态 dp[u][j] 代表根节点为u含有j个子节

2015-05-21 21:07:40 94

原创 POJ3104 Drying(二分答案)

题目大意:有n件衣服,每件衣服含a滴水有一台每分钟可以烘干k滴水的机器,每次可以让一件衣服使用衣服每分钟蒸发一滴水,输出烘干所有的衣服的最少时间二分枚举最少时间mid遍历衣服,若某件衣服含水量大于mid,算出烘干所用时间公式为:(a[i]-mid)/(k-1)注意k=1的时候特殊处理#include #define MAXN 100010int

2015-05-15 20:38:34 707 1

原创 POJ3273 Monthly Expense(二分答案)

题目大意:N个数不改变顺序分成M份,使每一份的和尽可能小输出和中的最大值很经典的二分答案,但是感觉二分很容易写错先求出答案下界,也就是N个数中的最大值(相当于分成N份)再求出答案上界,也就是N个数的和(相当于分成1份)二分枚举可能的值以这个值为和最大值,顺序遍历N个数,求出可以分多少份如果份数大于M,则将上界往前移如果份数小于等于M,则将下界往后移(

2015-05-15 13:07:24 610

原创 POJ1698 Alice's Chance(最大匹配)

题目大意:Alice要拍N部电影,一天只能拍一部每部电影规定在星期几拍摄,要在W个星期内拍D次问Alice是否可以拍完所有电影这道题目关键是构图,可以用最大流做由于我只会isap,写起来太麻烦,所以选择用好写的最大匹配做当然时间效率上慢了非常多最大匹配的基本思路是:拍电影的总次数构成一个集合,每一个日期构成一个集合若电影可以在某个日期拍摄则连起来,最后构

2015-05-14 22:15:11 515

原创 HDU1532 Drainage Ditches(最大流)

学了一下午网络流,AC了这道模板题勉强算是自己敲的,debug时参照了下模板,模板参照kuangbin大神邻接表+isap算法#include #include #define MAXN 210#define MAXM 420#define INF 0x3f3f3f3fstruct node{ int to,next,cap;}edge[MAXM];int

2015-05-14 19:05:35 494

原创 HDU1525 Euclid's Game(博弈)

题目大意:给出两个数,每次用大的数减去小的数的正整数倍将小的数变为0者获胜设两个数为a,b(a>=b)则必胜态为a%b==0当b一直反复下去则有一人先到必胜态当a>=2*b时,先手可以让下一个状态到达b,a%b或者a%b+b,b这两个状态之中一定有一个是必胜态一个是必败态由于先手很聪明,所以先手一定可以走到必胜态#include int

2015-05-13 18:27:41 419

原创 HDU1079 Calendar Game(博弈)

题目大意:给定日期区间 1900-1-1 至 2001-11-4随机给出一个区间内初始日期每次操作可以将日或者月加一将日期移动到 2001-11-4 则胜利通过简单分析,由于每次操作仅改变了日月之和的奇偶性容易得出日月之和为偶数时为必胜态,与年份无关但是存在两个特殊的日期 9-30 和 11-30由于这两个日期可以达到不改变奇偶性的目的即可以让对手面对必

2015-05-13 12:46:06 480

原创 HDU1150 Machine Schedule(匈牙利算法)

大概题意为:两个机器人A、B用来完成任务其中A有N中模式,B有M种模式完成任务i需要A为x模式,或者B为y模式每次改变模式需要重启一次问完成所有任务所需要的最少重启次数将每对x,y相连得到一个二分图每条线代表一个任务即求二分图的最小点覆盖数由于二分图中最小点覆盖数=最大匹配数故可用匈牙利算法#include #include #def

2015-05-12 23:18:21 401

原创 HDU1251 统计难题(Trie树)

刚学Trie树,水了一道题左儿子右兄弟法建树,听说比较省空间指针麻烦,所以用了数组实现#include #include struct node{ int count,son,bro; //count记录到此节点的次数 char ch;}trie[1000000];int cnt=2; //根节点为1 从2开始 避免之后很多东西要赋值为-1void inse

2015-05-12 19:37:03 498

空空如也

空空如也

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

TA关注的人

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