- 博客(282)
- 资源 (2)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 手把手教你实现自定义的应用层协议
1.简述互联网上充斥着各种各样的网络服务,在对外提供网络服务时,服务端和客户端需要遵循同一套数据通讯协议,才能正常的进行通讯;就好像你跟台湾人沟通用闽南语,跟广东人沟通就用粤语一样。实现自己的应用功能时,已知的知名协议(http,smtp,ftp等)在安全性、可扩展性等方面不能满足需求,从而需要设计并实现自己的应用层协议。2.协议分类2.1按编码方式二进制协议 比如网络通信运输层中的tcp
2017-03-11 17:03:07
8732
2
原创 C++轻量级单元测试框架
单元测试是构建稳定、高质量的程序、服务或系统的必不可少的一环。通过单元测试,我们可以在开发过程中及时发现和修复代码中的问题,提高代码的质量和可维护性。同时,单元测试也可以帮助我们更好地理解代码的功能和实现细节,从而更好地进行代码重构和优化。
2023-04-25 13:00:49
733
原创 分布式内存缓存系统设计
1.问题任何平台随着用户规模的扩大、功能不断的添加,持久化数据库层承受的读写压力会越来越大,一旦数据库承压过大会导致读写性能陡然下降,严重时会导致大量的业务请求超时,进而发生“雪崩”引发严重的故障。2.解决方案在业务层和数据库持久层之间引入一层内存缓存层,对于复杂且业务逻辑上不会变化的查询结果进行缓存,业务请求再次发起时,每次都先从缓存层中查询,从而大大减少对数据库的查询,减小对数据库的压力。3.分
2017-03-19 12:21:10
959
原创 extern “C” 陷阱
extern “C” 陷阱extern “C”通常使用在C++中,由于C++支持函数重载,命名空间等技术,故C++编译器在编译C++代码时会对函数进行签名,也就是说编译后的函数名将发生变化。例如我们有如下的代码:test.cppint fun(int a){///nothing.} 在Ubuntu下用g++编译这个cpp文件获取它的目标文件test.o,命令:
2013-06-04 22:27:10
2923
原创 memcpy Linux内核实现引发的思考:为什么嵌入式汇编中不用指定段寄存器
memcpy Linux内核实现引发的思考:为什么嵌入式汇编中不用指定段寄存器最近买了王爽的汇编语言和Linux内核完全注释,准备开始好好学习一下汇编语言,并看看早期的Linux(0.11版本)源代码实现。之前舍友面试TX是被问过memcpy什么时候不能用,这种问题如何解决?答:当dest,src都指向同一个数组且dest>src,那么当n大于abs(dest > src),则这个时候
2013-05-18 11:21:27
3289
转载 高流量高并发网站架构(转)
Web2.0的兴起,掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也极大的方便了上网的人们。但Web2.0以用户为导向的理念,使得新生的网站有了新的特点——高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了新的要求。 本文围绕高并发高流量的网站架构设计问题,主要研究讨论了以下内容: 首先在整个网络
2013-04-20 09:39:32
1610
转载 C++内存对齐
一、为什么会有C++内存对齐以下内容节选自《Intel Architecture 32 Manual》。为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,从而需要两次总线周
2013-04-19 16:26:07
1066
原创 虚函数、虚继承对sizeof的影响
虚函数、虚继承对sizeof的影响1、一个空类的大小代码如下:#include using namespace std;class A{};int main(){ cout << "A size = " << sizeof(A) << endl; return 0;} 输出结果为:分析:空类大小为1,编译器安插一个char给空类,用来标记它的每
2013-04-19 14:08:48
2575
原创 一起来学POSIX thread 之 综合应用——线程池
一起来学POSIX thread 之 综合应用——线程池1、为什么需要线程池?部分应用程序需要执行很多细小的任务,对于每个任务都创建一个线程来完成,任务完成后销毁线程,而这就会产生一个问题:当执行的任务所需要的时间T1小于等于创建线程时间T2和销毁线程时间T3总和时即T1 ,应用处理任务的响应能力会大大减弱,从而影响了应用程序性能,为了解决这类问题,线程池技术提供了很好的解决方案。
2013-02-14 22:26:19
3009
2
原创 一起来学POSIX thread 之 不变量、临界区、谓词
一起来学POSIX thread 之 不变量、临界区、谓词1、不变量(invariant)所谓的不变量是由程序作出的假设,特别是有关变量组间关系的假设。当编写队列包时,你需要为每一个队列指定一个队列头指针,指向队列的第一个元素。每一个数据元素也包含指向下一个元素的指针。重要的并不完全是数据,程序还要依赖于数据之间的关系。例如,队列或者为空,或者包含一个指向队首元素的指针。数据元素包含的指针
2013-02-12 21:11:33
2278
原创 一起来学POSIX thread 之 线程状态
一起来学POSIX thread 之 线程状态1、线程的四种基本状态的转换在OS中线程作为最基本的调度单元,它存在着四种基本状态,各个状态的转化情况如下图。四种状态的含义如下:1)就绪状态:线程能够运行,但在等待可用的处理器。可能刚刚启动,或刚刚从阻塞中恢复,或者从运行状态中被其他线程抢占从运行状态转变为就绪状态。2)运行状态:线程正在运行。在多处理器系统中,可
2013-02-11 22:02:19
1158
原创 一起来学POSIX thread 之 线程的创建和基本操作接口
一起来学POSIX thread 之 线程的创建和基本操作接口1、线程的创建我们之前提到了POSIX thread的三个基本核心要输:执行环境、调度、同步。在这里我们首先介绍一下执行环境(Unix环境下)如何创建,POSIX thread提供了pthread_create接口用来创建线程。pthread_create的原型如下:int pthread_create(pthread_t
2013-02-10 23:46:15
3363
原创 一起来学POSIX thread 之 结构概览、基本数据类型和报错机制
一起来学POSIX thread 之 结构概览、基本数据类型和报错机制1、结构概览任何一个线程系统都包括三个基本要素:执行环境、调度和同步。在评估一个线程系统或者比较任意两个线程系统时,都可以从比较它们对这三个方面的支持开始。POSIX thread通过调用pthread_create来创建执行环境(线程)。创建一个线程同样也调度了该线程的执行,这将通过调用指定的“线程启动”函
2013-02-09 11:37:24
1865
原创 一起来学POSIX thread 之 线程利弊与选择
一起来学POSIX thread 之 线程利弊与选择1、线程的利在多处理器系统中,利用线程的并行性可以提高计算性能。一个运行在双CPU上的计算密集型多线程程序几乎可以获得传统的单线程程序两倍的性能。“几乎两倍”是基于这样的事实:创建额外的线程和执行线程间的同步会带来额外的开销。虽然线程在多处理器的系统中能带来程序性能的提高,但性能的提高并不和处理器的个数成正比,而是和线程的并行
2013-02-08 22:26:05
2287
原创 一起来学POSIX thread 之 基本概念
一起来学POSIX thread 之 基本概念1、异步(asynchronous)异步指互不干扰的事件可以独立的发生,除非事件之间存在着依赖性.生活中存在着大量的异步事件,例如你可以一边喝茶,一边烧开水。异步带来的最大复杂性就是:如果你没有同时执行多个活动,那么异步就没有任何优势可言。如果你开始了一个异步活动,然后什么也不做等待它结束,则你并没有从异步中获得任何好处。2、并发(co
2013-02-08 00:08:11
2246
原创 线程终止的三种情况
线程终止的三种情况1、线程从启动例程中返回,返回值为线程的退出码。2、线程可以被同一进程中的其他线程取消(调用pthread_cancel函数)。3、线程自身调用pthread_exit退出。涉及的Unix/Linux接口。#include void pthread_exit(void * rval_ptr);///rval_ptr是一个无类型指针,用于设置线程退出
2012-12-24 21:49:28
1233
原创 进程与线程的区别
进程与线程的关系与区别1、进程是系统分配资源的基本单位,而线程是系统调度的基本单位。2、进程至少由一个线程组成,线程依赖于进程而存在。3、线程相对进程,并发性好,CPU资源利用率高,能改善系统响应时间和吞吐量。4、由于线程涉及到共享资源访问一致性问题,从而编程复杂度也高。
2012-12-24 21:10:20
767
原创 基于策略(policy)的类设计方法
基于策略(policy)的类设计方法通常类的功能是复杂的,而基于策略(policy)的设计方面把类的功能分离出来,变成粒度小的模块,每个模块完成不同的策略,通过不同的策略模块有序的组装从而实现整个类复杂的功能。将class分解成policies时,要遵守两条重要的准则。第一,把你的class内的“设计决定”局部化、命名、分离出来。第二,找出正交的policies,也就是彼此之间无交互左右、
2012-08-20 00:46:36
1243
原创 判断系统CPU是大端还是小端 详解
判断系统CPU是大端还是小端 详解所谓的大端小端就是CPU在存储数据的时候是从高地址开始存储还是低地址开始存储。例如在sizeof(int) = 2的系统中,1 + (2 )= 1 + 512 = 513,我们把这个值赋值给int nTemp = 1 + (2 。我们假定系统分配给变量nTemp的地址空间为:0x0000FF08到0x0000FF09,那么0x0000FF08开始的8个位为
2012-04-22 16:23:11
6114
原创 接口完备的高精度整数计算类
接口完备的高精度整数计算类 做ACM的时候经常会遇到高精题,把自己封装好的高精类跟大家分享。实现方式就是模拟每个位的计算,把每个位的数字保存到数组中。具体实现可以看代码,都有注释。代码如下:/* Author: ACb0y FileN
2011-10-18 23:21:29
1646
原创 在Unix/Linux下模拟双机热备(客户端自适应方式)
在Unix/Linux下模拟双机热备(客户端自适应方式) 最近突然对双机热备的切换的过程产生了浓厚的兴趣。晚上动手写了份代码模拟了,双机切换的过程。该模拟方式是通过客户端自适应的方式来实现。当一个客户端发现链接的服务器关闭之后,便链接备用服务器。具体描述如下:
2011-10-17 02:33:55
3199
4
原创 Unix/Linux线程同步互斥量的使用
Unix/Linux线程同步互斥量的使用 在main函数中创建3个子线程,并实时输出当前子线程数,当每创建一个子线程的时候,就对线程数变量加一,每个子线程运行3秒,3秒之后对子线程数变量值减一。当线程数为0时主线程退出。在对子线程数的读写过程中都使用到了线程同步的
2011-10-12 23:19:43
1964
原创 调用系统函数pthread_cancel取消进程的其他线程
调用系统函数pthread_cancel取消进程的其他线程 先在主线程中创建一子线程,在子线程中一直输出运行了多少时间,在主进程监控,当发现子线程已经运行10秒的时候,取消子线程。Demo代码如下:注意编译的时候要加 -lpthread 选项,即unix
2011-10-10 23:04:13
1712
原创 Unix/Linux创建一个线程
Unix/Linux创建一个线程 使用Unix/Linux的系统接口pthread_create()函数创建一个新的线程,主线程和新线程一直输出消息。注意用g++编译的时候要加 -lpthread,即需要链接线程库。源代码如下:#include #includ
2011-10-08 23:30:38
6471
原创 UVa 489
题意: 给定两个字符串,第一个串是用来匹配的,从第二个串的第一个字符开始匹配,如果第二个串中的字符在第一个串出现,则表示猜中了,第一个串中的相同的那个字符都算被猜中;如果没有出现则表示猜错,同样的猜错只算一次。在整个匹配的过程中,如果在还没猜错7次之前,第一个
2011-10-01 01:12:37
3186
原创 Socket编程基本原理
Socket编程基本原理1 问题的引入 UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-read-close)。在一个用户进程进行I/O操作时,它首先调用“打开”获得对指定文
2011-09-30 23:04:55
1235
原创 输出全排列的两种方式
输出全排列的两种方式 在暴力求解问题中,我们经常会枚举全排列,在此我列了列出了两种枚举全排列的两种方式。已输出1-5的全排列为例。 方式1:用回溯算法(深度优先遍历DFS)/** * Author: ACb0y * FileName: Test.c
2011-09-22 23:09:15
1300
原创 面向对象编程VS泛型编程
面向对象编程VS泛型编程1、面向对象浅析 OOP是对data&&operation的封装,是对同类事物的抽象,跟结构化编程相比它更接近自然语言。继承使得OO具有了更强的表达能力,进一步地接近了自然语言的属性。而多态则是OO的最为巧妙和强大的地方,它催生了一系
2011-09-20 23:51:15
2289
转载 volatile 和 sig_atomic_t
1 volatile—影响编译器编译的结果volatile 变量是随时可能发生变化的,每次使用时都需要去内存里重新读取它的值,与volatile变量有关的运算,不要进行编译优化,以免出错(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量
2011-09-01 11:48:33
1595
原创 Oracle的bug
Oracle的bug 做项目的时候,有用到很多SQL脚本,其中不乏有很多注释,当你在注释后面加一个“;”分号的时候,在注释下面的一条SQL语句将得不到执行。
2011-08-08 20:06:18
876
2
原创 使用标准输入&&标准输出,进行文件复制
使用标准输入&&标准输出,进行文件复制 使用Linux/Unix的不带缓冲区得I/0函数read 和 write实现使用标准输入&&标准输出,进行文件复制。代码如下:#include #include "apue.h"#include "err_msg
2011-08-07 22:58:21
841
原创 在我博客中经常使用的“apue.h”和“err_msg.h”
在我的Linux/Unix的博客中,经常会时候用“apue.h”和“err_msg.h”,这两个文件的内容如下:apue.h/* * Our own hander, to be included before all * standard system head
2011-08-07 22:51:32
2856
原创 Linux/Unix下读取指定目录下的所有文件名
Linux/Unix下读取指定目录下的所有文件名 调用系统函数opendir()和readdir来实现遍历Linux/Unix下的某个指定目录下的所有文件,并输出文件名。 实现代码如下:/* Author: ACb0y FileName: main.
2011-08-01 00:40:19
10459
原创 应用管道实现父子进程之间的通信
应用管道实现父子进程之间的通信最近在学习Linux/Unix的IPC,而通过管道是其中的一种方式。管道的限制在与,它只能实现父子进程间的通信,通常我们通常会创建一个管道,然后fork出一个子进程,在父进程关掉读端(fd[0]),在子进程里关掉写端(fd[1]),然后在父进
2011-07-31 00:56:35
3968
原创 Unix/Linux如何创建一个后台进程(run background process)
Unix/Linux如何创建一个后台进程在Unix/Linux中创建一个后台进程的步骤1、调用fork函数,创建一个子进程。2、先让父进程自然结束。3、在子进程中调用setpgrp(),把子进程的进程组ID设为子进程的进程ID。4、在子进程中调用setsid(),创建一个新的Se
2011-07-24 16:34:27
4579
转载 GDB 调试子进程
用gdb调试多进程的程序会遇到困难,gdb只能跟踪一个进程(默认是跟踪父进程),而不能同时跟踪多个进程,但可以设置gdb在fork之后跟踪父进程还是子进程set follow-fork-mode child命令设置gdb在fork之后跟踪子进程(set follow-fork-m
2011-07-21 19:06:49
11749
转载 Source Insight使用技巧之关闭大括号自动缩进方法
Source Insight使用技巧之关闭大括号自动缩进方法2009年07月24日 星期五 10:53相信大家在使用Source Insight的时候曾经遇到过输入大括号会自动缩进的情况,现有一方法可以关闭Source Insight的这个自动缩进的方法:1.打开Options
2011-07-18 10:28:58
14061
转载 OCI常用函数
一. Oracle oci工具包安装: $ORACLE_HOME\BIN:执行文件和help文件 $ORACLE_HOME\OCI\INCLUDE:头文件 $ORACLE_HOME\OCI\LIB\BC: for Borlanf C++的OCI库 $ORACLE_HOME\OC
2011-07-16 12:49:17
1625
转载 source insight快捷键及使用技巧
source insight快捷键及使用技巧 退出程序 : Alt+F4重画屏幕 : Ctrl+Alt+Space完成语法
2011-07-14 08:51:32
609
原创 vi 教程
1.光标命令k、j、h、l - 上、下、左、右光标移动命令。虽然您可以在Linux中使用键盘右边的4个光标键,但是记住这4个命令还是非常有用的。这4个键正是右手在键盘上放置的基本位置。 nG - 跳转命令。n为行数,该命令立即使光标跳到指定行。 Ctrl+G - 光标所在位置的行数和列数报告。 w、b - 使光标向前或向后跳过一个单词。2.编辑命令i、a、r - 在光标的前、后以及
2011-06-21 10:20:00
1390
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人