Articles of pipe理员

为什么相同的C程序有时快得多

那么,这将是一个没有细节的问题,因为我不知道如何更好地解释。 抱歉。 我有一个内存密集的C程序(很多指针)。 我有一个源,它是由我用gcc -O2编译的。 我在Ubuntu Linux上。 在程序的开始和结束时,有一个clock()函数来测量已用时间。 此外,我正在使用时间命令来检查时间。 问题是相同的程序有时比不更改任何东西快20%(或更慢)。 $ date; time ./cudd-example-8queens pon jun 20 00:49:05 CEST 2016 CPU TIME = 6.46 real 0m6.475s user 0m6.405s sys 0m0.067s $ date; time ./cudd-example-8queens pon jun 20 00:49:16 CEST 2016 CPU TIME = 8.03 real 0m8.051s user 0m7.995s sys 0m0.048s $ date; time ./cudd-example-8queens pon […]

Bash进程replace背景与作业控制

我有一个处理一批20MiB CSV文件的脚本,可以select压缩到4MiB左右。 有成千上万的文件和处理每个单独需要大约30秒; 读取一个未压缩的文件或者一个压缩文件,并且解压缩是“几乎是即时的”,高度暗示该过程可以在过程级别上并行化。 事实上,使用复杂的Rubystream水线就是这样做的。 不过,我试图用bash把Ruby代码分解成更小的部分。 为了控制工作,我想出了这个bash函数 wait_until_job_available() { maximum_jobs=${MAXIMUM_JOBS} [ $# -eq 0 ] || maximum_jobs="${1}" exit_status=0 RUNNING_JOBS=( $(jobs -p) ) while [ ${maximum_jobs} -le ${#RUNNING_JOBS[@]} ] && [ 0 -eq "${exit_status}" ] do # `wait -n` requires bash 4.3 which is unfortunately not available on several recent RHEL-based Linux distributions such as Oracle […]

如何将指针从内核空间传递到用户空间,并将其映射到虚拟空间

我正在为一个PCI设备的驱动程序代码工作。 通信是通过一个缓冲区来完成的,也就是我写入一个缓冲区,设备从中获取数据。 设备写入一个缓冲区,我从它gradle的数据。 这是问题发生的地方。 为了让设备写入这个缓冲区,它需要有它的物理地址(不是虚拟的)。 我的老板告诉我,如果我编写一个内核模块并使用kmalloc分配内存,就可以这样做。 这是我的问题。 如何从用户空间访问此缓冲区,即如何将指针从内核空间传递到用户空间? 由于用户空间中的所有地址都是虚拟地址,因此如何将物理指针转换为虚拟地址? 据我所知,我需要使用ioctl但我不知道如何。 任何帮助表示赞赏。

locking内存分配争用 – multithreading与多进程

我们已经开发了一个大型C ++应用程序,可以在大型Linux和Solaris机箱(多达160个CPU内核甚至更多)上的多个站点上运行得令人满意。 这是一个严重的multithreading(1000多个线程),单进程体系结构,消耗大量的内存(200 GB +)。 我们是LD_PRELO在谷歌Perftool的tcmalloc(或Solaris上的libumem / mtmalloc),以避免内存分配性能瓶颈,总体上好的结果。 然而,我们已经开始看到在一些更大的安装中,在内存分配/重新分配期间锁争用的不利影响,特别是在进程已经运行一段时间(暗示分配器的老化/分段影响)之后。 我们正在考虑改用多进程/共享内存架构(在共享内存中不会发生严重的分配/释放,而是在常规的堆上)。 所以,最后,我们的问题是:我们能否假设现代Linux内核的虚拟内存pipe理器能够有效地将内存分发到数百个并发进程? 或者我们不得不期望在单进程/multithreading环境中遇到与内存分配争用相同的问题? 我倾向于希望获得更好的整体系统性能,因为我们不再局限于单个地址空间,并且拥有多个独立的地址空间将会减less对虚拟内存pipe理器的locking。 任何人都有比较multithreading和多进程内存分配的实际经验或性能数据?

如果一端在另一端closures,Linuxpipe道()将会发生什么情况

我通过pipe道()系统调用进行进程间通信。 孩子写到一端,父母应该读取pipe道的另一端。 父对象在开始读取之前,waitpid()让子对象完成。 如果孩子退出非零返回值 – 那么表示孩子有错误。 所以父母只是简单地closurespipe道描述符,然后继续前进而不读取。 你认为这将成功完成孩子的情况下工作吗? 在阅读pipe道之前,父母是否有效地收获了孩子? 如果是,那么在传输中的数据会发生什么? 操作系统会安全地处理数据到达父目录?

在内核空间中,如何获得与ext4格式磁盘上的文件对应的物理地址

第一次在linux内核这里。 无论如何,我的问题是,如果你在这里: https://github.com/torvalds/linux/blob/master/fs/ext4/file.c#L360 您可以访问ext4_file_mmap函数中的这两个结构: struct file *file, struct vm_area_struct *vma 我正在改变dax模式的这个函数的实现,以便在你调用mmap的时候,页面表被完全填充(看看没有任何pagefaults给了我们多less好的性能)。 到目前为止,我已经完成了以下工作(假设我可以访问ext4_file_mmap可以访问的两个结构): // vm_area_struct defined in /include/linux/mm_types.h : 284 // file defined in /include/linux/fs.h : 848 loff_t file_size = file_inode(file)->i_size; unsigned long start_va = vma->vm_start; 现在,困难在这里。 如何获得与此文件关联的物理地址(块?不知道dax使用块)? 我花了几天的时间盯着linux的源代码,试图理解一些东西,而男孩我是成功的。 任何帮助,暗示,或build议非常感谢! 谢谢! 一些更新:当您在dax模式下dax文件时,您不会将任何内容提取到内存中。 该设备,在这种情况下PMEM,是字节地址,并给DDR的延迟,所以它直接访问(之间没有记忆)。 某些pte导致访问这个PMEM设备,而不是内存。

Linux C编程

这是我第一次在这里提出问题,所以我希望我不会犯任何错误…我做一个服务器端客户端程序,我有这个错误,当我运行客户端,我有“核心倾倒错误”。 我想我知道错误在哪里,但我不知道如何解决它。 我有2个结构: typedef struct { int pid; int cmd; //1 -login,2-registrar,3-tecla char login[100]; char pw[100]; int tecla; } PEDIDO; typedef struct { int cmd; int res; BONECO *b; } RESPOSTA; 服务器通过命名pipe道向客户端发送数据时的代码: int main(int argc, char *argv[], char *envp[]){ //… i = read(fd, &p, sizeof (p)); printf(">>> Li %d bytes\n", i); printf("User : %s PID […]

使用xargs启动并行networking任务,同时最小化上下文切换开销

我想要并行运行100个networking(非CPU密集型)工作,并且想要了解最佳方法。 特别是有可能使用xargs运行100多个作业,有什么缺点? 我知道有一点,有更多的上下文切换,然后实际的数据包处理。 如何理解这一点在哪里以及最小化它的最好方法是什么? 例如,是否有更好的工具来使用其他的xargs等?

打印fifo内容并退出

我需要将fifo(命名pipe道)的内容打印到标准输出。 我可以使用这个命令: cat fifo 问题是, cat不会返回。 它一直在运行,等待来自fifo的更多内容。 但是我知道那里不会有更多的内容来一段时间,所以我只是想打印什么可用。 有没有一个命令,只是打印可用的内容并退出? 编辑: 在fifo的一端,有一个过程不时地写出不同命令的输出。 该过程永久运行,所以不会是一个EOF。

运行“无限堆栈”大小的应用程序的效果是什么?

我inheritance了一些我需要维护的代码,有时候可能不稳定。 以前的人不再可以查询为什么他们在无限的堆栈设置的环境中运行应用程序,我很好奇这可能是什么效果? 应用程序似乎有一些不可预知的内存错误,我们无法find并在Valgrind下运行该应用程序不是一个选项,因为它减慢了应用程序的下降,我们实际上不能运行它。 所以任何想法,这可能是什么效果,赞赏。