共享内存 共享内存简介 共享内存是所有进程间通信(IPC)手段中速度最快的,不同进程间使用事实上的同一内存区域,这样使得进程间使用信息时免去“复制”这一流程,减少开销。 以下面“进程A从文件f中读取数据,进行加工之后,将数据传递给进程B”这种场景为例,若使用其他的IPC形式,我们至少需要以下步骤: 1. 从文件f中复制数据到进程A的内存中; 2. 加工数据; 3. 将加工好的数据通过系统调用拷贝到内核空间中; 4. 进程B得知有数据发来,从内核空间将加工好的数据拷贝到进程B的内存中; 5. 进程B使用数据 而我们若使用共享内存,则至少需要以下三个步骤: 1. 从文件f中复制数据到共享内存区域中; 2. 加工数据; 3. 进程B使用数据 显然的,在使用共享内存时,我们减少了一些无意义的数据复制。 不过,在这之中还有一些隐藏在其中影响效率的其他细节——系统调用的数量。在我们使用其他的IPC形式时,读取、写入时将不可避免的使用系统调用,当进行大量的数据吞吐时,频繁的系统调用就会严重地拖累性能。而当我们使用 继续阅读 >>


娄泽豪 18/10/31 22:56:59
ArchLinux 安装及KDE桌面环境安装配置 首先,安装之前,需要一个“启动介质”,我这里习惯使用USB设备作为启动介质,这是由于ArchLinux滚动更新的特性,而且占用空间很小,以其他的方式安装个人认为不太适合。 话不多说,访问ArchLinux官方网站,点击右上角Download,在下方选择适合你的下载方式或镜像进行下载,我常用的地址是网易的镜像源,和清华大学的镜像源。下载完毕后,我一般使用开源工具Rufus将之写入到U盘中。 安装 将启动U盘插入到电脑中,选择从U盘启动,进入到archlinux的LiveCD模式,若使用网线连接,此时应已经自动配置好网络,可使用ping命令测试网络;若使用无线网络,则键入wifi-menu命令选择并登录无线网络。然后,输入以下命令保证系统时间是正确的: timedatectl set-ntp true 然后我们可以通过fdisk -l命令查看分区情况,若要在此时修改分区表,ArchLinux提供了命令parted和fdisk,可以在此时修改分区表。若要格式 继续阅读 >>


娄泽豪 18/09/22 22:22:39
FastCGI 协议分析 FastCGI(快速通用网关接口)是一种让交互程序与Web服务器通信的协议,可以算是CGI的增强版本。FastCGI减少了网页服务器与CGI程序之间的开销,使得服务器可以同时处理更多的网页请求。目前很多常见的网页服务器都已经支持了该种协议。 通信格式 Web服务器与FastCGI程序之间通过流式套接字来通信,既包含Unix域套接字(Unix Domain Socket),也可以使用最常见的TCP/IP协议族套接字。FastCGI程序提供的内容与普通的CGI程序相似。由于与CGI程序具有环境变量、标准输入和标准输出等众多获取信息的渠道不同,FastCGI程序仅仅通过Socket获取信息。 消息头 FastCGI规定,任意一个FastCGI数据包必须以一个8字节的消息头开始: struct FCGI_Header { unsigned char version; unsigned char type; unsigned char requestIdB 继续阅读 >>


娄泽豪 18/08/10 16:43:56
什么是string_view std::string_view是C++ 17标准中新加入的类,正如其名,它提供一个字符串的视图,即可以通过这个类以各种方法“观测”字符串,但不允许修改字符串。由于它只读的特性,它并不真正持有这个字符串的拷贝,而是与相对应的字符串共享这一空间。即——构造时不发生字符串的复制。同时,你也可以自由的移动这个视图,移动视图并不会移动原定的字符串。 正因这些特性,当你不需要改变字符串时,应当抛弃原来使用的const string而采用新的string_view,这样可以避免多余的字符串拷贝。 构造 std::string_view允许通过C风格的字符串、字符串字面量、std::string或者其他的string_view进行构造。在构造的同时允许指定“大小”。 const char *cstr_pointer = "pointer"; char cstr_array[] = "array"; std::string stdstr = "std::string"; s 继续阅读 >>


娄泽豪 18/06/26 21:55:29
C++ 17标准已经发布了有一段时间了(甚至于后一个版本C++ 20也在路上了),最近终于得空(懒癌治愈),查阅了相关资料,简单上手一下。感觉到,一个是“现代”C++和C语言确实已经是天差地别,另一个就是标准库中的东西以及新语法确实更加方便我们编程了。虽然这些特性也许很长一段时间内都不一定用得上,然而学习一下总是好的,并且,体验一下“更现代”的C++的感觉也不错。 带初始化的选择语句 这个特性用于if和switch语句中,现在允许在这两个选择语句中声明并初始化一个变量,该变量在整个选择语句中都可用。这个特性显然有助于代码的清晰性,现在你可以这样写了: if (int fd = open("filename", O_RDWR | O_CREAT); fd == -1) { perror("something"); } else { // 可以继续在这里使用fd } switch (int op = getOp(); op) { case xxx: ... case 继续阅读 >>


娄泽豪 18/06/26 19:24:43
前言 小组2018年的免试题的五位出题人是:小组16级成员刘付杰、李猛、时宇辰、王良、娄泽豪。(此处应有掌声若干秒) 本人虽然参与了出题,但是我对其他关卡知之甚少,于是好奇的我在免试题上线了之后,与大家一起开始了破关之旅。以下以我作为第一视角所写而成的“免试题攻略”,若有错漏,还请多多包涵,与我在评论区进行交流。 第一关 目前微信推送中第一关的入口已经下线,想要挑战的同学可以点击这里的入口进行挑战。 打开本关的入口链接,首先我们看到了一大段英文,根据我们在线翻译级别的英语技术,大约意思是我们要不要继续下去: 第一直觉我们肯定选择【Yes!】,不过这一页还有别的信息吗?经过一番尝试,无论是叛逆的选择【No..】或者做其他操作,都没有其他有用的信息。于是我们选择【Yes!】进入第二个页面: 首先最引人瞩目的显然就是中间的看不清楚的字,还有下面“FUJIE”五个字母构成的目前看来意义不明的动画。中间看不清楚的字可以通过选择的方式选中复制出来看: 晓伴君王犹未起, 阻避钧衡过十年。 纳降 继续阅读 >>


娄泽豪 18/05/07 23:14:59
为什么写? 很好奇为什么这个东西有那么难吗?于是就花了点时间探索一下 若n未知或已知 使用写轮眼复制书上代码 顺便一说书上的代码十分的难看,好孩子们不要学。 #include<stdio.h> void main() { int i; long int f, f1=1, f2=1; printf("%10ld%10ld", f1, f2); for(i=3;i<=50;i++) { f=f1+f2; printf("%10ld", f); f2=f; } } 使用迭代 #include<stdio.h> long long fibonacci(unsigned int n) { long long rv[] = { 1, 1 }; for (int i = 2; i < n; i++) { rv[1] += 继续阅读 >>


娄泽豪 18/04/19 13:10:26
algorithm [C++ 11] std::all_of 原型: template <class InputIterator, class UnaryPredicate> bool all_of (InputIterator first, InputIterator last, UnaryPredicate pred); 功能: 指定上下界内是否都符合某条件 用例: #include<iostream> #include<algorithm> using namespace std; int main(int argc, char *argv[]) { int numbers[] = { 1, 3, 5, 7, 9, 11 }; if (all_of(begin(numbers), end(numbers), [](int i) { return i & 1; })) { 继续阅读 >>


娄泽豪 18/03/06 21:05:38
2月28日 新开这本日记,也为了督促自己下个学期多下些苦功。先要读完手边的《算法导论》和《C++ Primer》。 3月1日 摸鱼。 3月2日 摸鱼。 3月3日 摸鱼。 3月4日 hepangda啊hepangda!你怎么能如此堕落!先前订下的学习计划你都忘了吗?子曰:“吾日三省吾身。”不能再这样下去了! 3月5日 摸鱼。 3月6日 写博客挂自己 。 作者:hepangda 发表于 2018/03/06 16:58:23 原文链接 https://blog.csdn.net/hepangda/article/details/79460736 阅读:90 评论:1 查看评论 继续阅读 >>


娄泽豪 18/03/06 16:58:23
(本文已于2018-1-1更新) 使用时#include包含以下代码的头文件即可: // File: pstring.hpp #ifndef __HEADER__PSTRING_ #define __HEADER__PSTRING_ #include<stdexcept> #include<iostream> class pstring { private: // 任意迭代器类型 template<typename FN> struct any_iterator { private: char *p; public: any_iterator(): p(nullptr) {} any_iterator(char *p): p(p) {} char &operator*() { return *p; 继续阅读 >>


娄泽豪 17/12/27 21:30:15