西维蜀黍

【Operating System】I/O - 同步、异步与阻塞、非阻塞I/O问题

软硬件层面的同步/异步

硬件

在现代操作系统中,I/O是一种与外围设备(peripherals)进行数据交换的方式,I/O包括读或写数据到磁盘/SSD中,或通过网络发送/接收数据,显示信息到显示器上,接收鼠标或键盘的输入。

因此,我们通常说的I/O,不仅仅只限于磁盘文件的读写。*nix将计算机抽象了一番,磁盘文件、硬件、套接字等几乎所有计算机资源都被抽象为了文件。

实现硬件层面异步的机制称为硬件中断(hardware interrupt)

在典型的硬件**同步(synchronous)**场景中,当CPU请求外围设备读取数据时,CPU会进入一个无限循环(infinite loop),在循环中CPU需要不断去检查外围设备是否已经将数据读取到了,这个过程称为轮询(poll)。

而在现代硬件中,当CPU向外围设备发送I/O请求后,就会立刻去执行其他CPU指令(而不是不断的轮询)。当外围设备将数据准备完成后,它会通过电路中断(circuit interrupt)向CPU发送一个信号(signal)。这就是典型的**硬件异步(asynchronous)**场景。因此,CPU就不再需要静静的等待且不断轮询直到外围设备将数据准备完成,因而大大的提高了CPU的利用率。

软件

操作系统作为一层中间件,抽象了硬件设备,向应用程序以系统调用(System Call)的形式提供I/O操作服务。

类似地,当应用程序(通过调用系统调用)发起一个I/O操作后,操作系统会调用对应的设备驱动(device driver)以操作硬件进行这个I/O操作。

对于这个应用程序来说,如果此时需要静静的等待(或者不断的轮询),直到数据被准备完成后,这就是软件层面的同步,这样的编程方式称之为同步编程(synchronous programming)

如果操作系统允许应用程序声明一个回调函数(callback),且当I/O操作完成后,操作系统会自动调用这个回调函数,这就是软件层面的异步,这样的编程方式称为异步编程(asynchronous programming)

  ...


【Node.js】Node.js 的 Event Loop 与异步 I/O

事件循环(Event Loop)

Node的执行模型称为事件循环(Event Loop)。在Node进程启动后,Node会用主线程来执行所有用户代码。当主线程对应的栈为空时(所有用户代码执行完毕了)Node会开始执行一个类似while(true)的事件循环(Event Loop)(从Node代码实现的角度来说,并不存在这样的while(true))。

  ...


【Linux】chmod/chown - Linux 文件/文件夹 权限

文件权限修改常用命令 - chmod

先上常用命令。

修改文件权限为可读可写可执行(777):

chmod 777 [文件或文件夹路径]

chmod 777 /var/home/userid/cc,此文件cc的权限就变为可读可写可执行(777)了。

修改文件夹及该文件夹内所有文件和子文件夹(包括子文件夹中的文件和文件夹)权限为可读可写可执行(777):

chmod -R 777 [文件或文件夹路径]

如可以看到test文件夹中包含2个文件和一个子文件夹(其中file2文件位于该子文件夹中):

使用 chmod -R 777 ./test后,这2个文件和这个子文件夹的权限都会变成可读可写可执行(777)。

chmod命令可用于改变文件或目录的访问权限。

该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。

  ...


【SQL】SQLite 命令

打开或创建一个SQLite3数据库

打开或创建一个SQLite3数据库,它叫做testDB.db

  ...


【SQL】常用 SQL 语句(Common SQL)

Note: 以下均以SQLite为例。

1 SQL Join 操作

Join 操作包括以下四种:

  • Inner Join(内连接):在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
  • Outer Join (外连接)
    • Left Join/Left Outer Join (左连接,左外连接):Left join(左连接)会从左表中返回所有的记录,即使某条记录在右表中没有与之匹配的行。
    • Right Join/Right Outer Join (右连接,右外连接):Right outer join(右连接)会返回右表中的所有记录,即使某条记录在左表中没有与之匹配的行。
    • FULL Join/FULL Outer Join (全连接,全外连接):只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
  • CROSS JOIN/ Cross Product/ Cartesian(笛卡尔积、交叉连接):CROSS JOIN 返回的结果为被连接的两个表的乘积。
  • Natural join(自然连接,R⋈S):自然连接(Natural join)是一种特殊的等值连接,要求两个关系表中进行比较的属性组必须是名称相同的属性组,并且在结果中把重复的属性列去掉(即:对名称相同的属性组只显示一列)。

1.1 Inner Join(内连接)

在表中存在至少一个匹配时,INNER JOIN 关键字返回行。

  ...