 In this video, I'm going to give you an overview of the majority of the topics that are of major interest in memory, which are the most central to how we develop memory and how our levels of memory interact. So the first question we might have is, what data do we fetch? When I request a piece of data and it's not immediately available, I have to go to a different level of my hierarchy. So do I always just pull in the single byte that I want or am I going to pull in something larger? If I do bring some other data with it, how do I decide what I should bring? You could also ask, when do I fetch this data? Do I always just wait until a piece of data has been requested? Do I want to load data speculatively? A low-level cache is tiny, so the majority of the time it's already full. There's no real room to stick more stuff in there. So if I need to pull in some new data, it's going to have to replace something. So how do I choose what data I should replace? Which should I keep? Which do I want to get rid of now to make room for this new piece of data? You can also ask, well, where do I put my data inside these various levels? Does it need to be structured somehow or can I just kind of toss it in wherever I feel like? All of these are really central to reading data, but not necessarily so meaningful when you ask about writing data. You can also ask about what do I do when I write data? Do I just write it to my lowest level cache and ignore it? Do I want to write it to every last part of memory that knows about this data? We'll have some options for all of these questions, and we'll start with the first one here.