# 零、核心概念

# 一次 IO

  • 拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目的是把它读取到内存中。可以把这个步骤简化成把数据从硬件(硬盘)中读取到用户空间中。

两个阶段:

  1. 调用操作系统的 read 方法,并开始阻塞等待,等待数据准备好,此时数据正在拷贝到内核缓冲区。
  2. 将数据从内核缓冲区拷贝到应用进程,应用进程进行处理。

# 同步/异步

(从被调用方的角度来看👀

  • 如果被调用方被调用之后需要立刻返回结果,那么就是同步的。
  • 如果被调用方被调用之后先返回一个空的结果,等到任务执行完成后再通知调用方,那就是异步的。

# 阻塞/非阻塞

👀 从调用方的角度来看)

  • 如果调用方在被调用方返回结果之前只能傻傻等待,那就是阻塞的。
  • 如果调用方在被调用方返回结果之前可以先干别的事情,那就是非阻塞的。

同步和异步的区别:是否开启新线程。

阻塞和非阻塞的区别:当前线程是否挂起,即是否释放 CPU。

# 用户空间/内核空间

现在操作系统都是采用虚拟存储器,那么对 32 位操作系统而言,它的寻址空间(虚拟存储空间)为 4 G(2 的 32 次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对 linux 操作系统而言,将最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF),供内核使用,称为内核空间,而将较低的 3G 字节(从虚拟地址 0x00000000 到 0xBFFFFFFF),供各个进程使用,称为用户空间。

# 进程切换

为了控制进程的执行,内核必须有能力挂起正在 CPU 上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。

从一个进程的运行转到另一个进程上运行,这个过程中经过下面这些变化:

  1. 保存 CPU 上下文,包括程序计数器和其他寄存器。
  2. 更新 PCB 信息。
  3. 把进程的 PCB 移入相应的队列,如就绪、在某事件阻塞等队列。
  4. 选择另一个进程执行,并更新其 PCB。
  5. 更新内存管理的数据结构。
  6. 恢复 CPU 上下文。

总而言之就是很耗资源

# 文件操作符 fd

文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于 UNIX、Linux 这样的操作系统。

以下参考:《漫话:如何给女朋友解释什么是Linux的五种IO模型?》 (opens new window)

上次更新: 9/24/2021, 10:39:36 AM