<?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_2021F_Lecture_18</id>
	<title>Operating Systems 2021F Lecture 18 - 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_2021F_Lecture_18"/>
	<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Operating_Systems_2021F_Lecture_18&amp;action=history"/>
	<updated>2026-04-06T04:46:31Z</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_2021F_Lecture_18&amp;diff=23506&amp;oldid=prev</id>
		<title>Soma at 21:24, 18 November 2021</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Operating_Systems_2021F_Lecture_18&amp;diff=23506&amp;oldid=prev"/>
		<updated>2021-11-18T21:24:12Z</updated>

		<summary type="html">&lt;p&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 21:24, 18 November 2021&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-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&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;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;==Video==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&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;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&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;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Video from the lecture given on November 18, 2021 is now available:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&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;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [https://homeostasis.scs.carleton.ca/~soma/os-2021f/lectures/comp3000-2021f-lec18-20211118.m4v video]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&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;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [https://homeostasis.scs.carleton.ca/~soma/os-2021f/lectures/comp3000-2021f-lec18-20211118.cc.vtt auto-generated captions]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&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;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Video is also available through Brightspace (Resources-&amp;gt;Class zoom meetings-&amp;gt;Cloud Recordings tab)&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_2021F_Lecture_18&amp;diff=23505&amp;oldid=prev</id>
		<title>Soma: Created page with &quot; ==Notes==  &lt;pre&gt; Lecture 18 ----------  - Restoring from access  - ssh-agent  - chmod    - see man page on online explanations   - supervisor vs user mode  - what the kernel...&quot;</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Operating_Systems_2021F_Lecture_18&amp;diff=23505&amp;oldid=prev"/>
		<updated>2021-11-18T16:56:32Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot; ==Notes==  &amp;lt;pre&amp;gt; Lecture 18 ----------  - Restoring from access  - ssh-agent  - chmod    - see man page on online explanations   - supervisor vs user mode  - what the kernel...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 18&lt;br /&gt;
----------&lt;br /&gt;
 - Restoring from access&lt;br /&gt;
 - ssh-agent&lt;br /&gt;
 - chmod&lt;br /&gt;
   - see man page on online explanations&lt;br /&gt;
&lt;br /&gt;
 - supervisor vs user mode&lt;br /&gt;
 - what the kernel does&lt;br /&gt;
 - virtual memory&lt;br /&gt;
   - mmap&lt;br /&gt;
 - kernel modules&lt;br /&gt;
   - vs eBPF&lt;br /&gt;
 - filesystems&lt;br /&gt;
   - VFS&lt;br /&gt;
   - superblocks &amp;amp; inodes&lt;br /&gt;
 - character devices&lt;br /&gt;
   - creating, how they work&lt;br /&gt;
&lt;br /&gt;
Restoring from access&lt;br /&gt;
 - look in .bash_aliases for original&lt;br /&gt;
 - run this to restore:&lt;br /&gt;
    rsync -a -v --delete --force&lt;br /&gt;
       &amp;lt;scs-username&amp;gt;@access.scs.carleton.ca:COMP3000VM-backup/&lt;br /&gt;
       /home/student/&lt;br /&gt;
 - note this will delete whatever you have in /home/student currently, in favor of the backup!&lt;br /&gt;
    - specify a new directory if you don&amp;#039;t want this, like /home/student/Restore&lt;br /&gt;
 - only /home/student gets backed up&lt;br /&gt;
    - you can do other rsync commands to backup other things&lt;br /&gt;
    - but note those other files will probably be owned by other&lt;br /&gt;
      users&lt;br /&gt;
 - add a &amp;quot;-n&amp;quot; flag when you first run a new rsync command to  have it simulate what it would do otherwise&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ssh-agent&lt;br /&gt;
 - this saves your unlocked private key locally, answers remote requests&lt;br /&gt;
   - can forward through multiple ssh connections&lt;br /&gt;
   - should really run locally&lt;br /&gt;
   - and it is running by default in most desktop environments&lt;br /&gt;
     (yes even windows and macOS)&lt;br /&gt;
 - so only need one ssh agent, all ssh connections you make will ask it for authentication info&lt;br /&gt;
    - if you are chaining ssh commands (ssh&amp;#039;ing to one machine, then from there to another) you may have to add the -A flag to forward the agent connection&lt;br /&gt;
&lt;br /&gt;
 - note you can ssh to access from anywhere, so if you use -J with access you don&amp;#039;t need a VPN to connect to the openstack instances&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supervisor vs user mode&lt;br /&gt;
 - CPU has at least two modes&lt;br /&gt;
    - user mode (ring 3 on x86)&lt;br /&gt;
    - supervisor mode (ring 0 on x86)&lt;br /&gt;
    - for ring 1 and 2, look up MULTICS&lt;br /&gt;
 - kernel runs in supervisor mode&lt;br /&gt;
 - processes run in user mode&lt;br /&gt;
 - system calls invoke the kernel by causing the CPU to switch&lt;br /&gt;
   to supervisor mode&lt;br /&gt;
&lt;br /&gt;
Switching between CPU modes is expensive&lt;br /&gt;
 - because CPUs have lots of caches and registers,&lt;br /&gt;
   these have to be saved/restored/flushed on each switch&lt;br /&gt;
&lt;br /&gt;
When in supervisor mode, you can do things that you can&amp;#039;t do in user mode&lt;br /&gt;
 - let&amp;#039;s discuss!&lt;br /&gt;
&lt;br /&gt;
The kernel&amp;#039;s job is to abstract and allocate resources to other programs&lt;br /&gt;
  - running in processes&lt;br /&gt;
  - so, implement the process abstraction&lt;br /&gt;
&lt;br /&gt;
 - other hardware (than CPU &amp;amp; RAM) =&amp;gt; character or block devices&lt;br /&gt;
 - block devices =&amp;gt; files&lt;br /&gt;
 - one CPU =&amp;gt; many CPUs &lt;br /&gt;
    - share CPUs between processes&lt;br /&gt;
    - when a process runs, it gets a core to use&lt;br /&gt;
       - so it has to be kicked off periodically so other&lt;br /&gt;
         processes can use the same core&lt;br /&gt;
    - process scheduling: sharing CPUs&lt;br /&gt;
      (Lots to talk about scheduling, we&amp;#039;ll do that later)&lt;br /&gt;
 - physical memory =&amp;gt; virtual memory&lt;br /&gt;
&lt;br /&gt;
Recall that when we looked at the address space of a process, memory locations were roughly the same for different programs&lt;br /&gt;
 - and could run same program with same addresses in parallel&lt;br /&gt;
&lt;br /&gt;
Processes access memory using virtual addresses&lt;br /&gt;
 - a pointer contains a virtual address&lt;br /&gt;
&lt;br /&gt;
Virtual memory is good because we don&amp;#039;t have to care about where other processes put things in their own address space&lt;br /&gt;
 - different process, different set of addresses (different address space)&lt;br /&gt;
&lt;br /&gt;
But at the end of the day we need to use RAM, and RAM is accessed by address&lt;br /&gt;
  - but these are physical addresses&lt;br /&gt;
&lt;br /&gt;
So the kernel has to maintain a virtual-&amp;gt;physical map for every process&lt;br /&gt;
 - this map is called a page table&lt;br /&gt;
 - every process has its own page table&lt;br /&gt;
&lt;br /&gt;
On every memory access, the CPU has to take the virtual address and figure out the corresponding physical address&lt;br /&gt;
 - if you had to consult a big data structure every time, would be&lt;br /&gt;
   too slow&lt;br /&gt;
 - but CPU maintains a cache of virtual-&amp;gt;physical mappings called the TLB&lt;br /&gt;
   (Translation Lookaside Buffer).  Don&amp;#039;t ask what it means, just call&lt;br /&gt;
   it a TLB and blame some old IBM engineers&lt;br /&gt;
&lt;br /&gt;
Why is this mapping called a page table?&lt;br /&gt;
 - because it maps pages to pages&lt;br /&gt;
 - a page is a fixed amount of RAM, power of 2&lt;br /&gt;
   - 4K or 8K, but can be multiple megabytes&lt;br /&gt;
   - different CPUs support different page sizes&lt;br /&gt;
 - basically equivalent to a block, but blocks are for disks&lt;br /&gt;
   and pages are for RAM&lt;br /&gt;
&lt;br /&gt;
If you want to learn how CPUs and computers work at a low level and what makes them fast, learn computer architecture&lt;br /&gt;
&lt;br /&gt;
Great book:&lt;br /&gt;
Computer Architecture: A Quantitative Approach 5th Edition&lt;br /&gt;
by John L. Hennessy (Author), David A. Patterson (Author)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
virtual-physical memory mappings aren&amp;#039;t done on an address by address basis&lt;br /&gt;
 - they are done on a page-by-page basis&lt;br /&gt;
   - so in 4K =&amp;gt; 4K chunks&lt;br /&gt;
 - we divide virtual addresses into a page number and an offset&lt;br /&gt;
   - high bits are page number, lower bits are offset within page&lt;br /&gt;
&lt;br /&gt;
So all virtual memory refers to is this maintaining of separate virtual address spaces per process and how these map to physical addresses (dynamically)&lt;br /&gt;
&lt;br /&gt;
So why bother with all this machinery of virtual memory?&lt;br /&gt;
 - allows for easy sharing of RAM&lt;br /&gt;
    - can give a process pages from anywhere, don&amp;#039;t&lt;br /&gt;
      need continuous ranges of memory&lt;br /&gt;
    - same memory used by multiple processes can map to same physical memory&lt;br /&gt;
&lt;br /&gt;
So virtual memory is a great way to save on RAM usage&lt;br /&gt;
 - dynamic linking takes advantage of it, only need one copy of&lt;br /&gt;
   a library in memory and every process using it can share it&lt;br /&gt;
     (many virtual mappings but one range of physical RAM being used)&lt;br /&gt;
 &lt;br /&gt;
Remember all those calls to mmap?&lt;br /&gt;
 - tutorial 6, to access the file on disk&lt;br /&gt;
 - made by malloc back in tutorial 2&lt;br /&gt;
 - we see them whenever a dynamically linked process loads&lt;br /&gt;
&lt;br /&gt;
mmap maps a file into the virtual address space&lt;br /&gt;
 - so logically, the file has been completely loaded into memory&lt;br /&gt;
 - but in reality, parts are loaded on demand&lt;br /&gt;
&lt;br /&gt;
Different ranges of memory can have different permissions&lt;br /&gt;
 - read, write, execute&lt;br /&gt;
 - important for security, but also for performance&lt;br /&gt;
    - if memory is not writable and it came from disk,&lt;br /&gt;
      we don&amp;#039;t have to worry about saving it if we need space,&lt;br /&gt;
      we can just kick it out of RAM&lt;br /&gt;
&lt;br /&gt;
Think about fork&lt;br /&gt;
 - logically, we copy all of a process&amp;#039;s memory&lt;br /&gt;
 - in practice, we just duplicate the virtual address mappings&lt;br /&gt;
   and mark everything read only&lt;br /&gt;
    - when one process writes, we duplicate that memory so the&lt;br /&gt;
      two processes have distinct copies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mmap can also be used to make &amp;quot;anonymous mmap&amp;#039;s&amp;quot;, so allocate RAM but without a corresponding file&lt;br /&gt;
 - so like sbrk, but can be anywhere&lt;br /&gt;
&lt;br /&gt;
Can also mark memory regions as being private or shared&lt;br /&gt;
 - if private, then always make copies&lt;br /&gt;
 - if shared, then can be accessed by more than one thread/process&lt;br /&gt;
&lt;br /&gt;
multithreaded processes is really just multiple process-like things (threads) that share virtual memory&lt;br /&gt;
&lt;br /&gt;
If you see an mmap that is anonymous and uses a file descriptor of -1&lt;br /&gt;
 - it is allocating memory rather than loading a file&lt;br /&gt;
&lt;br /&gt;
So fork/execve isn&amp;#039;t as waseful as you&amp;#039;d think&lt;br /&gt;
 - fork, duplicate the process (but not much memory is actually being copied)&lt;br /&gt;
 - execve, throw out memory map and create a new one based on an&lt;br /&gt;
   executable on disk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Because of how much memory gets shared between processes, it is actually hard to say how much RAM a process is taking up&lt;br /&gt;
&lt;br /&gt;
Many similarities &amp;amp; connections between files and process memory&lt;br /&gt;
  - just remember that files are normally persistent, and process memory is volatile&lt;br /&gt;
&lt;br /&gt;
How does the Linux kernel make sure it doesn&amp;#039;t allocate too much RAM?&lt;br /&gt;
 - it doesn&amp;#039;t!  It just says yes and hopes things work out&lt;br /&gt;
   (it is &amp;quot;optimistic&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
It has a few strategies to help out&lt;br /&gt;
 - program code loaded from disk can always be kicked out of RAM&lt;br /&gt;
 - data/modified pages in RAM can be written to a swap or page&lt;br /&gt;
   file/partition&lt;br /&gt;
 - but eventually we&amp;#039;ll run out, and then the out of memory killer&lt;br /&gt;
   (OOM) gets to work&lt;br /&gt;
     - it will kill processes until there&amp;#039;s enough physical memory&lt;br /&gt;
     - what it kills can be kind of random...and in general&lt;br /&gt;
       won&amp;#039;t be what you want&lt;br /&gt;
 - because of the former mechanisms, normally the computer will slow&lt;br /&gt;
   to a crawl before actually needing to kill processes&lt;br /&gt;
     - because it will keep trying to free up physical memory,&lt;br /&gt;
       and eventually will spend most of its time doing that, rather&lt;br /&gt;
       than useful work&lt;br /&gt;
&lt;br /&gt;
managing all of this is the Linux kernel&amp;#039;s job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assume we have a process that uses 2G of virtual address space, 500M resident in RAM.&lt;br /&gt;
 - system has 8G of RAM total, 1G free&lt;br /&gt;
&lt;br /&gt;
On such a system, that process can fork with no problem&lt;br /&gt;
 - won&amp;#039;t end up using much more RAM because of sharing between&lt;br /&gt;
   parent and child&lt;br /&gt;
&lt;br /&gt;
But what if the child now starts doing lots of work and uses that 2G of virtual address space, using everything&lt;br /&gt;
 - now we could easily use up that 1G of free RAM&lt;br /&gt;
   - and even get to the point where the kernel is looking for 500M&lt;br /&gt;
&lt;br /&gt;
Linux is optimistic when allowing memory allocations because it allows full use of resources&lt;br /&gt;
 - if you want to put limits, you can impose quotas with cgroups&lt;br /&gt;
&lt;br /&gt;
By the way, phones run the same basic kernels as desktops and servers nowadays&lt;br /&gt;
 - but they normally don&amp;#039;t have swap&lt;br /&gt;
 - so, they have to be very aggressive in how they manage RAM&lt;br /&gt;
   - will proactively kill processes that aren&amp;#039;t needed&lt;br /&gt;
&lt;br /&gt;
Swap is where you &amp;quot;swap&amp;quot; a process to disk when we don&amp;#039;t have enough&lt;br /&gt;
room for it in physical memory&lt;br /&gt;
 - used to be we&amp;#039;d have to move the entire process to disk,&lt;br /&gt;
   hence swapping&lt;br /&gt;
 - but now we can just move some of it (some pages, so moving to disk=&amp;gt;&lt;br /&gt;
   paging to disk)&lt;br /&gt;
&lt;br /&gt;
We don&amp;#039;t have swap on phones to&lt;br /&gt;
 - save power&lt;br /&gt;
 - save wear and tear on flash memory&lt;br /&gt;
    (flash can only be written to so much)&lt;br /&gt;
&lt;br /&gt;
When you develop for a phone, your processes have to be ready to be&lt;br /&gt;
killed at any time&lt;br /&gt;
 - you tell the OS how to save necessary state so you can resume&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Soma</name></author>
	</entry>
</feed>