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