<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://homeostasis.scs.carleton.ca/wiki/index.php?action=history&amp;feed=atom&amp;title=Operating_Systems_2026F_Lecture_13</id>
	<title>Operating Systems 2026F Lecture 13 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://homeostasis.scs.carleton.ca/wiki/index.php?action=history&amp;feed=atom&amp;title=Operating_Systems_2026F_Lecture_13"/>
	<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Operating_Systems_2026F_Lecture_13&amp;action=history"/>
	<updated>2026-11-15T20:21:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=Operating_Systems_2026F_Lecture_13&amp;diff=25216&amp;oldid=prev</id>
		<title>Soma: /* Video */</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Operating_Systems_2026F_Lecture_13&amp;diff=25216&amp;oldid=prev"/>
		<updated>2026-11-06T17:52:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Video&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:52, 6 November 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot;&gt;Line 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Video from the lectures given on November 5th and 6th, 2026 are now available:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Video from the lectures given on November 5th and 6th, 2026 are now available:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [https://homeostasis.scs.carleton.ca/~soma/os-2026f/lectures/comp3000-2026f-lec13a-20261105.mp4 Lecture &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;12A&lt;/del&gt;]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [https://homeostasis.scs.carleton.ca/~soma/os-2026f/lectures/comp3000-2026f-lec13a-20261105.mp4 Lecture &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;13A&lt;/ins&gt;]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [https://homeostasis.scs.carleton.ca/~soma/os-2026f/lectures/comp3000-2026f-lec13b-20261106.mp4 Lecture &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;12B&lt;/del&gt;]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [https://homeostasis.scs.carleton.ca/~soma/os-2026f/lectures/comp3000-2026f-lec13b-20261106.mp4 Lecture &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;13B&lt;/ins&gt;]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Notes==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Notes==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Soma</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=Operating_Systems_2026F_Lecture_13&amp;diff=25215&amp;oldid=prev</id>
		<title>Soma: Created page with &quot;==Video==  Video from the lectures given on November 5th and 6th, 2026 are now available: * [https://homeostasis.scs.carleton.ca/~soma/os-2026f/lectures/comp3000-2026f-lec13a-20261105.mp4 Lecture 12A] * [https://homeostasis.scs.carleton.ca/~soma/os-2026f/lectures/comp3000-2026f-lec13b-20261106.mp4 Lecture 12B]  ==Notes==  ===Lecture 13A===  &lt;pre&gt; Lecture 13A ----------- Concurrency  Original UNIX didn&#039;t have threads -  it only had processes  So what&#039;s the difference?  A...&quot;</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Operating_Systems_2026F_Lecture_13&amp;diff=25215&amp;oldid=prev"/>
		<updated>2026-11-06T17:51:54Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==Video==  Video from the lectures given on November 5th and 6th, 2026 are now available: * [https://homeostasis.scs.carleton.ca/~soma/os-2026f/lectures/comp3000-2026f-lec13a-20261105.mp4 Lecture 12A] * [https://homeostasis.scs.carleton.ca/~soma/os-2026f/lectures/comp3000-2026f-lec13b-20261106.mp4 Lecture 12B]  ==Notes==  ===Lecture 13A===  &amp;lt;pre&amp;gt; Lecture 13A ----------- Concurrency  Original UNIX didn&amp;#039;t have threads -  it only had processes  So what&amp;#039;s the difference?  A...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
Video from the lectures given on November 5th and 6th, 2026 are now available:&lt;br /&gt;
* [https://homeostasis.scs.carleton.ca/~soma/os-2026f/lectures/comp3000-2026f-lec13a-20261105.mp4 Lecture 12A]&lt;br /&gt;
* [https://homeostasis.scs.carleton.ca/~soma/os-2026f/lectures/comp3000-2026f-lec13b-20261106.mp4 Lecture 12B]&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===Lecture 13A===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 13A&lt;br /&gt;
-----------&lt;br /&gt;
Concurrency&lt;br /&gt;
&lt;br /&gt;
Original UNIX didn&amp;#039;t have threads -&lt;br /&gt;
 it only had processes&lt;br /&gt;
&lt;br /&gt;
So what&amp;#039;s the difference?&lt;br /&gt;
&lt;br /&gt;
A thread is an execution context&lt;br /&gt;
A process is one or more execution contexts +&lt;br /&gt;
  an address space&lt;br /&gt;
&lt;br /&gt;
an execution context is CPU state&lt;br /&gt;
 - the value of all the registers (basically)&lt;br /&gt;
 - function stack&lt;br /&gt;
 - plus any associated kernel context&lt;br /&gt;
&lt;br /&gt;
Threads were introduced when we got SMP systems&lt;br /&gt;
 - symmetric multiprocessing, e.g., multiple cores&lt;br /&gt;
&lt;br /&gt;
You&amp;#039;re sharing memory between threads&lt;br /&gt;
 - how do you keep them from messing with each other?&lt;br /&gt;
&lt;br /&gt;
Concurrent access to any data in memory is inherently dangerous&lt;br /&gt;
 - TOCTTOU errors abound&lt;br /&gt;
   &amp;quot;time of check to time of use&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if (x) {&lt;br /&gt;
  do blah&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
If the inside of the if statement isn&amp;#039;t safe if the value of x changes after the check...you&amp;#039;re in trouble.&lt;br /&gt;
&lt;br /&gt;
It might seem like everything would be fine, but for any variable x, there can be multiple values&lt;br /&gt;
 - every thread can have its own value of x&lt;br /&gt;
 - even if there&amp;#039;s only supposed to be one copy of it&lt;br /&gt;
&lt;br /&gt;
The multiple copies come from the memory hierarchy&lt;br /&gt;
 - we make copies to make things fast&lt;br /&gt;
 - but those copies come back to bite us when&lt;br /&gt;
   we do concurrent programming&lt;br /&gt;
 - remember the fastest caches are core specific!&lt;br /&gt;
&lt;br /&gt;
My general advice is to use processes with shared memory&lt;br /&gt;
 - only share exactly what you need&lt;br /&gt;
 - rather than share everything&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concurrency is not parallelism&lt;br /&gt;
 - parallel processing is inherently concurrent&lt;br /&gt;
 - but even with one CPU you can have concurrency&lt;br /&gt;
&lt;br /&gt;
concurrent systems have multiple logical execution contexts that can interfere with each other&lt;br /&gt;
&lt;br /&gt;
signal handlers are concurrent but they are not parallel&lt;br /&gt;
 - the regular process pauses while the signal handler executes&lt;br /&gt;
 - but because they are in the same address space,&lt;br /&gt;
   they can interfere with each other&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concurrency arises when you have scheduling of CPUs&lt;br /&gt;
 - sharing between multiple running programs&lt;br /&gt;
&lt;br /&gt;
Assume we have processes A, B, and C running on a system with a single core/single CPU&lt;br /&gt;
&lt;br /&gt;
One way to handle sharing is for each process to run to completion before the other starts.&lt;br /&gt;
 - this is batch processing&lt;br /&gt;
&lt;br /&gt;
BATCH PROCESSING&lt;br /&gt;
----------------&lt;br /&gt;
A starts&lt;br /&gt;
A finishes&lt;br /&gt;
B starts&lt;br /&gt;
B finishes&lt;br /&gt;
C starts&lt;br /&gt;
C finishes&lt;br /&gt;
&lt;br /&gt;
But Linux is built on the idea of *time sharing*&lt;br /&gt;
 - each process gets a &amp;quot;slice&amp;quot; of CPU time&lt;br /&gt;
 - when it is done with its slice, another process is&lt;br /&gt;
   allowed to run (or the kernel does its work)&lt;br /&gt;
&lt;br /&gt;
We want the computer to multitask, i.e. do multiple things at the same time by splitting its attention between the tasks&lt;br /&gt;
&lt;br /&gt;
Two basic ways to multitask&lt;br /&gt;
 - cooperatively&lt;br /&gt;
 - preemptive multitasking&lt;br /&gt;
&lt;br /&gt;
With cooperative multitasking, each program has to be &amp;quot;polite&amp;quot;&lt;br /&gt;
  - it does some work but then gives up the CPU&lt;br /&gt;
    before it has spent too much time&lt;br /&gt;
  - if it has a lot of work to do, it splits it up&lt;br /&gt;
    into pieces that fit within a reasonable share&lt;br /&gt;
&lt;br /&gt;
with preemptive multitasking&lt;br /&gt;
  - there&amp;#039;s a timer set every time a process starts working&lt;br /&gt;
  - when the timer goes off (it has used up its time slice), the process is put to sleep and another process is allowed to run&lt;br /&gt;
&lt;br /&gt;
pipes&lt;br /&gt;
 - a kernel implementation of the producer-consumer pattern, using file descriptors&lt;br /&gt;
&lt;br /&gt;
Think of two people doing dishes&lt;br /&gt;
 - one washing, one drying&lt;br /&gt;
 - if either gets too far behind or ahead, the other&lt;br /&gt;
   will have to say stop&lt;br /&gt;
&lt;br /&gt;
Why not use pipes for all inter-process communication?&lt;br /&gt;
 - it is easy to use but potentially slow&lt;br /&gt;
 - but it really isn&amp;#039;t that slow!&lt;br /&gt;
&lt;br /&gt;
Going back to filesystems&lt;br /&gt;
&lt;br /&gt;
Why inodes?&lt;br /&gt;
&lt;br /&gt;
Because directories are then just maps between names and inodes&lt;br /&gt;
 - and inodes are where the complexity of storing file contents comes in&lt;br /&gt;
&lt;br /&gt;
superblock&lt;br /&gt;
 - it is the &amp;quot;head node&amp;quot; of the filesystem data structure&lt;br /&gt;
 - has info on the structure of the filesystem&lt;br /&gt;
 - stored redundantly to guard against corruption&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Lecture 13B===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 13B&lt;br /&gt;
-----------&lt;br /&gt;
&lt;br /&gt;
Concurrency&lt;br /&gt;
&lt;br /&gt;
Concurrency is not parallelism&lt;br /&gt;
 - parallel computing is concurrent&lt;br /&gt;
 - concurrency can happen without parallelism&lt;br /&gt;
&lt;br /&gt;
Concurrency means that multiple computations can interact with each other&lt;br /&gt;
 - we can do this without parallelism with shared resources&lt;br /&gt;
&lt;br /&gt;
Signal handlers involve concurrency&lt;br /&gt;
 - because the handler interrupts the regular program flow&lt;br /&gt;
 - and this interruption could disrupt program flow&lt;br /&gt;
   if you aren&amp;#039;t careful&lt;br /&gt;
&lt;br /&gt;
It is all about side effects&lt;br /&gt;
&lt;br /&gt;
Consider TOCTTOU&lt;br /&gt;
 - time of check to time of use&lt;br /&gt;
&lt;br /&gt;
if (x) {&lt;br /&gt;
  do blah&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Implicitly with such code we assume that whatever the condition x was, it holds when we do blah.&lt;br /&gt;
&lt;br /&gt;
But what if something came in and changed x after we tested it but before doing blah?&lt;br /&gt;
&lt;br /&gt;
The entire point of the process model is to avoid concurrency as much as possible&lt;br /&gt;
&lt;br /&gt;
But we&amp;#039;ve got to talk about threads&lt;br /&gt;
&lt;br /&gt;
A thread is an execution context&lt;br /&gt;
A process is one or more execution contexts&lt;br /&gt;
  + an address space&lt;br /&gt;
&lt;br /&gt;
What is an execution context?&lt;br /&gt;
 - all the state associated with an executing program,&lt;br /&gt;
   outside of global shared memory&lt;br /&gt;
 - CPU registers + stack + kernel state&lt;br /&gt;
&lt;br /&gt;
Original UNIX didn&amp;#039;t have threads&lt;br /&gt;
&lt;br /&gt;
I don&amp;#039;t like threads&lt;br /&gt;
 - most of the time, you&amp;#039;re better off with processes&lt;br /&gt;
 - if you need shared memory, share just what you need!&lt;br /&gt;
&lt;br /&gt;
Threads became more popular once we had SMP systems&lt;br /&gt;
 - symmetric multiprocessing, i.e., multiple cores&lt;br /&gt;
 - without threads, any process is limited to a single core at a time&lt;br /&gt;
&lt;br /&gt;
But threads involve sharing all of a process&amp;#039;s memory&lt;br /&gt;
 - even the parts that shouldn&amp;#039;t be shared!&lt;br /&gt;
 - any error by one thread will propagate to other threads,&lt;br /&gt;
   in potentially very difficult to debug ways&lt;br /&gt;
&lt;br /&gt;
concurrency bugs are hard to track down because they depend on the relative timing of multiple computations&lt;br /&gt;
&lt;br /&gt;
Regular applications should try to avoid concurrency whenever possible...but the operating system has to live in a wold of concurrency&lt;br /&gt;
 - so how do we do it?&lt;br /&gt;
&lt;br /&gt;
We need the operating system to enable multitasking&lt;br /&gt;
&lt;br /&gt;
Two kinds: cooperative and preemptive&lt;br /&gt;
&lt;br /&gt;
Cooperative multitasking&lt;br /&gt;
 - each computation splits up its work so it can be&lt;br /&gt;
   a good sharer&lt;br /&gt;
 - if any computation is selfish the entire system can&lt;br /&gt;
   come to a halt&lt;br /&gt;
&lt;br /&gt;
Preemptive multitasking&lt;br /&gt;
 - timer limiting the &amp;quot;slice&amp;quot; of resources any computation&lt;br /&gt;
   gets&lt;br /&gt;
 - if one needs more time, it must wait its turn&lt;br /&gt;
&lt;br /&gt;
Strategies for managing multitasking are known as scheduling algorithms or schedulers&lt;br /&gt;
 - many, many ways to build schedulers&lt;br /&gt;
 - simplest schemes such as first come first serve&lt;br /&gt;
   work pretty well, but with lots of annoying corner cases&lt;br /&gt;
&lt;br /&gt;
UNIX provides a very nice way to manage concurrency between processes: pipes&lt;br /&gt;
&lt;br /&gt;
What is a pipe?&lt;br /&gt;
 - implementation of producer/consumer using file descriptors&lt;br /&gt;
 &lt;br /&gt;
Think of two people doing dishes: one washing, one drying&lt;br /&gt;
 - this is producer consumer&lt;br /&gt;
&lt;br /&gt;
For the producer, there&amp;#039;s only so much space to store intermediate results (wet but clean dishes)&lt;br /&gt;
 - when the storage space is full, producer must pause&lt;br /&gt;
 - but when there is room, the producer should start work again&lt;br /&gt;
&lt;br /&gt;
For the consumer, when there&amp;#039;s no work to do they should take a break&lt;br /&gt;
 - but when there is work to do, the consumer should get back to work&lt;br /&gt;
&lt;br /&gt;
That&amp;#039;s the tricky part of concurrent systems: coordination&lt;br /&gt;
&lt;br /&gt;
With pipes, coordination is taken care of by the kernel&lt;br /&gt;
 - it manages the buffers&lt;br /&gt;
 - it wakes up the producer (allows a write to finish)&lt;br /&gt;
 - it wakes up the consumer (allows a read to finish)&lt;br /&gt;
&lt;br /&gt;
pipes are a basic building block on UNIX systems because&lt;br /&gt;
it allows multiple programs to be combined to do a task&lt;br /&gt;
&lt;br /&gt;
Note that while multithreaded programs can be very efficient, they don&amp;#039;t have to be, and often times a multi-process implementation with pipes or some other IPC can be remarkably efficient&lt;br /&gt;
 - with less complex code!&lt;br /&gt;
&lt;br /&gt;
Why is parallel access to memory so bad?&lt;br /&gt;
Because of the memory hierarchy&lt;br /&gt;
&lt;br /&gt;
We make copies of data to make things faster&lt;br /&gt;
 - but that means there are multiple copies!&lt;br /&gt;
 - and so different computations could be working with&lt;br /&gt;
   multiple copies of the same data, and so if the&lt;br /&gt;
   program acts like there is just one version...chaos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
inodes&lt;br /&gt;
&lt;br /&gt;
A directory just associates names with inodes&lt;br /&gt;
 - easy way to get nested directories,&lt;br /&gt;
   since directories are just a kind of inode&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Filesystems consist of a few kinds of blocks:&lt;br /&gt;
 - data blocks&lt;br /&gt;
 - inode blocks &amp;lt;--- file contents metadata&lt;br /&gt;
    - directory inodes&lt;br /&gt;
 - superblocks&lt;br /&gt;
&lt;br /&gt;
What&amp;#039;s a superblock?&lt;br /&gt;
 - block that describes a filesystem&lt;br /&gt;
 - without a superblock you can&amp;#039;t mount a filesystem&lt;br /&gt;
&lt;br /&gt;
You technically only need one superblock, but multiple copies are stored just in case&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Soma</name></author>
	</entry>
</feed>