自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

墨篙和小奶猫

现实者不功利,理想者不空谈;仁爱者不软弱,刚直者不偏激

  • 博客(19)
  • 资源 (1)
  • 收藏
  • 关注

原创 缓冲技术之五:缓冲池的LRU管理策略C++实现

/*LRU事实上属于一类被称为内存置换算法(FIFO、LRU、LFU):都是指在有限的容量下,设计一个如何管理和更新数据项的策略本程序是实现LRU-1算法,但是和常见的LRU算法不同,一般常规的LRU算法是直接用一个LRU双向链表队列实现管理,这种双向链表会导致查找元素的时间复杂度位O(n),故而我的程序是在LRU双向链表的基础上附加一个map关联容器用以加速索引过程,将查找元素的操作的时间

2017-11-28 17:22:21 1966

原创 缓冲技术之四:LRU缓冲管理策略分析

1. LRU 调度算法 缓存淘汰算法:LRU(Least recently used,最近最少使用)算法是调度场景下(内存调度、缓存淘汰等)常用到的算法,其原理是根据数据的最近访问时间来安排数据淘汰的顺序。其实常用的LRU算法是LRU-K算法体系下LRU-1特例算法。LRU算法的核心归根结底还是在链表基础上改装而来。其运行逻辑如下: 1.新数据插入链表首部(最新被使用的数据,优先级最高,位于链首

2017-11-27 23:22:18 1131

原创 STL工具库使用解析系列之二:自定义比较函数的两种方式(重载和仿函数)

C++比C不仅多了面向对象支持class类编程,还支持泛型编程,以及提供丰富的STL开发工具库。泛型是一种在编译期间动态具体化的技术,使得一些通用算法或数据结构的封装变得十分方便。在C++标准中指出,当一个模板不被使用时,它就不应该被具体化。对于模板在编译期间如何特化,其实用到的概念诸多,比如“惰性求值”和“模式匹配”,两点关键: 1.对于函数模板: 确定特化的参数类型是隐式传进去的,编译器将根

2017-11-27 22:50:54 795

原创 STL工具库使用解析系列之一 STL::map

STL是C++提供标准模块库的缩写,其中涉及多诸多常用的数据结构和算法,本文便是介绍map结构,一种和hash-table同样使用键值对的数据结构,但和哈希表常用数组实现不同,STL::map内核数据结构是红黑树,故而相比于hash-table的搜索速度是O(1), 而STL::map搜索时间复杂度是O(LogN)。但考虑到空间复杂度和动态扩展性能,以及要设计表现优异的hash函数的难度,故而对于存

2017-11-27 22:36:22 288

原创 缓冲技术之三:Linux下I/O操作buffer缓冲块使用流程

0. Linux下缓冲池技术的简单介绍 Linux文件系统中,存在着著名的三大缓冲技术用以提升读写操作效率:inode缓冲区、dentry缓冲区、块缓冲。其中所谓的块缓冲便是我们前面一直在讨论的缓冲池技术,常用来配备IO操作,用来减少IO读取次数,以提升系统效率。本文便是此前《换成技术》系列的两篇文章的基础上继续讨论缓冲池技术。对于块缓冲体系而言,需要提及的两个概念分别是page cache和bu

2017-11-26 22:58:20 2953

原创 缓冲技术之二:缓冲池BufferPool的简单实现

在文章缓冲技术中提到无论是单缓冲、双缓冲或循环缓冲,均仅是进程专属缓冲配备,而一旦考虑到操作系统的分时并行特性,任一时刻只有一个进程的缓冲体系在工作之中,而其他进程的缓冲体系并不在工作(要么是迁移到swap cache外设磁盘上要么是占据物理内存,显著减少可用物理内存容量),所以采用公用缓冲池架构为多个并发进程提供缓冲服务是当前主流的手段(操作系统、数据库)。由于完整地提供操作系统级别的缓冲池涉及到

2017-11-26 18:17:38 7084 2

原创 多线程基础之七:多线程遇上printf的“延迟写”策略

0. 运行库提供的IO读写函数采用“延迟写”策略的原因 编程时经常会用到printf()函数,但是由于printf()函数涉及到和显示器或磁盘等外设进行交互,所以操作涉及到从“用户态–>内核态–>返回用户态”的一系列内核转换过程,但是从用户态通过中断使用系统调用涉及到内核从用户态切换到内核态,上下文切换是间很费时的操作。更糟糕的是,如果printf()的目标设备是显示器这种字符设备(单次传输一个字

2017-11-25 23:22:03 3413

原创 多线程基础之六:Pthread Win32实现的非阻塞请求机制的Semaphore

前面看到Windows API直接提供的Semaphore并没有为其配备等待队列,从而无法实现非阻塞请求机制以实现操作加速,对于临界区耗时的情况下,显然是存在实现非阻塞请求机制的Semaphore的。Linux下的Pthread库实现了这样的增加版Semaphore,幸运地是有Pthread的Win32版本。前面讲解到其实Semaphore的完整结构体内容应该如下typedef struct{

2017-11-17 23:46:15 665

原创 多线程基础之五:Windows API提供的mutex和semaphore性能比较

Windows系统提供HANDLE WINAPI CreateSemaphore(xxx)和HANDLE WINAPI CreateMutex(xxx)直接提供Mutex和Semaphore两种内核对象供程序员使用在临界区互斥操作。在前面的多线程基础之一提到过Semaphore存在Binary和Counting两种,其中Binary Semaphore等同于Mutex,而Counting Semap

2017-11-17 23:15:07 1382

原创 多线程基础之四:Linux提供的原子锁类型atomic_t

在x86体系下,任何处理器平台下都会有一些原子性操作,在单处理器情况下,单步指令的原子性容易实现。但是在SMP多处理器情况下,只有那些单字的读(将变量读进寄存器)或写(从寄存器写入到变量地址)才是原子性的。故而在SMP下,要保证特定指令集合的原子性即不被中断,x86提供lock前缀用来在执行被lock修饰的指令期间锁住总线,从而实现了“禁止中断”的效果。事实上,Linux操作系统便根据这种针对特殊数

2017-11-15 22:38:42 18180

原创 多线程基础之三:使用event, mutex, semaphore实现多进程间互斥

前面文章介绍了使用mutex和semaphore在多线程场景中实现线程互斥。事实上,因为mutex, semaphore是内核对象,虽然是在某一个进程中创建的,但是由于进程间可以共享内核模块,故而使用mutex, semaphore在进程间作为互斥标识量也是可以的。 0. 使用mutex实现多进程间互斥race_process_mutex_1.cpp#include <stdio.h>#in

2017-11-15 09:52:11 1785

原创 多线程基础之二:mutex和semaphore使用方法

mutex和semaphore都是内核对象,是用来实现多进程间或多线程锁机制的基础。本文将要介绍两者的使用方式。 0. 多线程锁机制涉及的Windows API创建mutex内核对象,用来作为线程间或进程间通信的API接口如下HANDLE WINAPI CreateMutex( __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes, __in BO

2017-11-15 00:42:27 3113

原创 多线程基础之一:进程间同步问题的来源和解决方案

同步问题诞生的最本质的原因:In fact, a process may be interrupted at any point in its instruction stream, and processing core may be assigned to execute instructions of another process.总之一句话,关于共享对象的更改操作并非原子操作,如假设两个进

2017-11-15 00:12:12 1505

原创 程序员的自我修养:MiniCRT++运行库部分实现C++特性

前面的文章展示了如何通过自制的运行库实现堆初始化和IO初始化,以及标准输入输出功能,这些都是标准的C功能实现。而对于C++而言,则拥有更多的复杂特性,如new/delete、STL、异常处理、流等,这些特性显然是语言层的,故而需要GCC库提供相应的实现。对于C++而言,其毕竟是在C的基础上衍生而来的,故而C++运行库显然只需要实现这些C++特有的特性,而其他和C共享的功能如基本文件操作、堆管理等都可

2017-11-14 22:33:31 595

原创 #include指令加载外部库的两种用法

C中可以通过#include <header.h>和#include "header.h"来加载文件,两者的区别主要是在include加载的搜索路径上存在不同。区别是: 采用#include <header.h>,链接器会按照系统指定目录(如Windows下给INCLUDE环境变量指定的路径顺序)去查找头文件<header.h>。采用#include "header.h"方式,链接器会先到当前目录

2017-11-14 21:44:57 2487

原创 缓冲技术之一:缓冲问题的来源和解决方法

缓冲技术某种程度上而言也是符合银弹理论,增加了一层抽象层–缓冲区,用于解决上下游机器介质速度不匹配导致的程序速度缓慢的问题。缓冲器是一个存储器,它可以是硬件级的,即独立于内存外设置的专门硬件缓冲器(内存页表起始地址寄存器),也可以是软件级的,即由软件在内存中开辟一块缓冲区域(buffer,cache)。硬件要花钱,所以一般用在关键的地方。1. 引入缓冲技术的原因 1.Cache缓存,减少读块设备的

2017-11-07 23:46:34 5006 4

原创 Linux内核:IO设备的抽象管理方式

I/O设备是人们使用计算机的途径,无意相当于计算机的五官,不同的使用方式需要配备不同的设备,如输入文字一般用键盘,但在某些应用场合,需要扫描仪,输入声音需要话筒,打印信息需要打印机,实时控制RT领域需要传感器。 摘自《操作系统原理及应用》一书关于IO设备从不同角度的分类 使用目的 1.存储设备:alias外存、辅助存储器 2.输入/输出设备 按传输速率分类 1.低速设备:几~几百Bytes

2017-11-07 23:32:20 1341

原创 Linux内核:IO设备通信的控制方式

IO设备与主机(CPU、内存)之间的通信不是直接的,而是通过设备控制器,设备控制器是IO设备和主机之间的中介。IO设备和进程之间的数据传送方式主要有4种:1.程序控制方式:又被称为“忙等”模式,即当要在内存和IO设备之间进行信息传输时,由CPU向相应的设备发出命令,由设备控制器控制IO设备进行实际操作。在IO设备工作时,CPU执行一段循环测试程序,不断测试IO设备的完成状况,根据完成状况决定下一步操

2017-11-07 23:11:22 4864

原创 程序员的自我修养:MiniCRT自制C语言运行库

程序员的自我修养一书中,在最后一章专门介绍一款小型的C语言运行库,并给出了详细的代码实现。阅读该代码实现,可以对C语言运行库提供的语言抽象层得到更深的理解。Talk is cheap, show code!minicrt.h: MiniCRT的文件头#ifndef __MINI_CRT_H__#define __MINI_CRT_H__#endif/*定义C++相关的函数,以使得函数的兼容性得到

2017-11-05 01:20:37 1563 1

串口读取程序

通过java程序调用本机上的串口!希望对正在找串口程序的你可以提供帮助!!

2012-12-14

空空如也

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

TA关注的人

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