小编jan*_*ust的帖子

/ proc/[pid]/pagemaps和/ proc/[pid]/maps | Linux的

我试图了解标题中提到的两个文件.我抬头看了些什么东西; 但是,我无法理解如何从中提取有用的信息(或者我只是以错误的方式接近它).

让我解释一下:页面映射是一个相当新的"特征"伪文件,它包含分配给当前[pid]的虚拟页面的物理帧信息.也就是说,给定一个从地址x开始的虚拟页面,比如用于虚拟地址开始的'vas',我可以使用vas索引页面映射文件以获得映射的物理页面帧的64位.这些位包含有关该虚拟页面的信息.然而,当我提取位并进行一些移动时,我迷失了我所看到的东西.

这些位表示如下:0-54是页面帧号,55-60是页面移位,第63位是当前位,还有其他位对我不感兴趣.在我使用/ proc/[pid]/maps中的vas地址进行一些映射之后,似乎几乎每个进程的页面都被交换,即第63位始终为零.:(

我想问题是,如何有效地使用页面地图获取/ proc/[pid]/maps给出的地址的等效物理地址

公平地说,我发布了一个类似的问题,但几天前的方法有点不同.

如果有人能够对这个问题有所了解,我将非常感激.

===编辑===

要解决以下评论:我正在从/ proc/[pid]/maps读取一行,其行如下所示:

00400000-00401000 r-xp 00000000 08:01 8915461/home/janjust/my_programs/shared_mem 7ffffef1b000-7ffffef3c000 rw -p 00000000 00:00 0 [stack]

然后我将提取它接触的虚拟页面的数量并索引二进制文件/ proc/[pid]/pagemaps,并且对于每个虚拟页面,我可以提取它分配给它的物理页面.

输出如下:

00400000-00401000 r-xp 00000000 08:01 8915461/home/janjust/my_programs/shared_mem num_pages:1:86000000001464C6

虚拟范围中每个虚拟页面的一个物理地址.

读取行和提取物理地址的代码是:

74     /* process /proc/pid/maps, by line*/
75     while(fgets(line, 256, in_map) != NULL){
76         unsigned long vas;
77         unsigned long vae;
78         int num_pages;
79 
80         //print line
81         printf("%s", line);
82 
83         /*scan for the virtual addresses*/
84         n = sscanf(line, "%lX-%lX", &vas, &vae);
85 …
Run Code Online (Sandbox Code Playgroud)

c linux memory-management linux-kernel

13
推荐指数
2
解决办法
8519
查看次数

使用gui-support安装vim Mac OS X.


我有Mac Pro,OS X 10.9.4(无法升级到Yosemite),我正在尝试使用gui-support构建vim7.4,或者获得任何类型的gui支持.我现在的vim是版本7.3,我猜,这是macs附带的默认vim.我有Terminal.appiTerm2.app,我的vim rc有默认值

set term=xterm-256colors
Run Code Online (Sandbox Code Playgroud)

或者你有什么.

到目前为止我所拥有的:

macvim
Run Code Online (Sandbox Code Playgroud)

颜色看起来很棒,基本上它与我在ubuntu系统上的设置相同,但它打开一个新窗口真的很烦人.有没有办法让它在我的终端内打开?(不是从终端启动它,在里面打开)

正如我所说,我有常规的vim7.3虽然我可以使用颜色方案,但与我的ubuntu系统相比,它们看起来像垃圾.我想这必须归功于gui-support选项?我试过,CSApprox,但这给了我一个奇怪的错误.

所以我决定简单地构建vim 7.4并启用gui支持,但是我得到了随机错误.
我的基本配置看起来像:

./configure --enable-gui=yes
make
Run Code Online (Sandbox Code Playgroud)

在这一点上它抱怨丢失头文件等,我认为这应该不那么难.

有小费吗?

我正在尝试做的基础是:

有一个安装了gui支持的vim版本,或者我的颜色全部搞砸了.

谢谢!

macos vim macvim

6
推荐指数
2
解决办法
1万
查看次数

推测条件执行C/C++

所以我与一位同事讨论了评估执行的顺序.考虑这个条件:

if (a > b && ref++) { do something }
Run Code Online (Sandbox Code Playgroud)

我们都同意按照C标准,订单是从左到右.然而,不同意的是,尽管评估顺序,但是最终将评估其数据的一些指令可以被推测性地执行,然后尽管进行了惰性评估,仍然保持在该状态.

例如,ref在评估之前递增a > b,并且评估仍然从左到右发生,这是jump greater than两者的实际指令,a > b并且rev > 0从左到右按顺序执行,并且在第一个实例时放弃!true.现在这违背了懒惰评估的整个概念,但如果ref是指令流,内联函数可能会如此.开始以推测方式执行某些指令会更有意义.关注的是:这些指令是否已经提交,甚至是中途通过.

思考?

c conditional if-statement

6
推荐指数
1
解决办法
156
查看次数

C++正确用法,这个指针

可能重复:
我什么时候应该明确使用this指针?

我想知道"this"指针的正确用法.

我见过有人创建了一个类构造函数,其中传递的参数传递给名为'data'的传递变量.但是他有一个名为'data'的私有成员变量,因此他只使用了:

this->data = data;

本来可以简单地使用

data = data_in

(如果参数名为data_in),则无需调用"this"指针并引用成员类型.

现在我想知道,这是正确的用法吗?使用this->member以减少对命名的复杂性?我的意思是它有效,我看到它完成了预期但我想知道你是否有些更有经验的C++男女可以说一两句话,如果这是常见的做法?

此外,出于好奇,我已经检测了代码只是为了看看幕后发生了什么,似乎无论如何都会调用"this"指针.我猜这是对类对象的引用无论如何都是这样做的.

c++ this

4
推荐指数
1
解决办法
3632
查看次数

文件IO性能C.


我有一个关于文件IO(C语言)及其性能问题的问题.

我有一个应用程序可以执行大量的文件I/O(在其生命周期内~3-6小时,大约0.5-0.75TB,主要是文件输出).目前,我的应用程序将sprintf()所有内容放入char字符串中,并在行write()s 的末尾,放入file_descriptor.我的字符串长度为1024个字符,但可以在64到1024之间变化.无论如何.

问题是: 在做之前做
一个更大的字符串(比如说1MB?)以及其中的sprintf()所有内容会更有意义write()吗?或者是否更有意义地sprintf()完全跳过并简单地write()直接跳到文件,假设缓冲是由照顾的write()

我想到的东西,但不确定它是否真的会在性能方面实现任何目标:
如果我有一个结构,我存储字符串的各个部分,数字和字符串,然后对结构进行mem_copy,该怎么办?我猜是类似于二进制写?

我正在尝试实现"缓冲"方法或任何可以最大化性能的方法.后者是我需要使用该文件进行进一步处理.有什么建议?

编辑
我做了一些简单的性能对比printf(); + redirsprintf(); write();
我简单地复制〜20GB的文件.

char string[1024];

for(i=0;i<(1<<20)*20;i++)
  printf("%s",string);

~/tmp/tests$ time ./printf.out > testing
real   2m22.101s
user   0m28.214s
sys    0m29.294s
Run Code Online (Sandbox Code Playgroud)

而不是:

char string14[256]; ...etc
for(i=0;1<<(1<<20)*20;i++){
  sprintf(dst_string,"%s%s",dst_string, string14);
  sprintf(dst_string,"%s%s",dst_string, string24);
  sprintf(dst_string,"%s%s",dst_string, string34);
  sprintf(dst_string,"%s%s",dst_string, string44);
  write(fd, dst_string, 1024);
}

~/tmp/tests$ time ./write.out 

real   1m48.206s
user   0m58.544s
sys    0m41.079s
Run Code Online (Sandbox Code Playgroud)

多个sprintf()的原因是模拟copy-> buffer然后写入缓冲区.时间(实际上无论如何)并不像某些评论所暗示的那样微不足道.虽然这是一个简单的例子,也许在计算方案+ IO可能不会.

我在printf示例中有点困惑的事情,那个额外的时间去了哪里?用户+系统不加起来真的,难道他们至少不应该在球场上吗?因为整个1:30m缺失了.

该测试是否显示任何结论?sprintf + write>只需打印+ …

c io

4
推荐指数
1
解决办法
926
查看次数

标签 统计

c ×3

c++ ×1

conditional ×1

if-statement ×1

io ×1

linux ×1

linux-kernel ×1

macos ×1

macvim ×1

memory-management ×1

this ×1

vim ×1