Historically BSD offered memory-mapped I/O via mmap() and friends, while System V introduced shared memory segments as part of the new IPC package (shmget() and friends).
Functionally the difference is that memory-mapped I/O is backed by a file while shared segments are not. Shared segments remain allocated after the creating process exits, which is why they're in the IPC package. In the days prior to multi-threading a common programming model was to start a bunch of processes mapped to the same shared segment if you needed to use multiple CPUs.
Technically POSIX doesn't require mmap to support anonymous mappings, which are similar to shared segments. Practically every current implementation does support them making it a moot point. The "BSD-style" carried the day and is the de-facto standard.