darrell@sdcsvax.UUCP (03/10/87)
Some people call RAM "fast memory" and disk "slow memory" (and tape "very slow memory"). With large address spaces and virtual memory, who needs files? Why not define all storage as extended memory structures that may be loaded as needed. I realize that this is the de facto effect of paging systems, disk-caching, sparse addressing, runtime-loadable modules and workspace-oriented environments...why not make it de jure? This model would be inappropriate for some environments, but many small systems (32 bits && < 4Gbytes storage) would fit just fine. Non-inflammatory comments please.... -- ------------------------------------------------------------------------------- Bob Bagwill Are we not men? UUCP: {decvax,seismo,cbosgd}!decuac!bagwill INET: bagwill@decuac.DEC.COM
darrell@sdcsvax.UUCP (03/12/87)
Multics used the idea of "no such thing as 'files' from the very start. Everything was in virtual memory (36-bit addresses, too) Look where it got them. :-(
darrell@sdcsvax.UUCP (03/12/87)
In article <2850@sdcsvax.UCSD.EDU> bagwill@decuac.DEC.COM (Bob Bagwill) writes: >Some people call RAM "fast memory" and disk "slow memory" (and tape >"very slow memory"). With large address spaces and virtual memory, who >needs files? Why not define all storage as extended memory structures >that may be loaded as needed. I realize that this is the de facto >effect of paging systems, disk-caching, sparse addressing, >runtime-loadable modules and workspace-oriented environments...why not >make it de jure? I can think of one very important distinction between virtual memory and files. That is, we expect file integrity to be maintained in case of a system crash, but we don't expect this from most virtual memory systems. Adding facilities to a virtual memory to insure such integrity would probably add a great deal of overhead to normal memory accesses. [It seems to me that what you need is the notion of a persistent data object DL] Also, think of how big the page tables for a 2GB virtual memory would be (if the whole 2gb space was used); that would be 2 million pages, if we have a 1k page size. These tables would probably be too big to remain permanently resident, and would have to be paged, resulting in potential multiple page faults on a simple memory access. [The address space would be sparse (consider the IBM RT). Also, it is not unusual for page tables to be paged themselves (VMS). DL] There have actually been systems implemented which do keep all their data in a large virtual memory. A system called LOOM (for Large Object-Oriented Memory) was implemented at Xerox to provide storage for Smalltalk objects, and an object-oriented filing system was built for the Intel iAPX-432. I have references to these, and can dig them up upon request. Cheers..Yoram Yoram Eisenstadter | Arpanet: yoram@cs.columbia.edu Columbia University | Usenet: seismo!columbia!cs!yoram Dept. of Computer Science | Bitnet: yoram%cs.columbia.edu@WISCVM New York, NY 10027 | Phone: (212) 280-8180
darrell@sdcsvax.UUCP (03/12/87)
In article <2850@sdcsvax.UCSD.EDU> bagwill@decuac.DEC.COM (Bob Bagwill) writes: > With large address spaces and virtual memory, who >needs files? Why not define all storage as extended memory structures >that may be loaded as needed. That's approximately the approach I'm taking with the OS I'm writing for the 80386, which supports both segmentation and paging. My project is to build a prototype implementation of the proposed MIL-STD-1838a, aka. CAISa (Common APSE (Ada Programmer Support Environment) Interface Set, revision a. This system doesn't really have a "file system;" instead, it has an entity-relationship-attribute data base with strongly-typed components. I'm mapping the components directly to 386 segments in virtual memory, and letting the underlying paging system move them back and forth between RAM and disk. User programs will access data in ways that are half-way between file access and manipulating memory-resident data structures. BTW, the whole thing is being written in Ada. There don't seem to be very many people out there doing anything with the 386's ability to do demand paging. I'd love to share experiences and even code (my stuff is all public domain, and MITRE is good at keeping proprietary data secure). -- Bob
darrell@sdcsvax.UUCP (03/13/87)
In article <2850@sdcsvax.UCSD.EDU> bagwill@decuac.DEC.COM (Bob Bagwill) writes: >Some people call RAM "fast memory" and disk "slow memory" (and tape >"very slow memory"). With large address spaces and virtual memory, who >needs files? Why not define all storage as extended memory structures >that may be loaded as needed. ... This is a great idea. In fact, it's such a great idea that it was first implemented in the late 1960s under Multics, which indeed does all of its file I/O by mapping the files into the address space. The IBM System/38 also has a single-level-store architecture, with all memory and file objects having a uniform addressing scheme. Even the RT PC was supposed to do its file I/O through the pager, but we kind of wimped out. It seems to me that considerable performance gains should be obtained this way, because the path from the program to the I/O supervisor via page faults should be faster than that through system calls -- no user arguments to validate. There are some problems with doing I/O this way, most notably that it makes device independence very hard. How do you do I/O to a terminal through page faults? To a network socket? Beats me. For that matter, how do you tell how big a file is to less than the granularity of a page? You add extra system calls which lose much of the elegance that page-fault I/O gains. The other reason that you want files is that they have an existence and a naming structure separate from the programs that manipulate them, which is kind of unavoidable. You as a human would probaby rather call a file /usr/fred/games/source/pinball_bounce.c, while your program would rather have a nice handle like a memory address of 0x18723d70 or a file handle of 5. -- John R. Levine, Javelin Software Corp., Cambridge MA +1 617 494 1400 { ihnp4 | decvax | cbosgd | harvard | yale }!ima!johnl, Levine@YALE.something Where is Richard Nixon now that we need him? [He's 76 years old, hopefully he a relaxing -DL]
darrell@sdcsvax.UCSD.EDU (Darrell Long) (03/17/87)
yerazuws@lll-crg.ARPA (Crah): > Multics used the idea of "no such thing as 'files' from the very > start. Everything was in virtual memory (36-bit addresses, too) > > Look where it got them. :-( Actually, the hardware limitations are probably what did Multics in. If a Multics-like machine was designed today, instead of in 1966, it would probably be a much better performer. Things like a maximum segment size of 256K (18-bit segments, 2^18 # of segments), a single 36-bit accumulator, very limited memory capacity, etc. meant that performance was very limited. And implementing the MMU (with associative look-up cache), caches, etc. with ancient technology was very expensive. I currently attend a university that has an old Multics unit hanging around, the University of Southwestern Louisiana (although USL-Multics is being replaced by an IBM 3090 -- ick). For those of you who've never seen a Multics system and how it does its "all files are segments and are mappable into the address space" trick, a quick description follows: There was no such thing as a "file" in Multics. Everything was a segment, mappable into virtual memory via a system call. However, traditional "file" operations were also allowed. A segment was 18 bits, and there were 2^18 possible segments (thus the "36 bit addresses", which is as misleading as saying that an 80286 has "32 bit addresses"). Segments were paged, and there was a segment table and a paging table keeping track of all this segmentname-segment# info and virtual-address/real-address mapping. An interesting thing was that all memory was also accessible as a file -- that is, since a segment can be either interpreted as being a file or as being memory... there was a "process directory", which contained all these segments, with randomly-generated filenames (Multics has a tree-structured file/segment system, which is where Unix got its concept from). Another Multics oddity was dynamic binding. This may have also had some negative impact on performance, and really should be considered to be a different topic altogether from having memory and files as being identical. The processor itself (Level-68) was pretty weird. It has a single 36-bit accumulator, 16 18-bit index registers, 16 32-bit in-segment addressing registers, and a whole lot of other similiarly brain-dead stuff that I can't remember (it's been 4 years since I last looked at the architecture manual). All instructions used 18-bit addresses -- that is, the first 18 bits have the instruction and addressing mode, the second 18 bits is an address (it has 36 bit words). So most addressing was indexed off one of those 32-bit segment registers, which is quite a bottleneck if you're wanting to access more segments than the available # of segment registers. But standard languages just used a few segments -- a heap, a static variables area, and the stack segment. The PL/1 compiler was huge, and did some of the funkiest optimization that I ever saw... necessary, since there was a LOT of operating system, almost all of it written in PL/1, and you're trying to get decent performance out of some of the most... bizarre... hardware in existence. Despite the fastest I/O processors I've ever seen, a triple-processor Level-68 Multics system could only handle about 100 users before becoming sluggish. Which is really great for a $5,000,000 system :-). A network of three Pyramid 98x machines do that, for under a million... it is probably that fact, rather than anything inherent about treating files as memory, which accounts for the big flop. An 80386 has most of the architectural features of Multics, much improved (such as 32 bit addresses, 2^32 # of segments), and probably would make a much better basis for implementing such an architecture, than the kluged '60s-era GE hardware (originally intended for GECOS) that Honeywell cobbled together. I doubt that anybody will ever do it, though, with Unix around, and Honeywell more interested in bringing GCOS up to bronze-age standards (bringing it up to modern standards would be nigh impossible...). -- Darrell Long Department of Computer Science & Engineering, UC San Diego, La Jolla CA 92093 ARPA: Darrell@Beowulf.UCSD.EDU UUCP: darrell@sdcsvax.uucp Operating Systems submissions to: mod-os@sdcsvax.uucp
darrell@sdcsvax.UUCP (03/17/87)
In article <2859@sdcsvax.UCSD.EDU> johnl@ima.ISC.COM (John R. Levine) writes: >In article <2850@sdcsvax.UCSD.EDU> bagwill@decuac.DEC.COM (Bob Bagwill) writes: >>"very slow memory"). With large address spaces and virtual memory, who >>needs files? Why not define all storage as extended memory structures >>that may be loaded as needed. ... : > >This is a great idea. In fact, it's such a great idea that it was first >implemented in the late 1960s under Multics, which indeed does all of its >file I/O by mapping the files into the address space. The IBM System/38 >also has a single-level-store architecture, with all memory and file objects >having a uniform addressing scheme. Even the RT PC was supposed to do its >file I/O through the pager, but we kind of wimped out. It seems to me that >considerable performance gains should be obtained this way, because the path >from the program to the I/O supervisor via page faults should be faster than >that through system calls -- no user arguments to validate. : > >-- >John R. Levine, Javelin Software Corp., Cambridge MA +1 617 494 1400 : Another way to approach this is to leave the files with a separate existence, but to structure the (file description tables or whatever the system calls them) such that the file can be mapped to virtual memory. Then provide the operating system with a call to MAP a file to process memory. Both the old IBM TSS operating system (R.I.P :-( ) and the still current CDC VSOS operating system have this feature. It works very well and is a very efficient way of doing I/O. The FIRST call to open the file goes through a system call, after that file access is to memory (and via the PAGER when necessary). This is a very clean, simple, intelligent way to get very good RANDOM I/O performance. There is one minor problem however. Most operating systems read ahead when doing sequential I/O. Programs which read large amounts of data sequentially ( a lot of programs) will suffer a serious negative impact if this case is not handled properly. One way is to put code in PAGER to read ahead. In order for this to work efficiently, PAGER needs to be able to distinguish regular virtual memory from sequential file memory. This is an additional complication, though it can be (and was, for some versions of TSS) done. An additional (not mutually exclusive) way is to provide an operating system call to ADVISE the PAGER which virtual memory (which may be files or just regular process memory) will be needed in the near future. VSOS has this good feature, and I think it is a good feature to make available on any virtual memory system. Since the advise is a system call, you lose a little bit, though typically less than with non-mapped I/O, since the ADVISE is asynchronous. If this approach is taken, the I/O library needs to keep track of how much data it is using and issue the ADVISES for itself. Hugh LaMaster, m/s 233-9, UUCP {seismo,topaz,lll-crg,ucbvax}! NASA Ames Research Center ames!pioneer!lamaster Moffett Field, CA 94035 ARPA lamaster@ames-pioneer.arpa Phone: (415)694-6117 ARPA lamaster@pioneer.arc.nasa.gov "In order to promise genuine progress, the acronym RISC should stand for REGULAR (not reduced) instruction set computer." - Wirth ("Any opinions expressed herein are solely the responsibility of the author and do not represent the opinions of NASA or the U.S. Government")
darrell@sdcsvax.UUCP (03/20/87)
In article <2875@sdcsvax.UCSD.EDU> darrell@sdcsvax.UCSD.EDU (Darrell Long) writes: > If a Multics-like machine was designed today, instead of in 1966, it would > probably be a much better performer. > a triple-processor Level-68 Multics system could only handle about 100 users > before becoming sluggish. Which is really great for a $5,000,000 system :-). And that's 1960's dollars, probably about $15M today. Given that you can buy a 16M RAM, 160M disk, Sun-like display 386 machine for about $15K, that's a thousand users equivalent. > An 80386 has most of the architectural features of Multics, much improved > (such as 32 bit addresses, 2^32 # of segments), and probably would make a > much better basis for implementing such an architecture, than the kluged > '60s-era GE hardware (originally intended for GECOS) that Honeywell cobbled > together. Bit of a lapse there in your history, though most of the preceeding technical info is accurate (the machine did support 2**18 word-long segments, but MULTICS arbitrarily limited them to 2**16). As far as I know, Honeywell was not involved in the genesis of MULTICS; it was a joint MIT/GE/Bell Labs project sponsored by ARPA. The 645 was a kludge of the commercial product GE 635. BTW, most of this was going on in the same Tech Square building and at the same time as the seminal days of the MIT AI Lab (of "Hackers" fame) AND the creation of IBM's CP-40, later CP-67/CMS and then the current VM system. An awful lot of our current world started at that very small area in time and space. > I doubt that anybody will ever do it, though, with Unix around, and Honeywell > more interested in bringing GCOS up to bronze-age standards. Wanna' bet? I'm considering calling my system MULTICS/386, which may be possible now that Honeywell has decommitted their MULTICS. I'm also considering the name Elliott, in honor of the late Elliott Organick who wrote a very important book describing MULTICS. And, of course, I'm using the current equivalent of PL/I, Ada. -- Bob Munck
bobp@vsedev.vse.com (Bob Pearson) (03/22/87)
Please excuse the length of the following and the inclusion of ravings of biblical proportions. Also, please excuse me if some of my opinions are not new as I did not have access to "news" when Multics was cancelled and I am new to the net. If I've broken any net etiquette, let me apologize in advance. My comments refer to the HIS (Honeywell Information Systems) Series 60 Level 68 and HIS Series 6000 6180 processors and not the HIS Series 600 645/647 (was General Electric) processors that were discussed in "The Multics System: An Examination of Its Structure" by Elliott Organick (MIT Press 1972). Please reference "The Multics Virtual Memory" (H.I.S. June 1972, AG95 Rev. 0). This is a historical paper on the Multics virtual memory implementation and also describes how rings are implemented in hardware (they were not in the Multics implementation on the HIS 645/647 describe by Organick). As an interesting footnote, Honeywell estimated that the software simulation of rings on the HIS 645/647 took between 10 to 20 percent of total chargeable time, with a hardware implementation of rings it became negligible. yerazuws@lll-crg.ARPA (Crah) writes: >> Multics used the idea of "no such thing as 'files' from the very >> start. Everything was in virtual memory (36-bit addresses, too) >> >> Look where it got them. :-( to which darrell@sdcsvax.UCSD.EDU (Darrell Long) responds: > Actually, the hardware limitations are probably what did Multics in. If a > Multics-like machine was designed today, instead of in 1966, it would probably > be a much better performer. Things like a maximum segment size of 256K (18-bit > segments, 2^18 # of segments), a single 36-bit accumulator, very limited > memory capacity, etc. meant that performance was very limited. And > implementing the MMU (with associative look-up cache), caches, etc. with > ancient technology was very expensive. FLAME (RAVE) ON... I do not agree. The problem with Multics was that is was way ahead of its time and the fact that Honeywell did not know how to market it. The hardware was quite sound given the desire that secondary storage be directly processor addressable. There is a real cost (read high overhead) associated with this capability that has to be weighed against the power it gives you [be very careful here, raving of unimaginable magnitude follows], the best program- ming environment in the world. Compared with IBM's TSO or VM/CMS , DEC's VAX/VMS or TOPS-20 operating systems, or UNIX [your favorite incarnation here] (now you opened a hornet's nest) there is no comparison. It is a crime that so much great work must be lost and the wheel be reinvented again and again. Please do not rave at me with "if Multics was so good, then why wasn't it successful?". I attributed this to the fact that Honeywell didn't know how to market it and never realized what they had. It didn't help that IBM released the IBM 360/67 (CP 67) computer (to compete in the timesharing arena) priced to earn a minuscule 0.009% (read PERCENT) profit. BIG BLUE didn't want to lose any more customers (see DATAMATION, May 1 1986, "Multics Users Face Their Maker" by John W. Verity, pages 103-112). I ascribe the success of UNIX to the fact that it is "portable" across many different architectures (no small feat). Multics needs very specific hardware support to run. Multics was done right (if albeit painfully) and didn't take many easy way outs [design compromises (read kludges)]. It was an extremely elegant design. Maybe its goals were lofty but I for one believe in shooting for the stars. FLAME (RAVE) OFF... > There was no such thing as a "file" in Multics. Everything was a segment, > mappable into virtual memory via a system call. Incorrect. While a process can directly invoke a supervisory routine to make a segment known to a process, the normal method was via a hardware fault (trap). The process of making a segment (procedure or data) known takes a rather lengthly discussion to describe all of the mechanics involved (omitted here). It is not done by a "system call" but a hardware trap. Basically, a reference to a segment <k> (by symbolic name) that does not have a valid segment number assigned [(i.e.) its ITS (Indirect To Segment) word "snapped" in the process combined linkage segment for this ring], would not point to a valid SDW (Segment Descriptor Word) and this would cause a Segment Missing Fault that traps to a specific supervisor module [the SCM (Segment Control Module)] that is mapped into every process address space and has a fixed segment number in the address space. This module is responsible to search the supervisor's database of known and active segments to see if the segment is known by any other process (and hence the supervisor), if it is not, it invokes Directory Control Module procedures to locate the desired segment's directory entry with its location in secondary storage (and access rights, page map, and other file attributes) and brings it into main memory. The final byproduct of all of this is that a SDW is constructed in the descriptor segment, the process access rights are set and the segment descriptor word is made to point to word zero of the page table for this segment and the ITS word is set with k# (an offset to the SDW in the descriptor segment for this process). Now the faulting process can continue executing with a valid k# (the segment is now known). The actually process is unfortunately even more complicated. This process is part of dynamic linking. The address (k#) of the target segment is *NOT* known at reference time. > However, traditional "file" > operations were also allowed. A segment was 18 bits, and there were 2^18 > possible segments (thus the "36 bit addresses", which is as misleading as > saying that an 80286 has "32 bit addresses"). Segments were paged, and there > was a segment table and a paging table keeping track of all this > segmentname-segment# info and virtual-address/real-address mapping. Also, conventional I/O was possible via DIMs (Device Interface Modules), that is another topic definitely. Multics also supported nonpaged segments also, but this is not the issue. > An interesting thing was that all memory was also accessible as a file -- that > is, since a segment can be either interpreted as being a file or as being > memory... there was a "process directory", which contained all these segments, > with randomly-generated filenames (Multics has a tree-structured file/segment > system, which is where Unix got its concept from). Another Multics oddity was > dynamic binding. This may have also had some negative impact on performance, > and really should be considered to be a different topic altogether from having > memory and files as being identical. I am not certain that it is a different topic altogether. Dynamic linking is the single biggest win, in my opinion, with the Multics system. It is indeed built on top of the segmented/paged virtual memory but is part of the justif- ication for all this addressing complexity (as well as the true sharing of pure procedures and read only data). It allows the running of incomplete programs and a debugging environment par excellence. In a traditional system, a link editor resolves all external references to construct a core image using either via real memory addresses, relative to relocation registers or via paged virtual addresses. This is fixed at compile and/or link time. In Multics, global symbol table information is included in an executable module and intra-segment references are resolved on the fly. A change in a procedure involves only a recompilation of the segment in which it is found. VMS or SVR3 shared libraries are not needed as all pure procedure (procedures that do not modify themselves) are shareable. All users reference the same main memory resident pages. As an added bonus, a user can replace a version of a procedure that is part of large subsystem (program) with his own copy by modifying search rules used to find missing segments (before they are made known or *AFTER*), and not have to recompile and link a new "image". I could test this version without my new procedure affecting any other users who are running this subsystem. How's that for flexibility? In Multics, if a segment is pure, its pages are either in main memory or in secondary storage. No special mechanism needs to be invoke, it is the normal operating environment. The combination of a segmented/paged addressing scheme with dynamic linking leads to a very good simulation of an idealized infinite memory. There is a performance penalty associated with this added capability that I for one, think is well worth it. Another unique feature of the Multics system is that changes in access to a segment are immediately enforced. Once a process has access to a segment and the access rights are changed, future references to the segment cause protection violations. What other system does this? > The processor itself (Level-68) was pretty weird. It has a single 36-bit > accumulator, 16 18-bit index registers, 16 32-bit in-segment addressing > registers, and a whole lot of other similarly brain-dead stuff that I can't > remember (it's been 4 years since I last looked at the architecture manual). > All instructions used 18-bit addresses -- that is, the first 18 bits have the > instruction and addressing mode, the second 18 bits is an address (it has 36 > bit words). So most addressing was indexed off one of those 32-bit segment > registers, which is quite a bottleneck if you're wanting to access more > segments than the available # of segment registers. But standard languages > just used a few segments -- a heap, a static variables area, and the stack > segment. The PL/1 compiler was huge, and did some of the funkiest optimization > that I ever saw... necessary, since there was a LOT of operating system, > almost all of it written in PL/1, and you're trying to get decent performance > out of some of the most... bizarre... hardware in existence. > Despite the fastest I/O processors I've ever seen, a triple-processor > Level-68 Multics system could only handle about 100 users before becoming > sluggish. Which is really great for a $5,000,000 system :-). A network of > three Pyramid 98x machines do that, for under a million... it is probably that > fact, rather than anything inherent about treating files as memory, which > accounts for the big flop. An 80386 has most of the architectural features of > Multics, much improved (such as 32 bit addresses, 2^32 # of segments), and > probably would make a much better basis for implementing such an architecture, > than the kluged '60s-era GE hardware (originally intended for GECOS) that > Honeywell cobbled together. I doubt that anybody will ever do it, though, with > Unix around, and Honeywell more interested in bringing GCOS up to bronze-age > standards (bringing it up to modern standards would be nigh impossible...). The restriction of 256K byte segments can be handle via multisegment files and few procedures (ala structured programming) need to be greater that 256K bytes, though data files do. This is not to say that the Level 68 was ideal and could not be much improved but all the great work was done is now dust in the wind (I hope not!!). I believe it is impossible to fairly evaluate Multics hardware by looking at its features and/or capabilities in isolation. Rather, one must look at them as providing a foundation for the support of a truly unique operating system/ developing environment. Multics gave us, rings (domains of execution), dynamic linking, a hierarchical file system that was extremely reliable, control sharing of programs/data via discretionary ACLs (Access Control Lists) and nondiscretionary AIM (Access Isolation Mechanism), demand paging (no thrashing here), unparalleled security, device independent I/O, the concept of files as an extension of memory, IPCs, replaceable execution environments (that a USER could code), a realtime pre- emptive operating system that was highly interactive, the ability to do backups automatically on ACTIVE FILE SYSTEMS, the ability to install changes to the OS without taking the system down, etc, etc... MORE RAVING... One is incredulous that with these features, so far ahead of all its competition of the day (vintage IBM VM/CMS, the TSO of MVS, TOPS-10, TWENEX, VMS, et al), were not enough to save this very elegant operating system. But alas, the Dollar wielded its mighty sword and slayed this sleeping giant. We all know that this is the most important criteria on judging an operating system. If it doesn't make money, it must be a loser. Since Multics could not make it in the real world, it couldn't have been that great of a system. I for one, think Honeywell and the industry in general, didn't know a great thing when they saw it. When I talk to CS students who take OS courses, some say they studied Multics in class and their general impression is that it is a dinosaur, that the operating systems of today are much more advance and elegant. I wonder... I am truly HBD (Honeywell Brain-Damaged), Bob Pearson And now for the BIGGEST RAVE OF ALL TIME... DEFINITION OF UNIX (eunuchs)... Multics without the balls... The opinions expressed here and not the opinions of my employer or of any sane, rational sentient being. btw... I actually like UNIX a lot. ============================================================================= -- -- UUCP: ..!seismo!vsedev!bobp (Bob Pearson) ..!verdix!vrdxhq!vsedev!bobp INET: vsedev.VSE.COM!bobp@seismo.CSS.GOV
darrell@sdcsvax.UUCP (03/23/87)
>> There was no such thing as a "file" in Multics. Everything was a segment, >> mappable into virtual memory via a system call. > >Incorrect. While a process can directly invoke a supervisory routine to make >a segment known to a process, the normal method was via a hardware fault "Normal" in what sense? If you wanted to get at a segment by a name *specified at run time*, which many many commands would, you had to call the system. In fact, the dynamic linker code that responded to those faults would, I believe, find the name of the segment being referenced and call the hardcore supervisor routine to map in in, so ultimately to get a segment into a process' address space *somebody* has to call the system to do it. > The process of making a segment (procedure or data) known takes a rather > lengthly discussion to describe all of the mechanics involved (omitted here). > It is not done by a "system call" but a hardware trap. Not really that lengthy. An instruction that made an external reference would do so through a pointer in the process' "combined linkage section". The pointer in question was initially a Fault Tag 2 pointer. That would cause a trap to the linker. The linker would use that pointer to find the name of the segment in which the location being referenced existed, and use the standard hardcore supervisor call to get a pointer to that segment. (This routine was called "hcs_$initiate_refname", or something like that, if I remember correctly. The name that was used for the segment was called a "reference name". To translate such a name to a segment, the supervisor searched your search path, which was a list of directories, for a file with the given name as a file name. Actually, an entry in the search path could refer to the Known Segment Table, which was a table that recorded all the segments that had already been "initiated" by "hcs_$initiate_refname".) If the reference were not to some offset from the base of the segment as a whole, but to an offset from a particular entry point in that segment (i.e., the segment is an object module), the linker would look for the entry point in the segment's symbol table and modify the pointer to point to that entry. In either case, it would then replace the FT2 pointer with the new pointer. (I forget whether it snapped any other links to that segment or entry point or not.) >Basically, a reference to a segment <k> (by symbolic name) that does not >have a valid segment number assigned [(i.e.) its ITS (Indirect To Segment) >word "snapped" in the process combined linkage segment for this ring], If you're talking about an unsnapped link, when I was using Multics at school, they weren't ITS pointers at all, they were FT2 pointers. (Organick's book also describes it this way.) The trap didn't occur because the segment number was invalid, but because the pointer was one that always caused traps when a reference was made through it. Did they stop using FT2 pointers in a later version of Multics? >Also, conventional I/O was possible via DIMs (Device Interface Modules), >that is another topic definitely. If I remember correctly, you could (if you felt so inclined) call the low-level device driver routines directly. They didn't, however, have device-independent interfaces. The DIMs provided the device-independent interfaces; they generally didn't run in a privileged ring, but called the low-level I/O routines which did. There was also a DIM that referred to segments, so you could do the equivalent of "write" calls to files (which merely meant that the DIM copied data into the segment) or to devices. (Actually, the DIM supported "multi-segment files", which were files that could be larger than a segment. They were implemented as directories containing multiple segments that contained pieces of the data in the file.
darrell@sdcsvax.UUCP (03/23/87)
> yerazuws@lll-crg.ARPA (Crah): > > Multics used the idea of "no such thing as 'files' from the very > > start. Everything was in virtual memory (36-bit addresses, too) > > > > Look where it got them. :-( > > Actually, the hardware limitations are probably what did Multics in. > The processor itself (Level-68) was pretty weird. Not that wierd (GE-645). The point is that there were other operating systems (e.g. DTSS, early UN*X) that would run on the same processor without such overhead. Multics was developed in a research environment where burning up hardware wasn't an issue. [DTSS? I'd like to hear more about that. -DL]
darrell@sdcsvax.UUCP (03/24/87)
[I think that most of us agree that Multics was great. Let's finish up with Multics and move on to what we should put into present-day OS's -DL] Well, actually, I expect you've been reading the Organick book. Originally Multics used 64K (2**16) word segments, but for a long time they've been (an inconvenient) 2**18 - 1K word segments. The missing 1K is interesting. The original processor was architecturally more-or-less a copy of IBM 7094 type machines. (GE-645). The bits needed to do most of the fancy character operations, most of the segmentation and paging support, and the 8-ring protection, are in an add-on box tacked onto the standard (GCOS system type) processor. Whoever designed that box used page number 0 as a special case, so that segments could only be 1-255 (1K) pages long. Most of the standard hardware, bar the tack-on Multics box, could cope with 256K segments. The character-handling instructions and some others can't. Recently work has been done to allow 'large segments' -- that is, things which are more than one segment long but which can be manipulated, at least from highe-level languages, as though they were normal segments. The original development was done by AT&T (Bell Labs), General Electric, and MIT, sponsored by the US DoD. AT&T pulled out fairly early. Then (mid-60s, I think, maybe early 70s) GE sold out to Honeywell. HIS produced several newer versions of GCOS hardware (though mostly the same architecture, just faster/denser parts) with tack-on Multics boxes. The real problem with Multics was that there was never a processor designed to run it. It was always a bodge-box attached to a non-Multics processor. HIS wouldn't develop new hardware because Multics didn't sell well enough. Multics didn't sell well enough because many if not most of the HIS sales staff didn't even know about it. There were incredible political rows about this within HIS, but it appears to me that there were 2 factors involved: (1) HIS marketing regarded Multics primarily as a research project -- an attitude not fought by the developers, particularly; and (2) most of the higher-level executives at a few critical moments had strong past attachments to the GCOS side of the product line, and saw Multics as an internal competitor. Still, it lives on in the form of influences to a number of O/Ss which acknowledge a debt to it -- the first 2 to come to mind are U*ix and Primos.
darrell@sdcsvax.UUCP (03/25/87)
In article <2892@sdcsvax.UCSD.EDU> bobp@vsedev.vse.com (Bob Pearson) writes: > : > >Multics gave us, rings (domains of execution), dynamic linking, a hierarchical >file system that was extremely reliable, control sharing of programs/data via >discretionary ACLs (Access Control Lists) and nondiscretionary AIM (Access >Isolation Mechanism), demand paging (no thrashing here), unparalleled security, >device independent I/O, the concept of files as an extension of memory, IPCs, >replaceable execution environments (that a USER could code), a realtime pre- >emptive operating system that was highly interactive, the ability to do backups >automatically on ACTIVE FILE SYSTEMS, the ability to install changes to the OS >without taking the system down, etc, etc... > >MORE RAVING... >One is incredulous that with these features, so far ahead of all its competition >of the day (vintage IBM VM/CMS, the TSO of MVS, TOPS-10, TWENEX, VMS, et al), >were not enough to save this very elegant operating system. But alas, the >Dollar wielded its mighty sword and slayed this sleeping giant. We all know : > >When I talk to CS students who take OS courses, some say they studied Multics in >class and their general impression is that it is a dinosaur, that the operating >systems of today are much more advance and elegant. I wonder... > > I am truly HBD (Honeywell Brain-Damaged), > > Bob Pearson : Interestingly enough, IBM's TSS operating system had many of the features of MULTICS as listed above (they were copied, of course). TSS had a lot of bugs when it was first released, and gained a (deserved at the time, but not later) reputation for unreliability. In the meantime, the forces of OS/360 (now MVS) recouped within IBM and succeeded in killing off TSS before it ever really had a chance to succeed. In this case, I believe it really was a question of politics, not profit. TSS is also listed as a "dinosaur" in the operating system textbooks, despite the fact that it and MULTICS are still unsurpassed today in any commercial operating system. Amusingly enough, though, the TSS kernel lives on inside UNIX/370, IBM's UNIX done for Bell labs for the IBM 370, and probably inside IX/370 as well. TSS was originally designed for the 32 bit addressing 360/67, though it was given a partial lobotomy to run on the 370/168 (24 bit addressing). I believe that the MVS lobby within IBM will not permit 32 bit addressing to be restored to TSS to support UNIX, or will delay it inordinately, for political reasons. Nor will they permit, I would bet, IX/370 to be ported to the 3090/VF series, again to protect MVS. Ask your local IBM sales rep about it some time; especially ask why if MVS is so good you can't run UNIX on top of it :-) For years people inside and outside IBM have been trying to get IBM to give VM the right stuff to be an operating system in its own right, but the MVS crowd has successfully fought it off. There is still (the last time I looked) no support of 32 bit addressing in CMS, and no decent production batch monitor. I guess I am TBD (TSS Brain-Damaged), but my message to whoever is reading this is, "Never Give In (when internal politics threatens to destroy technically sound marketable products)". Easy to say, but hard to do! Hugh LaMaster, m/s 233-9, UUCP {seismo,topaz,lll-crg,ucbvax}! NASA Ames Research Center ames!pioneer!lamaster Moffett Field, CA 94035 ARPA lamaster@ames-pioneer.arpa Phone: (415)694-6117 ARPA lamaster@pioneer.arc.nasa.gov "In order to promise genuine progress, the acronym RISC should stand for REGULAR (not reduced) instruction set computer." - Wirth ("Any opinions expressed herein are solely the responsibility of the author and do not represent the opinions of NASA or the U.S. Government")
darrell@sdcsvax.UUCP (03/26/87)
In article <2859@sdcsvax.UCSD.EDU> johnl@ima.ISC.COM (John R. Levine) writes: >In article <2850@sdcsvax.UCSD.EDU> bagwill@decuac.DEC.COM (Bob Bagwill) writes: >> >> ... Why not define all storage as extended memory structures >>that may be loaded as needed. ... > > ... it makes device independence very hard. ... > >The other reason that you want files is that they have an existence and a >naming structure separate from the programs that manipulate them, which is >kind of unavoidable. You as a human would probably rather call a file >/usr/fred/games/source/pinball_bounce.c, while your program would rather >have a nice handle like a memory address of 0x18723d70 or a file handle of 5. I'd like to continue this defence for the file concept and to turn the question the other way: Why not turn all memory into files? The structured UNIX file tree is a very comfortable means for handling big, non-uniform amounts of data. Much more comfortable than a uniform, binary address space from zero to infinity. Even an address space from zero to 2^16 (as on this PDP-11/70 called Obelix) seems too big and unstructured to me. Why not continue the partitioning of data into files and directories down to the variable/record/statement level? Of course, we would then have to consider interpreting languages with more overhead than todays optimized number-crunchers, but, as computers as such become faster and smaller, we would have to find a way to use their extra power anyhow :-). I think this idea has been used to implement some virtual LISP and SmallTalk machines, but these aren't too common. To the comp.arch people: Who will invent the tree-structured memory chip? -- Name: Lars Aronsson Snail: Rydsvagen 256 A:10, S-582 48 Linkoping, Sweden UUCP: {mcvax,seismo}!enea!liuida!obelix!l-aron ARPA: l-aron@obelix.ida.liu.se
darrell@sdcsvax.UUCP (03/27/87)
>In article <2859@sdcsvax.UCSD.EDU> johnl@ima.ISC.COM (John R. Levine) writes: >>In article <2850@sdcsvax.UCSD.EDU> bagwill@decuac.DEC.COM (Bob Bagwill) writes: >>> >>> ... Why not define all storage as extended memory structures >>>that may be loaded as needed. ... >> >> ... it makes device independence very hard. ... >> >>The other reason that you want files is that they have an existence and a >>naming structure separate from the programs that manipulate them, which is >>kind of unavoidable. You as a human would probably rather call a file >>/usr/fred/games/source/pinball_bounce.c, while your program would rather >>have a nice handle like a memory address of 0x18723d70 or a file handle of 5. Actually, there are operating systems that let you do this sort of thing. (Well, maybe it's just a sufficiently close approximation.) The Dartmouth College Time Sharing system provides an "address file" system call which maps a file into your virtual memory space. The program now has a nice handle on the file which is a memory address, the operating system having performed the translation between a user supplied treename (pathname) and a memory address. The program can now access the memory mapped file using a suitable data structure. Device independence is not a problem. Back before DCTS implemented this system call, some people were porting IBM PL1 programs which apparently did similar things. -- Chuck
darrell@sdcsvax.UUCP (03/27/87)
In article <2907@sdcsvax.UCSD.EDU> l-aron@obelix.UUCP (Lars Aronsson) writes: >I'd like to continue this defence for the file concept and to turn >the question the other way: Why not turn all memory into files? > >The structured UNIX file tree is a very comfortable means for handling >big, non-uniform amounts of data. Much more comfortable than a uniform, >binary address space from zero to infinity. Even an address space from >zero to 2^16 (as on this PDP-11/70 called Obelix) seems too big and >unstructured to me. Why not continue the partitioning of data into >files and directories down to the variable/record/statement level? >Of course, we would then have to consider interpreting languages >with more overhead than todays optimized number-crunchers, but, >as computers as such become faster and smaller, we would have to find >a way to use their extra power anyhow :-). > >I think this idea has been used to implement some virtual LISP and >SmallTalk machines, but these aren't too common. > >To the comp.arch people: > Who will invent the tree-structured memory chip? (They have! Ain't you ever heard of a binary tree?! :-) ) I think the problem is that this drives the size of a pointer through the roof. It also makes dereferencing the things a horrible operation. It might, however, be possible to use plain ol' numbered memory with a facility for translating names to addresses... Hm... Could you describe the avantages you see in this memory model? I'm not sure exactly what it's hoping to accomplish. It sounds sorta interesting, but I can't see any great advantages it has over large address spaces. -- -Colin Plumb (watmath!watnot!ccplumb) Silly quote: I'll procrastinate when I get around to it.