Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!utgpu!water!watnot!watmath!clyde!rutgers!ames!ucbcad!ucbvax!wookie.DEC.COM!w_smith From: w_smith@wookie.DEC.COM.UUCP Newsgroups: comp.os.cpm Subject: Help on caching algorythm? Message-ID: <8703072310.AA02571@decwrl.dec.com> Date: Sat, 7-Mar-87 21:00:00 EST Article-I.D.: decwrl.8703072310.AA02571 Posted: Sat Mar 7 21:00:00 1987 Date-Received: Sun, 8-Mar-87 16:18:48 EST Sender: daemon@ucbvax.BERKELEY.EDU Distribution: world Organization: The ARPA Internet Lines: 43 I'm rebuilding my BIOS to (among other things) change my hard disk track buffers over to caching. I've gotten almost the whole thing written, but I have one algorythm I need some help on. I have 4 (will be 8) buffers in another bank of memory, which each holds an 8 K logical track. Each access to a buffer increments a counter, so I know how often (since last warm boot) a buffer has been used. I've done the easy part, finding a buffer (if I have a cache 'hit') or allocating an unused buffer, now I'm looking for an algorythm to deallocate a buffer when I don't have a 'hit' and there aren't any free. I have a few ideas, but there are problems with each: LRU: Least Recently Used. I think the algorythm goes something like "when you use a buffer, move it's number to the top of a block of memory, shuffle others down to make room, and if you need a buffer, use the one whose number is at the bottom of the list." The problems are maintaining the data structure without reams of code, and the fact that a buffer with a high use count can be deallocated by merely reading 4 (8) different tracks before you get back to the first one. Thus you could lose your directory track fairly rapidly, and I know I'm going to need that frequently. Smallest count. Look for the buffer that got used the least, and use that. Looks good as an idea, but there is a major coding problem. Given a table of 4 (8) numbers, how do you find the smallest? [I'm coding in Z-80 assembly, so MIN(x,y,z) doesn't help :+) ]. If you start scanning from the beginning, you will tend to deallocate number 0 more than number 3. If you don't start at the beginning, the coding gets messy. If there are 2 numbers that are a minimum, which one do you pick? I though of a way that would work, "start with one, look for it in the table, if not found, look for two, if not found, look for 3, etc, etc, etc". I'm using byte counters, so I'd only have to go up to 255, but this is kind of a hack, any better ideas? Are there any other, more popular, more useful, simpler, or more elegancache algorythms that anyone knows about? Willie Smith w_smith@wookie.dec.com w_smith%wookie.dec.com@decwrl.dec.com [decwrl.arpa?] Usenet: the_known_universe!decwrl!wookie.dec.com!w_smith BIX: w_smith