the notebook of eyu

2014-11-09
为什么不能直接将立即数写入段寄存器

为什么不能直接将立即数写入段寄存器

在看《一个操作系统的实现》这本书的时候,给段寄存器赋值都是这样执行的:

1
2
mov ax, cs
mov ds, ax

或是

1
2
mov ax, 段基址
mov gx, ax

为什么8086的设计是不能拼接给段寄存器赋值,而是要借助通用数据寄存器。

查了些资料也没有得到好的解释。

有一种说法是:数据总线只与数据数据寄存器相连,并没有与段寄存器相连,但这个说明只是说出了最终的设计,并没有说到原因,而且也不能解释为什么不能使用mov ds, cs这种段寄存器之间的赋值也不允许。

还有一种说明是:段寄存器只在有限的场合有用,大部分情况下是自动设置的,不需要应用程序编写者手动改变其中的值,所以如果增加这种指令通路没有必要,会增加复杂度,所以没有这样设计。这种说法说的有一定道理。

Read More

2014-10-31
关于-fno-omit-frame-pointer与-fomit-frame-pointer

关于-fno-omit-frame-pointer与-fomit-frame-pointer

在GDB core的时候,经常去查看EBP,ESP寄存器,来查找一些有用的调用信息,但是感觉这个EBP,ESP中值的变化,并不是像书中描述的那种函数调用的标准流程。

在用perf做性能分析,打印函数的调用路径时,打印调用路径也有问题。
后来才清楚,原来是-fno-omit-frame-pointer这个优化导致的问题。

Read More

2014-09-29
linux优化使用SSD的方法

文件系统层

原理

减少不必要的写,可以提升SSD的性能,并增加SSD的寿命。

方法1:不记录文件的最后访问时间

一些linux发行版,会记录文件的最后访问时间,所以每次访问一个文件,都会更新元数据,产生大量的写操作,所以当不关心最后访问时间的话,可以打开这个选项。
vim /etc/fstab
/dev/sda1 / ext3 noatime 0 0

方法2:TRIM机制

如果没打开TRIM机制,操作系统仅公将其标记为删除,实际磁盘上并没有删除,这对于传统磁盘是没有问题的,传统磁盘可以在一次操作中,修改磁盘数据。但是对于SSD来说,要先擦除,然后才能写,需要两次操作。如果打开了TRIM机制,删除文件时,会擦除相应的块,所以下次写的时候,仅需要一次操作就可以了。

磁盘调度算法

CFQ:针对机械磁盘设计的算法,不适用于SSD。
Deadline:在高写压力下,保证读的RT。
NOOP:FIFO
修改调度算法:
echo deadline > /sys/block/sda/queue/scheduler

swap和tmp

swap分区尽量放到机械磁盘上而不是SSD。
如果内存足够够的话,可以关闭swap。echo 0 > /proc/sys/vm/swappiness
tmp尽量使用内存(ram disk),而不是建在实际硬盘上。

应用

对于过度使用硬盘的应用,如浏览器的缓存,最后建在机械硬盘上,而不要建在SSD上。

分区对齐

分区对齐对于SSD来说非常重要,因为在SSD上,读和写都是以页(包含多个块)为单位进行的。如果分区没有对齐,当文件系统写的块大小与SSD的块大小没有对齐的话,当数据跨页边界话,会造成对磁盘的多次访问。

参考资料

http://apcmag.com/how-to-maximise-ssd-performance-with-linux.htm

Read More

2014-08-24
径山骑行

径山环境很好,特别是从207国道到径山脚下那一段。

山上的饭菜也很便宜:两菜+可乐+两个玉米,才收了35元,超好吃。

下山很爽不需要踩踏板。

上山很痛苦。

寺庙很幽静悠闲,人不多

Read More

2014-08-21
double_write

Innodb Double Write原理

基本原理就是将数据写两份
将Dirty Page刷到磁盘时,先将Page刷到磁盘上的一个区域tablespace,然后择机将Page拷贝到数据文件对应位置。
tablespace是innodb在磁盘上分配的一块区域,包含100个Page。
而每个Page都有自己的checksum,来校验本身数据的正确性。

Read More

2014-08-16
绍兴骑行






Read More

2014-06-18
与switch–case相关的性能优化

与switch–case相关的性能优化

去年做性能优化的时候写过一篇与switch优化相关的文章http://www.trueeyu.com/?p=1156,今天无意中看到了一篇感觉不错,翻译一下。

Read More

2014-05-29
glibc读写锁与linux内核读写自旋锁的原理

glibc读写锁与linux内核读写自旋锁的原理

glibc读写锁的原理

加读锁:
int __pthread_rwlock_rdlock(pthread_rwlock_t* rwlock);
(nptl/pthread_rwlock_rdlock.c)

加写锁:
int __pthread_rwlock_wrlock(pthread_rwlock_t* rwlock)
(nptl/pthread_rwlock_wrlock.c)

解锁:
int __pthread_rwlock_unlock(pthread_rwlock_t* rwlock)
(nptl/pthread_rwlock_wrlock.c)

默认读写锁是读优先的,如果有写者在等待锁,不会阻塞读者。
如果配置为写优先,如果有写者在等待锁,所有的后续的读者加锁都会阻塞。
但是当占有读者锁的读者数为0时,当有写者在等待时,会优先唤醒写者。
当配置为读者优先时,会出现写者饿死的情况
当配置为写者优先时,会出现读者饿死的情况
读写锁适用于读多写少的场景

Read More

2014-03-21
盐关观潮

盐关观潮




Read More

2014-02-21
塘溪骑行

塘溪骑行




Read More