Not the OP but I have always been amazed by the quality and completeness of IBM’s documentation on their systems and peripheral devices. You can read it just for pleasure.
Any idea how one would find hardware documentation? I have an old "small" mainframe and I'm curious about some of the hardware (backplanes, connector pin outs, etc) but after dozens of hours spent searching, I only found an SSA pinout by a curious hardware engineer.
Unfortunately, I have a S/390 and bitsavers only has a few things. However, those things relate to a different system which uses the same chassis, so I'll take a look. Thanks.
Sadly I have some later mainframe peripherals for which the documentation seems lost to time. Outside of maintenance manuals that came with the pieces.
For mine, I never had any and can't find any hardware documentation. One critical piece of my system, I was only able to find a single photograph on the internet, much less anything more informative.
At some point in the past twenty years IBM downsized its technical writing teams. When I started as an intern in 1990 there were ~250 people in the “Information Development” group in Poughkeepsie responsible for MVS, RACF, RMF and a variety of other mainframe products (plus hardware documentation). Today, there’s now maybe 20–25 people left in Poughkeepsie covering twice the workload as other products consolidated there (Endicott closed, Kingston closed, etc).
Also not the OP. But my dad brought home Datamation magazines from work when I was a kid, and I remember seeing a fair amount about the 3033. It was the new hotness once upon a time.
The first big iron I touched was a 4341, a direct descendant of the 3033. I never saw JCL or the OS - my login threw me into an IDE, the Mantis 4GL environment, which felt a lot like Ruby on Rails (a parallel I'd see over and over in the following years).
The thing I find the most fascinating about mainframes is they they evolved from a completely different branch of computing. There are no files (they call it datasets), the terminal doesn't scroll (it pages, but you need to ask), the full screen editor will have a region at the left where you can enter a command for each line before submitting the whole screen back...
... and the CPU has no direct support of in memory stack needed when calling a subroutine. Rumor had it, the guy responsible for this decision (to not include it), was later mutated to the IBM's internal equivalent of Siberia
For many programming languages of the day, you didn’t need a stack when calling a subroutine.
Languages such as FORTRAN and COBOL didn’t allow recursive calls, and multi-processing wasn’t in the picture, so stack frames could just be given fixed addresses, for example just before the called function’s entry point.
It was later than 1960 on many platforms, including IBM mainframes, where Lisp and ALGOL were always fringe languages, primarily limited to the computing research community, while the vast majority of mainframes were instead being used for business and government data processing, and numerically-oriented scientific computing. On IBM mainframes, it really started when PL/I decided to borrow a lot of concepts from ALGOL, but PL/I wasn't generally available until at least 1966.
A number of later developments increased the demand for reentrancy/recursion: transaction monitors such as CICS; the advent of C and C++ on mainframe platforms (which didn't happen until the 1980s); the decision to add ALGOL-style features to COBOL and FORTRAN.
Some RISC architectures didn't have dedicated instructions/registers for the call stack either. That, in itself, isn't really an issue.
The real issue is that the original calling convention chosen by OS/360 / MVS / z/OS didn't feature a stack. It was based on the assumption that code would not be recursive/reentrant. Each routine would have a static memory block to save registers in. That was a software design issue (OS and compilers), not a CPU design issue. However, a lot of application code was written in COBOL and FORTRAN, which in their original versions didn't support recursion/reentrancy at all, and a top-down coding style discouraged recursion/reentrancy anyway, so this was less of an issue in practice than it might have been. And lots of other vendors in the 1960s (such as DEC and HP) made the same design decision.
Over time, the demand to support recursive/reentrant code became stronger. The first approach was to have each routine use GETMAIN (equivalent of malloc) to dynamically allocate a save area. This succeeded in providing recursion/reenterancy, but cost a lot in performance. Later they introduced the equivalent of a stack, called a "dynamic save area" (DSA) – rather than having each routine's prologue call GETMAIN to allocate a register save area, they'd just use a slice of that dynamic save area allocated once at the beginning of the program. Newer versions of z/OS introduce a new calling convention XPLINK, which is even closer to what other platforms do – it is more efficient, the stack grows in the normal way (top-down not bottom-up), and overflow is detected using a guard page instead of a manual check in every function prologue.
However, due to the demands of backward compatibility, z/OS has to support all three calling conventions – the original one without a stack, the legacy DSA calling convention, and the new XPLINK stack calling convention – complete with thunking macros to generate code so code using one can call code using the other. At least if you stick to C, the compiler handles all this for you, and you just have to declare which calling convention to use before you declare the function (via `#pragma linkage`). Rather similar to the situation with MS-DOS and 16-bit Windows, where each function had to declare which calling convention it wanted to use (cdecl, pascal, stdcall, fortran, etc)
That's really just a difference in terminology, not a different concept.
z/OS datasets are mostly record-oriented, quite different from the stream-oriented files familiar to people from Unix-like and Windows platforms.
However, it would be a mistake to think that datasets are record-oriented and files are stream-oriented. z/OS has one type of stream-oriented dataset (VSAM LDS), and other operating systems have record-oriented files (e.g. IBM i, OpenVMS).
In general, "dataset" is just a rare synonym for file.
In the area of z/OS in particular, datasets belong to the non-Unix part of the operating system (non-VSAM datasets, VSAM, PDS(E), etc), while files (or to give their full name, "z/OS UNIX files") belong to the Unix part of the OS. But a VSAM LDS and a z/OS UNIX files are conceptually quite similar, you could say they are two different implementations of the same fundamental concept–the main differences between them being which filesystem namespace they appear in, and which API is the native API for accessing them. (The internals of how they are stored and what filesystem code is used to access them are also somewhat different.)
While I do find VMS much more understandable than MVS (it's a completely different branch of the Tree of Computing, as similar to modern PCs as the extremophiles that live next to volcanic chimneys in the bottom of the ocean are to us), I have to say the VAX competed with the much lower end machines in the 370 family. Also, you don't measure a mainframe's capacity in MIPS - The CPU is a small part of the of overall system and a lot of hardware goes to the multiple IO subsystems that offload the main CPUs so that they can keep running your applications while the rest of the system focus on pushing bits in and out of the system. It was considered a "minicomputer", in contrast to a proper computer such as the System/370.
Cray-1 from that era had 80 Mhz clock and 8 Megabytes (1 Megaword) memory. But had peak floating point of 160 mega flops. Also, no cache. But highly interleaved main memory.
The Cray designs and the IBM mainframes were built for different requirements. The Cray machines were designed for the highest possible processor speed while mainframes were much more geared towards business needs, where you do a lot of IO and just a little bit of processing on the data, before sending it back to tape.
It's really interesting that, while the Future Systems project was cancelled, a lot of it went into the AS/400, which lives to this day as the IBM i (now based on POWER). It was so far ahead of its time that some of it is still well ahead of our time.
I work in an IBM i shop and concur that it is a powerful and elegant machine. All the old hats who've worked on it for most of their life, at least in my experience, still refer to it as the AS/400, rather than referring to it as the IBM i (before it was called IBM i, it was called System i).
Despite this, I can confirm that many of our non-tech savvy users and managers think of the machine as old and antiquated simply because of the way most of our user-base interfaces with the machine (TN5250 connection - green screen). I kid you not, many of the managers think we'd be better off replacing our IBM i with a new out-of-the-box machine, despite the fact that we have decades of homegrown programs and processes that have been built and customized on the i.
> non-tech savvy users and managers think of the machine as old and antiquated
People need to be educated about the power of a good text-based interface. And I'll say the well laid out 3270/5250 screens are much nicer than trying to understand what Kubernetes or docker are trying to say with thousand-character lines.
I think OS/400 has some really cool technology at the lower levels of its stack, but the applications running on top rarely really took advantage of them.
You start with an advanced machine-independent single-level store capability-oriented operating system, and then you use it to run RPG code???
OS/400 was based on an object-oriented idea. And yet, only IBM could ever define new object types. But IBM went ahead and defined all kinds of random obscure object types [1][2] for all kinds of obscure requirements, many of which are now quite legacy. It would have been far more powerful if IBM had opened it up and allowed end-users and ISVs to define object types of their own.
One thing always holding OS/400 back, is that it has never been a self-hosting operating system. OS/400 has never been able to compile itself, and the OS/400 development team didn't run OS/400. The code for the core of OS/400 was maintained on a mainframe running VM/CMS, which hosted cross-compilers (for PL/MP, PL/MI, etc); OS/400 developers would transfer the compiled code to an actual AS/400 for testing. Around the time of the RISC transition, the development OS changed from VM/CMS to AIX.
As a kid i craved those types of documents. I read and reread many times articles from old encyclopedias searching for computers and radio mentions. Computers where too pricey until 2005~. This pdf would be a gold mine back then.
37 comments
[ 6.7 ms ] story [ 98.0 ms ] threadLanguages such as FORTRAN and COBOL didn’t allow recursive calls, and multi-processing wasn’t in the picture, so stack frames could just be given fixed addresses, for example just before the called function’s entry point.
Around 1960, Lisp and ALGOL changed that.
It was later than 1960 on many platforms, including IBM mainframes, where Lisp and ALGOL were always fringe languages, primarily limited to the computing research community, while the vast majority of mainframes were instead being used for business and government data processing, and numerically-oriented scientific computing. On IBM mainframes, it really started when PL/I decided to borrow a lot of concepts from ALGOL, but PL/I wasn't generally available until at least 1966.
A number of later developments increased the demand for reentrancy/recursion: transaction monitors such as CICS; the advent of C and C++ on mainframe platforms (which didn't happen until the 1980s); the decision to add ALGOL-style features to COBOL and FORTRAN.
The real issue is that the original calling convention chosen by OS/360 / MVS / z/OS didn't feature a stack. It was based on the assumption that code would not be recursive/reentrant. Each routine would have a static memory block to save registers in. That was a software design issue (OS and compilers), not a CPU design issue. However, a lot of application code was written in COBOL and FORTRAN, which in their original versions didn't support recursion/reentrancy at all, and a top-down coding style discouraged recursion/reentrancy anyway, so this was less of an issue in practice than it might have been. And lots of other vendors in the 1960s (such as DEC and HP) made the same design decision.
Over time, the demand to support recursive/reentrant code became stronger. The first approach was to have each routine use GETMAIN (equivalent of malloc) to dynamically allocate a save area. This succeeded in providing recursion/reenterancy, but cost a lot in performance. Later they introduced the equivalent of a stack, called a "dynamic save area" (DSA) – rather than having each routine's prologue call GETMAIN to allocate a register save area, they'd just use a slice of that dynamic save area allocated once at the beginning of the program. Newer versions of z/OS introduce a new calling convention XPLINK, which is even closer to what other platforms do – it is more efficient, the stack grows in the normal way (top-down not bottom-up), and overflow is detected using a guard page instead of a manual check in every function prologue.
However, due to the demands of backward compatibility, z/OS has to support all three calling conventions – the original one without a stack, the legacy DSA calling convention, and the new XPLINK stack calling convention – complete with thunking macros to generate code so code using one can call code using the other. At least if you stick to C, the compiler handles all this for you, and you just have to declare which calling convention to use before you declare the function (via `#pragma linkage`). Rather similar to the situation with MS-DOS and 16-bit Windows, where each function had to declare which calling convention it wanted to use (cdecl, pascal, stdcall, fortran, etc)
That's really just a difference in terminology, not a different concept.
z/OS datasets are mostly record-oriented, quite different from the stream-oriented files familiar to people from Unix-like and Windows platforms.
However, it would be a mistake to think that datasets are record-oriented and files are stream-oriented. z/OS has one type of stream-oriented dataset (VSAM LDS), and other operating systems have record-oriented files (e.g. IBM i, OpenVMS).
In general, "dataset" is just a rare synonym for file.
In the area of z/OS in particular, datasets belong to the non-Unix part of the operating system (non-VSAM datasets, VSAM, PDS(E), etc), while files (or to give their full name, "z/OS UNIX files") belong to the Unix part of the OS. But a VSAM LDS and a z/OS UNIX files are conceptually quite similar, you could say they are two different implementations of the same fundamental concept–the main differences between them being which filesystem namespace they appear in, and which API is the native API for accessing them. (The internals of how they are stored and what filesystem code is used to access them are also somewhat different.)
...
At announcement the monthly lease price for a minimally configured 3033 processor (without peripherals) was $70,400" [1]
[1] https://en.wikipedia.org/wiki/IBM_303X
http://bitsavers.org/pdf/dec/vax/780/EK-11780-UG-001_780hwUG...
http://www.vaxhaven.com/images/0/00/EK-11780-PG-001.pdf
http://gordonbell.azurewebsites.net/cgb%20files/evolution%20...
Sadly it was an anachronistic 36-bit machine with no future..
The 3033 wasn't supposed to happen, the System/370 family was expected to be replaced by the Future Systems project [1]
[1] https://en.wikipedia.org/wiki/IBM_Future_Systems_project
Despite this, I can confirm that many of our non-tech savvy users and managers think of the machine as old and antiquated simply because of the way most of our user-base interfaces with the machine (TN5250 connection - green screen). I kid you not, many of the managers think we'd be better off replacing our IBM i with a new out-of-the-box machine, despite the fact that we have decades of homegrown programs and processes that have been built and customized on the i.
People need to be educated about the power of a good text-based interface. And I'll say the well laid out 3270/5250 screens are much nicer than trying to understand what Kubernetes or docker are trying to say with thousand-character lines.
You start with an advanced machine-independent single-level store capability-oriented operating system, and then you use it to run RPG code???
OS/400 was based on an object-oriented idea. And yet, only IBM could ever define new object types. But IBM went ahead and defined all kinds of random obscure object types [1][2] for all kinds of obscure requirements, many of which are now quite legacy. It would have been far more powerful if IBM had opened it up and allowed end-users and ISVs to define object types of their own.
One thing always holding OS/400 back, is that it has never been a self-hosting operating system. OS/400 has never been able to compile itself, and the OS/400 development team didn't run OS/400. The code for the core of OS/400 was maintained on a mainframe running VM/CMS, which hosted cross-compilers (for PL/MP, PL/MI, etc); OS/400 developers would transfer the compiled code to an actual AS/400 for testing. Around the time of the RISC transition, the development OS changed from VM/CMS to AIX.
[1] https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_74/api...
[2] https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_74/rba...
Cromemco Z-2: 8-bit Z80 @ 4 MHz, maximum 256 kB RAM (bank-switched in a 64 kB address space), 0.007 Whetstone MIPS - $4695
VAX-11/780: 32-bit VAX @ 5 MHz, maximum 8 MB RAM, 0.476 Whetstone MIPS - $241,255
In a similar same format (benchmark from [2]):
IBM 3033: ?-bit ? @ 17 MHz, maximum 8 MB RAM, 4.70 Whetstone MIPS - $70,400/mo!
[1] https://news.ycombinator.com/item?id=22955814
[2] http://www.roylongbottom.org.uk/whetstone.htm
Everything I know about PR1MEOS I learned from trashing.