Annotation of 41BSD/cmd/iostat.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)iostat.c    4.2 (Berkeley) 10/19/80";
                      2: /*
                      3:  * iostat
                      4:  */
                      5: #include <nlist.h>
                      6: #include <sys/dk.h>
                      7: 
                      8: struct nlist nl[] = {
                      9:        { "_dk_busy" },
                     10: #define        X_DK_BUSY       0
                     11:        { "_dk_time" },
                     12: #define        X_DK_TIME       1
                     13:        { "_dk_xfer" },
                     14: #define        X_DK_XFER       2
                     15:        { "_dk_wds" },
                     16: #define        X_DK_WDS        3
                     17:        { "_tk_nin" },
                     18: #define        X_TK_NIN        4
                     19:        { "_tk_nout" },
                     20: #define        X_TK_NOUT       5
                     21:        { "_dk_seek" },
                     22: #define        X_DK_SEEK       6
                     23:        { "_cp_time" },
                     24: #define        X_CP_TIME       7
                     25:        { "_dk_mspw" },
                     26: #define        X_DK_MSPW       8
                     27:        { 0 },
                     28: };
                     29: struct
                     30: {
                     31:        int     dk_busy;
                     32:        long    cp_time[CPUSTATES];
                     33:        long    dk_time[DK_NDRIVE];
                     34:        long    dk_wds[DK_NDRIVE];
                     35:        long    dk_seek[DK_NDRIVE];
                     36:        long    dk_xfer[DK_NDRIVE];
                     37:        float   dk_mspw[DK_NDRIVE];
                     38:        long    tk_nin;
                     39:        long    tk_nout;
                     40: } s, s1;
                     41: 
                     42: int    mf;
                     43: double etime;
                     44: 
                     45: main(argc, argv)
                     46: char *argv[];
                     47: {
                     48:        extern char *ctime();
                     49:        register  i;
                     50:        int iter;
                     51:        double f1, f2;
                     52:        long t;
                     53:        int tohdr = 1;
                     54: 
                     55:        nlist("/vmunix", nl);
                     56:        if(nl[X_DK_BUSY].n_type == 0) {
                     57:                printf("dk_busy not found in /vmunix namelist\n");
                     58:                exit(1);
                     59:        }
                     60:        mf = open("/dev/kmem", 0);
                     61:        if(mf < 0) {
                     62:                printf("cannot open /dev/kmem\n");
                     63:                exit(1);
                     64:        }
                     65:        iter = 0;
                     66:        while (argc>1&&argv[1][0]=='-') {
                     67:                argc--;
                     68:                argv++;
                     69:        }
                     70:        lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
                     71:        read(mf, s.dk_mspw, sizeof s.dk_mspw);
                     72:        if(argc > 2)
                     73:                iter = atoi(argv[2]);
                     74: loop:
                     75:        if (--tohdr == 0) {
                     76:                printf("      TTY");
                     77:                for (i = 0; i < DK_NDRIVE; i++)
                     78:                        if (s.dk_mspw[i] != 0.0)
                     79:                                printf("           D%d ", i);
                     80:                printf("         CPU\n");
                     81:                printf(" tin tout");
                     82:                for (i = 0; i < DK_NDRIVE; i++)
                     83:                        if (s.dk_mspw[i] != 0.0)
                     84:                                printf(" sps tps msps ");
                     85:                printf(" us ni sy id\n");
                     86:                tohdr = 19;
                     87:        }
                     88:        lseek(mf, (long)nl[X_DK_BUSY].n_value, 0);
                     89:        read(mf, &s.dk_busy, sizeof s.dk_busy);
                     90:        lseek(mf, (long)nl[X_DK_TIME].n_value, 0);
                     91:        read(mf, s.dk_time, sizeof s.dk_time);
                     92:        lseek(mf, (long)nl[X_DK_XFER].n_value, 0);
                     93:        read(mf, s.dk_xfer, sizeof s.dk_xfer);
                     94:        lseek(mf, (long)nl[X_DK_WDS].n_value, 0);
                     95:        read(mf, s.dk_wds, sizeof s.dk_wds);
                     96:        lseek(mf, (long)nl[X_TK_NIN].n_value, 0);
                     97:        read(mf, &s.tk_nin, sizeof s.tk_nin);
                     98:        lseek(mf, (long)nl[X_TK_NOUT].n_value, 0);
                     99:        read(mf, &s.tk_nout, sizeof s.tk_nout);
                    100:        lseek(mf, (long)nl[X_DK_SEEK].n_value, 0);
                    101:        read(mf, s.dk_seek, sizeof s.dk_seek);
                    102:        lseek(mf, (long)nl[X_CP_TIME].n_value, 0);
                    103:        read(mf, s.cp_time, sizeof s.cp_time);
                    104:        lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
                    105:        read(mf, s.dk_mspw, sizeof s.dk_mspw);
                    106:        for (i = 0; i < DK_NDRIVE; i++) {
                    107: #define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t
                    108:                X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time);
                    109:        }
                    110:        t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t;
                    111:        t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t;
                    112:        etime = 0;
                    113:        for(i=0; i<CPUSTATES; i++) {
                    114:                X(cp_time);
                    115:                etime += s.cp_time[i];
                    116:        }
                    117:        if (etime == 0.0)
                    118:                etime = 1.0;
                    119:        etime /= 60.0;
                    120:        printf("%4.0f%5.0f", s.tk_nin/etime, s.tk_nout/etime);
                    121:        for (i=0; i<DK_NDRIVE; i++)
                    122:                if (s.dk_mspw[i] != 0.0)
                    123:                        stats(i);
                    124:        for (i=0; i<CPUSTATES; i++)
                    125:                stat1(i);
                    126:        printf("\n");
                    127: contin:
                    128:        --iter;
                    129:        if(iter)
                    130:        if(argc > 1) {
                    131:                sleep(atoi(argv[1]));
                    132:                goto loop;
                    133:        }
                    134: }
                    135: 
                    136: stats(dn)
                    137: {
                    138:        register i;
                    139:        double atime, words, xtime, itime;
                    140: 
                    141:        if (s.dk_mspw[dn] == 0.0) {
                    142:                printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0);
                    143:                return;
                    144:        }
                    145:        atime = s.dk_time[dn];
                    146:        atime /= 60.0;
                    147:        words = s.dk_wds[dn]*32.0;      /* number of words transferred */
                    148:        xtime = s.dk_mspw[dn]*words;    /* transfer time */
                    149:        itime = atime - xtime;          /* time not transferring */
                    150: /*
                    151:        printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n",
                    152:            dn, words, atime, xtime, itime);
                    153: */
                    154:        if (xtime < 0)
                    155:                itime += xtime, xtime = 0;
                    156:        if (itime < 0)
                    157:                xtime += itime, itime = 0;
                    158:        printf("%4.0f", s.dk_seek[dn]/etime);
                    159:        printf("%4.0f", s.dk_xfer[dn]/etime);
                    160:        printf("%5.1f ",
                    161:            s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0);
                    162: /*
                    163:        printf("%4.1f",
                    164:            s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0);
                    165: */
                    166: }
                    167: 
                    168: stat1(o)
                    169: {
                    170:        register i;
                    171:        double time;
                    172: 
                    173:        time = 0;
                    174:        for(i=0; i<CPUSTATES; i++)
                    175:                time += s.cp_time[i];
                    176:        if (time == 0.0)
                    177:                time = 1.0;
                    178:        printf("%3.0f", 100*s.cp_time[o]/time);
                    179: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.