![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
书籍阅读
文章平均质量分 95
枯萎的海风
向来缘浅, 奈何情深, 彼此豆蔻,谁许谁地老天荒, 敌不过似水流年, 逃不过此间少年
展开
-
[读书笔记]30 天自制操作系统 day10 叠加处理
1. 内存管理虽然我们采用列表式管理, 但是由于我们的列表的条目是非常有限的,如果不经约束的进行内存的分配和释放的话, 可能会造成在内存中出现有很多不连续的小段的未使用空间, 这样就容易会把内存空间耗尽我们采用的方式是通过以 0x1000 字节(4KB) 作为单位进行管理 3.内存管理相关代码: 内存分配的时候, 从前向后遍历, 找到第一块满足需要的内存块进行操作即可通过4KB 为单位进行原创 2016-12-19 10:51:41 · 545 阅读 · 0 评论 -
多线程模拟实现生产者/消费者模型
点我进入原文 题目如下: 在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据。多个生产者线程会在同一时间运行,生产数据,并放到内存中一个共享的区域。期间,多个消费者线程读取内存共享区,消费里面的数据。 分析在下面Java应用程序中,生产者线程向一个线程安全的堆栈缓冲区中写(PUSH)数据,消费者从该堆栈缓冲区中转载 2016-09-11 19:57:47 · 1832 阅读 · 0 评论 -
chrome 插件开发 之 ip地址显示
1. 前言最近突然间对chrome插件开发感兴趣了, 于是就想写几个小插件来玩玩。这次写的是 ip 地址显示插件, 参考文章地址: http://www.ituring.com.cn/article/602212. 流程2.1 编写manifest.json主要编写插件的一些配置, 版本号, 名字, 用到的图标, 相应的popup.html, 跨站请求许可等。{ "manifest_vers原创 2016-09-15 21:34:20 · 6023 阅读 · 1 评论 -
chrome 插件开发之天气预报
1. 前言参考文章: http://www.ituring.com.cn/article/60271 这里主要记录一下 自己编写这个插件过程中遇到的一些问题2. 基本步骤2.1 manifest.json这个实际上是一个配置文件, 写一些版本号, 图标, 浏览器动作, 跨站请求许可等东西{ "manifest_version": 2, "name": "天气预报", "ve原创 2016-09-16 16:59:49 · 620 阅读 · 0 评论 -
vs2013 C# 添加单元测试功能
1. 前言最近在看软件工程的相关内容, 正好看到单元测试这块, 书是邹欣老师的《构建之法》, 正好想测试一下, 结果发现我的vs 2013 有些问题, 找到插件点击下载安装 出现一个.net framework 的报错, 但是我们的电脑已经升级到了 win 10, .net framework 是满足要求的 2. 解决方法升级 vs2013 然后经过漫长的等待, 实现vs 更新, 重新原创 2016-09-08 12:39:44 · 1461 阅读 · 0 评论 -
[阅读笔记]Modern C++ Programming with Test-Driven Develpment chp2
1. 前言最近突然对代码测试非常感兴趣, 学习了一些google test 框架的内容之后, 开始啃Modern C++ Programming with Test-Driven Develpment,ie, code better sleep better工程代码地址: https://github.com/zhyh2010/DDTlearning2. 主要内容2.1 小结的一些东西chp 2原创 2016-11-03 22:58:30 · 1443 阅读 · 0 评论 -
程序员的自我修养 读书笔记 chp5,chp6
5.1 windows的二进制文件格式PE/COFFwindows 平台, 引入一种称为PE的可执行格式,他有着跟ELF一样良好的平台扩展性,和ELF一样都是从COFF发展而来的6.1 进程虚拟地址空间进程: 是一个动态概念, 程序是一个静态概念linux 中原则上 进程可以有 3GB的进程空间(剩下 1GB 给操作系统), windows 中原则上只有2G(2G给操作系统)PAE: 32原创 2016-11-04 22:53:27 · 542 阅读 · 0 评论 -
程序员的自我修养 读书笔记 chp1
1. 前言知乎上面好多推荐看这本书的, 今天拿起来看看, 做些笔记2. 笔记1.2 万变不离其宗计算机硬件中几个关键部件: 中央处理器cpu内存IO控制芯片硬件结构框架 北桥: 高速芯片 使用 PCI 总线 南桥: 低速芯片 使用 ISA 总线SMP 和 多核 由于CPU的频率受到制作工艺限制,无法继续提升, 就采用增加cpu 数量提升性能但是这个有点类似人月神话中的思想,原创 2016-10-26 10:48:16 · 878 阅读 · 0 评论 -
程序员的自我修养 读书笔记 chp2
2.1 被隐藏了的过程一般一个hello world程序主要可以分为4个步骤: 预处理,处理其中的一些宏等信息编译, 将预处理完的文件进行词法分析,语法分析,语义分析以及优化之后生成相应的汇编代码文件汇编, 将汇编代码转化为机器码链接,将程序运行所需要的各个模块整合起来2.2 编译器做了什么词法分析 lex语法分析 yacc语义分析 生成语法树中间语言生成 将语法树转化为原创 2016-10-26 11:26:40 · 511 阅读 · 0 评论 -
剑指offer 代码实现 C++
临近找工作的季节, 赶紧把牛课网上的剑指offer部分的代码重新码了一遍 http://www.nowcoder.com/ta/coding-interviews?page=1将代码托管到了 csdn 上工程地址: https://code.csdn.net/zhyh1435589631/sword_offer3/tree/master其中遇到一个问题, 就是感觉 git 提交的工程文件中不能原创 2016-07-30 17:27:41 · 6694 阅读 · 0 评论 -
深入理解nginx chap3 开发一个简单的HTTP模块
1. 如何调用HTTP模块本质:worker 进程会在一个for 循环里面反复调用事件模块检测网络事件。 2. 基本数据结构命名规则: ngx_http_xxx_module.c2.1 整形封装ngx_int_t 封装了有符号整形, 而 ngx_uint_t 封装了无符号整形2.2 ngx_str_tngx_str_t 封装了字符串typedef struct { size_t原创 2016-06-21 21:28:46 · 5350 阅读 · 0 评论 -
深入理解Nginx chap 4 配置, error日志和请求上下文
1. http配置项的使用场景nginx 在每一个http 块, server 块, location 块下, 都会生成独立的数据结构用来存放配置项, 使用非常灵活2. 怎样使用Http配置处理http 配置项的基本流程:Created with Raphaël 2.1.0start创建数据结构, 存储配置项参数设定nginx.conf中配置项的限制条件与回掉方法实现上一步中的回掉函数, 或原创 2016-06-23 22:46:26 · 595 阅读 · 0 评论 -
Linux Shell 脚本攻略 chap 1 小试牛刀
1. 简介一般在shell 脚本的起始, 需要指定解释器的路径 #! /bin/bash使用 # 作为注释标记符shell 脚本如果需要执行, 必须添加 执行(x) 权限, 一般可以 chmod a + x xxx.shshell 的设置文件 ~/.bashrc~/.bash_profile~/.bash_history2. 终端打印双引号中的特殊字符需要使用 转义符 显示原创 2016-06-24 11:55:21 · 540 阅读 · 0 评论 -
《深入理解Linux 内核》chap 5 内核同步
1. 内核如何为不同的请求提供服务我们可以将内核看作为是一个不断对请求进行响应的服务器, 而这些请求可能来自于CPU 上执行的进程, 也可能来自于发出中断请求的外部设备内核的各个部分并不是严格按照顺序依次执行的, 而是采用交错执行的方式。1.1 内核抢占如果一个运行在内核中的进程, 在执行内核函数的时候, 允许发生内核切换, 那么, 我们认为他是可抢占的。计划性进程切换, 进程由于等待资源原创 2016-06-09 13:46:10 · 548 阅读 · 0 评论 -
《深入理解Linux 内核》 chap 1 绪论
1. 操作系统的几个基本概念操作系统的两个基本目标: 与硬件交互, 管理硬件为运行在计算机上的软件提供环境为了实现这种机制, 引入了两种工作模式: 用户态 和 内核态1.1 多用户系统def: 一台能够独立和并发的执行分别属于两个或者多个用户的若干应用程序的计算机并发: 几个程序能够同时处于活动状态并竞争各种资源独立: 每个程序执行自己的任务, 不用考虑其他用户程序通过使用与CPU原创 2016-05-22 22:17:07 · 504 阅读 · 0 评论 -
nginx 配置静态web服务器以及反向代理服务器的一些问题
1. 运行中的Nginx进程间关系nginx 进程中, 一般使用master-worker关系, worker 最好应该与cpu的数量保持一致。这样的系统可以充分利用SMP多核框架。nginx 的一个worker 进程可以同时处理的请求数只受限于内存大小, 而且在架构设计上, 不同的worker进程之间处理并发请求的时候几乎没有同步锁的限制, 进程间切换的代价是最小的。 2. 静态web服务器原创 2016-06-09 22:58:31 · 3507 阅读 · 0 评论 -
nginx 编写简单HTTP模块 hello world
1. 编写HTTP模块1.1 目标编写一个简单的显示hello world 信息的HTTP 模块1.2 几个重要组成部分1.2.1 ngx_command_t 数组 也就是说, 对于我们在nginx.conf 中编写的配置项 mytest 来说, nginx 首先会遍历所有的模块(modules),而对于每个模块, 会遍历他所对应的ngx_command_t 数组, 试图找到关于我们的配置项m原创 2016-06-11 22:55:31 · 3220 阅读 · 0 评论 -
深入理解Linux内核 chap 6 定时测量
很多计算机化的活动都是由定时测量来驱动的, 程序需要能每个文件中检索到文件的最后访问时间 (时间戳)Linux 内核需要完成的两种主要的定时测量: 保存当前时间和日期维持定时器定时测量是由基于固定频率振荡器和计数器的几个硬件电路完成的。1. 时钟和定时器电路(不同的时钟触发源)定时器电路由内核编程, 所以他们以固定的, 预先定义的频率发出中断。1.1 实时时钟RTC即使电源被切断,原创 2016-06-15 14:25:57 · 640 阅读 · 0 评论 -
深入理解Linux内核 chap 7 进程调度
1. 调度策略目标: 进程响应时间尽可能快后台作业的吞吐量尽可能高尽可能避免进程饥饿低优先级和高优先级进程需要尽可能调和Linux 的调度基于分时技术: 多个进程以“时间多路复用”的方式运行, 分时依赖于定时中断, 因此对进程是透明的调度策略根据优先级进行分类, 每个进程都与一个值相关联, 这个值表示把进程如何适当的分配给CPU在Linux 中, 进程优先级是动态的 在较长时间间原创 2016-06-17 12:08:40 · 669 阅读 · 0 评论 -
程序员的自我修养 读书笔记 chp3
3.1 目标文件的格式PC 平台流行的可执行文件的格式主要是 windows 下面的 PE 和 Linux 下的ELF, 他们都是COFF 格式的变种3.2 目标文件是什么样的一般来说, text 段放置代码, data段放置初始化的数据(全局变量或者静态变量), bss 放置未初始化的数据(全局变量或者静态变量) bss 段只是为未初始化的全局变量和静态变量预留了位置, 并没有内容, 不会占原创 2016-10-27 14:50:18 · 521 阅读 · 0 评论 -
程序员的自我修养 读书笔记 chp4
4.1 空间与地址分配链接: 将几个输入目标文件加工后合并成一个输出文件的过程链接方式: 按序叠加 在有很多输入文件的情况下, 输出文件将会有很多零散的段相似段合并 两步链接: 空间与地址分配符号解析和重定位4.2 符号解析和重定位重定位重定位表绝对寻址修正和相对寻址修正的区别在于绝对寻址修正后的地址为该符号的实际地址, 而相对寻址修正后的地址为符号距离被修正位置的地址差4原创 2016-10-29 22:52:04 · 661 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day2 汇编语言学习与Makefile入门
阅读相应的启动代码 ; hello-os; TAB=4 ORG 0x7c00 ; このプログラムがどこに読み込まれるのか; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 JMP entry DB 0x90 DB "HELLOIPL" ; ブートセクタ原创 2016-11-25 16:53:08 · 646 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day7 FIFO与鼠标控制
1. 获取按键编码这里需要特别注意的是,需要采用io_out8(PIC0_OCW2, 0x61);来通知cpu IRQ-01上面的中断已经处理完毕。如果不写这句话的话, cpu会忽略后续IRQ-01 上传递过来的中断信号。其他 IRQ-n 对应的编码应该为: 0x60 + n#define PORT_KEYDAT 0x0060void inthandler21(int *esp){原创 2016-12-08 21:16:10 · 492 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day3 进入32bit模式并导入C语言
1. 制作真正的IPLIPL 启动程序装载器, 用来装载程序分析代码; haribote-ipl; TAB=4 ORG 0x7c00 ; このプログラムがどこに読み込まれるのか; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 JMP entry DB 0x90 DB原创 2016-11-26 22:28:37 · 971 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day9 内存管理
1. 内存容量检查由于内存和CPU的距离比CPU内部元件之间的距离要远很多, 因此,在寄存器内部使用 mov 要比 从寄存器MOV 到内存快很多另外, 由于寄存器的速度快, 但是存储的容量非常有限, 所以不得不频繁的使用内存为了解决这个问题, IBM 引入了 高速缓存存储器 (cache memory), 但是成本非常高本质上呢, 我们可以讲这个高速缓存器件理解成是一个类似缓冲区的概念 2.原创 2016-12-17 16:45:49 · 618 阅读 · 0 评论 -
[读书笔记]程序员的自我修养 chp12
12.1 系统调用介绍12.1.1 什么是系统调用现代操作系统都将可能会发生冲突的系统资源(文件, 网络, IO, 设备)保护起来, 阻止应用程序直接访问系统调用通过中断实现, linux 使用 0x80 中断, 而 windows 使用 0x2e 中断 作为系统调用的入口12.1.2 Linux 系统调用使用 0x80 中断, eax 存放系统调用的接口号, 同时, eax 也是调用结果的原创 2016-12-14 16:11:23 · 418 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day8 鼠标控制与32位模式切换
1. 鼠标解读一个鼠标事件实际上会产生 3 个byte 的数据, 可以借助缓冲区 unsigned char mouse_dbuf[3], 对其数据进行输出显示同时为了提高代码可读性, 采用 MOUSE_DEC 结构体对其进行封装鼠标的三个字节数据保存在 buf[3] 中, 其中 buf[0] 的 低3 bit 表征鼠标的按键状态, buf[1], buf[2] 表征鼠标 x, y 的相对移动原创 2016-12-15 11:43:54 · 959 阅读 · 0 评论 -
[读书笔记]程序员的自我修养 chp13 一个简单的CRT 运行库实现
0. 前言目标:实现一个小型的 CRT 运行库本质: 利用系统提供的api接口, 实现一个通用的 CRT 函数接口, 使得 C 语言程序可以自由的运行在各个不同的系统上项目工程地址: https://github.com/zhyh2010/miniCRT1. 遇到的一些问题windows.h 不包含路径集 解决方法: http://www.unjeep.com/q/86995415原创 2016-12-22 22:03:47 · 1025 阅读 · 1 评论 -
[读书笔记]30 天自制操作系统 day11 制作窗口
1. 显示窗口本质上, 这个有点类似于鼠标的显示, 在VRAM 的相应位置写入相应的数据即可显示效果: void make_window8(unsigned char *buf, int xsize, int ysize, char *title){ static char closebtn[14][16] = { "OOOOOOOOOOOOOOO@",原创 2016-12-23 15:35:41 · 588 阅读 · 0 评论 -
[读书笔记]程序员的自我修养 chp8
8.1 共享库版本8.1.1 共享库兼容性共享库的更新被分为两类: 兼容更新不兼容更新这个和二进制接口有关系 ie, ABI不建议使用C++ 做共享库8.1.2 共享库版本命名形如: libname.so.x.y.zx 为主版本号, 表示重大升级y 表示此版本号, 表示增量升级z 表示发布版本号, 不添加任何新接口, 也不对接口进行更改有些库, 如 Glibc 不遵从这个命名规原创 2016-11-25 12:08:07 · 396 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day6 分割编译与中断处理
1. 分割源文件由于原先的bootpack.c 太过冗长, 将他分割成几个部分 同时为了节省声明所占空间, 使用 头文件2. 整理Makefile将多个类似的编译规则, 使用一般规则进行合并, 简化书写一般而言, 普通规则的优先级比一般规则要高 (类似于 C++ 模板 和 偏特化情形)4. 意犹未尽4.1 load_gdtr_load_gdtr: ; void load_gdtr(原创 2016-12-06 12:44:07 · 679 阅读 · 0 评论 -
googletest 学习记录
1. 前言学习java的时候, 我们可以非常方便的使用JUnit对我们编写的代码进行测试, 但是C++中没有现成的工具, 后来找到了几款 CPPUnit, googletest。 这里记录下学习googletest 的一些过程, 方便以后查阅。2. 相关资料2.1 官方资料1. Introduction: Why Google C++ Testing Framework? 2. AdvancedG原创 2016-10-30 15:30:33 · 958 阅读 · 0 评论 -
[阅读笔记]Modern C++ Programming with Test-Driven Develpment chp3
3.2 Unit Test and TDD FundamentalsTDD 主要体现在单元测试中基本流程: 初始化触发或者调用需要测试的行为验证所测试行为的结果扫尾测试代码, 应该保持短小,精悍3.3 The TDD Cycle:Red-Green-Refactor基本流程: 先写测试代码确保新的测试无法通过修改原始代码使得测试代码通过使用 TDD 方式,代码的覆盖率比较高原创 2016-11-15 22:54:43 · 714 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day4 C语言与画面显示的练习
1. 用C语言实现内存写入 1. 需要注意的是, 函数的参数列表中, 第一个数字存放地址 【ESP + 4】, 第二个 为 【ESP + 8】。。。 2. ESP 实际上是栈寄存器的指针, AX 默认用来作为函数返回的寄存器 3. 可以自由使用的寄存器主要有 EAX, ECX, EDX,其他寄存器只能使用它的值, 不能随意改变 4. naskfunc.nas 中 INSTRSET 指令告诉n原创 2016-11-29 10:00:43 · 661 阅读 · 0 评论 -
程序员的自我修养 读书笔记 chp 7
7.1 为什么要动态链接静态链接浪费内存和磁盘空间, 模块更新也比较困难而解决空间浪费和更新困难这两个问题最简单的方法就是将程序模块相互分割开来, 形成独立的文件。也就是说, 把链接这个过程推迟到了运行时候再进行, 这就是动态链接的基本思想通过动态链接不仅可以节省内存, 也可以减少物理页面的换入和换出, 还可以增加CPU缓存的命中率。动态链接还可以增强程序的兼容性动态链接的基本思想是把程序原创 2016-11-13 22:39:10 · 563 阅读 · 0 评论 -
[读书笔记]程序员的自我修养 chp11
11.1 入口函数和程序初始化11.1.1 程序从main 开始吗程序有一个入口函数 entry point, 实际上是 程序的初始化和结束部分, 他往往是运行库的一个部分一个典型的程序运行步骤: 操作系统创建进程, 把控制权交给程序的入口,这个入口, 往往是运行库中的某个入口函数入口函数对运行库和程序运行环境进行初始化, 包括堆, IO, 线程, 全局变量构造 etc入口函数在完成初始化原创 2016-12-11 21:43:39 · 412 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day5 结构体, 文字显示与GDT/IDT初始化
1. 接收启动信息采用结构体, 将各个独立的变量联系起来, 让程序有更好的可读性 原始未使用 结构体的代码:void HariMain(void){ char *vram; int xsize, ysize; short *binfo_scrnx, *binfo_scrny; int *binfo_vram; init_palette(); bi原创 2016-12-03 13:16:14 · 497 阅读 · 0 评论 -
[读书笔记]30 天自制操作系统 day1 从计算机结构到汇编程序入门
1. 前言我们参考书籍为: http://download.csdn.net/detail/zhyh1435589631/9689118 http://download.csdn.net/detail/zhyh1435589631/9689127 附带光盘: http://download.csdn.net/detail/zhyh1435589631/96891052. 实现2.1 二进制文原创 2016-11-21 19:16:35 · 858 阅读 · 0 评论 -
[读书笔记]程序员的自我修养 chp10
10.1 程序的内存布局一个32bit 指针的寻址空间是 4GB, 其中一部分空间会被分配给内核空间, 剩余部分给用户 可以很容易看到栈是向低地址增长, 堆是向高地址增长10.2 栈和调用惯例10.2.1 什么是栈经典的 i386 系统中, 栈总是向下增长的, 栈顶通过 esp 寄存器定位, 压栈操作使得栈顶的地址减少, 弹出操作使得栈顶地址增大 栈通常用来维护 一个函数调用所需要的信息原创 2016-12-04 21:07:52 · 393 阅读 · 0 评论 -
利用中介者模式模拟两个对象对话 C++
1. 中介者模式用一个中介对象来封装一系列的对象的交互, 中介者使得各个对象不需要显示调用, 从而降低他们之间的耦合, 并且可以独立的改变他们之间的交互。一般而言, 通过将一个系统划分为多个对象, 通常可以增加他的复用性, 但是对象之间相互连接的激增, 又会降低他的复用性。 我们可以这么理解, 由于大量的连接使得一个对象需要依赖其他对象才能工作, 系统表现成为一个不可分割的整体, 这时候, 再想对原创 2016-03-28 23:12:53 · 662 阅读 · 0 评论