1.内存映射的好处:
1.1内存不满4G,可以硬盘中的一部分来当作内存使用,进程获得4G的虚拟地址
1.2操作系统都划分为系统空间和用户空间,使用虚拟地址可以很好的保护内核空间不被用户空间破坏
1.3操作系统分为用户态和内核态,用户态是不能直接和物理设备打交道的,如果想把硬盘的一块区域读到用户态,则需要两次拷贝(硬盘->内核->用户),但是内存映射的设计只需要发生一次的拷贝,大大的提高了读取数据的效率(不需要经过内核态传递)
2.MMU
MMU(Memory Management Unit),内存管理单元,主要负责CPU内存访问的时候将虚拟地址转换为物理地址的单元。也就是说CPU想要访问内存必须先经过MMU的转换,获得真正的物理地址,才能读写物理内存的数据。其实MMU只是一个简单的计算单元,它通过虚拟地址查找页表,找到对应的物理地址,然后返回给CPU。
Linux的页表是四级的,因此需要查询四次页表,每一次查询都会获得一个物理地址指向下一级页表的内存地址,知道最后获得实际要访问的内存物理地址
3.内存映射:
mmap本身其实是一个很简单的操作,在进程的页表中添加一个页表项,该页表项是物理内存的地址。调用mmap的时候,内核会在改进程的虚拟空间的映射区域查找一块满足需求的空间用于映射该文件
munmap:系统提供了一个munmap的接口去解除指定地址的映射关系。munmap主要的功能是清除页表项,解除这个映射关系,但是这个过程中会涉及到缓存的刷新,虚拟内存vm的删除,TLB的一致性(tlb shootdown操作)
4.动态库与静态库:
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
4.1 静态函数库
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
总结一句话就是:使用静态库编译后的执行程序是不需要其他函数库支持的,但是当他改变时,那么你的程序也要改变!
4.2动态函数库
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
一句话总结:你的执行程序用到此函数库时才会去调用它,但是你要把他引用到你的程序里面才行!
4.3相同点
都是由*.o目标文件生成
5.内部总线、系统总线、外部总线
5.1内部总线:在CPU内部,寄存器之间和算术逻辑部件ALU与控制部件之间传输数据所用的总线称为片内总线(即芯片内部的总线)。
5.2系统总线:又称内总线或板级总线,是微机中各插件板与系统板之间的总线,用于插件板一级的互联。因为该总线是用来连接微机各功能部件而构成一个完整微机系统的,所以称之为系统总线。人们平常所说的微机总线就是指系统总线,如ISA总线、PCI总线等。
5.3外部总线:是计算机和外部设备之间的总线
6.fork/join并行计算框架
6.1Fork就是一个不断分枝的过程,在当前任务的基础上长出n多个子任务
6.2 Join是一个不断等待,获取任务执行结果的过程
如果一个应用能被分解成多个子任务,并且组合多个子任务的结果就能够获得最终的答案,那么这个应用就适合用 Fork/Join 模式来解决。其原理如下图。