做跨境电商的网站,WordPress域名授权破解,做网站需要懂什么,wordpress 泛解析往期知识点记录#xff1a; 鸿蒙#xff08;HarmonyOS#xff09;应用层开发#xff08;北向#xff09;知识点汇总 鸿蒙#xff08;OpenHarmony#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核#xff08;LiteOS-M#xff09; 轻量系统内核#…往期知识点记录 鸿蒙HarmonyOS应用层开发北向知识点汇总 鸿蒙OpenHarmony南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核LiteOS-M 轻量系统内核LiteOS-M【中断管理】 轻量系统内核LiteOS-M【任务管理】 轻量系统内核LiteOS-M【内存管理】 轻量系统内核LiteOS-M【内核通信机制】 轻量系统内核LiteOS-M【时间管理】 轻量系统内核LiteOS-M【扩展组件】 轻量系统内核LiteOS-M【内存调测】 轻量系统内核LiteOS-M【异常调测】 轻量系统内核LiteOS-M【Trace调测】 轻量系统内核LiteOS-M【LMS调测】 轻量系统内核LiteOS-M【SHELL】 小型系统内核LiteOS-A【概述】 小型系统内核LiteOS-A【内核启动】 小型系统内核LiteOS-A【中断及异常处理】 标准系统内核Linux【New IP内核协议栈】 标准系统内核Linux【内核增强特性 任务调度】 持续更新中……
读写锁
基本概念
读写锁与互斥锁类似可用来同步同一进程中的各个任务但与互斥锁不同的是其允许多个读操作并发重入而写操作互斥。
相对于互斥锁的开锁或闭锁状态读写锁有三种状态读模式下的锁写模式下的锁无锁。
读写锁的使用规则 保护区无写模式下的锁任何任务均可以为其增加读模式下的锁。 保护区处于无锁状态下才可增加写模式下的锁。
多任务环境下往往存在多个任务访问同一共享资源的应用场景读模式下的锁以共享状态对保护区访问而写模式下的锁可被用于对共享资源的保护从而实现独占式访问。
这种共享-独占的方式非常适合多任务中读数据频率远大于写数据频率的应用中提高应用多任务并发度。
运行机制
相较于互斥锁读写锁如何实现读模式下的锁及写模式下的锁来控制多任务的读写访问呢 若A任务首次获取了写模式下的锁有其他任务来获取或尝试获取读模式下的锁均无法再上锁。 若A任务获取了读模式下的锁当有任务来获取或尝试获取读模式下的锁时读写锁计数均加一。
开发指导
接口说明
表1 读写锁模块接口
功能分类接口描述读写锁的创建和删除- LOS_RwlockInit创建读写锁- LOS_RwlockDestroy删除指定的读写锁读模式下的锁的申请- LOS_RwlockRdLock申请指定的读模式下的锁- LOS_RwlockTryRdLock尝试申请指定的读模式下的锁写模式下的锁的申请- LOS_RwlockWrLock申请指定的写模式下的锁- LOS_RwlockTryWrLock尝试申请指定的写模式下的锁读写锁的释放LOS_RwlockUnLock释放指定读写锁读写锁有效性判断LOS_RwlockIsValid判断读写锁有效性
开发流程
读写锁典型场景的开发流程 创建读写锁LOS_RwlockInit。 申请读模式下的锁LOS_RwlockRdLock或写模式下的锁LOS_RwlockWrLock。
申请读模式下的锁
* 若无人持有锁读任务可获得锁。
* 若有人持有锁读任务可获得锁读取顺序按照任务优先级。
* 若有人非自己持有写模式下的锁则当前任务无法获得锁直到写模式下的锁释放。申请写模式下的锁
* 若该锁当前没有任务持有或者持有该读模式下的锁的任务和申请该锁的任务为同一个任务则申请成功可立即获得写模式下的锁。
* 若该锁当前已经存在读模式下的锁且读取任务优先级较高则当前任务挂起直到读模式下的锁释放。3.申请读模式下的锁和写模式下的锁均有三种无阻塞模式、永久阻塞模式、定时阻塞模式区别在于挂起任务的时间。
4.释放读写锁LOS_RwlockUnLock。 如果有任务阻塞于指定读写锁则唤醒被阻塞任务中优先级高的该任务进入就绪态并进行任务调度 如果没有任务阻塞于指定读写锁则读写锁释放成功。
删除读写锁LOS_RwlockDestroy。 说明 读写锁不能在中断服务程序中使用。 LiteOS-A内核作为实时操作系统需要保证任务调度的实时性尽量避免任务的长时间阻塞因此在获得读写锁之后应该尽快释放该锁。 持有读写锁的过程中不得再调用LOS_TaskPriSet等接口更改持有读写锁任务的优先级 用户态快速互斥锁
基本概念
Futex(Fast userspace mutex用户态快速互斥锁)是内核提供的一种系统调用能力通常作为基础组件与用户态的相关锁逻辑结合组成用户态锁是一种用户态与内核态共同作用的锁例如用户态mutex锁、barrier与cond同步锁、读写锁。其用户态部分负责锁逻辑内核态部分负责锁调度。
当用户态线程请求锁时先在用户态进行锁状态的判断维护若此时不产生锁的竞争则直接在用户态进行上锁返回反之则需要进行线程的挂起操作通过Futex系统调用请求内核介入来挂起线程并维护阻塞队列。
当用户态线程释放锁时先在用户态进行锁状态的判断维护若此时没有其他线程被该锁阻塞则直接在用户态进行解锁返回反之则需要进行阻塞线程的唤醒操作通过Futex系统调用请求内核介入来唤醒阻塞队列中的线程。
运行机制
当用户态产生锁的竞争或释放需要进行相关线程的调度操作时会触发Futex系统调用进入内核此时会将用户态锁的地址传入内核并在内核的Futex中以锁地址来区分用户态的每一把锁因为用户态可用虚拟地址空间为1GiB为了便于查找、管理内核Futex采用哈希桶来存放用户态传入的锁。
当前哈希桶共有80个0-63号桶用于存放私有锁以虚拟地址进行哈希64-79号桶用于存放共享锁以物理地址进行哈希私有/共享属性通过用户态锁的初始化以及Futex系统调用入参确定。
如下图所示每个futex哈希桶中存放被futex_list串联起来的哈希值相同的futex node每个futex node对应一个被挂起的tasknode中key值唯一标识一把用户态锁具有相同key值的node被queue_list串联起来表示被同一把锁阻塞的task队列。
图1 Futex设计图 Futex操作
Futex模块接口
Futex模块支持以下三种操作
功能分类接口名称描述设置线程等待OsFutexWait向Futex表中插入代表被阻塞的线程的node唤醒被阻塞线程OsFutexWake唤醒一个被指定锁阻塞的线程调整锁的地址OsFutexRequeue调整指定锁在Futex表中的位置 说明 Futex系统调用通常与用户态逻辑共同组成用户态锁故推荐使用用户态POSIX接口的锁。 信号
基本概念
信号(signal)是一种常用的进程间异步通信机制用软件的方式模拟中断信号当一个进程需要传递信息给另一个进程时则会发送一个信号给内核再由内核将信号传递至指定进程而指定进程不必进行等待信号的动作。
运行机制
信号的运作流程分为三个部分如表1
表1 信号的运作流程及相关接口用户态接口
功能分类接口名称描述注册信号回调函数signal注册信号总入口及注册和去注册某信号的回调函数。注册信号回调函数sigaction功能同signal但增加了信号发送相关的配置选项目前仅支持SIGINFO结构体中的部分参数。发送信号killpthread_killraisealarmabort发送信号给某个进程或进程内发送消息给某线程为某进程下的线程设置信号标志位。触发回调无由系统调用与中断触发内核态与用户态切换前会先进入用户态指定函数并处理完相应回调函数再回到原用户态程序继续运行。 说明 信号机制为提供给用户态程序进程间通信的能力故推荐使用上表1列出的用户态POSIX相关接口。 注册回调函数 void *signal(int sig, void (*func)(int))(int);31 号信号该信号用来注册该进程的回调函数处理入口不可重复注册。 0-30 号信号该信号段用来注册与去注册回调函数。 注册回调函数 int sigaction(int, const struct sigaction *__restrict, struct sigaction *__restrict); 支持信号注册的配置修改和配置获取目前仅支持SIGINFO的选项SIGINFO内容见sigtimedwait接口内描述。 发送信号 进程接收信号存在默认行为单不支持POSIX标准所给出的STOP及CONTINUE、COREDUMP功能。 进程无法屏蔽SIGSTOP、SIGKILL、SIGCONT信号。 某进程后被杀死后若其父进程不回收该进程其转为僵尸进程。 进程接收到某信号后直到该进程被调度后才会执行信号回调。 进程结束后会发送SIGCHLD信号给父进程该发送动作无法取消。 无法通过信号唤醒处于DELAY状态的进程。