linux系统编程(三):使用缓冲提高I/O效率

1、频繁的系统调用将降低效率


用户进程运行在用户控件,而磁盘只能被内核直接访问。当执行系统调用时,需要在内核中执行代码。系统调用的开销不仅仅是因为数据的传输。当运行内核代码时,CPU需要切换到超级用户模式,需要建立额外的堆栈和内存环境,执行完系统调用时,CPU要切换回用户模式,把堆栈和内存环境还原为原来的用户模式运行状态。这种频繁的用户态和内核态切换将消耗更多的时间。

为了提高I/O的效率,我们可以使用更大的缓冲区来一次读取更多的数据。这样会减少用户态和内核态之间的切换,提高程序的I/O效率。

2、在who命令中使用缓冲技术

编写who命令时,如果我们一次读取一个utmp对象的内存,读取10个登录用户就需要调用10次read系统调用。但是,如果我们一次读取5个对象数据,那么2次系统调用就可以完任务。

#include <stdio.h>
#include <unistd.h>
#include <utmp.h>
#include <fcntl.h>
#include <time.h>
#include <stdlib.h>

#define READSIZE 16    // 定义缓冲区大小
#define UTMPSIZE sizeof(struct utmp)
static char utmpbuf[READSIZE * UTMPSIZE];    // 缓冲区数组
static int rec_count = 0;    // 读取到的对象数目
static int cur_count = 0;    // 已经输出的对象数目
static int fd_utmp = -1;     // 文件描述符

void show_info(struct utmp* utbuf){
    if(utbuf
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值