速写几点linux方面的感悟

晚饭后看了remap_file_pages,这个函数主要就是将一个文件的任何位置映射进任何一个vma(稍微有点限制)的任何地方,man手册上说的很清楚:

The remap_file_pages() system call is used to create a non-linear mapping, that is, a mapping in which the pages of the file are mapped into a non-sequential order in memory. The advantage of using remap_file_pages() over using repeated calls to mmap(2) is that the former approach does not require the kernel to create additional VMA (Virtual Memory Area) data structures. To create a non-linear mapping we perform the following steps:

1. Use mmap() to create a mapping (which is initially linear). This mapping must be created with the MAP_SHARED flag.

2. Use one or more calls to remap_file_pages() to rearrange the correspondence between the pages of the mapping and the pages of the file. It is possible to map the same page of a file into multiple locations within the mapped region.

是的,节省了vma,这又是一种复用,vma的复用,实际上应该是vma的重用,文件和vma之间明显看出了两个层次,文档上说这是非线性映射,实际上我觉得这个说法不对,有啥非线性的,难道文件映射就一定要是线性的吗?文件就一定要在vma中保持文件中的顺序吗?我觉得不必非得这样,既然映射了,vma接口就不应该知道文件的任何信息,我认为文件在vma的线性的映射仅仅是为了高效而又方便罢了,按照理论没有必要这样的。我们在缺页中断中可以看到,为了这一种所谓的非线性映射,特意保持了一个独立的缺页函数,而且内核中为这个机制提供了一个半复杂的操作,其中就包括我在很早以前写的一篇文章《关于pgoff_to_pte宏》,理论上没有必要这么复杂,但是linux确实总是靠这种美中不足做到了高效。

昨晚本来想写一篇关于指令级并行的文章的,可是看书太久了,完了一看表就十二点多了,结果还是将思想吞咽到了肚子里,早上醒来什么都忘了,郁闷啊,不过还是写几笔。冯诺依曼机器上的程序本质上就是串行的,指令的执行顺序具有偏序性,并且在动态上唯一的由pc寄存器决定,即使指令并行了,最终还是要将这些并行的结果串行起来的,最终必然有一个瓶颈,指令级的并行就好像两头尖中间大的通道,指令级并行度越高,中间越大,然而两头却永远都不会变大,于是想提高处理器性能必须设置多个冯诺依曼式的串行执行绪,这就是线程级的并行,于是就有了超线程式的cpu,当然在非IA架构上可能不叫超线程。

处理器当然性能越高越好,超线程只是处理器发展的一条线罢了,可惜这条线最终被证明是一条死胡同,以前根本就没有什么多cpu的概念,在单cpu中,通过一横一纵两个线索提高cpu性能,一横就是超标量,一纵就是超流水线,其实这是很显然的,要想使覆盖体积大,就必须在多个维度拉伸,记住V=l*w*h,流水线技术是个古老的技术,在芯片技术上,越细的流水线使得每一级开闭的电路越少从而实现简单,这样就提高了cpu的频率,指令执行的吞吐率增加了,在横向上,超标量技术使得一个时钟周期可以发射多条指令,注意这些指令还是一个线程的,因为其寄存器上下文是一致的,后来才有了超标量这个线程级的并行,至此,一个单独的物理芯片的性能已经发展到了极限,于是便有了多处理器技术,大致分为SMP和CMT,后者占了上风,这个事导致了超线程其实只是一个过渡技术和过度产品,多个cpu核心比多个逻辑cpu可以更好的共享缓存,但是趣却不用由于共享执行逻辑而导致频繁冲突。cmt要求程序按照并行的方式进行开发,昨晚看新技术有“帮手线程”和“线程级猜测”,都是很吸引人的技术,可是老婆又在催着睡了,唉..

你可能感兴趣的:(linux,File,System,文档,产品)