Embryo!

进程模块 —— 雏形

在确定好设计理念之后,我们就需要来具体实现 OS 的进程系统了。我希望它作为一个模块挂载到 OS 下,这样抽象成模块存在,就可以易于安装、分离与运行。

既然它作为一个独立模块存在,那么它对主 AI 应当只暴露一些公开的接口,所以首先,我们需要设计它暴露的公开接口是什么。这样,即便后来我们换了或者是优化了具体的实现细节,只要公开的接口相同,其他的代码就不用跟着更换。

在此之前,需要先定义一些之前公开的涉及到的类型和常量:

/**
 * 公开的原子函数返回值
 */

/** 下一次执行时, 仍然从当前原子函数重复执行 */
export const OK_STOP_CURRENT = "ok_stop_current"
/** 下一次执行时, 从当前原子函数下一条继续执行 */
export const OK_STOP_NEXT = "ok_stop_next"
/** 下一次执行时, 从指定 Tag 开始继续执行 */
export const OK_STOP_CUSTOM = "ok_stop_custom"
/** 错误, 在下一 tick 重启运行该进程 */
export const STOP_ERR = "stop_err"

/**
 * 特殊的原子函数返回值
 */

/** 阻塞进程 */
const STOP_STUCK = "stop_stuck"

/** 普通原子函数返回值 */
type AtomicFuncReturnCode = OK | typeof OK_STOP_CURRENT | typeof OK_STOP_NEXT | [typeof OK_STOP_CUSTOM, string] | [typeof STOP_ERR, string]
/** 可阻塞的原子函数返回值 */
type StuckableAtomicFuncReturnCode = OK | typeof STOP_STUCK

/**
 * 原子函数定义
 */

/** 原子函数 */
type AtomicFunc = () => AtomicFuncReturnCode | StuckableAtomicFuncReturnCode
/** Tag + 原子函数 */
type AtomicFuncWithTag = [string, AtomicFunc]
/** 条件跳转: "JUMP" + 条件 + Tag */
type AtomicJump = ["JUMP", () => boolean, string]

/** 原子函数描述器, 用于构建进程时 */
type AtomicFuncDescriptor = (AtomicFunc | AtomicFuncWithTag | AtomicJump)[]

现在还没涉及到阻塞的锁、信号量和管程,所以暂且不写,留待以后补充。

接下来,我们需要在进程模块主文件内部来具体定义:

在之后, 锁、信号量和管程会作为进程模块的子模块附加在内。因为他们需要访问进程的私有属性和方法。

📃 Interface 模块内部实现

在 Interface 模块内部,我们需要实现一些私有属性和方法。

锁的实现是进程同步机制中最简单的一个。它只需要实现acquirerelease 两个方法。

但是因为这牵涉到进程的阻塞与唤醒,所以它不能作为一个独立模块存在,而是作为进程模块的子模块存在。

首先,我们定义锁类实体。

接下来,我们需要定义锁模块的接口,并加到进程模块中去。

triangle-exclamation
circle-exclamation

在进程模块中加入管理锁的部分:

Okay,到目前为止,我们的进程模型大略已经完成了,下面需要一些简单的测试。

🚥 信号集的实现

信号集需要实现SwaitSsignal 。而信号集依赖于信号量。实际上,我们只要实现了一个个的信号量,就可以实现信号集。

但是因为这牵涉到进程的阻塞与唤醒,所以它不能作为一个独立模块存在,而是作为进程模块的子模块存在。

首先我们定义信号量类:

接下来,我们需要定义信号量模块的接口,并加到进程模块中去。

triangle-exclamation
circle-exclamation

接下来,我们在进程模块中具体添加信号量子模块:

信号集的实现十分关键,我们后边资源管理模块也要依赖信号集来实现。

Last updated