Linux---回写机制

前言

当我们修改了某个文件时,被修改的内容不会直接写入磁盘中,而是会写入由内核提供的一个buffer里,那么,内核会在一个特定的时间或者机制,再将buffer中的内容写进磁盘中去,为什么要这么做?原因就是减少开销,降低磁盘的读写次数。

缓存的三种机制

一般缓存有三种机制:

1.不缓存(nowrite):这种机制是跳过缓存,直接写入磁盘中。如果进行读操作时,还需要从磁盘中读取存入缓冲中。个人觉得在读操作时,使用的时间长。

2.写透缓存(write-through cache):当进行写操作时,会写入缓存中,并且马上再写入磁盘中。这种机制相对于上一种,写操作使用的时间长,但读操作使用的时间短。

3.回写:这种机制在写操作时,会先写入缓存中,但不会立即写入磁盘中,而是在一些特定条件或操作,才会把缓存中的数据写入磁盘。回写机制可以说是非常灵活,这是本笔记探讨的内容。

回写机制的Dirty标志

buffer在特定的时间里(查看/proc/sys/vm/dirty_writeback_centisecs 再除以 100 就是多少秒),会被标记为dirty page,被标记的dirty page会被加入到一个链表中,但并不会马上写入磁盘中。

回写机制的写入磁盘时机

有两种情况dirty page才会被写入磁盘中:

1.  当空闲的内存低于某一个值时(查看/proc/sys/vm/dirty_background_ration),会把1024个dirty page写回磁盘中,直到内存回到空闲状态。

2.  当dirty page超过一定的比例时(查看/proc/sys/vm/dirty_ratio),内核会启动pdflush线程把超过的那一部分启写入磁盘中。

3.  当dirty page超过了一定的时间(查看/proc/sys/vm/dirty_expire_centisecs),才会被写入磁盘中。

4.  当用户程序调用了sync() 和 fsync()系统调用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
读者-写者同步问题是指多个读者和一个写者同时访问共享资源时可能会出现的数据不一致性问题。为了解决这个问题,可以使用Linux中的信号量机制。 下面是一个简单的读者-写者同步问题的实现: ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #define BUFFER_SIZE 5 #define READER_NUM 5 #define WRITER_NUM 1 int buffer[BUFFER_SIZE]; int read_count = 0; sem_t mutex, rw_mutex; void *reader(void *arg) { int id = *(int *)arg; while (1) { sem_wait(&mutex); read_count++; if (read_count == 1) { sem_wait(&rw_mutex); } sem_post(&mutex); printf("Reader %d is reading...\n", id); // 读取数据 sem_wait(&mutex); read_count--; if (read_count == 0) { sem_post(&rw_mutex); } sem_post(&mutex); sleep(rand() % 3); } return NULL; } void *writer(void *arg) { int id = *(int *)arg; while (1) { sem_wait(&rw_mutex); printf("Writer %d is writing...\n", id); // 写入数据 sem_post(&rw_mutex); sleep(rand() % 3); } return NULL; } int main() { pthread_t readers[READER_NUM], writer[WRITER_NUM]; int reader_id[READER_NUM], writer_id[WRITER_NUM]; int i; sem_init(&mutex, 0, 1); sem_init(&rw_mutex, 0, 1); for (i = 0; i < READER_NUM; i++) { reader_id[i] = i + 1; pthread_create(&readers[i], NULL, reader, &reader_id[i]); } for (i = 0; i < WRITER_NUM; i++) { writer_id[i] = i + 1; pthread_create(&writer[i], NULL, writer, &writer_id[i]); } for (i = 0; i < READER_NUM; i++) { pthread_join(readers[i], NULL); } for (i = 0; i < WRITER_NUM; i++) { pthread_join(writer[i], NULL); } sem_destroy(&mutex); sem_destroy(&rw_mutex); return 0; } ``` 在这个实现中,使用了两个信号量:mutex和rw_mutex。mutex用于控制读者访问的互斥,rw_mutex用于控制写者访问的互斥。 读者在读取数据时,首先获取mutex信号量的锁,然后增加read_count计数器的值。如果是第一个读者访问,则需要获取rw_mutex信号量的锁,以保证写者不能同时访问。读取数据完成后,再次获取mutex信号量的锁,减少read_count计数器的值。如果是最后一个读者访问,则需要释放rw_mutex信号量的锁。 写者在写入数据时,需要获取rw_mutex信号量的锁,以保证不能有其他读者或写者同时访问。写入数据完成后,释放rw_mutex信号量的锁。 总体来说,这个实现使用了信号量机制来控制读者和写者的访问,并保证了数据的一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值