开源库 parallel-hashmap 介绍:高性能 线程安全 内存友好的哈希表 和 btree
倒排索引求交算法相关资料调研
用 process_vm_readv() 实现多进程内存队列
一,问题背景
多进程之间需要传输大量数据的时候,比如多进程 RPC 框架的进程之间通信,常用共享内存队列。
但是共享内存队列难免会有 入队+出队 2次 memcpy 。
而且要变长共享内存队列,如果支持多生产者进程+多消费者进程 ,就要处理线程安全方面的问题, 比较麻烦。
process_vm_readv() , process_vm_writev() 是 Linux 3.2 新增的 syscall,用于在多个进程的地址空间之间,高效传输大块数据。
https://www.man7.org/linux/man-pages/man2/process_vm_readv.2.html
https://github.com/open-mpi/ompi/blob/master/opal/mca/btl/sm/btl_sm_get.c#L96
在此, 我提个设想,可以用 process_vm_readv 实现一个多进程内存队列,相比之下,优势是:
- 在处理 多线程/多进程 并发时,更简单
- 省掉一次 memcpy。
下面 demo 代码演示了这个思路。 为了方便,直接用 posix mq 来传输 iovec 数组,也没有考虑多路复用。 真实项目可能需要 eventfd 之内的机制来做 notify。
实测了下,3个进程加起来有 5.5 GB/秒 的速度。
构造最短程序打印自身的 MD5
一,介绍
比赛题目很简单:构造一个程序,在 stdout 上打印出自身的 MD5,程序越短越好。按最终程序文件大小字节数排名,文件越小,排名越靠前。 只能使用 ld-linux-x86-64.so, libc.so, libdl.so, libgcc_s.so, libm.so, libstdc++.so 。 禁止了 socket, shmget, fork, execvc 等 syscall 。
汇编高手如云,本人只做到 752 字节,只拿到 27 名。 但忙活好几天,学到不少东西,也有苦劳,还是值得记录一下。
基本是纯 C 实现,没有动用汇编。