Von Neumann, Harvard and contemporary processor architecture
In a von Neumann architecture, both data and programs are stored in a single memory unit, as strings of binary digits (bit strings).
As the von Neumann architecture holds both programs and data in memory, which is separate from the processor, there is inevitably bottlenecking due to the limited bandwidth of the memory, especially compared to the speed of modern day processors. This means that the processor spends time idle, waiting for the data to be fetched from memory, slowing it down and creating a bottleneck.
This problem can be combatted in a number of ways, including caching – putting frequently used data into a faster area between the CPU and RAM, prefetching – moving data into the cache before it is requested to speed up access should it be requested, multithreading – managing multiple requests simultaneously in different threads, processing in memory – integrating the processor and memory into a single microchip, and using separate caches or access paths for data and instructions.
As both programs and data are held together, there is a possibility that a badly written program could begin reading the data as processor instructions, causing unexpected results.
This can be combatted by making sure to place a halt instruction before any of the data, to ensure that the program never reads it as instructions, or by separating the programs and data into separate caches, so data cannot be read as instructions