⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vmstat.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
#define Z(fld)	{t = s.nchstats.fld; s.nchstats.fld -= s1.nchstats.fld; \	if(state == TIME) s1.nchstats.fld = t;}#define PUTRATE(fld, l, c, w) \	Y(fld); \	putint((int)((float)s.fld/etime + 0.5), l, c, w)#define MAXFAIL 5static	char cpuchar[CPUSTATES] = { '=' , '>', '-', ' ' };static	char cpuorder[CPUSTATES] = { CP_SYS, CP_USER, CP_NICE, CP_IDLE };voidshowkre(){	float f1, f2;	int psiz, inttotal;	int i, l, c;	static int failcnt = 0;	for (i = 0; i < dk_ndrive; i++) {		X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time);	}	etime = 0;	for(i = 0; i < CPUSTATES; i++) {		X(time);		etime += s.time[i];	}	if (etime < 5.0) {	/* < 5 ticks - ignore this trash */		if (failcnt++ >= MAXFAIL) {			clear();			mvprintw(2, 10, "The alternate system clock has died!");			mvprintw(3, 10, "Reverting to ``pigs'' display.");			move(CMDLINE, 0);			refresh();			failcnt = 0;			sleep(5);			command("pigs");		}		return;	}	failcnt = 0;	etime /= hertz;	inttotal = 0;	for (i = 0; i < nintr; i++) {		if (s.intrcnt[i] == 0)			continue;		if (intrloc[i] == 0) {			if (nextintsrow == LINES)				continue;			intrloc[i] = nextintsrow++;			mvprintw(intrloc[i], INTSCOL + 9, "%-8.8s",				intrname[i]);		}		X(intrcnt);		l = (int)((float)s.intrcnt[i]/etime + 0.5);		inttotal += l;		putint(l, intrloc[i], INTSCOL, 8);	}	putint(inttotal, INTSROW + 1, INTSCOL, 8);	Z(ncs_goodhits); Z(ncs_badhits); Z(ncs_miss);	Z(ncs_long); Z(ncs_pass2); Z(ncs_2passes);	s.nchcount = nchtotal.ncs_goodhits + nchtotal.ncs_badhits +	    nchtotal.ncs_miss + nchtotal.ncs_long;	if (state == TIME)		s1.nchcount = s.nchcount;	psiz = 0;	f2 = 0.0;	/* 	 * Last CPU state not calculated yet.	 */	for (c = 0; c < CPUSTATES - 1; c++) {		i = cpuorder[c];		f1 = cputime(i);		f2 += f1;		l = (int) ((f2 + 1.0) / 2.0) - psiz;		if (c == 0)			putfloat(f1, GRAPHROW, GRAPHCOL + 1, 5, 1, 0);		else			putfloat(f1, GRAPHROW, GRAPHCOL + 12 * c,				5, 1, 0);		move(GRAPHROW + 2, psiz);		psiz += l;		while (l-- > 0)			addch(cpuchar[c]);	}	putint(ucount(), STATROW, STATCOL, 3);	putfloat(avenrun[0], STATROW, STATCOL + 17, 6, 2, 0);	putfloat(avenrun[1], STATROW, STATCOL + 23, 6, 2, 0);	putfloat(avenrun[2], STATROW, STATCOL + 29, 6, 2, 0);	mvaddstr(STATROW, STATCOL + 53, buf);#define pgtokb(pg)	((pg) * cnt.v_page_size / 1024)	putint(pgtokb(total.t_arm), MEMROW + 2, MEMCOL + 3, 6);	putint(pgtokb(total.t_armshr), MEMROW + 2, MEMCOL + 9, 6);	putint(pgtokb(total.t_avm), MEMROW + 2, MEMCOL + 15, 7);	putint(pgtokb(total.t_avmshr), MEMROW + 2, MEMCOL + 22, 7);	putint(pgtokb(total.t_rm), MEMROW + 3, MEMCOL + 3, 6);	putint(pgtokb(total.t_rmshr), MEMROW + 3, MEMCOL + 9, 6);	putint(pgtokb(total.t_vm), MEMROW + 3, MEMCOL + 15, 7);	putint(pgtokb(total.t_vmshr), MEMROW + 3, MEMCOL + 22, 7);	putint(pgtokb(total.t_free), MEMROW + 2, MEMCOL + 29, 6);	putint(total.t_rq - 1, PROCSROW + 1, PROCSCOL + 3, 3);	putint(total.t_pw, PROCSROW + 1, PROCSCOL + 6, 3);	putint(total.t_dw, PROCSROW + 1, PROCSCOL + 9, 3);	putint(total.t_sl, PROCSROW + 1, PROCSCOL + 12, 3);	putint(total.t_sw, PROCSROW + 1, PROCSCOL + 15, 3);	PUTRATE(Cnt.v_cow_faults, VMSTATROW + 0, VMSTATCOL + 3, 6);	PUTRATE(Cnt.v_lookups, VMSTATROW + 1, VMSTATCOL + 3, 6);	PUTRATE(Cnt.v_hits, VMSTATROW + 2, VMSTATCOL + 3, 6);	PUTRATE(Cnt.v_zfod, VMSTATROW + 3, VMSTATCOL + 4, 5);	PUTRATE(Cnt.v_nzfod, VMSTATROW + 4, VMSTATCOL + 3, 6);	putfloat(cnt.v_nzfod == 0 ? 0.0 : (100.0 * cnt.v_zfod / cnt.v_nzfod),		 VMSTATROW + 5, VMSTATCOL + 2, 7, 2, 1);	putint(pgtokb(cnt.v_kernel_pages), VMSTATROW + 6, VMSTATCOL, 9);	putint(pgtokb(cnt.v_wire_count), VMSTATROW + 7, VMSTATCOL, 9);	putint(pgtokb(cnt.v_active_count), VMSTATROW + 8, VMSTATCOL, 9);	putint(pgtokb(cnt.v_inactive_count), VMSTATROW + 9, VMSTATCOL, 9);	putint(pgtokb(cnt.v_free_count), VMSTATROW + 10, VMSTATCOL, 9);	PUTRATE(Cnt.v_dfree, VMSTATROW + 11, VMSTATCOL, 9);	PUTRATE(Cnt.v_pfree, VMSTATROW + 12, VMSTATCOL, 9);	PUTRATE(Cnt.v_reactivated, VMSTATROW + 13, VMSTATCOL, 9);	PUTRATE(Cnt.v_scan, VMSTATROW + 14, VMSTATCOL, 9);	PUTRATE(Cnt.v_rev, VMSTATROW + 15, VMSTATCOL, 9);	if (LINES - 1 > VMSTATROW + 16)		PUTRATE(Cnt.v_intrans, VMSTATROW + 16, VMSTATCOL, 9);	PUTRATE(Cnt.v_pageins, PAGEROW + 2, PAGECOL + 5, 5);	PUTRATE(Cnt.v_pageouts, PAGEROW + 2, PAGECOL + 10, 5);	PUTRATE(Cnt.v_swpin, PAGEROW + 2, PAGECOL + 15, 5);	/* - */	PUTRATE(Cnt.v_swpout, PAGEROW + 2, PAGECOL + 20, 5);	/* - */	PUTRATE(Cnt.v_pgpgin, PAGEROW + 3, PAGECOL + 5, 5);	/* ? */	PUTRATE(Cnt.v_pgpgout, PAGEROW + 3, PAGECOL + 10, 5);	/* ? */	PUTRATE(Cnt.v_pswpin, PAGEROW + 3, PAGECOL + 15, 5);	/* - */	PUTRATE(Cnt.v_pswpout, PAGEROW + 3, PAGECOL + 20, 5);	/* - */	PUTRATE(Cnt.v_swtch, GENSTATROW + 1, GENSTATCOL, 5);	PUTRATE(Cnt.v_trap, GENSTATROW + 1, GENSTATCOL + 5, 5);	PUTRATE(Cnt.v_syscall, GENSTATROW + 1, GENSTATCOL + 10, 5);	PUTRATE(Cnt.v_intr, GENSTATROW + 1, GENSTATCOL + 15, 5);	PUTRATE(Cnt.v_soft, GENSTATROW + 1, GENSTATCOL + 20, 5);	PUTRATE(Cnt.v_faults, GENSTATROW + 1, GENSTATCOL + 25, 5);	mvprintw(DISKROW, DISKCOL + 5, "                              ");	for (i = 0, c = 0; i < dk_ndrive && c < MAXDRIVES; i++)		if (dk_select[i]) {			mvprintw(DISKROW, DISKCOL + 5 + 5 * c,				"  %3.3s", dr_name[i]);			dinfo(i, ++c);		}	putint(s.nchcount, NAMEIROW + 2, NAMEICOL, 9);	putint(nchtotal.ncs_goodhits, NAMEIROW + 2, NAMEICOL + 9, 9);#define nz(x)	((x) ? (x) : 1)	putfloat(nchtotal.ncs_goodhits * 100.0 / nz(s.nchcount),	   NAMEIROW + 2, NAMEICOL + 19, 4, 0, 1);	putint(nchtotal.ncs_pass2, NAMEIROW + 2, NAMEICOL + 23, 9);	putfloat(nchtotal.ncs_pass2 * 100.0 / nz(s.nchcount),	   NAMEIROW + 2, NAMEICOL + 34, 4, 0, 1);#undef nz}intcmdkre(cmd, args)	char *cmd, *args;{	if (prefix(cmd, "run")) {		copyinfo(&s2, &s1);		state = RUN;		return (1);	}	if (prefix(cmd, "boot")) {		state = BOOT;		copyinfo(&z, &s1);		return (1);	}	if (prefix(cmd, "time")) {		state = TIME;		return (1);	}	if (prefix(cmd, "zero")) {		if (state == RUN)			getinfo(&s1, RUN);		return (1);	}	return (dkcmd(cmd, args));}/* calculate number of users on the system */static intucount(){	register int nusers = 0;	if (ut < 0)		return (0);	while (read(ut, &utmp, sizeof(utmp)))		if (utmp.ut_name[0] != '\0')			nusers++;	lseek(ut, 0L, L_SET);	return (nusers);}static floatcputime(indx)	int indx;{	double t;	register int i;	t = 0;	for (i = 0; i < CPUSTATES; i++)		t += s.time[i];	if (t == 0.0)		t = 1.0;	return (s.time[indx] * 100.0 / t);}static voidputint(n, l, c, w)	int n, l, c, w;{	char b[128];	move(l, c);	if (n == 0) {		while (w-- > 0)			addch(' ');		return;	}	sprintf(b, "%*d", w, n);	if (strlen(b) > w) {		while (w-- > 0)			addch('*');		return;	}	addstr(b);}static voidputfloat(f, l, c, w, d, nz)	double f;	int l, c, w, d, nz;{	char b[128];	move(l, c);	if (nz && f == 0.0) {		while (--w >= 0)			addch(' ');		return;	}	sprintf(b, "%*.*f", w, d, f);	if (strlen(b) > w) {		while (--w >= 0)			addch('*');		return;	}	addstr(b);}static voidgetinfo(s, st)	struct Info *s;	enum state st;{	int mib[2], size;	extern int errno;	NREAD(X_CPTIME, s->time, sizeof s->time);	NREAD(X_CNT, &s->Cnt, sizeof s->Cnt);	NREAD(X_DK_BUSY, &s->dk_busy, LONG);	NREAD(X_DK_TIME, s->dk_time, dk_ndrive * LONG);	NREAD(X_DK_XFER, s->dk_xfer, dk_ndrive * LONG);	NREAD(X_DK_WDS, s->dk_wds, dk_ndrive * LONG);	NREAD(X_DK_SEEK, s->dk_seek, dk_ndrive * LONG);	NREAD(X_NCHSTATS, &s->nchstats, sizeof s->nchstats);	NREAD(X_INTRCNT, s->intrcnt, nintr * LONG);	size = sizeof(s->Total);	mib[0] = CTL_VM;	mib[1] = VM_METER;	if (sysctl(mib, 2, &s->Total, &size, NULL, 0) < 0) {		error("Can't get kernel info: %s\n", strerror(errno));		bzero(&s->Total, sizeof(s->Total));	}}static voidallocinfo(s)	struct Info *s;{	s->intrcnt = (long *) malloc(nintr * sizeof(long));	if (s->intrcnt == NULL) {		fprintf(stderr, "systat: out of memory\n");		exit(2);	}}static voidcopyinfo(from, to)	register struct Info *from, *to;{	long *time, *wds, *seek, *xfer;	long *intrcnt;	/*	 * time, wds, seek, and xfer are malloc'd so we have to	 * save the pointers before the structure copy and then 	 * copy by hand.	 */	time = to->dk_time; wds = to->dk_wds; seek = to->dk_seek;	xfer = to->dk_xfer; intrcnt = to->intrcnt;	*to = *from;	bcopy(from->dk_time, to->dk_time = time, dk_ndrive * sizeof (long));	bcopy(from->dk_wds, to->dk_wds = wds, dk_ndrive * sizeof (long));	bcopy(from->dk_seek, to->dk_seek = seek, dk_ndrive * sizeof (long));	bcopy(from->dk_xfer, to->dk_xfer = xfer, dk_ndrive * sizeof (long));	bcopy(from->intrcnt, to->intrcnt = intrcnt, nintr * sizeof (int));}static voiddinfo(dn, c)	int dn, c;{	double words, atime, itime, xtime;	c = DISKCOL + c * 5;	atime = s.dk_time[dn];	atime /= hertz;	words = s.dk_wds[dn]*32.0;	/* number of words transferred */	xtime = dk_mspw[dn]*words;	/* transfer time */	itime = atime - xtime;		/* time not transferring */	if (xtime < 0)		itime += xtime, xtime = 0;	if (itime < 0)		xtime += itime, itime = 0;	putint((int)((float)s.dk_seek[dn]/etime+0.5), DISKROW + 1, c, 5);	putint((int)((float)s.dk_xfer[dn]/etime+0.5), DISKROW + 2, c, 5);	putint((int)(words/etime/512.0 + 0.5), DISKROW + 3, c, 5);	if (s.dk_seek[dn])		putfloat(itime*1000.0/s.dk_seek[dn], DISKROW + 4, c, 5, 1, 1);	else		putint(0, DISKROW + 4, c, 5);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -