求助,当年ACM最经典的用汇编实现3D效果的程序。

求助,当年ACM最经典的用汇编实现3D效果的程序。,第1张

本程序由国外的Vulture大哥编写,并公布了源码,这个是他95年的一个作品。真的很佩服他!太强了。好好学习啊!!!!

编译方法: 1 tasm 3d.asm

2 tlink 3d.obj

3 exe2bin 3d.exe 3d.com

Assembler Program By Vulture.

3D-system example. Use the following formulas to rotate a point:

Rotate around x-axis

YT = Y * COS(xang) - Z * SIN(xang) / 256

ZT = Y * SIN(xang) Z * COS(xang) / 256

Y = YT

Z = ZT

Rotate around y-axis

XT = X * COS(yang) - Z * SIN(yang) / 256

ZT = X * SIN(yang) Z * COS(yang) / 256

X = XT

Z = ZT

Rotate around z-axis

XT = X * COS(zang) - Y * SIN(zang) / 256

YT = X * SIN(zang) Y * COS(zang) / 256

X = XT

Y = YT

Divide by 256 coz we have multiplyd our sin values with 256 too.

This example isn’t too fast right now but it’ll work just fine.

Current Date: 6-9-95 Vulture

IDEAL Ideal mode

P386 Allow 80386 instructions

JUMPS Tasm handles out of range jumps (rulez!:))

SEGMENT CODE Code segment starts

ASSUME cs:code,ds:code Let cs and ds point to code segment

ORG 100h Make a .COM file

START: Main program

mov ax,0013h Init vga

int 10h

mov ax,cs

mov ds,ax ds points to codesegment

mov ax,0a000h

mov es,ax es points to vga [Page]

lea si,[Palette] Set palette

mov dx,3c8h

xor al,al

out dx,al

mov dx,3c9h

mov cx,189*3

repz outsb

=== Set some variables ===

mov [DeltaX],1 Initial speed of rotation

mov [DeltaY],1 Change this and watch what

mov [DeltaZ],1 happens. It’s fun!

mov [Xoff],256

mov [Yoff],256 Used for calculating vga-pos

mov [Zoff],300 Distance from viewer

MainLoop:

call MainProgram Yep... do it all... -)

in al,60h Scan keyboard

cmp al,1 Test on ESCAPE

jne MainLoop Continue if not keypressed

=== Quit to DOS ===

mov ax,0003h Back to textmode

int 10h

lea dx,[Credits]

mov ah,9

int 21h

mov ax,4c00h Return control to DOS

int 21h Call DOS interrupt

=== Sub-routines ===

PROC WaitVrt Waits for vertical retrace to reduce \"snow\"

mov dx,3dah

Vrt:

in al,dx

test al,8

jnz Vrt Wait until Verticle Retrace starts

NoVrt:

in al,dx

test al,8

jz NoVrt Wait until Verticle Retrace ends

ret Return to main program

ENDP WaitVrt

PROC UpdateAngles

Calculates new x,y,z angles

to rotate around

mov ax,[XAngle] Load current angles

mov bx,[YAngle]

mov cx,[ZAngle]

add ax,[DeltaX] Add velocity

and ax,11111111b Range from 0..255

mov [XAngle],ax Update X

add bx,[DeltaY] Add velocity

and bx,11111111b Range from 0..255

mov [YAngle],bx Update Y

add cx,[DeltaZ] Add velocity

and cx,11111111b Range from 0..255

mov [ZAngle],cx Update Z

ret

ENDP UpdateAngles

PROC GetSinCos

Needed : bx=angle (0..255)

Returns: ax=Sin bx=Cos

push bx Save angle (use as pointer)

shl bx,1 Grab a word so bx=bx*2 [Page]

mov ax,[SinCos bx] Get sine

pop bx Restore pointer into bx

push ax Save sine on stack

add bx,64 Add 64 to get cosine

and bx,11111111b Range from 0..255

shl bx,1 *2 coz it’s a word

mov ax,[SinCos bx] Get cosine

mov bx,ax Save it bx=Cos

pop ax Restore ax=Sin

ret

ENDP GetSinCos

PROC SetRotation

Set sine &cosine of x,y,z

mov bx,[XAngle] Grab angle

call GetSinCos Get the sine&cosine

mov [Xsin],ax Save sin

mov [Xcos],bx Save cos

mov bx,[Yangle]

call GetSinCos

mov [Ysin],ax

mov [Ycos],bx

mov bx,[Zangle]

call GetSinCos

mov [Zsin],ax

mov [Zcos],bx

ret

ENDP SetRotation

PROC RotatePoint Rotates the point around x,y,z

Gets original x,y,z values

This can be done elsewhere

movsx ax,[Cube si] si = X (movsx coz of byte)

mov [X],ax

movsx ax,[Cube si 1] si 1 = Y

mov [Y],ax

movsx ax,[Cube si 2] si 2 = Z

mov [Z],ax

Rotate around x-axis

YT = Y * COS(xang) - Z * SIN(xang) / 256

ZT = Y * SIN(xang) Z * COS(xang) / 256

Y = YT

Z = ZT

mov ax,[Y]

mov bx,[XCos]

imul bx ax = Y * Cos(xang)

mov bp,ax

mov ax,[Z]

mov bx,[XSin]

imul bx ax = Z * Sin(xang)

sub bp,ax bp = Y * Cos(xang) - Z * Sin(xang)

sar bp,8 bp = Y * Cos(xang) - Z * Sin(xang) / 256

mov [Yt],bp

mov ax,[Y]

mov bx,[XSin]

imul bx ax = Y * Sin(xang)

mov bp,ax

mov ax,[Z]

mov bx,[XCos]

imul bx ax = Z * Cos(xang)

add bp,ax bp = Y * SIN(xang) Z * COS(xang) [Page]

sar bp,8 bp = Y * SIN(xang) Z * COS(xang) / 256

mov [Zt],bp

mov ax,[Yt] Switch values

mov [Y],ax

mov ax,[Zt]

mov [Z],ax

Rotate around y-axis

XT = X * COS(yang) - Z * SIN(yang) / 256

ZT = X * SIN(yang) Z * COS(yang) / 256

X = XT

Z = ZT

mov ax,[X]

mov bx,[YCos]

imul bx ax = X * Cos(yang)

mov bp,ax

mov ax,[Z]

mov bx,[YSin]

imul bx ax = Z * Sin(yang)

sub bp,ax bp = X * Cos(yang) - Z * Sin(yang)

sar bp,8 bp = X * Cos(yang) - Z * Sin(yang) / 256

mov [Xt],bp

mov ax,[X]

mov bx,[YSin]

imul bx ax = X * Sin(yang)

mov bp,ax

mov ax,[Z]

mov bx,[YCos]

imul bx ax = Z * Cos(yang)

add bp,ax bp = X * SIN(yang) Z * COS(yang)

sar bp,8 bp = X * SIN(yang) Z * COS(yang) / 256

mov [Zt],bp

mov ax,[Xt] Switch values

mov [X],ax

mov ax,[Zt]

mov [Z],ax

Rotate around z-axis

XT = X * COS(zang) - Y * SIN(zang) / 256

YT = X * SIN(zang) Y * COS(zang) / 256

X = XT

Y = YT

mov ax,[X]

mov bx,[ZCos]

imul bx ax = X * Cos(zang)

mov bp,ax

mov ax,[Y]

mov bx,[ZSin]

imul bx ax = Y * Sin(zang)

sub bp,ax bp = X * Cos(zang) - Y * Sin(zang)

sar bp,8 bp = X * Cos(zang) - Y * Sin(zang) / 256

mov [Xt],bp

mov ax,[X]

mov bx,[ZSin]

imul bx ax = X * Sin(zang)

mov bp,ax

mov ax,[Y]

mov bx,[ZCos]

imul bx ax = Y * Cos(zang)

add bp,ax bp = X * SIN(zang) Y * COS(zang) [Page]

sar bp,8 bp = X * SIN(zang) Y * COS(zang) / 256

mov [Yt],bp

mov ax,[Xt] Switch values

mov [X],ax

mov ax,[Yt]

mov [Y],ax

ret

ENDP RotatePoint

PROC ShowPoint

Calculates screenposition and

plots the point on the screen

mov ax,[Xoff] Xoff*X / Z Zoff = screen x

mov bx,[X]

imul bx

mov bx,[Z]

add bx,[Zoff] Distance

idiv bx

add ax,[Mx] Center on screen

mov bp,ax

mov ax,[Yoff] Yoff*Y / Z Zoff = screen y

mov bx,[Y]

imul bx

mov bx,[Z]

add bx,[Zoff] Distance

idiv bx

add ax,[My] Center on screen

mov bx,320

imul bx

add ax,bp ax = (y*320) x

mov di,ax

mov ax,[Z] Get color from Z

add ax,100d (This piece of code could be improved)

mov [byte ptr es:di],al Place a dot with color al

mov [Erase si],di Save position for erase

ret

ENDP ShowPoint

PROC MainProgram

call UpdateAngles Calculate new angles

call SetRotation Find sine &cosine of those angles

xor si,si First 3d-point

mov cx,MaxPoints

ShowLoop:

call RotatePoint Rotates the point using above formulas

call ShowPoint Shows the point

add si,3 Next 3d-point

loop ShowLoop

call WaitVrt Wait for retrace

xor si,si Starting with point 0

xor al,al Color = 0 = black

mov cx,MaxPoints

Deletion:

mov di,[Erase si] di = vgapos old point

mov [byte ptr es:di],al Delete it

add si,3 Next point

loop Deletion

ret

ENDP MainProgram

=== DATA ===

Credits DB 13,10,\"Code by Vulture / Outlaw Triad\",13,10,\"$\"

Label SinCos Word 256 values

dw 0,6,13,19,25,31,38,44,50,56 [Page]

dw 62,68,74,80,86,92,98,104,109,115

dw 121,126,132,137,142,147,152,157,162,167

dw 172,177,181,185,190,194,198,202,206,209

dw 213,216,220,223,226,229,231,234,237,239

dw 241,243,245,247,248,250,251,252,253,254

dw 255,255,256,256,256,256,256,255,255,254

dw 253,252,251,250,248,247,245,243,241,239

dw 237,234,231,229,226,223,220,216,213,209

dw 206,202,198,194,190,185,181,177,172,167

dw 162,157,152,147,142,137,132,126,121,115

dw 109,104,98,92,86,80,74,68,62,56

dw 50,44,38,31,25,19,13,6,0,-6

dw -13,-19,-25,-31,-38,-44,-50,-

56,-62,-68

dw -74,-80,-86,-92,-98,-104,-109,-115,-121,-126

dw -132,-137,-142,-147,-152,-157,-162,-167,-172,-177

dw -181,-185,-190,-194,-198,-202,-206,-209,-213,-216

dw -220,-223,-226,-229,-231,-234,-237,-239,-241,-243

dw -245,-247,-248,-250,-251,-252,-253,-254,-255,-255

dw -256,-256,-256,-256,-256,-255,-255,-254,-253,-252

dw -251,-250,-248,-247,-245,-243,-241,-239,-237,-234

dw -231,-229,-226,-223,-220,-216,-213,-209,-206,-202

dw -198,-194,-190,-185,-181,-177,-172,-167,-162,-157

dw -152,-147,-142,-137,-132,-126,-121,-115,-109,-104

dw -98,-92,-86,-80,-74,-68,-62,-56,-50,-44

dw -38,-31,-25,-19,-13,-6

Label Cube Byte The 3d points

c = -35 5x*5y*5z (=125) points

rept 5

b = -35

rept 5

a = -35

rept 5

db a,b,c

a = a 20

endm

b = b 20

endm

c = c 20

endm

Label Palette Byte The palette to use

db 0,0,0 63*3 gray-tint

d = 63

rept 63

db d,d,d

db d,d,d

db d,d,d

d = d - 1

endm

X DW ? X variable for formula

Y DW ?

Z DW ?

Xt DW ? Temporary variable for x

Yt DW ?

Zt DW ?

XAngle DW 0 Angle to rotate around x

YAngle DW 0

ZAngle DW 0

DeltaX DW ? Amound Xangle is increased each time

DeltaY DW ?

DeltaZ DW ?

Xoff DW ?

Yoff DW ?

Zoff DW ? Distance from viewer

XSin DW ? Sine and cosine of angle to rotate around

XCos DW ?

YSin DW ? [Page]

YCos DW ?

ZSin DW ?

ZCos DW ?

Mx DW 160 Middle of the screen

My DW 100

MaxPoints EQU 125 Number of 3d Points

Erase DW MaxPoints DUP (?) Array for deletion screenpoints

ENDS CODE End of codesegment

END START The definite end.... :)

You may use this code in your own productions but

give credit where credit is due. Only lamers steal

code so try to create your own 3d-engine and use

this code as an example.

Thanx must go to Arno Brouwer and Ash for releasing

example sources.

Ciao dudoz,

Vulture / Outlaw Triad

sar命令的用法很多,有时判断一个问题,需要几个sar命令结合起来使用,比如,怀疑CPU存在瓶颈,可用sar -u 和sar -q来看,怀疑I/O存在瓶颈,可用sar -b、sar -u和 sar-d来看

Sar

-A 所有的报告总和

-a 文件读,写报告

-B 报告附加的buffer cache使用情况

-b buffer cache使用情况

-c 系统调用使用报告

-d 硬盘使用报告

-g 有关串口I/O情况

-h 关于buffer使用统计数字

-m IPC消息和信号灯活动

-n 命名cache

-p 调页活动

-q 运行队列和交换队列的平均长度

-R 报告进程的活动

-r 没有使用的内存页面和硬盘块

-u CPU利用率

-v 进程,i节点,文件和锁表状态

-w 系统交换活动

-y TTY设备活动 sar –a 5 5

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002

11:45:40 iget/s namei/s dirbk/s (-a)

11:45:45 6 2 2

11:45:50 91 20 28

11:45:55 159 20 18

11:46:00 157 21 19

11:46:05 177 30 35

Average 118 18 20

iget/s 每秒由i节点项定位的文件数量

namei/s 每秒文件系统路径查询的数量

dirbk/s 每秒所读目录块的数量

*这些值越大,表明核心花在存取用户文件上的时间越多,它反映着一些程序和应用文件系统产生的负荷。一般地,如果iget/s与namei/s的比值大于5,并且namei/s的值大于30,则说明文件系统是低效的。这时需要检查文件系统的自由空间,看看是否自由空间过少。 -b 报告缓冲区(buffer cache)的使用情况(buffer cache)-b 报告缓冲区的使用情况

sar -b 2 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002

13:51:28 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s (-b)

13:51:30 382 1380 72 131 273 52 0 0

13:51:32 378 516 27 6 22 72 0 0

13:51:34 172 323 47 39 57 32 0 0

Average 310 739 58 58 117 50 0 0

bread/s 平均每秒从硬盘(或其它块设备)读入系统buffer的物理块数

lread/s 平均每秒从系统buffer读出的逻辑块数

%rcache 在buffer cache中进行逻辑读的百分比(即100% - bread/lreads)

bwrit/s 平均每秒从系统buffer向磁盘(或其它块设备)所写的物理块数

lwrit/s 平均每秒写到系统buffer的逻辑块数

%wcache 在buffer cache中进行逻辑写的百分比(即100% - bwrit/lwrit).

pread/sgu 平均每秒请求进行物理读的次数

pwrit/s 平均每秒请求进行物理写的次数

*所显示的内容反映了目前与系统buffer有关的读,写活。在所报告的数字中,最重要的是%rcache和%wcache(统称为cache命中率)两列,它们具体体现着系统buffer的效率。衡量cache效率的标准是它的命中率值的大小。

*如果%rcache的值小于90或者%wcache的值低于65,可能就需要增加系统buffer的数量。如果在系统的应用中,系统的I/O活动十分频繁,并且在内存容量配置比较大时,可以增加buffer cache,使%rcache达到95左右,%wcache达到80左右。

*系统buffer cache中,buffer的数量由核心参数NBUF控制。它是一个要调的参数。系统中buffer数量的多少是影响系统I/O效率的瓶颈。要增加系统buffer数量,则要求应该有较大的内存配置。否则一味增加buffer数量,势必减少用户进程在内存中的运行空间,这同样会导致系统效率下降。 sar -c 2 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002

17:02:42 scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s (-c)

17:02:44 2262 169 141 0.00 0.00 131250 22159

17:02:46 1416 61 38 0.00 0.00 437279 6464

17:02:48 1825 43 25 0.00 0.00 109397 42331

Average 1834 91 68 0.00 0.00 225975 23651

scall/s 每秒使用系统调用的总数。一般地,当4~6个用户在系统上工作时,每秒大约30个左右。

sread/s 每秒进行读 *** 作的系统调用数量。

swrit/s 每秒进行写 *** 作的系统调用数量。

fork/s 每秒fork系统调用次数。当4~6个用户在系统上工作时,每秒大约0.5秒左右。

exec/s 每秒exec系统调用次数。

rchar/s 每秒由读 *** 作的系统调用传送的字符(以字节为单位)。

wchar/s 每秒由写 *** 作的系统调用传送的字符(以字节为单位)。

*如果scall/s持续地大于300,则表明正在系统中运行的可能是效率很低的应用程序。在比较

典型的情况下,进行读 *** 作的系统调用加上进行写 *** 作的系统调用之和,约是scall的一半左右。 sar -d 2 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/07/2002

17:27:49 device %busy avque r+w/s blks/s avwait avserv (-d)

17:27:51 ida-0 6.93 1.00 13.86 259.41 0.00 5.00

ida-1 0.99 1.00 17.33 290.10 0.00 0.57

17:27:53 ida-0 75.50 1.00 54.00 157.00 0.00 13.98

ida-1 9.50 1.00 12.00 75.00 0.00 7.92

17:27:55 ida-0 7.46 1.00 46.77 213.93 0.00 1.60

ida-1 17.41 1.00 57.71 494.53 0.00 3.02

Average ida-0 29.85 1.00 38.14 210.28 0.00 7.83

ida-1 9.29 1.00 29.02 286.90 0.00 3.20

device 这是sar命令正在监视的块设备的名字。

%busy 设备忙时,运行传送请求所占用的时间。这个值以百分比表示。

avque 在指定的时间周期内,没有完成的请求数量的平均值。仅在队列被占满时取这个值。

r+w/s 每秒传送到设备或者从设备传送出的数据量。

blks/s 每秒传送的块数。每块512个字节。

avwait 传送请求等待队列空闲的平均时间(以毫秒为单位)。仅在队列被占满时取这个值。

avserv 完成传送请求所需平均时间(以毫秒为单位)

*ida-0和ida-1是硬盘的设备名字。在显示的内容中,如果%busy的值比较小,说明用于处理

传送请求的有效时间太少,文件系统的效率不高。要使文件系统的效率得到优化,应使%busy的数值相对高一些,而avque的值应该低一些。 sar -g 3 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002

11:10:09 ovsiohw/s ovsiodma/s ovclist/s (-g)

11:10:12 0.00 0.00 0.00

11:10:15 0.00 0.00 0.00

11:10:18 0.00 0.00 0.00

Average 0.00 0.00 0.00

ovsiohw/s 每秒在串囗I/O硬件出现的溢出。

ovsiodma/s 每秒在串囗I/O的直接输入,输出信道高速缓存出现的溢出。

ovclist/s 每秒字符队列出现的溢出。 -m 报告进程间的通信活动(IPC消息和信号灯活动)情况

sar -m 4 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002

13:24:28 msg/s sema/s (-m)

13:24:32 2.24 9.95

13:24:36 2.24 21.70

13:24:40 2.00 36.66

Average 2.16 22.76

msg/s 每秒消息 *** 作的次数(包括发送消息的接收信息)。

sema/s 每秒信号灯 *** 作次数。

*信号灯和消息作为进程间通信的工具,如果在系统中运行的应用过程中没有使用它们,那么由sar命令报告的msg 和sema的值都将等于0.00。如果使用了这些工具,并且其中或者msg/s大于100,或者sema/s大于100,则表明这样的应用程序效率比较低。原因是在这样的应用程序中,大量的时间花费在进程之间的沟通上,而对保证进程本身有效的运行时间必然产生不良的影响。 sar -n 4 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002

13:37:31 c_hits cmisses (hit %) (-n)

13:37:35 1246 71 (94%)

13:37:39 1853 81 (95%)

13:37:43 969 56 (94%)

Average 1356 69 (95%)

c_hits cache命中的数量。

cmisses cache未命中的数量。

(hit %) 命中数量/(命中数理+未命中数量)。

*不难理解,(hit %)值越大越好,如果它低于90%,则应该调整相应的核心参数。 sar -p 5 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002

13:45:26 vflt/s pflt/s pgfil/s rclm/s (-p)

13:45:31 36.25 50.20 0.00 0.00

13:45:36 32.14 58.48 0.00 0.00

13:45:41 79.80 58.40 0.00 0.00

Average 49.37 55.69 0.00 0.00

vflt/s 每秒进行页面故障地址转换的数量(由于有效的页面当前不在内存中)。

pflt/s 每秒来自由于保护错误出现的页面故障数量(由于对页面的非法存,取引起的页面故障)。

pgfil/s 每秒通过”页—入”满足vflt/s的数量。

rclm/s 每秒由系统恢复的有效页面的数量。有效页面被增加到自由页面队列上。

*如果vflt/s的值高于100,可能预示着对于页面系统来说,应用程序的效率不高,也可能分页参数需要调整,或者内存配置不太合适。 -q 报告进程队列(运行队列和交换队列的平均长度)情况

sar -q 2 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/13/2002

14:25:50 runq-sz %runocc swpq-sz %swpocc (-q)

14:25:52 4.0 50

14:25:54 9.0 100

14:25:56 9.0 100

Average 7.3 100

runq-sz 准备运行的进程运行队列。

%runocc 运行队列被占用的时间(百分比)

swpq-sz 要被换出的进程交换队列。

%swpocc 交换队列被占用的时间(百分比)。

*如果%runocc大于90,并且runq-sz的值大于2,则表明CPU的负载较重。其直接后果,可能使系统的响应速度降低。如果%swpocc大于20,表明交换活动频繁,将严重导致系统效率下降。解决的办法是加大内存或减少缓存区数量,从而减少交换及页—入,页—出活动。 -r 报告内存及交换区使用情况(没有使用的内存页面和硬盘块)

sar -r 2 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002

10:14:19 freemem freeswp availrmem availsmem (-r)

10:14:22 279729 6673824 93160 1106876

10:14:24 279663 6673824 93160 1106876

10:14:26 279661 6673824 93160 1106873

Average 279684 6673824 93160 1106875

freemem 用户进程可以使用的内存页面数,4KB为一个页面。

freeswp 用于进程交换可以使用的硬盘盘块,512B为一个盘块。 sar -u 2 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002

10:27:23 %usr %sys %wio %idle (-u)

10:27:25 2 3 8 88

10:27:27 3 3 5 89

10:27:29 0 0 0 100

Average 2 2 4 92

%usr cpu处在用户模式下时间(百分比)

%sys cpu处在系统模式下时间(百分比)

%wio cpu等待输入,输出完成(时间百分比)

%idle cpu空闲时间(百分比)

*在显示的内容中,%usr和 %sys这两个值一般情况下对系统无特别影响,%wio的值不能太高,如果%wio的值过高,则CPU花在等待输入,输出上的时间太多,这意味着硬盘存在I/O瓶颈。如果%idle的值比较高,但系统响应并不快,那么这有可能是CPU花时间等待分配内存引起的。%idle的值可以较深入帮助人们了解系统的性能,在这种情况上,%idle的值处于40~100之间,一旦它持续低于30,则表明进程竞争的主要资源不是内存而是CPU。

*在有大量用户运行的系统中,为了减少CPU的压力,应该使用智能多串卡,而不是非智能多串卡。智能多串卡可以承担CPU的某些负担。

*此外,如果系统中有大型的作业运行,应该把它们合理调度,错开高峰,当系统相对空闲时再运行。 -v 报告系统表的内容(进程,i节点,文件和锁表状态)

sar -v 2 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002

10:56:46 proc-sz ov inod-sz ov file-sz ov lock-sz (-v)

10:56:48 449/ 500 0 994/4147 0 1313/2048 0 5/ 128

10:56:50 450/ 500 0 994/4147 0 1314/2048 0 5/ 128

10:56:52 450/ 500 0 994/4147 0 1314/2048 0 5/ 128

proc-sz 目前在核心中正在使用或分配的进程表的表项数

inod-sz 目前在核心中正在使用或分配的i节点表的表项数

file-sz 目前在核心中正在使用或分配的文件表的表项数

ov 溢出出现的次数

lock-sz 目前在核心中正在使用或分配的记录加锁的表项数

*除ov外,均涉及到unix的核心参数,它们分别受核心参数NPROC,NIMODE,NFILE和FLOCKREC的控制。

*显示格式为:

实际使用表项/整个表可以使用的表项数

比如,proc-sz一列所显示的四个数字中,分母的100是系统中整个进程表的长度(可建立100个表项),分子上的24,26和25分别是采样的那一段时间所使用的进程表项。inod-sz,file-sz和lock-sz三列数字的意义也相同。

三列ov的值分别对应进程表,i节点表和文件表,表明目前这三个表都没有出现溢出现象,当出现溢出时,需要调整相应的核心参数,将对应表加大。 sar -w 2 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002

11:22:05 swpin/s bswin/s swpot/s bswots pswch/s (-w)

11:22:07 0.00 0.0 0.00 0.0 330

11:22:09 0.00 0.0 0.00 0.0 892

11:22:11 0.00 0.0 0.00 0.0 1053

Average 0.00 0.0 0.00 0.0 757

swpin/s 每秒从硬盘交换区传送进入内存的次数。

bswin/s 每秒为换入而传送的块数。

swpot/s 每秒从内存传送到硬盘交换区的次数。

bswots 每秒为换出而传送的块数。

pswch/s 每秒进程交换的数量。

*swpin/s,bswin/s,swpot/s和bswots描述的是与硬盘交换区相关的交换活动。交换关系到系统的效率。交换区在硬盘上对硬盘的读,写 *** 作比内存读,写慢得多,因此,为了提高系统效率就应该设法减少交换。通常的作法就是加大内存,使交换区中进行的交换活动为零,或接近为零。如果swpot/s的值大于1,预示可能需要增加内存或减少缓冲区(减少缓冲区能够释放一部分自由内存空间)。 -y 报告终端的I/O活动(TTY设备活动)情况

sar -y 2 3

SCO_SV scosvr 3.2v5.0.5 PentII(D)ISA 06/14/2002

11:38:03 rawch/s canch/s outch/s rcvin/s xmtin/s mdmin/s (-y)

11:38:05 5 0 951 0 1 0

11:38:07 10 0 996 0 0 0

11:38:09 4 0 2264 0 0 0

Average 6 0 1404 0 1 0

rawch/s 每秒输入的字符数(原始队列)

canch/s 每秒由正则队列(canonical queue)处理的输入字符数。进行正则处理过程中,可以识别出一些有特殊意义的字符。比如,(中断字符),(退出符),(退格键)等。因此,canch/s中的计数不包括这些有特殊意义的字符。

outch/s 每秒输出的字符数。

rcvin/s 每秒接收的硬件中断次数。

xmtin/s 每秒发出的硬件中断次数。

mdmin/s 每秒modem中断次数。

*应该特别说明,sar命令可以对任意终端活动进行统计,所谓任意终端,是指任意tty设备。它们可以是串行终端,主控台,伪终端等等。

*在这几个量中,modem中断次数mdmin/s应该接近0。其它没有特殊要求,但如果每发送一个字符,中断的数量就动态地增加,这表明终端线出了差错,可能是接触不好。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11329976.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存