操作系统相关知识整理(三)

用户模式和内核模式

处理器必须提供一种机制,限制一个应用可以执行的指令以及它可以访问的地址空间范围。处理器通常是用某个控制寄存器中的一个模式位(mode bit)来提供这种功能的,该寄存器描述了进程当前享有的特权。

设置了模式位:进程就运行在内核模式中,一个运行在内核模式的进程 可以执行指令集中任何指令,并且 可以访问系统中的任何内存位置。
没有设置模式位:进程就运行在用户模式中,用户模式中的进程 不允许执行特权指令,也不允许访问地址空间内内核区的代码和数据。
用户程序必须通过系统调用间接地访问内核代码和数据。
用户态和内核态的切换:
○1 系统调用
○2 异常(缺页异常)
○3 外围设备的终中断

同步IO,异步IO,阻塞IO,非阻塞IO

同步 IO 和异步 IO 的区别就在于: 数据拷贝的时候进程是否阻塞!
塞 阻塞 IO 和非阻塞 IO 的区别就在于:应用程序的调用是否立即返回!

并发和并行

并发: 指应用能够交替执行不同的任务。
并行 : 指应用能够同时执行不同的任务。

Linux打开文件,文件描述符

内核对所有打开的文件的文件维护有一个系统级的描述符表格(open file descriptiontable)。有时,也称之为打开文件表(open file table),并将表格中各条目称为打开文件句柄(open file handle)。一个打开文件句柄存储了与一个打开文件相关的全部信息,如下所示:
1. 当前文件偏移量(调用 read()和 write()时更新,或使用 lseek()直接修改)
2. 打开文件时所使用的状态标识(即,open()的 flags 参数)
3. 文件访问模式(如调用 open()时所设置的只读模式、只写模式或读写模式)
4. 与信号驱动相关的设置
5. 对该文件 i-node 对象的引用
6. 文件类型(例如:常规文件、套接字或 FIFO)和访问权限

7. 一个指针,指向该文件所持有的锁列表
8. 文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳

内核为所有打开文件维护一张文件表项,每个文件表项包含内容可以由以上结构体看出,其中比较重要的内容有:

a. 文件状态(读 写 添写 同步 非阻塞等)

b. 当前文件偏移量

c. 指向该文件i节点(i节点)的指针

d. 指向该文件操作的指针(file_operations )

操作系统相关知识整理(三)

mmap内存映射

linux 提供了内存映射函数 mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改

mmap 返回的是用户进程空间的虚拟地址,在 stack 和 heap 之间的空闲逻辑空间( 虚拟空间) 就是用来提供映射的,文件将会被映射到这一区域的某块虚拟内存上,具体哪一块若是用户没有指定,则由内核来分配。

1 、共享内存: 可以说是最有用的进程间通信方式,也是最快的 IPC 形式。

2 、文件访问方式:mmap 函数是 unix/linux 下的系统调用,mmap 系统调用并不是完全为了用于共享内存而设计的。 它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。