自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 关于flash的擦除与入速度

控制器需要不断地寻找那些包含大量“无效”数据的块,把里面少量的“有效”数据搬走,然后执行缓慢的擦除操作,来腾出新的空闲块以供后续写入。这是影响Flash寿命和性能的关键因素。1. 必须先擦后写:因为无法直接覆盖(不能把0变1,只能把1变0),所以任何数据更新都需要先找到一块已经擦除好的(全是1的) 空间来写入新数据,并把旧数据标记为无效。· 垃圾回收:当空闲页不足时,控制器会找一个“无效”数据最多的块,把里面还有“有效”数据的页读出来搬到一个新块,然后擦除这个旧块,从而获得一整块全新的空闲空间。

2025-08-21 23:33:56 291

原创 cache与内存里的数据一致性

cache 空间比内存小很多(比如内存是 GB 级,cache 可能只有 KB~MB),所以必须有个规则,把 内存地址 → cache 行(cache line) 建立映射。◦ block offset:在一个 cache line 里的偏移(比如 64B line,就用 6bit 表示偏移)。• Cache line:cache 的最小存储单位(常见大小 32/64/128B)。• Cache:64KB,4 路组相联,每个 line = 64B。

2025-08-18 12:53:12 436

原创 空闲的chunk为啥没有被系统回收

合并空闲 chunk:释放的 chunk 通常与相邻的空闲 chunk 合并,形成更大的空闲块,存储在 unsorted bin 或 large bins 中。Top Chunk 的特殊性:堆顶的 top chunk 是堆的边界,空闲 chunk 通常不会直接归还,除非 top chunk 足够大且满足特定条件(见下文)。如果释放的 chunk 相邻于其他空闲 chunk(通过 mchunk_prev_size 和 PREV_INUSE 标志判断),会合并为更大的 chunk。

2025-08-17 00:01:48 837

原创 malloc如何分配内存

如果请求的内存较小(通常小于某个阈值,如 512 字节),分配器会尝试从 Fast Bins(快速分配链表)或 Small Bins(小块内存链表)中查找合适的空闲块。可能使用 Best Fit 策略(选择最接近请求大小的块)或 First Fit 策略(选择第一个满足条件的块)。如果请求的内存较大,分配器会从 Large Bins(大块内存链表,按大小范围组织)中查找合适的块。还需要额外分配空间存储元数据(如内存块的大小、状态等),通常位于分配块的头部。

2025-08-16 23:40:39 293

原创 linux中断-待续

• ARMv8-A(AArch64)统一为四类异常源:Synchronous(同步异常,含 SVC/数据访问异常等)/ IRQ / FIQ / SError,并按异常级别 EL0–EL3 进入对应向量表。◦ 软中断(softirq):下半部机制的一种,由内核统一调度(如 NET_RX、TASKLET)。◦ threaded-IRQ:request_threaded_irq(),上半部只做最小化工作并 IRQ_WAKE_THREAD,真正工作在内核线程里,可睡眠。A:SGI=IPI;

2025-08-16 00:20:25 766

原创 自旋锁与互斥锁等待时进程状态

• 被唤醒的线程会从 TASK_UNINTERRUPTIBLE → TASK_RUNNING,然后重新尝试获取锁。自旋锁等待时,进程(或更准确说内核线程/CPU 上的执行上下文)不会睡眠,所以它的状态一直是 TASK_RUNNING。• 因为它没有调用调度器去让出 CPU,调度器会认为它是可运行的,所以状态是 TASK_RUNNING。• 如果锁是空闲的,直接抢到并返回,全程线程状态都是 TASK_RUNNING(可运行状态)。

2025-08-14 00:13:49 232

原创 临界资源保护有哪些(自旋锁/互斥锁/信号量)

自旋锁 | 忙等待 | 临界区短 | 否 | 是 | 高 || 信号量 | 睡眠等待 | 复杂同步 | 是 | 否 | 中 || 读写锁 | 睡眠等待 | 读多写少 | 是 | 否 | 中 |// 获取信号量(P操作)spin_lock(&my_lock);

2025-08-13 23:53:33 671

转载 linux 信号量/互斥锁/信号量

多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理;linux内核锁机制有还有。是用来解决进程/线程之间的同步和互斥问题的一种通信机制,是用来保证两个或多个关键代码不被并发调用。信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;

2025-08-13 23:39:44 28

原创 nandflash如何实现单字节写入,写的时候不是要先擦除块才能写吗,那样不是会丢失数据

• NAND 控制器 / FTL(Flash Translation Layer)会在底层做映射,把逻辑地址映射到新的物理地址,实现“看上去可以随便写”的效果。因为 NAND 写只能 1→0,如果你的改动涉及 0→1,就必须先擦除整个 Block(所有 Page 的数据都会被清空成 0xFF)。不过,单字节写入的实现,并不是直接在原地改那一个字节,而是**用读–改–写(Read-Modify-Write)**的方式完成的。• 写入时,只能把 1 变成 0,不能把 0 变回 1。

2025-08-12 00:01:07 326

原创 进程/线程/协程区别

进程:由操作系统(内核)管理,有独立的虚拟地址空间、文件描述符表等。调度、抢占由内核完成(preemptive)。线程:也由操作系统管理(kernel thread)或由用户库管理(user thread),是进程内的执行流,多个线程共享同一进程资源。通常是抢占式调度(OS 抢占线程执行权)。协程:通常在用户态由语言运行时或框架调度(例如 asyncio、Go runtime、libuv/Node、Tokio)。协作式调度。

2025-08-11 23:12:59 412

转载 linux中likely()和unlikely()

这里就是程序员可以确定 a>b 在程序执行流程中出现的可能相比较大,因此运用了likely()告诉编译器将fun1()函数的二进制代码紧跟在前面程序的后面,这样就cache在预取数据时就可以将fun1()函数的二进制代码拿到cache中。这样,也就添加了cache的命中率。这里的__built_expect()函数是gcc(version >= 2.96)的内建函数,提供给程序员使用的,目的是将"分支转移"的信息提供给编译器,这样编译器对代码进行优化,以减少指令跳转带来的性能下降。

2025-08-11 22:37:12 29

原创 linux进程调度

优先级范围分为普通进程(非实时进程)和实时进程两类。通过合理设置优先级,可以优化关键任务的响应速度或平衡系统负载。Linux系统中进程调度优先级由。

2025-08-11 22:26:06 272

原创 LeetCode ZigZag Conversion

在LeetCode中有一道关于ZigZag的题目,自己试着做了一下,在这里分享一下自己做这道题目的一些感受。首先我是在LeetCode里做了一些题目,自己也是先做的刚出的题目,后来发现还是从开头做吧,然后就遇到了ZigZag这道题目。也许有人做过这道题目,那么请无视本文的拙笔。本文只是给那些对这道题目有困惑的朋友写的。下面是原题目:The string "PAYPALISHIRIN

2015-05-29 16:18:29 371

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除