自旋锁是一种用于保护多线程共享资源的锁,与一般的互斥锁的不同之处在于自旋锁在尝试获取锁时以等待的形式不断的循环检查当前的锁是否可用。
在多CPU的环境中,对持有锁较短的程序来说,使用自旋锁代替一般的互斥锁能够提高程序的性能
当自旋诉被一个线程持有的时候,就不可以被其他线程获取,如果其他的线程常识去获取pthread_spin_lock()获得该锁,那么他将不会从改函数返回,而是一直自旋,直到当前的自旋锁可用为止
使用自旋锁的注意事项
在CPU内核中,假设一个双核的机器上同时运行了两个线程,分别运行在core0与core1上,假设线程A通过pthread_mutex_lock操作来得到临界区的锁,此时该锁被线程B持有,那么线程A就会出于阻塞状态(blocking),core0会在此时进行上下文切换,将线程A置于等待队列中,此时Core0就可以执行其他任务而不必忙于等待,但spin——lock属于busy_waiting的锁,如果线程A是使用pthread_spin_lock操作去请求锁,那么线程A就会一直在Core0上进行忙等待并不停的进行锁请求,直到得到这个锁为止。
对于自旋锁来说,它只需要消耗很少的资源来建立锁;随后当线程被阻塞时,它就会一直重复检查看锁是否可用了,也就是说当自旋锁处于等待状态时它会一直消耗CPU时间。
对于互斥锁来说,与自旋锁相比它需要消耗大量的系统资源来建立锁;随后当线程被阻塞时,线程的调度状态被修改,并且线程被加入等待线程队列;最后当锁可用 时,在获取锁之前,线程会被从等待队列取出并更改其调度状态;但是在线程被阻塞期间,它不消耗CPU资源。
因此自旋锁和互斥锁适用于不同的场景。自旋锁适用于那些仅需要阻塞很短时间的场景,而互斥锁适用于那些可能会阻塞很长时间的场景。
未受信任或者风险较高的软件部件,应该运行在非特权等级。MPU可以限制这些部件访问的存储器空间
用作通信缓冲RAM空间中可能包含通信注入的恶意代码,MPU可以将存储器空间定义为不可执行。
1.在多任务系统中,MPU可以定义应用任务栈的合法存储器空间,使得任务不会破坏其他任务或OS数据栈的空间
2.若应用具有较高的安全需求,则MPU可以将栈空间最终定义为不可访问的存储器空间,可以用来检测栈溢出。
3.有些程序可能需要将代码复制到SRAM中执行,或者将向量表复制到SRAM中执行,或者将向量表复制到SRAM中来提高访问速度,复制完代码或向量后,存储器就被定义为只读,防止存储器空间被意外篡改
1.可以利用MPU来定义可被缓存的存储器空间,以及存储策略
2.利用MPU配置覆盖掉某个存储器空间的默认配置
3.根据具体的项目需要,来选择MPU是默认配置还是需要修改配置
DRAM SRAM
DRAM用作内存比较多,SRAM用作cache比较多。
从名字上看,SRAM与DRAM的区别只在于一个是静态一个是动态。SRAM不需要刷新电路就能够保存数据,所以具有静止存取数据的作用。而DRAM则需要不停地刷新电路,否则内部的数据将会消失。cache追求的是速度所以选择SRAM,而内存则追求容量所以选择能够在相同空间中存放更多内容并且造价相对低廉的DRAM。在我们的PC待机时消耗的电量有很大一部分都来自于对内存的刷新。
DRAM的数据实际存放在内存中。电容放久了内部的电荷会减少,对外形成不了电位的变化,且当对DRAM执行读操作的时候需要将电容与外界形成回路,通过检查是否有电荷流进或流出来判断该bit是1还是0.所以读操作破坏了原来的数据,需要在读操作结束后将数据写回到DRAM中,在整个读写操作中,计算机都会对DRAM进行刷新
ROM 与 RAM
ROM与RAM都是半导体存储器,ROM在系统停止供电时仍然可以保持数据,而RAM通常在系统掉电之后丢失数据,典型的RAM为计算机的内存。
RAM
RAM主要有两个大类,一种称为静态RAM(SRAM),SRAM的速度非常快,通常用作 CPU的一级缓冲,二级缓冲(cache),另一种称为动态RAM(DRAM),DRAM保留数据的时间很短,速度也比SRAM慢
DDRAM
DDRAM(Date-Rate RAM)也称作DDR SDRAM,这种改进的RAM和SDRAM基本相同,不同之处在于它可以在一个时钟读写两次数据,显著加快了数据的传输速度,是目前电脑中用的最多的内存
简而言之,watchdog就是为了保证系统正常运行,或者从死循环,死锁等状态中退出的一种机制
看门狗又分为硬件看门狗和软件看门狗。硬件看门狗是利用定时器电路,他的定时输出连接到电路的复位端,程序在一定的时间范围内对定时器清零(“喂狗”),在程序正常工作时,定时器不会发生溢出,因此不会产生复位信号,若程序发生故障,没有在定时器周期内复位watchdog,这就使得看门狗定时器溢出产生复位信号并重启系统。软件看门狗原理相同,只是将硬件电路上的定时器用处理器的内部定时器代替,能够简化硬件电路设计,但可靠性不如硬件定时器,例如定时器自身发生故障无法检测。
软件看门狗分为两种,一种是基于时钟中断的普通看门狗,一种是检测hard lockup的NMI狗
1.频繁处理硬中断以至于没有时间正常调度
2.长期处理软中断
3.对于非抢占式内核,某个线程长时间执行不触发调度
1.长期处理某一个硬中断
2.长时间在禁用本地中断下处理
硬狗
用来检测所有的CPU是否正常运行
任何一个CPU都可以来喂狗,当在一定时间内没有核喂狗,触发硬狗复位
产生原因:
1.CPU(没有软狗,NMI狗触发条件)全部挂死
2.CPU之间存在硬件依赖关系,某一个CPU挂死,又软件层面的共享资源。
文件存储在硬盘上,硬盘的最小存储单位叫扇区,每个扇区存储512个字节,即0.5KB
操作系统在读取硬盘的时候,不会一个个扇区进行读取,效率低下,而是一次性读取多个连续的扇区,即一次性读取一个块(block),这种由多个扇区组成的块,称之为文件存取的最小单位,块的大小通常为4KB,八个连续的sector组成一个block。
文件数据存储在块中,还必须找一个地方来存储文件的元信息,例如文件的创建者,文件的创建日期,文件的大小等。这种存储文件元信息的区域就被称作inode,也被称为索引节点。
inode会消耗硬盘空间,所以在硬盘格式化的时候,操作系统自动将硬盘划分为两个区域,数据区存放文件数据,另一个是inode,存放inode包含的信息。
每个inode节点的大小,一般为128字节或256个字节。inode节点的总数在格式化时就给定,通常为每1KB或2KB设置inode
由于每个文件都必须有一个inode,有可能出现inode用光,硬盘还没存满的情况。
每一个inode都有一个号码,操作系统使用inode号码来识别不同的文件
在操作系统内部,系统首先找到文件名对应的inode号码,其次通过inode号码获取inode信息,最后根据inode信息找到文件数据存放的block
在开启cache时,可能出现Write Miss 错误,在出现这种情况的时候,通常有两种解决办法:Write Allocate & No Write All;前者先将存储器内容LOAD到Cache,然后走Write Hit过程,更新Cache。然而No Write Allocate,就是在Cache Miss之后,直接写入存储器,此时Cache中依然没有存储出存储器的相关内容。
一般情况下Write Back采用Write Allocate的Write Miss策略,即cache命中,则更新cache(并不更新存储器的内容),若不命中,则LOAD存储到Cache,然后更新Cache
而Write Through则一般采用No Write Allocate 策略,如果命中,更新Cache,更新存储器的相关内容,若不命中,则只更新存储器。