The memory management in DOS is simple, but that simplicity may be deceptive. There are several rather interesting pitfalls that programming documentation often does not mention.
↫ Michal Necasek at the OS/2 Museum
A must-read for people writing software for earlier DOS versions.

Nice start…
This is true when you exit with TERMINATE = (4Ch), but not true, when your “Terminate and Stay Resident / TSR” = (31h).
There are also techniques that just change the free size by “shaving” from the upper limit (SETBLOCK).
Speaking of upper limits…
Expanded, and Extended memory (EMS, XMS) would also be good follow ups.
Not to mention HIMEM (0x10000 – 0x10FFF)
Edit: This might be useful for enthusiasts… the INT 21 DOS syscalls:
https://stanislavs.org/helppc/int_21.html