day16(linux虚拟地址空间、请求分页、分段、段页式、虚拟内存好处、缺页中断、fork与vfork、写时复制、页表地址)
-
Linux虚拟地址空间
为了防止不同进程在同一时间在物理内存中运行而产生的物理内存争夺,采用了虚拟内存。
虚拟内存技术使得不同进程运行时,看到的是自己独自占有当前系统的4G资源。
所有进程共享一个物理内存,每个进程只需要把需要的虚拟内存映射并存储到物理内存上。
每个进程创建加载时,只是创建了虚拟内存布局,也就是初始化控制表中内存相关的链表,只是建立虚拟内存和磁盘文件之间的映射就好。
等运行到对应程序的时候,才通过缺页异常来拷贝数据。malloc等动态分配内存也只是做相应的设置,真正访问到该数据时才引发缺页异常。 -
请求分页系统、请求分段系统和请求段页式系统都是针对虚拟内存的,通过请求实现内存和外存的的信息置换。
-
虚拟内存的好处:
扩大了地址空间
内存保护,每个进程运行在自己的虚拟内存空间,互相不能干扰对方。还对特定的内存地址提供写保护,防止数据和代码被恶意修改。
公平内存分配,采用了虚拟内存后,每个进程相当有拥有同样大小的虚拟内存空间。
当进程通信的时候,可以采用虚拟内存共享的方式实现。
不同进程使用同一个代码时,比如库文件中的代码,物理内存可以只存储一份,不同进程只需要把自己的虚拟内存映射过去就可以了,节省内存。
虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待他的一部分读入内存时,CPU可以交给其他进程使用。在内存中就可以保留多个进程,系统的并发性得到提高。
代价:
虚拟内存的管理需要建立很多的数据结构,这些数据结构要占用额外的内存。
虚拟内存到物理内存的转换增加了指令的执行时间。
页面的换入换出需要磁盘I/O,很耗时间。
如果一页只有一部分数据,会浪费内存。
4. 缺页中断
在请求分页系统中,可以通过查询页表中的状态位来确定要访问的页表是否在内存中。当不 在的时候就会产生一次缺页中断。此时操作系统就会根据页表中的外存地址在外存中找到缺失的一页,将其调入内存。
过程:
保护CPU现场、分析中断原因、转入缺页中断程序中进行处理、恢复CPU现场继续执行。
与一般的硬件产生的中断有区别:
在指令执行期间产生和处理中断信息,一条指令在执行期间可能产生多次缺页中断,缺页中断返回是,执行产生中断的一条指令,而一般中断是返回执行下一条指令。
5. fork()与vfork()
当调用fork时,内核会把所有的内存数据结构复制一份,复制进程的页表项,然后把父进程的地址空间中的内容逐页的复制到子进程的地址空间。是非常耗时的。
vfork会挂起父进程直到子进程终止或运行一个新的可执行文件的映像。通过这样的方式,避免了地址空间的按页复制。在这个过程中父进程和子进程共享相同的地址空间和页表项。
vfork,只完成了一件事,复制内部的内核数据结构。因此子进程就不能修改地址空间中的任何内存。
6. Linux采用了写时复制,以减少fork时对父进程空间进程整体复制带来的开销。
如果进程从来就不需要修改资源,则不需要进行复制。惰性算法的好处就是他们尽量推迟代价高昂的操作,直到必要的时刻才会去执行。
在使用虚拟内存的情况下,写时复制是以页为基础进行的。所以,只要进程不修改他全部的地址空间,那么就不必复制整个地址空间。
fork和vfork的区别:
fork的子进程拷贝复制父进程的数据段和代码段,vfork的子进程和父进程共享数据段。
fork的父子进程执行次序不一定,vfork保证子进程先执行,调用exec或exit后父进程才可能被调度运行。
当需要改变共享数据段中的值,则拷贝父进程。
7. linux默认最大的句柄数是1024
8. 并发concurrency:宏观上看起来是两个程序同时在执行,比如在单核CPU的多任务时,微观上是两个程序指令交替的执行,在单个周期内只运行一个指令。只能提高效率,不能提高性能。
并行parallelism:严格物理上的同行运行,比如多核CPU,两个程序分别在两个核上运行,互不干扰。
9. MySQL的端口号
查看端口号的命令:show global variables like ‘port’,查看端口号,mysql默认端口号是3306.
sqlserver默认端口号为1433,oracle默认端口号为1521,DB2默认端口号为:5000,postgreSQL默认端口号5432。
修改端口号,编辑/etc/my.cnf文件。
10. 操作系统中的页表地址
页式内存管理,内存分成固定长度的一个个页片,操作系统为每一个进程维护一个虚拟到物理地址的一个映射。