内存管理 - MEMORY POOL
摘要:内存池优势: 内存池设计思路: 内存池可以根据实际需要,设计成不同的样子。下面是针对网络中数据传输设计的一个内存池。 内存池:在初始状态获取的堆区一大块内存。 内存页:根据需要,将内存池划分成若干内存页,进行管理。 内存块:内存页内的内存最小单元,用于直接传递给申请者使用。 由于网络传输数据大小有限
阅读全文
OpenSSL - RSA非对称加密实现
摘要:非对称加密:即两端使用一对不同的密钥进行加密。 在非对称加密中,需要两对密钥,公钥和私钥。 公钥个私钥属于对立关系,一把加密后,只有另一把才可以进行解密。 公钥数据加密 数字证书内包含了公钥,在进行会话连接时,双方交换各自的公钥,保留自己的私钥。进行数据传输时,利用对方的公钥进行数据加密。加密后的数
阅读全文
OpenSSL - 文件和字符MD5加密实现
摘要:OpenSSL安装: 1.github下载最新的OpenSSL:https://github.com/openssl/openssl 2.在linux解压压缩包 3.安装OpenSSL 4.用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下面 openssl MD5接口: 代
阅读全文
ACE - Reactor实现I/O,Dispatch,Service三层完整服务器(完结)
摘要:框架描述 服务器层次: I/O层:对应具体的文件描述符处理,对应ACE中的handle。 Dispatch层:事件分发,将I/O事件分发到对应绑定的处理队列等待业务处理,对应ACE中的Event_handle。 业务层:处理具体业务,包含一组线程或进程,并发处理业务。对应ACE中的ACE_Task。
阅读全文
ACE - Reactor源码总结整理
摘要:ACE源码约10万行,是c++中非常大的一个网络编程代码库,包含了网络编程的边边角角。 ACE代码可以分三个层次:OS层、OO层和框架层: OS层主要是为了兼容各个平台,将网络底层API统一化,这一层用户不关心。 OO层则是对一些常用的数据结构或方法进行OO封装,方便上层使用,包括socket方法,
阅读全文
ACE - ACE_Task源码剖析及线程池实现
摘要:原文出自http://www.cnblogs.com/binchen-china,禁止转载。 上篇提到用Reactor模式,利用I/O复用,获得Socket数据并且实现I/O层单线程并发,和dispatch层把不同的I/O绑定到了不同的Event中去处理。也就是已经实现了多个client连接和通信,
阅读全文
ACE - Reactor模式源码剖析及具体实现(大量源码慎入)
摘要:原文出自http://www.cnblogs.com/binchen-china,禁止转载。 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于Reactor框架的服务器。 首先回顾下Reactor模式和Preactor模式。 Reactor模
阅读全文
ACE - 代码层次及Socket封装
摘要:原文出自http://www.cnblogs.com/binchen-china,禁止转载。 ACE源码约10万行,是c++中非常大的一个网络编程代码库,包含了网络编程的边边角角。在实际使用时,并不是所有代码都能用到你的项目中来,相反你只需要其中的一小部分就已经可以完成实际所需。 最近研究其源码最大
阅读全文
IO复用(Reactor模式和Preactor模式)——用epoll来提高服务器并发能力
摘要:上篇线程/进程并发服务器中提到,提高服务器性能在IO层需要关注两个地方,一个是文件描述符处理,一个是线程调度。 IO复用是什么?IO即Input/Output,在网络编程中,文件描述符就是一种IO操作。 为什么要IO复用? 1.网络编程中非常多函数是阻塞的,如connect,利用IO复用可以以非阻塞
阅读全文
服务器线程并发和进程并发
摘要:进程和线程的使用在前面博文已经讲述完毕,在完成一个最简单的服务器之后,就是要考虑下如何实现并发服务器了。 要实现服务的并发,只能通过进程和线程两种方式。 之前提到过listen_fd和connect_fd,listen用于监听是否有客户端连接,维护两个fd队列,没完成握手的和完成就绪的。 conne
阅读全文
线程同步(四)—— 信号
摘要:这篇是进程线程的博文的最后一篇了,至此进程线程的所有同步内容已经全部回顾完了。 其中信号和信号量看起来名字很像,实际上却是完全不一样的两个东西,信号和信号量在进程线程中都可以使用。而且使用方式也基本完全一样。 进程中的共享内存,线程中的互斥锁,条件变量。这些是独有的,但实际也能互相使用,《Unix网
阅读全文
线程同步(三)—— 信号量
摘要:线程信号量和进程信号量类似,Unix提供了两套与信号量有关的API。POSIX和System V。两套API都可以在线程和进程中使用。 进程中使用信号量是为了保证临界资源的控制,线程中已经有了互斥锁,而且还有条件变量对线程进行控制,信号量是不是就有点多余了呢? 其实在进程中也是可以使用互斥锁和控制变
阅读全文
线程同步(二)—— 条件变量
摘要:上篇提到线程针对临界值操作时需要加锁,但是线程访问临界资源只通过锁来控制是不够的。 比如对一个数据进行操作,A线程需要读,B线程进行写。 A线程先访问临界资源,发现没有数据可以读,只能等待B线程先写,此时又占用了互斥锁,导致B线程无法得到锁,进行写操作。 此时就需要用到条件变量了,条件变量的目的就是
阅读全文
线程同步(一)—— 互斥锁
摘要:在使用线程时,经常要注意的就是访问临界资源加锁。 在编码过程由于粗心忘记加锁将带来不可预知的错误。这类错误单次运行或小并发时难以复现,当数据量变大,用户数增多时,轻则系统崩溃,大则引起数据错误。造成损失。 线程中互斥锁与进程的信号量类似,也可以看做是PV操作,用于保护临界资源,确保只有一个线程访问。
阅读全文
进程同步(四)—— 消息队列
摘要:消息队列使用的API与信号量、共享内存类似。 消息队列、信号量、共享内存均可用ipcs命令查看以及ipcrm删除。 msgget首先向内核获取一个消息队列ID。 获取成功后,可用msgctl获取和设置队列相关信息。 msgsnd用于写消息队列。 msgrcv用于读消息队列。 消息队列遵循First
阅读全文
进程同步(三)—— 信号
摘要:程序在执行过程经常产生信号,有些是由内核发出,有些是由用户发出。 执行命令kill -l可以查看信号。 这些信号由系统定义,他们不是简单的int之类的数据类型,可能是调用一些函数。 这些信号中,10/12是给用户预留使用的,其他信号各有自己相应的含义。代码中无法完美的自定义信号,容易覆盖或产生系统错
阅读全文
进程同步(二)—— 信号量&内存共享
摘要:内存共享是进程间常用的通信方式,可以实现两个完全独立的进程通信。 在访问共享内存时,同时需要信号量进行访问控制。 使用ipcs -m命令可以查看系统共享内存,ipce -m + key 可以删除指定的共享内存。 对共享内存操作时,使用信号量对共享内存进行保护,类似与线程中的互斥锁。都可以看做是通过P
阅读全文
进程同步(一)—— 管道
摘要:父子进程可以通过管道进行数据交互,一个管道只能有一个数据流向,要实现双工通信,可以使用两个管道实现。 管道工作原理: 数据交互图: 单工通信代码实现: 测试结果:
阅读全文
Linux交叉开发环境搭建 —— 效率之源
摘要:楼主今天终于把所有Linux开发环境需要的软件下载完毕了。虽然以前也是搭建过的,时间久了又折腾了一晚上。 交叉环境: 工具: 虚拟机搭建: 虚拟机网络配置: 文件共享: SecureCRT 连接虚拟机: 完成交叉环境搭建后,就可以轻松的在Window下进行代码开发和编译了。同时也可以用SecureC
阅读全文