The software they wrote to do the analysis is available. On Android and Ubuntu they used it to do static analysis of a large sample of packages (1.1 million free Android apps, and 71,199 Ubuntu packages). They further did a more detailed dynamic analysis on a smaller number of Android, Ubuntu, and OSX apps (45 Android, 45 Ubuntu, 10 OSX).
Their summary of the three main findings is:
First, usage is driven by high-level frameworks, which impacts POSIX’s portability goals. … Modern OSes gravitate towards a more layered programming model with “taller” interfaces: applications directly link to high-level frameworks, which invoke other frameworks and libraries that may eventually utilize POSIX.
Second, extension APIs, namely ioctl, dominate modern POSIX usage patterns as OS developers increasingly use them to build support for abstractions missing from the POSIX standard.
Third, new abstractions are arising, driven by the same POSIX limitations across the three OSes, but the new abstractions are not converging.
POSIX abstractions found to be especially on the way out:
Interprocess communication (IPC). This is most obvious on Android, which has its own IPC mechanism, Binder, implemented on top of an ioctl and used by every Android app. But on Ubuntu as well, a bunch of the apps are shfting to dbus for IPC. On OSX, POSIX-style IPC was never the primary IPC model (though supported for compatibility); instead a descendant of the Mach IPC model is mainly used, either directly or via the higher-level XPC API. They run some benchmarks to partly justify Android and OSX’s choices here, showing that both Binder and Mach IPC have much better performance than traditional POSIX IPC in common use-cases.
Asynchronous I/O. All three of Android, Ubuntu, and OSX have their own model based on a new de-facto standard architecture (not standardized by POSIX) of “dispatching event-driven work to a queue backed by a pool of pre-initialized threads”. However the three implementations are quite different.
They also discuss graphics a bit, which was never standardized in POSIX.
Interesting study. Miscellaneous highlights:
The software they wrote to do the analysis is available. On Android and Ubuntu they used it to do static analysis of a large sample of packages (1.1 million free Android apps, and 71,199 Ubuntu packages). They further did a more detailed dynamic analysis on a smaller number of Android, Ubuntu, and OSX apps (45 Android, 45 Ubuntu, 10 OSX).
Their summary of the three main findings is:
POSIX abstractions found to be especially on the way out:
Interprocess communication (IPC). This is most obvious on Android, which has its own IPC mechanism, Binder, implemented on top of an
ioctl
and used by every Android app. But on Ubuntu as well, a bunch of the apps are shfting to dbus for IPC. On OSX, POSIX-style IPC was never the primary IPC model (though supported for compatibility); instead a descendant of the Mach IPC model is mainly used, either directly or via the higher-level XPC API. They run some benchmarks to partly justify Android and OSX’s choices here, showing that both Binder and Mach IPC have much better performance than traditional POSIX IPC in common use-cases.Asynchronous I/O. All three of Android, Ubuntu, and OSX have their own model based on a new de-facto standard architecture (not standardized by POSIX) of “dispatching event-driven work to a queue backed by a pool of pre-initialized threads”. However the three implementations are quite different.
They also discuss graphics a bit, which was never standardized in POSIX.