Did you forget to run the OpenGL teapot?
BeOS was magical. I wish I could use Haiku in my desktop today.
Worse with cooperative multitasking any running application could mess things up.
For its era, System 7 was good, but later, it was worse than even Windows 98.
Be tried to do things right, it was ~1995 after all.
I’d hope this is much better now given things like Wayland and the increased use of parallelism.
But I also remember not having background processes. It's a trade of.
Finder browsing files is much faster in macOS, Windows scans the entire directory with defender every time you click on it before it allows you to sort it or interact with it. That can take several minutes on some of my directories.
The mouse tracking model in Windows is somewhat different, and a bit more responsive, but there are multiple third party extensions to macOS the make its model exactly the same as the Windows model.
You can tell the execs that approved that were probably impressed watching someone else demo it but probably never used it themselves.
Jobs would have spotted it was rubbish immediately.
It has a dial on the front to choose settings. Potentially a great idea to skip quick to the one I want - BUT the damn thing can only detect 1 step of change about every half second. So if you fast-turn it 4 clicks, it still only moves one step. So you have to stand there, slowly turning it, click, click, click, click....
The dial is the biggest design feature on there. Massive. Right in the middle. Bright lights all around it. But they couldn't even be bothered to make it solve the one problem it was there to do.
It's the kind of thing that'd make you reject purchasing it if only you'd thought to have tested that specific bit of it before buying it.
Honestly, I wish that they would make appliances with physical controls as opposed to digital. At least those are easier to fix/mod on your own.
I think if someone did a kickstarter for a very simple physical buttoned digital camera it would do very well.
Caveat: said Arduino may need to sit between the rest of the buttons as well, in case inputs must be given in sequence.
Possible benefit: switch the Arduino for something from the ESP family, and you could feed instructions to the machine over Wi-Fi or Bluetooth. (Which could take the form of a dedicated wireless button panel above the machine with macros for frequently-used options.)
(Hmm. I can tell there's some over-optimization in here, but I'm not sure _where_.)
On Arch Linux this is available as linux-zen
There is also realtime-linux - https://wiki.archlinux.org/index.php/Realtime_kernel_patchse...
This looks super fun to play with, thanks!
I was taken aback by how slow Windows 95 felt after I finally jumped the wagon and retired my beloved Amiga in favor of a PC, circa 1995. Just moving the cursor was incredibly jerky in comparison and things would randomly freeze for seconds for no apparent reason. Windows NT 4 was much smoother though.
Even today, in Visual Studio, I regularly have multi-second pauses between a key press and the character showing-up on the screen, though this probably has more to do with Resharper than either Visual Studio or Windows.
Considering how FireWire worked in comparison to USB that's not particularly surprising. The host machine was more or less out of the way while the FW interfaces did their thing instead of requiring constant hand-holding.
Citation needed. Do you have any numbers on that?
I'm skeptical that BeOS has better latency than modern OSes on modern hardware.
IIUC input is still driven at 60Hz but changing this is in discussion [2].
[1] https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1285 [2] https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/168
https://en.wikipedia.org/wiki/Mutter_(window_manager)
Edit: I missed the part where you were asking specifically about GNOME. Removed everything unrelated to that.
Why are inputs synchronized to the frame in Wayland? What the f---? That's just... wow.
The logic isn't perfect and the implementation is flawed but I see where the decision originated.
Since the compositor is already using vsync, it's generally pointless to run graphical applications under a compositor with vsync as well, since that only adds latency. [2] Hypothetically that can result in tearing, however in practice that doesn't matter, because the scanout of the compositor is basically a copy in GPU memory, so you'd have to be rather unlucky to see tearing, let alone consistent tearing. [1]
Of course, OpenGL doesn't support triple buffering (since it has fixed definitions of exactly one GL_FRONT and exactly one GL_BACK buffer per framebuffer/output surface), and it seems like at least nVidia on Linux doesn't support it for Vulkan, either (no mailbox present mode, only FIFO).
In any case, on X11 there is a huge difference between running a 3D UI on a compositor with (A) VSync enabled, (B) running without VSync (which introduces unncessarily high GPU loads, since UIs are generally super-quick to render and if your app architecture is correct, you should be seeing thousands of frames per second), (C) running with a frame limiter (careful choice of limiting FPS to avoid common multiples of 30), (D) rendering a frame as soon as at least one event has been posted, which requires some explicit synchronization work and thought (worker threads have to post events to wake the UI, animations need a timer). (D) is what QML does and what I'm implementing currently. It works well, latency seems to be indistinguishable from B) and C), without the unnecessary power use. X11 only seems to deliver events at a rate of somewhere around 250-400 per second, so an explicit FPS limiter is unnecessary.
[1] If you are rendering to a monitor, scanout happens approx 95 % of the time, so tearing is very likely. Let's say your app's window is 1451x1400 pixels big, then its framebuffer will be about 8 MB. The "scanout" will take something like 15 µs, so at 60 Hz scanout happens about 0.1 % of the time.
[2] My angle here is primarily applications that happen to use <insert 3D API here> as their UI rendering backend. Games have slightly different considerations and should generally just run full-tilt with triple buffering.
When I scroll in MS Word, there is this insane black tearing across the white surface when I scroll, but only on the laptop monitor.
It's A WORD PROCESSOR! It's just a word processor... It's.... weeps
Or the graphics card isn't being used for some reason? E.g., if your laptop has NVidia's Optimus[1], the graphics card may be inactive while Word's running. There's usually a way to force applications to use the GPU with Optimus.
[1] https://www.nvidia.com/en-us/geforce/technologies/optimus/
People put up with slow responses today because many programmers are simply unaware that instantaneous response architectures are possible.
(And a real-time scheduler isn't enough by itself, the many layers of architecture around handling input events can still be bad even if you're meeting every deadline there.)
The human is still faster than the computer!
"""In an interactive software application, any user action SHOULD result in a noticeable change within 16ms, actionable information within 32ms, and at least one full screen of content within 64ms."""
click About - Not Found
to be fair, the empty white not found page did open probably under 64ms...
</subjective_opinion>
Sounds interesting enough to try. Which operating system is this ?
One really neat demo was 250 windows running the size of poststamps with a little bouncing line demo inside them. All still received their 'fair share' of time, all could still be moved around and expanded as though the machine was otherwise idle.
That's the scheduler. There are a lot of moving parts to running this code, I may make a little project out of restoring it to life under a VM at some point.
Happy reading.
Edit: reading it myself, wow, my English was cringe worthy back then. Moving to Canada certainly fixed that.
Mouse, keyboard, screen. Those are the things that should run at high priority. Everything else can - quite literally - wait.
I might add audio to this list.
Listening to music, on the other hand, does not require low latency except in response to user input.
Please expand on your reasoning here. Maybe hard realtime is optimal for a kiosk or appliance, but a general purpose OS treating "user input" as a hard interrupt seems problematic. I see merit in your position if we had a sub-category of "interactive OS" for general purpose end-user devices.
In this model, your compositor, input pipeline and (at least the UI latency sensitive part of) your applications would have to be ported to the RTOS, which makes this pretty infeasible. But it works really well if you have a some hard-realtime control loop talking to a bunch of non-realtime network IO or UI code. Would be a fun way to build a wifi controlled quadcopter.
These days you probably want to use Xenomai, or possibly RTAI.
Thanks for the great writeup correcting me!
There used to be a one-floppy installer with the desktop on it, I'm sure you could get that to work in a VM.
Lots of screenshots:
https://www.operating-system.org/betriebssystem/_english/bs-...
Docs:
https://www.mikecramer.com/qnx/qnx_6.1_docs/sysadmin/intro.h...
Unfortunately I can't seem to locate any disk images, rumor has it there was a VMWare image floating around.
Grr.
Unfortunately QNX 6.5 is pretty old and not too well-supported (QNX is fully POSIX-compliant so you can sometimes get things working on it without too much trouble however) but it's damn fantastic to play around with in a VM. It's actually so fun.
Is Fuchsia hard real time?
edit: looks like Fuchsia is based on the Wikipedia Overview https://en.wikipedia.org/wiki/Google_Fuchsia#Overview
If the processor is rendering a frame and a network packet comes in, now it needs to respond to the network first, and render the frame after processing the packet. That is a very simplified example on one processor, but there are trade-offs depending on workload/inputs/context-switching is what I'm saying, and measuring latency is step one in trying to optimize for it.
And does the mouse being a ps/2 input vs USB make a difference?
This would be one way in which the Rust crowd could really make a difference.
On the developer side, documentation was also amazing. There are tens of full, working example applications. BB10 used QT behind the scenes (Cascades UI). It had also a Python (2.x) binary on the device among other typical UNIX programs.
[0]: https://developer.blackberry.com/devzone/files/design/bb10/i...
[1]: https://developer.blackberry.com/devzone/design/bb10/10_3_vi...
[2]: https://developer.blackberry.com/devzone/design/bb10/keyboar...
The BB10 UI was built on something like QML (the language and runtime) from Qt 4 with their own UI elements and an OpenGL based backend from the acquired company The Astonishing Tribe. They had animations e.g. for slider switches running in the render thread, perfect 60 fps. Qt Quick (the UI framework based on QML, colloquially called "QML") only got an OpenGL backend in Qt 5.
Another very good Qt-based phone OS (after the Nokia N9, got one of these at a conference as well) that failed :(
By the way, the Ford Sync 3 IVI ("in-vehicle infotainment system") is also based on QNX and Qt and it received fairly good reviews. I think I made some tiny contribution to it, if only helping a coworker with something.
The difference used to be very noticeable. Nowadays my PC doesn't have a PS/2 port.
- USB works by polling for changes at fixed intervals
- ps/2 works with interrupts, so the OS will know immediately when hw does something.
A kid who asks you 1000 times a second whether you are there yet is going to know within 1ms of when you get there, but I imagine we’d all like being the driver much more if there were no “are we there yet”s and all the kid needed was one “We’re here” exactly when you arrive.
That all being true, having a publish/subscribe model is still not the same as having a true interrupt (and I’d have to do some digging to figure out whether there wasn’t still polling somewhere in the pub/sub pipeline)
The difference is real time control of stepper motors with crazy speeds when microstepping at 300K steps / second or more interpolating across 5 axis vs moving them at a snails pace of maybe 10K steps / second (on really nice and otherwise idle hardware, miss a single step and your goose is cooked, now you have a cumulative error).
This intuitively makes sense especially with SSDs and especially with NVMe SSDs: you're not going to have to wait that long, especially compared to the overhead of an interrupt. Also, if you're reading sequentially, once you get one I/O completion you're going to get a lot more in a short timeframe—it makes sense to just poll for those instead of handling every one as an interrupt. Interrupts are pretty expensive (I honestly don't have a good grasp of how Linux interrupt handling works but it can easily be on the order of microseconds.)
It also has some side benefits like preventing the CPU from going into a lower power state for only a short period of time.
If it’s possible to interrupt on a serial port, are there existing examples of how to configure a mouse or keyboard to interrupt over a serial port?
Typically a serial port would contain a small buffer which would fill up, upon completion of the first byte an interrupt would be generated and you'd respond to that and read out the register freeing up room for more bytes to be received. Transmit the same but reversed, as soon as a byte had left the shifter in the chip it would generate an interrupt so you could re-use that space for more bytes to send.
This works quite well. Hardware flow control can help in case the OS doesn't respond fast enough to the interrupts, so you don't lose characters.
More to read here: https://stackoverflow.com/questions/5452371/why-isnt-every-o...
RTOSes are often found in autopilot and vehicle management systems controlling critical peripherals or safety critical software. More mundanely there are also sensors that will get upset if you don't give them undivided attention for fixed periods of time (or if you interrupt them, they will terminate the transfer). Image sensors are particularly picky about this.
I've run a plasma cutter under Linux on a run-of-the-mill VIA SBC, it was actually pretty easy: just make a program setuid root, use that to disable interrupts after you've read all your data in and then just go wild on polled and precision timed IO until you're done. Re-enable interrupts and return as if nothing ever happened.
It's a good lesson to play with polling versus interrupts on a micro. Susprising just how many cycles it takes to jump into the ISR.
Was this a QNX variant?
I'm wondering how you'd rate iOS, especiallly with the ProMotion displays on the iPad Pro. Do they come close in terms of responsiveness?
Which one?