Lane (通道设计)
- 不同类型的任务占有不同的通道位置, 一个通道可以存储多个任务
- 通道为总长31位的二进制码, 可用31位
位运算
&=
删除 二进制按位与=> 均为1则为1, 否则为0|=
添加 二进制按位或=> 有一个为1,则为1~
按位翻转 1=>0, 0=>1 ~0 = -1
-1的值 1111 1111 1111 1110
<<
按位左移,左端超出被清除, 右端补00b110
0b 代表二进制
二进制数值存储
- 符号位:表示数值的正负,1=> 正, 0=>负
- 补码:二进制形式的补数,支持计算机减法运算而诞生,计算机数值统一使用补码存储;
- 正数:补码=原码
- 负数:补码=[负数绝对值]原码(符号位不变)=> 取反 => +1
空通道
0b0000000000000000000000000000000
添加任务
- 使用
lanes << 1
与原通道进行运算,添加新任务 - 通道类型判断
lanes & ~LANETYPE
再与通道类型比对// LANETYPE :lanes设置的初始通道类型
// lanes : 传入的通道值
// 示例
const unblockedLanes = pendingLanes & ~suspendedLanes; // 取与
//比较
if (unblockedLanes !== NoLanes) {
nextLanes = getHighestPriorityLanes(unblockedLanes);
nextLanePriority = return_highestLanePriority;
}
获取任务
- 相应的获取任务的
index
, lanes >> index
获取到当前任务 - 获取最高优先级的通道
// 原码
function getHighestPriorityLane(lanes: Lanes) {
return lanes & -lanes;
}
/* 解析 */
let lanes = /* */0b0000000000000000000000000001110 //任务集合的当前通道
// 获取通道中的最右侧为1的任务, 任务的添加是通过左移,所以最右侧为最高优先级
-lanes =/* */0b1111111111111111111111111110010
lanes & -lanes = 0b0000000000000000000000000000010 //取与获得最右侧任务通道值
删除任务
//原码
export function removeLanes(set: Lanes, subset: Lanes | Lane): Lanes {
return set & ~subset;
}
/* 解析 */
let set = /* */0b0000000000000000000000000001110 //任务集合的当前通道
// subset =/* */0b0000000000000000000000000000100 // 要删除的任务通道值
~subset =/* */0b1111111111111111111111111111011 //取反
set & ~subset = 0b0000000000000000000000000001010 // 取与删除后的通道值