OS
文章平均质量分 72
eriol
这个作者很懒,什么都没留下…
展开
-
lock-free线程安全算法
Lock-free 算法的基础是 CAS (Compareand-Swap) 原子操作。当某个地址的原始值等于某个比较值时,把值改成新值,无论有否修改,返回这个地址的原始值。目前的cpu 支持最多64位的CAS。并且指针 p 必须对齐。 注:原子操作指一个cpu时钟周期内就可以完成的操作,不会被其他线程干扰。 一般的 CAS 使用方式是:假设有指针 p, 它指...原创 2011-09-05 14:55:11 · 191 阅读 · 0 评论 -
cache写策略
Write Through (完全写入) CPU向cache写入数据时,同时向memory也写一份,使cache和memory的数据保持一致。优点是简单,缺点是每次都要访问memory,速度比较慢。 Write Back (回写) CPU更新cache时,只是把更新的cache区标记一下,并不同步更新memory。只是在cache区要被新进入的数据取代时,才更新 m...原创 2011-10-02 19:07:25 · 530 阅读 · 0 评论 -
实模式与保护模式
1. x86实模式介绍x86体系的处理器刚开始时只有20根地址线,寻址寄存器是16位。我们知道16位的寄存器可以访问64K的地址空间,如果程序要想访问大于64K的内存,就需要把内存分段,每段64K,用段地址+偏移量的方式来访问,这样使20根地址线全用上,最大的寻址空间就可以到1M字节,这在当时已经是非常大的内存空间了。 2. 实模式的问题与保护模式的出现事实上,实模式将整个...原创 2011-10-02 16:30:30 · 95 阅读 · 0 评论 -
死锁和饥饿的异同
在多道程序系统中,同时有多个进程并发运行,共享系统资源,从而提高了系统资源利用率,提高了系统的处理能力。但是,若对资源的管理、分配和使用不当,则会产生死锁或是饥饿。 所谓死锁是指在多道程序系统中,一组进程中的每一个进程都无限期等待被该组进程中的另一个进程所占有且永远不会释放的资源。饥饿是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响...原创 2011-09-24 18:28:52 · 2384 阅读 · 0 评论 -
CPU页式内存管理
页式内存管理 CPU的页式内存管理单元,负责把一个线性地址,最终翻译为一个物理地址。从管理和效率的角度出发,线性地址被分为以固定长度为单位的组,称为页(page),例如一个32位的机器,线性地址最大可为4G,可以用4KB为一个页来划分,这页,整个线性地址就被划分为一个totall_page[2^20]的大数组,共有2的20个次方个页。这个大数组我们称之为页目录。目录中的每一个目录项,就是一...原创 2011-09-17 20:25:39 · 367 阅读 · 0 评论 -
CPU段式内存管理
逻辑地址如何转换为线性地址 一个逻辑地址由两部份组成,段标识符: 段内偏移量。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是一个索引号。后面3位包含一些硬件细节,最后两位涉及权限检查。如图: 索引号就是“段描述符(segment descriptor)”。段描述符描述了一个段。这样,很多个段描述符,就组了一个数组,叫“段描述符表”...原创 2011-09-17 14:45:07 · 173 阅读 · 0 评论 -
逻辑地址与物理地址
逻辑地址 (Logical Address) 是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,与绝对物理地址无关。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式...原创 2011-09-16 19:33:33 · 364 阅读 · 0 评论 -
大端和小端字节序
关于字节序(大端法、小端法)的定义 《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。 也可以说: 小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。 大端法(Big-Endian)就是...原创 2011-09-06 21:53:38 · 174 阅读 · 0 评论 -
LRU的实现思想
LRU表示Least Recently Used,即最近最少被使用的页面替换算法。其理论基础是局部性原理,也就是说最近被访问的对象将在不久以后再次被访问。 对于LRU算法,可以使用一个链表和hashmap来实现。链表中的节点表示缓存的页面,链表中的第一个元素就是要被替换的元素,所以替换的复杂度是O(1)。同时,还维护一个hashmap来建立访问对象和缓存页面的映射关系。 当需要访问...2011-09-05 15:58:32 · 177 阅读 · 0 评论 -
Linux下用C实现线程池
什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。 下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。...原创 2011-12-11 21:52:35 · 126 阅读 · 0 评论