摘要:
I/O操作和DMA、RDMA 用户进程想要执行IO操作时(例如想要读磁盘数据、向磁盘写数据、读键盘的输入等等),由于用户进程工作在用户模式下,它没有执行这些操作的权限,只能通过发起对应的系统调用请求操作系统帮忙完成这些操作。这里因为系统调用产生中断将陷入到内核,进行一次上下文切换操作。 内核进程帮忙 阅读全文
摘要:
两个缓冲空间:kernel buffer和io buffer 先看一张图,稍后将围绕这张图展开描述。图中的fd table、open file table以及两个inode table都可以不用理解,只需要知道它们体现出来的文件描述符和磁盘文件之间的对应关系:文件描述符fd(例如图中的fd=3)是对 阅读全文
摘要:
OOM和swap分区 进程的虚拟内存空间是映射到整个物理内存空间的,所以在进程自身看来它拥有了整个物理内存,它也能使用整个物理内存,只需在使用的时候请求操作系统帮忙分配更多空间即可。 但是,操作系统上并非只运行了一个进程,如果一个进程无休止的申请物理内存空间,最终会导致物理内存耗尽或即将耗尽,使得操 阅读全文
摘要:
页翻译:快速地址转换 虽然操作系统通过页表也能将虚拟页翻译成内存中对应的页帧,但是它仍然很慢。另一方面,如果访问每个页都需要操作系统来参与帮忙翻译,这会频繁陷入内核,效率是非常低的。所以,这里再次将任务交给硬件CPU去做。 提示:操作系统将底层任务交给硬件提高效率 前文介绍段的虚拟地址翻译,以及这里 阅读全文
摘要:
分页和页表 除了分段,空间管理的第二种常见方式是分页。 Linux将虚拟内存划分成固定大小的页(Linux中的页大小是4KB),并且以页作为操作内存的最小单元。例如一次性读取一页,虚拟内存中的页称为虚拟页。对应的,物理内存也会划分成固定大小的页来管理,称为物理页,也常称为页框或页帧(page fra 阅读全文
摘要:
栈空间:用户栈和内核栈 程序的执行流程 进程其实都是在执行任务,而任务其实就是函数定义的(函数也称为方法、子程序等,本质都一样),所以进程的作用就是不断的执行函数。程序启动时,第一个要执行的函数是main()函数(有些语言隐藏了这个函数,但任何程序一定会有一个程序入口函数),然后在main()函数中 阅读全文
摘要:
进程的地址空间布局:分段 Linux的虚拟地址空间采用“分段+分页”结合的方式实现。先看分段,之后再介绍分页。 分段是将内存划分成各个段落(Segment),每个段落的长度可以不同,且虚拟地址空间中未使用的空间不会映射到物理内存中,所以操作系统不会为这段空间分配物理内存。这样的话,内核为刚创建的进程 阅读全文
摘要:
资源隔离:虚拟内存 前面描述的所有操作系统基础知识都是进程和CPU资源相关的内容,另一个操作系统中和进程相关的比较重要的话题是内存资源。 操作系统主要目的是执行程序,而程序在执行时,程序自身以及程序所访问的数据、所产生的数据都在内存里(至少所有数据的流向都会经过内存)。此外,现代操作系统可以同时运行 阅读全文
摘要:
CPU的归属:Idle进程 操作系统并不总是繁忙。例如个人PC上任务比较轻,多数时候都无法充分利用CPU,导致CPU处于空闲状态。但CPU既然通电了,它就得运行,那么在它没有任务需要执行的时候,CPU在干嘛呢? 操作系统提供了一个称为idle的进程(也可能idle处于某个永不退出的内核式进程内,而不 阅读全文
摘要:
操作系统的服务端口:系统调用 用户进程工作在用户态,它是受限的,很多涉及到硬件的操作都无法执行,但是它们又想要取得结果,就只能请求工作在内核态的操作系统帮助完成这些操作,并将操作结果交给用户进程。 系统调用(system call)就是操作系统提供给用户进程请求操作系统做一些特权操作的接口,即为用户 阅读全文