 All right, welcome back. Good morning, everybody. Good morning. This is like the largest class I've had for a while. I think I should hand back exams every day. So I hope you guys had a great break. As you can tell, today we're kind of off to like a slow, relaxed sort of back falling into non-spring break. So I hope you guys had some good time off. And I didn't ruin it by handing back an exam today. But today the goal is to go over the exam. I'm going to put up the stats, give you some idea of how you did relative to the rest of the class. The average on the exam was pretty low, it was about 25. So maybe that makes you feel better about your score or really good about your score, depending on how well you did. So and then I want to go through the exam sort of question by question just to give you a little bit of an insight into why these questions were on the exam, what they were designed to elucidate about your understanding. So the point is that the first time I'd ever written given an exam, and I don't like it. And you guys are probably thinking, well, if you don't like it, then stop. But the point of doing this is not to create a hierarchy within the class. The point of doing this is so that you guys understand the progress that you're making towards learning the material that we'd like you to know. The nice thing is that on some level, the rest of the material that we're going to cover for this semester kind of starts to feel like variations on the same theme. We're going to see a lot of the same design principles that you were asked to write about in one of the long questions occur over and over again. And on some level, when we talk about storage and virtualization, we're going to see some of the same ideas emerge. So I want you guys to feel, if you didn't do as well as you wanted to on the exam, that we're going to continue to reinforce some of these concepts. I would rather have you guys remember one or two things from this class. If I have to have you guys repeat them every day, and I have to find eight different ways to kind of get out them and get you guys to think about them, then cover all sorts of material and have you guys not remember anything except that the class was hard and the instructor wrote these really terrible exams that were really difficult and things like that. So we're going to continue to kind of drum in some of the basics here. But let me talk a little about the exam. I'll also talk a little bit about how grading in this class works, because I think it's kind of an appropriate moment to discuss that. All right. So the midterm, and this is not working because it's not on, that's a good reason for it not to work. OK. All right. So just a couple of announcements before we get going. We're going to have feedback on your design documents out by tomorrow. The TAs don't know this, but they're going to be working hard on this for the next 24 hours. Well, also today I think post some idea of the rubric for our grading of the design documents, meaning here are the things that we wanted you guys to cover. Here are the things that we hoped you unearthed. Here are the things that we think are hard about the assignment. You guys may find that there are different things. But hopefully by this point you're also well into the process of making some significant progress on assignment two, which is due a week from today. And then again, so for the rest of the semester we're essentially at the halfway point. And we have about six weeks to go. We're going to spend those six weeks discussing largely storage and virtualization. I'm still unsure about how I'm going to do storage partly because I feel a little bit weird talking about spinning disks because I think by the time you guys are mature sort of Jedi masters, spinning disks won't matter anymore. Or it will be very rare for you guys to actually encounter one. So we'll figure out how to do that. And then we're going to talk about virtualization. And we'll also sneak into a couple of lectures about operate system structure, which is usually covered earlier. But I decided to kind of wait because I think it makes more sense to talk operate system structure once you've seen the structure of an operate system. So let's you know what the components are. We can talk a little bit more about the design and talk about micro kernels and macro kernels and monolithic kernels and exo kernels and multi kernels, et cetera, et cetera. So this gets to be a little bit alphabet soupish, but it's kind of fun. All right. So again, this is my goal today. If you have questions about your specific grade on one of the questions, please approach the core staff during office hours. The grading for the exam was done over break while you guys were out partying and then soaking up some sun. And it was done by Feng, who graded the short answer questions. And Anodipa, who is proctoring an alternate midterm makeup exam today, but she graded the multiple choice and the long answer question. So just so you know who to blame. But if you have specific questions about the exam, please talk to them or talk to me if there are issues. Finally, I just want to point this out just to head off any problems, which is that we scanned all the exams. So if you think that you could add a little bit to your answers and then turn them in for regrading, don't try it, because they're all scanned in. And why not? I mean, we just did it because it's easy, right? And you could just scan things. OK, so remember, going back to our grading overview, this exam was worth 12% of the points in this class. 4% you got for free by just taking the preterm exam. And then 12 percentage points for this, the final exam is going to be worth 24 points. The final exam is probably going to look a lot like this, actually. I decided when I wrote this exam, I kind of like writing exams like this. Maybe you guys don't. But I think I'd rather write an exam like this than a long multiple choice exam. There's a possibility that the final will be a take-home exam as well. I'm still sort of thinking about it. How many people would enjoy doing a 24-hour take-home final exam rather than coming to class for whatever it is, like an hour, three-hour winter take-all? Who would prefer to do a 24-hour take-home exam? The 24-hour take-home exam would be written and designed to take like three or four hours. It would not be designed to take 24 hours. It's not a 24-hour long exam. It's an exam that you can take within a 24-hour window of time. Let me see those hands again. People who prefer a 24-hour take-home exam. People who would prefer to sit for a whatever it is in two-hour exam. OK, so that's about 50-50. I think I get to make up my mind about this, which is good, because that's what I was going to do anyway. OK, well, we'll think about how to do that. All right, so this is just a reminder about how this works in case, again, you're disappointed by the midterm or related by the midterm. It's a small percentage of your grade. So here were the statistics for the midterm. Again, the average was pretty low. The average was about 26. The median was also about a 26. We had 89 people who took the primary version of this exam. Most of you guys are here. If you took the alternate version, you know that. If you took the primary version. If you don't know what version you took, then you took the primary version. I wrote several versions of the exam because I gave them one early. And again, I don't want to blow us out of proportion, but there were some people here who did very well in the exam. So it was actually kind of interesting that the max that most people got in the exam was about 40. 40 to 42. That was where most of the high grades. However, there was one person who I think who maybe or not maybe here who got a 48 out of. So is Robbie here? Nice job. So the following top five grades, Keith, who I know is here, 43, nice work. John Gerber, 42. Where's John? He's going to be embarrassed a little bit. Jimmy Woo. Now everyone's going to come to you guys for questions. That's why I'm doing this. Is Jimmy here? I don't think Jimmy is here. And then there was a group down at 40. So Michael, Vikas, and John Longenacker is here. Michael's here. Vikas is also here. And Jason, I know, is out. So let's give these guys a little hand. They did well on the exam. And again, I mean, the only reason to do this is so you guys can bother these guys when you have questions about the material. There's one of me, there's six of them, seven of them, eight of them. I should have given more high grades. Eight of them. So if you're struggling, these are good people to talk to. They understand the conceptual material. How they do on the program and assignments is a totally separate story. But these guys are getting the concepts that they're good people to talk to. So let's go question by question. So a multiple choice were designed to be easy. How many people felt the multiple choice were pretty easy? I hope they were. I mean, the multiple choice were exactly taken from the slide. Literally, like I said, I looked at the slides and I said, here's a multiple choice question. Here's a slide that has three things that are policy and three things that are mechanism. I can turn that into a multiple choice question. Actually, I turned that into two multiple choice questions. There was a parallel question on the alternative exam. So the point is that these were not designed to be hard and by and large, people did well. The median out of 10 was an eight. The average was a seven point again. We didn't break this down question by question. I'm curious how many people got the coming to class on time question, but I don't really care. So maybe we'll try to figure that out. All right, so the short answer. So let me explain this. So the short answer what I did is we computed. Let me go back a second. So they're 89 total. And we computed how many people decided to answer this question, which means they filled out something in the blank. And then we also tabulated for how many people was that question one of the top four short answer questions. So some people answered more short answer questions than they needed to. And for those people, one of the answers wasn't counted. So you can see that it was clear to me in retrospect that some of these questions were easier than others. So for example, question four was a very popular question and for good reason. That was the question on interrupts. Yeah, apparently that was easy. Because almost everybody decided to answer that question and the average was 3.8 out of 5, which is by far the highest. On the other hand, question six, so you guys were pretty good at identifying the questions that were difficult. Not perfect though, because 84 people decided to try to answer question seven, which apparently was harder than you thought it was. So these are just summary statistics. I'll post the stuff on the website, but let's give some idea of the overall breakdown. As with any exam, my goal was to write six questions of equivalent difficulty, and I failed. Some of these were easier than others, or maybe I just did a better job teaching some of this material. So the point is that there was some spread in the average here. So for the long answer, the overall average, so as far as I could tell, the long answer question is really where people struggled. The average on this question was below 10 out of 20. So I think most people, this dragged down a lot of people. People lost a lot of points here. And I understand that, because this is not something that we've done a lot of in this class. This question asked you guys, not just to repeat or to remember material that we've covered, but actually to try to synthesize some new thought based on existing concepts. On the other hand, again, for this particular question, the two alternatives showed a fairly large grade spread. So the alternative one, we'll go over each one of these answer by answer. Alternative one was the user versus kernel multi-threading question. People, about half the people who took the exam tried that question and about the average was quite a bit lower. Alternative two was the design principles question. So the average on that one was a little bit higher. Again, if you have questions about your specific grade, please come talk to us. OK, any questions about the breakdown here? Questions, doubts? This is kind of supposed to be a little bit of a struggle session for me. So if you guys are mad about the midterm, it's a good time to say something, to be like, and this is ridiculous. I answered alternative one and I got totally screwed because it was hard. No one feels that way. I'm sure people feel that way. Everyone who answered question one feels that way, D. So I think alternate two was an easier question. And what can I say? I mean, I feel like that's just, alternate one was designed to be a little bit more technical in nature. I think it was a fair question in that, if you understood the material that we presented in class about threads, then that should have been an easy question to answer. But let me be honest. Alternate two, so alternate one was kind of a question that was aimed at the people in this class who might really think that they will go out and do sort of serious system programming some day. Alternate two was aimed at the other 90% of you who are taking this class because it's a requirement and don't intend to ever hack on a kernel again once you get through this miserable OS 161 stuff. But you guys are going to write software. And as we talked about in the beginning of this course, one of the things about this class is learning design principles that you can take with you when you work on other software projects. So that's what alternative two was really trying to get at, was design principles that are broader and bigger than just computer systems. They're not about just operating systems. They're not about just computer systems. They're bigger and they're good ideas that you can take with you no matter what you're working on. And really in some ways, the question was also trying to push you guys to take some of these good system design principles and find kind of cute applications for them outside of computer science. I don't know how many people answered. One of those, at least one of those examples was something that wasn't drawn from computer systems. Did anyone come up with good? OK, John. Did anyone come up with good examples that weren't computer systems? How many people came up with good examples that weren't from operating systems, like networks or other types of programming? OK, so that was kind of the point. Many other questions. We're looking at the score by score breakdown. All right, so let me step back. And in case you guys are nervous, because this exam, and I told my wife and she was like, oh, man, that's terrible. People got a 50% in here exam. You're a terrible professor. Yeah, I know that. Nothing different than what she tells me on a regular basis. So the point is putting these grades in context. So this is how we are going to grade this class. This is actually how it's going to happen. So at the end of the day, you guys are essentially accumulating points. So these are the first points that you've accumulated that we've actually measured. We're almost done with grading the assignment zero. We know we're behind on the assignment grading, so we need to catch up on that. But we're going to add up all your points, and then we're going to put you guys up on some sort of big board, and we're going to go through them. We're going to start to look for logical clumps of students, students that we think their performance overall, when we've calculated all the different components, is indistinguishable. And normally what happens when you do this is that you see that there are cohorts, right? That there's a group of students that are all at the top within a certain range of scores, and then there's kind of a natural place for a division, right? So this is a very much a manual process, and the point is to try to map these points that we're giving you to letter grades, but that's not actually going to happen until the very, very, very end of class, right? So a 25 out of 50 on this midterm is meaningful only in the sense that there's 25 points that might put somebody else, although there was almost no one who, I mean nobody got a perfect score, and there were very few who got over a 40, right? But that might put them into another cohort at the end of the day, but it probably won't, right? Because a lot of the points are still on the board, right? So most of the points are for things like the programming assignments. The other thing I want to point out about the midterm in case it's not immediately obvious is that the midterm tests your ability to come in here and sit down for 50 minutes and really nail an exam based on the material you have in your head, right? And for people like me, I'm not super fond of that skill. That skill has uses, right? But the number of times that you guys are actually going to sit down and have to, there's 50 minutes and there's a bomb about to go off, and if you don't answer the question correctly about user versus kernel multi-threads, the world is going to perish, right? This is not a feasible scenario, right? It is possible that you'll have a month-long deadline and you'll be trying to push into a piece of software and you'll be really required to pound out some pretty good code, but that's really more about determination. So I see this part of the class, this component of your grade, the midterm and the final, really. So that's about 40% are the, this is the brightness component, right? This is the smartness component. It has to some degree to do with just your innate intelligence and then how much time you've spent going over the lecture materials, how many questions you've come, ask me during office hours, how many times you rewatch the really exciting lecture videos online, et cetera, right? The other 60%, which is thankfully bigger, is the determination points, right? So you guys don't have to stop working on these assignments till you're done, right? Or until you run out of time. And when you guys turn in assignment two, there might be one group that spends five hours on it. How many people have already spent over five hours on it? Okay, so there probably won't be a group that says five hours on it, but maybe it'll be the group that spends like 15 hours on it, right? And there's gonna be another group that spends 150 hours on it. And we can't tell it apart, right? All we're gonna do is test it and see if it works, right? So that part of the grade is really much, much more in your control. I know you guys have other things to do, but that part of the grade is kind of like being able to take the midterm and spend twice as long or three times as long as somebody else on it, right? It's not over until you give up, okay? Any questions about the grading for overall class? And I think, I'm on a slide, so okay. So let me pull up the solution set for the midterm, which I will make available via email today. Okay. Come on. And okay, so I'm not gonna dwell on the multiple choice. Does anyone have any questions on the multiple choice questions? Questions that they think are, answers they think were just blatantly wrong. Okay, going once, going twice, questions on the multiple choice. All right, good. All right, so let's talk, let's talk, let me go back here and just review, okay. So why don't we go through these questions in some sort of reasonable order. So the most difficult question based on the average as far as the short answer was question number six. So let's look at that one. All right. All right, so this was a question about kernel privilege. All right? The reason this question is on the exam is because kernel privilege is the thing that makes kernel, the kernel different than just some normal application, right? The kernel is a piece of computer code, right? I think some of you guys are starting to get a feeling for this. Let me see if I make this a little bit bigger. As you work on assignment too, right? But the kernel is a piece of computer code. And it's in some ways very similar to any other application you run on your system, right? The difference is, as we've talked over and over about is that the kernel has special privileges, right? The kernel has special powers that other applications don't have, and it's required to do that in order to multiplex resources, right? So this question starts with the premise that these privileges are needed to multiplex virtual memory and then ask you guys to describe what special privileges are required, how they're used, and what would happen if the kernel didn't have them, right? So I didn't get a chance to see the individual answers. Does anyone who answered this question want to make a comment about their answer or where they got hung up or why this question felt difficult? One of the things I worried about with this question was just that maybe it was even a little too obvious, right? Like the last part, what would happen if the kernel didn't have these special privileges? Well, applications could just sort of barf all over each other's memory, right? But maybe we've got you guys to the point where you don't even see that as a possibility. That's just the world can't be there, right? Any questions about this question on the exam? Who answered this question? Raise your hand. All right, do you guys don't have any questions about this question? All right, let's go on. Okay, question. The next most difficult question was question seven. Describe the trade-offs surrounding memory page size. What happens to become pages become very small? What happens to become pages become very large? So I'll be honest. I didn't anticipate this question was going to be hard. How many people answered this question? Raise your hand if you answered this question. Okay, this was a popular question to answer. Does anyone want to make a comment about their answer and how they lost points? Or whether they lost points? Isaac? Nobody said that you had to mention blue and black trade-off exactly what you're saying. It's what you wanted to say. Okay. It's not even exactly what they're more to answer than that. Well, I mean, again, I felt like this question had a pretty straightforward and short answer. So maybe the grading on this question was a little bit aggressive. It's possible. So you got what? I got three out of five. Okay, and can you identify things that were missing from your answer? I didn't do good stuff as far as I would have asked you. Ah, okay. Maybe bad, bad, bad things. Gotcha. And there is a fair amount of symmetry to these things. Like the good and bad things are paired. So maybe we will revisit the grading of this question in terms of, on the other hand, of course, you have to remember, as long as the grading is consistent. Although you're right. I mean, we should make sure that we rectify this with respect to the other questions. John? Okay. Keith? Okay, okay. So maybe for this question, we need to go back and take out some of the symmetry. Can we do that, Feng? Okay, so if you answer this question, right, this is why we're doing this. If you answer this question, and you lost points, and again, I think I was, this is the question that I was most confused about because a lot of people chose to answer the question, which means I think that people sense that this question was an easy mark, right? And yet the grading was a little bit low. So it sounds like maybe people are missing one or two points on this question. If, I guess there's, let's see here, I guess there's two things we can do here, right? And I'll consider both. The first one is easier. The first one is just, we apply some sort of across the board correction to this question only, right? Maybe we add a point, right? Or two points to everybody's answer. The other approach is, you guys come in individually and meet with the core staff and we try to figure out how your answer makes sense, all right? So we will think about this. I don't wanna open up massive cans of worms here because if I start doing this, then the people who answered question six are gonna wanna go back and start complaining about question six, right? But I think that's a fair point. I think that there is a lot of symmetry to this answer. So maybe what we can do is make sure that if people gotten the bad points on both sides or the good points on both sides that those reflect across, all right? All right, okay, so let me, somebody other than me is listening so we can make notes of this. Okay, so let's go on, that's a good point. So the next most difficult question was question two. That is, ah, no, that's this one. That was easy. Question two, okay, so this is, this I was also a little bit surprised by because I thought this question was mechanical and probably not that difficult to go through. So this was not a terribly, this was the least popular question to answer, okay? Is anybody who did this question and is feeling unsatisfied by their grade they received wanna make a comment about the question? I mean, unless there's something wrong with this question, I think this is gonna be a difficult one to quibble with, right, because this is, again, designed to be fairly mechanical, right? And I even made it easier by using base 10 arithmetic, which makes me feel a little dirty, but I think it's the right thing to do, wait. Physical page number 120. Well, I mean, we wanna see the whole address, right? We definitely wanted to see the eventual instruction that would have been executed. I mean, if you think you have an answer that's functionally equivalent to this, then come talk to us and we'll look at it again. Anybody else comments on this question? Yeah? Yeah, I mean, for C and Y, we identified whether there'd be a DLP point or a page point and are we really moving on that? Okay. So we're very lost. Okay, I mean, maybe we can, we might think about making that one, but yeah, I mean, we wanted, we wanted to know kind of what would happen, right? I think that was, I think that was specified, right? Describe what would happen of each of the following two of the instruction words were executed, right? And we went over something like this in class, right, with the segmentation. So I think I established some problems with this. Any other questions on this question? All right, now the next two, I hope we'll go a little faster because they were easier. So questions three and five were, both had pretty high averages. I think people did well on these questions. Question three, where's my, question three was locating bugs. And of course, there was no, there was no surfeit of problems with this code. Most of them were pretty obvious. And then question five was identifying between interactive and non-interactive threats. Any questions on these two, these two questions? Question three, question five from the short answers section. Any frustrations? I know you guys are just seeing the exam. We're just doing this right now because I want some feedback on the questions and I think we've already got some useful feedback. This is kind of the process of debugging the midterm. If you guys have doubts later about your answers, please come talk to the course staff, right? I mean, you guys, I'm sure you'll sit down and look at the feedback that's the TFs have provided, John. Yeah, yeah. So why don't, why don't we do this? I will have, I will have Fung and Anodipa try to come up with some, because I know they have rubrics that they used. So I'll have them sort of describe the rubrics and we can put that either on the solution side or we'll send it out via email. That's, that's a good point. In those cases, that's not, they're not always going to add up, right? Like there might be, if there's three parts and it's a five point question, it might be two points per part up to five points or two points off per part down to zero points, right? So, all right, any, any questions on three and five? And then the question that, that everybody seemed to really enjoy answering was this one, and I don't want to spend too much time on it because the medium was a four. So most people seem to do well on this particular question. Any questions, any questions on four? All right, going once, going twice, questions three, four and five. This is the soft underbelly of the, of the short answer question section. All right, so let's look at the long answer questions. Just don't have a huge amount of time, but we have a few minutes. All right, so I already touched a little bit on both of these questions, but let me give you an idea of rationale here. I'm happy to do rationale for the other questions. I know I kind of stopped doing that, but I hope the rationale, at least in certain places, is clear, right? So again, the system design principles is on here because these are the things I actually care about you guys learning or at least remembering, right? I mean, some idea of the existence of and the application of because I think that this, these are things that'll make you guys stronger programmers and stronger technologists, right? I mean, these are some of the hard earned lessons that the computer science systems community has spent 50 years, 60 years, fighting their way to understand, right? And the reason we try to teach people these is because not because they're not obvious, right? Because some of them are kind of obvious and that's fine. The reason that we teach them is because people, including me, smart people constantly ignore them, right? That's the weird thing. I mean, sometimes you have this, you know, when you're having conversations with systems people, it's like, oh yeah, well, everybody knows that. It's like, well, why don't they do it, right? If everybody knows it. I mean, keep it simple, stupid, right? I mean, this is a very, this is actually kind of a deep idea, right? For a lot of people and yet the number of systems that seem to struggle with this is pretty incredible, right? So my favorite example of keep it simple, stupid, do you guys remember Friendster? How many people ever used Friendster? Friendster, really, nobody? I'm old, okay. Friendster was an early social networking site. You know, how many people think that Facebook was the first social networking site ever created? That's good because it wasn't clearly. There were predecessors and Friendster was one of them, right? And it's an interesting, I mean, you can have a long conversation about why Facebook rose to the position of relative dominance in this area. But one of the things that Friendster tried to do was Friendster was entirely, Friendster didn't have any notion of school or any notion of company. It was entirely trying to connect people based on their social networking graphs, right? So the idea was, you know, if I'm within four degrees of separation from Isaac through our mutual friends, then I should be able to access information about it, so how often do you think that friend graph changes? It's like constantly, right? So, I mean, Friendster had a lot of issues, right? It was a really slow site, but I remember reading somewhere that one of their design issues was simply that they were trying to do all this based on these graph traversals, and yet this graph was constantly changing, right? As people were adding and removing friends, and so the system got so slow, right? And rather than think about a simpler way to address their problem that might not have had that feature, I mean, when Facebook came out, you could only, Facebook had these very, very nice, vertically oriented, you know, spheres of social contact. If you went to school with somebody, you could see their profile. That's how it was in the early days before they added 10 gazillion privacy features, right? But it used to be, you know, like if you went to Harvard and this other guy went to Harvard, you could see his profile, and that was really easy, right? You can imagine that makes determining whether or not you can see a person's information very, very fast, whereas for friends here it was incredibly slow, right? And now that Facebook has matured, it has some of those friends who are like features, right? But on some level, Facebook took a simpler, easier approach first, and they got it to work. They also had a site that looked better, right? But you didn't go to Facebook and sit there for 10 seconds waiting for the page to load, right? So it had some nice problems. Anyway, sorry about the digression, but the point of this question was to try to get you guys to talk about some of these design principles, right? Any questions about the second alternative system design principles question? And then why don't I quickly just, I mean, again, we're gonna send out these answers via email, but so examples of system design principles, separation of policy from mechanism. I think we've talked about that one multiple times. Keep it simple. Stupid was not one that came up a lot, but it did come up several times. Use the past to predict the future. I think that hopefully that one's been drummed pretty well into your heads by now. Using caches to make a big thing seem faster or putting a fast thing, or using a big slow thing to make a small fast thing seem bigger. It's kind of the duals of each other, right? Adding a level of indirection to allow the system to have more control over translation and to play some games about where things are, and then avoiding doing things immediately that you might never have to do, right? So we talked about that with demand paging. Any questions about these principles? And then the other, again, I mean the other question here was the one about user and kernel threads. And the idea behind this question was to try to see if people had a really detailed knowledge of what it means to do threading. And I think this is a fair question because we talked about it in class. And also you guys are doing this for assignment two, right? So for assignment two, if you're off to the right start, you've seen a lot of the functions in OS 161 that create and manipulate threads, right? And there's no magic here, right? I mean thread state is stored in memory somewhere, right? Thread context is stored in memory and switching threads means unloading and reloading registers. And there's no reason that a lot of this stuff can't be done in user space and in fact it frequently is, right? As far as the trade-offs, right? I mean that probably is a part of the question that people struggled a little bit more with, right? And the fundamental thing you had to notice there was that creating threads and manipulating threads and the kernel requires context switching into the kernel. And we've talked several times about context switch overhead, right? And so that means that things like thread creation and thread destruction are very slow, right? So the general, and I'll let you guys again see the solution at some point. These are more difficult to view here because they span multiple pages. But the idea with this problem was that we wanted you to identify the fact that context switching is slow. That means certain types of thread operations are much more expensive to do inside the kernel. And that means that applications that use threads for sort of small tasks like I fork off a thread to handle the fact that the user clicked a button and then that thread dies or exits, those applications do much better with user thread libraries, right? Applications that use kernel threads like web servers frequently fork off a whole pool of threads that essentially sit there processing tasks from a queue and live until the entire application shuts down, right? And that's how they avoid the overhead of creating and destroying threads. They keep a set of threads around that is designed to be large enough for a large task that they might have to perform. But when the system is idle, those threads still sit there, right, and they're just sleeping, not doing much, right? Okay, any questions about the long answer questions? All right, so Wednesday, we're gonna go on. There might be a little sort of memory stuff that we need to clean up, but probably not, we're probably gonna do storage. So this is the third big unit in the class. We're gonna talk about disks, file systems. There's a lot of similarities here between virtual memory management. So we'll have a chance to reinforce some of that and that'll be awesome, so I will see you then.