Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Plan for Today
Administrative Things
Communication, Grading, Recording
Learning Rust
How to Share a Processor

1
Human

Human Communication

IRC: quick and dirty
#cs4414: immediate responses
#rust: general Rust questions

Web: rust-cla...
Grading
Don’t be stressed!

3
4
cs4414 Grading Form
1

/1

Your program pretty much works!

You will have plenty of ways to distinguish yourself as
outsta...
For Future Problem Sets
Auto-grader
You’ll be able to confirm that your code behaves as
expected before submitting (and ca...
Recording Classes

Can’t promise to record everything
Recordings will be (somewhat) edited
Press the button in front of yo...
Questions

8
Rust
Expressions
and Functions
9
Java / C / C++
IfStatement ::=
if (Expression)
StatementTrue
[ else
StatementFalse
]

Rust
IfExpression ::=
if Expression ...
Quiz

IfExpression ::=
if Expression Block
[ else Block ]

Block ::= { [Statement* Expr] }
Expression ::= Block

fn max(a:...
fn max(a: int, b: int) -> int {
if { } { a } else { b }
}

IfExpression ::=
if Expression Block
[ else Block ]

Block ::= ...
(Trick) Quiz

IfExpression ::=
if Expression Block
[ else Block ]

Block ::= { [Statement* Expr] }
Expression ::= Block

f...
fn max(a: int, b: int) -> int {
if { let x = 4414; x = x + a; x > b + 4414 } { a }
else { b }
}
$ rustc block.rs
block.rs:...
fn max(a: int, b: int) -> int {
if { let mut x = 4414; x = x + a; x > b + 4414 } { a }
else { b }
}
$ rust run block.rs
Ma...
Quiz
fn max(a: int, b: int) -> int {
if a > b { a } else { b; }
}

IfExpression ::=
if Expression Block
[ else Block ]

Bl...
fn max(a: int, b: int) -> int {
if a > b { a } else { b; }
The semi-colon makes it a statement – no value
}
block.rs:2:24:...
Higher-Order Functions
Java
Java 8 (March 2014)

Scheme

Rust
| <parameters> | Block
proc(<parameters>) Block

(define (ma...
Define a function, make_adder, that takes an
int as input and returns a function that takes
and int and returns the sum of...
fn make_adder(a: int) -> (fn(int) -> int) {
fn(b: int) { a + b }
}
fn main() {
let increment = make_adder(1);
println!("re...
Define a function, ntimes, that takes as inputs a
function f (int -> int) and an integer n, and
returns a function that ap...
fn double(a: int) -> int { a * 2 }

fn ntimes(f: proc(int) -> int, times: int) -> proc(int) -> int {
proc(x: int) {
match ...
fn double(a: int) -> int { a * 2 }

fn ntimes(f: proc(int) -> int, times: int) -> proc(int) -> int {
proc(x: int) {
match ...
24
25
Rust or Bust?
Rust

 Immature, Unstable
 Poorly documented
 Few open source projects
(except Servo)
 Not in high emplo...
Rust

Bust (C)

 Benefits from 30 years of
language research
 Chance to influence a
new, exciting, fastevolving language...
But what about the
Lack of Documentation?!

28
“Baby”
programmer
(cs1xxx)

29
Give up in
disgust!
30
cs4414 Student

“Professional
Amateur
Programmer”
31
Solving Programming Mysteries
1.
2.
3.
4.

DuckDuckGo (or Google) is your friend!
stackoverflow [rust]
Experiment!
If you ...
Instead of whinging about how
bad the Rust documentation for
strings is….

28 January 2014

University of Virginia cs4414
...
Be happy! You can be
the first to write one!

28 January 2014

University of Virginia cs4414

34
Be happy! You can be
the first to write one!

28 January 2014

Note: last semester’s students
had much less
documentation,...
How can several programs share
a processor?

36
Batch Processing

Recap
Last Class

Program

Program A
Program B

Multiprogramming

A
B

A

Program C

C
37
Kinds of Processor-Sharing
Multiprogramming
User program runs until it gets stuck, then supervisor runs.
Non-preemptive mu...
Non-preemptive

Preemptive

39
Which have preemptive
multitasking?

MULTICS (1969)

UNIX (1975)

Microsoft
Windows 2.1x
1988
PowerMac G5
(Mac OS 9)
2006
...
Which have preemptive
multitasking?

MULTICS (1969)

UNIX (1975)

Microsoft
Windows 2.1x
1988
PowerMac G5
(Mac OS 9)
2006
...
How could I prove it?
Mac OS X
42
42
One-line “Proof”

43
Which are result from preemptive multitasking?
A.
B.
C.
D.

A computer running Mac OS X crashes less than one
running Mac ...
Mac OS 9.2.2
5 Dec 2001

Mac OS X (Cheetah)
24 March 2001

How did Apple add preemptive multitasking to Mac OS?
45
(The answer is
probably not in this
movie.)
http://www.youtube.com/watch?
v=YsWBJ_usRck&t=2m18s
46
“Once you make them
talk, they won’t be
inanimate anymore.”
Steve Jobs (as quoted by
Sorkin earlier in interview)
47
https://upload.wikimedia.org/wikipedia/commons/7/77/Unix_history-simple.svg

48
49
50
51
Sir Tim Berners Lee
finishing PS1 24
years early!
52
MULTICS

Code (carries license)

“Ideas” (no
license, possible patent
lawsuits)

Unix

BSD

NextStep

Minix

FreeBSD

Linu...
How can
preemptive multitasking
even be possible?!?
Preemptive multi-tasking
User program X runs until the supervisor
deci...
Preemptive (?) Multitasking
Program A

A

Program B

B

Program C

A

Supervisor
Supervisor

Supervisor
A
55
56
57
Interrupts
How frequently
should the
supervisor’s alarm
clock (“kernel timer
interrupt”) go off to
check on the
workers?
5...
My MacBook (Ubuntu)
timer.c is a 50-line C program from
http://www.advenage.com/topics/linux-timer-interrupt-frequency.php...
Timer Interrupts
Super
visor

A

set alarm clock
switch to program A

Supervisor

B

Supervisor

set alarm clock
switch to...
Who interrupts the supervisor?

61
The supervisor’s supervisor!

a.k.a. Hypervisor
62
Support for hypervisor added
to Intel x86 in 2005 (VT-x)
63
More general (quite similar)
idea in MULTICS (but with
8-levels of supervision in
hardware by 1975)
64
Charge
Tutorial Part 3 and Problem Set 2 will be
posted later today
PS2 is due February 9
Longer and more challenging than...
Once Upon a Process
Upcoming SlideShare
Loading in …5
×

Once Upon a Process

7,083 views

Published on

University of Virginia
cs4414: Operating Systems

Rust Expressions and Higher-Order Procedures
How to Share a Processor
Non-Preemptive and Preemptive Multitasking
Kernel Timer Interrupt

Published in: Education, Technology
  • Be the first to comment

  • Be the first to like this

Once Upon a Process

  1. 1. Plan for Today Administrative Things Communication, Grading, Recording Learning Rust How to Share a Processor 1
  2. 2. Human Human Communication IRC: quick and dirty #cs4414: immediate responses #rust: general Rust questions Web: rust-class.org Page-specific (e.g., PS1, Class 1 notes) General forums easiest for others to see Email: evans@virginia.edu best for longer questions/responses Use only for things that don’t fit into other channels Notify me if you asked something on web but didn’t get a response Anything that you want to keep private 2
  3. 3. Grading Don’t be stressed! 3
  4. 4. 4
  5. 5. cs4414 Grading Form 1 /1 Your program pretty much works! You will have plenty of ways to distinguish yourself as outstanding, but by doing something creating and extraordinary, not by being perfect on some checklist of minutiae. 5
  6. 6. For Future Problem Sets Auto-grader You’ll be able to confirm that your code behaves as expected before submitting (and can try as many times as you want) Demos All team members will answer questions about design decisions, concepts, how to extend, etc. Teammate Ratings 6
  7. 7. Recording Classes Can’t promise to record everything Recordings will be (somewhat) edited Press the button in front of you unless you want to be recorded 7
  8. 8. Questions 8
  9. 9. Rust Expressions and Functions 9
  10. 10. Java / C / C++ IfStatement ::= if (Expression) StatementTrue [ else StatementFalse ] Rust IfExpression ::= if Expression Block [ else Block ] Block ::= { [Statement* Expr] } Expression ::= Block Statement ::= Expression ; Simplified: static.rust-lang.org/doc/master/rust.html#if-expressions. Warning: “(looking for consistency in the manual's grammar is bad: it's entirely wrong in many places.)” 10
  11. 11. Quiz IfExpression ::= if Expression Block [ else Block ] Block ::= { [Statement* Expr] } Expression ::= Block fn max(a: int, b: int) -> int { if { } { a } else { b } a) Syntax Error } b) Type Error c) Run-time Error 11
  12. 12. fn max(a: int, b: int) -> int { if { } { a } else { b } } IfExpression ::= if Expression Block [ else Block ] Block ::= { [Statement* Expr] } Expression ::= Block $ rustc block.rs block.rs:2:7: 2:10 error: mismatched types: expected `bool` but found `()` (expected bool but found ()) block.rs:2 if { } { If you get bad error messages ^~~ from rustc,report them to Kiet! 12
  13. 13. (Trick) Quiz IfExpression ::= if Expression Block [ else Block ] Block ::= { [Statement* Expr] } Expression ::= Block fn max(a: int, b: int) -> int { if { let x = 4414; x = x + a; x > b + 4414 } { a } else { b } a) Syntax Error } b) Type Error c) Run-time Error 13
  14. 14. fn max(a: int, b: int) -> int { if { let x = 4414; x = x + a; x > b + 4414 } { a } else { b } } $ rustc block.rs block.rs:2:23: 2:24 error: re-assignment of immutable variable `x` block.rs:2 if { let x = 4414; x = x + a; x > b + 4414 } { ^ “Variables” are invariable…unless declared with mut. 14
  15. 15. fn max(a: int, b: int) -> int { if { let mut x = 4414; x = x + a; x > b + 4414 } { a } else { b } } $ rust run block.rs Max: 5 15
  16. 16. Quiz fn max(a: int, b: int) -> int { if a > b { a } else { b; } } IfExpression ::= if Expression Block [ else Block ] Block ::= { [Statement* Expr] } Expression ::= Block Statement ::= Expression ; a) Syntax Error b) Type Error c) Run-time Error 16
  17. 17. fn max(a: int, b: int) -> int { if a > b { a } else { b; } The semi-colon makes it a statement – no value } block.rs:2:24: 2:30 error: mismatched types: expected `int` but found `()` (expected int but found ()) block.rs:2 if a > b { a } else { b; } ^~~~~~ 17
  18. 18. Higher-Order Functions Java Java 8 (March 2014) Scheme Rust | <parameters> | Block proc(<parameters>) Block (define (make-adder a) (lambda (n) (+ a n))) 18
  19. 19. Define a function, make_adder, that takes an int as input and returns a function that takes and int and returns the sum of the original and input int. let increment = make_adder(1); increment(3) => 4 19
  20. 20. fn make_adder(a: int) -> (fn(int) -> int) { fn(b: int) { a + b } } fn main() { let increment = make_adder(1); println!("result: {:x}", increment(2)); } Limitation: we can only use increment once! 20
  21. 21. Define a function, ntimes, that takes as inputs a function f (int -> int) and an integer n, and returns a function that applies f n-times. fn double(a: int) -> int { a * 2 } fn main() { let quadruple = ntimes(double, 2); println(fmt!("quad: %?", quadruple(2))); } 21
  22. 22. fn double(a: int) -> int { a * 2 } fn ntimes(f: proc(int) -> int, times: int) -> proc(int) -> int { proc(x: int) { match times { 0 => { x } _ => { ntimes(f, times - 1)(f(x))} } }} fn main() { let quadruple = ntimes(double, 2); println!("quad: {:d}", quadruple(2)); } 22
  23. 23. fn double(a: int) -> int { a * 2 } fn ntimes(f: proc(int) -> int, times: int) -> proc(int) -> int { proc(x: int) { match times { 0 => { x } bash-3.2$ rustc ntimes.rs bash-3.2$ ./ntimes _ => { ntimes(f, times - 1)(f(x))} } Segmentation fault: 11 }} Note: { fn main() when a C/C++ program gives a “Segmentation fault”, 99.9999% of the time it is let quadruple = ntimes(double, 2);the programmers “fault”. When a Rust {:d}", quadruple(2)); println!("quad:program (that doesn’t use unsafe) } does, 100% of the time it is Rust’s fault. 23
  24. 24. 24
  25. 25. 25
  26. 26. Rust or Bust? Rust  Immature, Unstable  Poorly documented  Few open source projects (except Servo)  Not in high employer demand  No other courses 28 January 2014 Bust (C)  Mature, Stable  Hundreds of books, etc.  Lots of open source projects (incl. Linux)  Popular for interview questions  Nearly all OS courses University of Virginia cs4414 26
  27. 27. Rust Bust (C)  Benefits from 30 years of language research  Chance to influence a new, exciting, fastevolving language  Really cool features for memory management and concurrency  FUN!  Suffers from maintaining backwards compatibility  C++0x standard process began in 1998, released in 2011, over 40 meetings  Lots of complexity, but not designed for safety  Boring, Annoying 27
  28. 28. But what about the Lack of Documentation?! 28
  29. 29. “Baby” programmer (cs1xxx) 29
  30. 30. Give up in disgust! 30
  31. 31. cs4414 Student “Professional Amateur Programmer” 31
  32. 32. Solving Programming Mysteries 1. 2. 3. 4. DuckDuckGo (or Google) is your friend! stackoverflow [rust] Experiment! If you figure something Ask for help: useful out that is not well – IRC – rust-class.org documented, document it: course forum comment, “blog” post 32
  33. 33. Instead of whinging about how bad the Rust documentation for strings is…. 28 January 2014 University of Virginia cs4414 33
  34. 34. Be happy! You can be the first to write one! 28 January 2014 University of Virginia cs4414 34
  35. 35. Be happy! You can be the first to write one! 28 January 2014 Note: last semester’s students had much less documentation, and an even more buggy compiler, but still survived! (And some did contribute to writing the tutorials and improving the compiler you University of Virginia cs4414 35 are using now.)
  36. 36. How can several programs share a processor? 36
  37. 37. Batch Processing Recap Last Class Program Program A Program B Multiprogramming A B A Program C C 37
  38. 38. Kinds of Processor-Sharing Multiprogramming User program runs until it gets stuck, then supervisor runs. Non-preemptive multi-tasking User program runs until it decides to let the supervisor run. Preemptive multi-tasking User program runs until the (approximately) supervisor decides to let another program run. 38
  39. 39. Non-preemptive Preemptive 39
  40. 40. Which have preemptive multitasking? MULTICS (1969) UNIX (1975) Microsoft Windows 2.1x 1988 PowerMac G5 (Mac OS 9) 2006 MacBook Air (Mac OS X) 2011 40
  41. 41. Which have preemptive multitasking? MULTICS (1969) UNIX (1975) Microsoft Windows 2.1x 1988 PowerMac G5 (Mac OS 9) 2006 MacBook Air (Mac OS X) 2011 41
  42. 42. How could I prove it? Mac OS X 42 42
  43. 43. One-line “Proof” 43
  44. 44. Which are result from preemptive multitasking? A. B. C. D. A computer running Mac OS X crashes less than one running Mac OS 9 A computer running Mac OS X needs fewer hard reboots than one running Mac OS 9 When you watch your favorite Eminem video for the 50th time, the video still (occasionally) jitters Your zhttpto server can handle more than one request at a time 44
  45. 45. Mac OS 9.2.2 5 Dec 2001 Mac OS X (Cheetah) 24 March 2001 How did Apple add preemptive multitasking to Mac OS? 45
  46. 46. (The answer is probably not in this movie.) http://www.youtube.com/watch? v=YsWBJ_usRck&t=2m18s 46
  47. 47. “Once you make them talk, they won’t be inanimate anymore.” Steve Jobs (as quoted by Sorkin earlier in interview) 47
  48. 48. https://upload.wikimedia.org/wikipedia/commons/7/77/Unix_history-simple.svg 48
  49. 49. 49
  50. 50. 50
  51. 51. 51
  52. 52. Sir Tim Berners Lee finishing PS1 24 years early! 52
  53. 53. MULTICS Code (carries license) “Ideas” (no license, possible patent lawsuits) Unix BSD NextStep Minix FreeBSD Linux Mac OS X Android iOS 53
  54. 54. How can preemptive multitasking even be possible?!? Preemptive multi-tasking User program X runs until the supervisor decides to let another program run. 54
  55. 55. Preemptive (?) Multitasking Program A A Program B B Program C A Supervisor Supervisor Supervisor A 55
  56. 56. 56
  57. 57. 57
  58. 58. Interrupts How frequently should the supervisor’s alarm clock (“kernel timer interrupt”) go off to check on the workers? 58
  59. 59. My MacBook (Ubuntu) timer.c is a 50-line C program from http://www.advenage.com/topics/linux-timer-interrupt-frequency.php (link on notes) bash-3.2$ uname -a Darwin Davids-MacBook-Air-2.local 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu1699.32.7~1/RELEASE_X86_64 x86_64 bash-3.2$ gcc timer.c ; ./a.out kernel timer interrupt frequency is approx. 4016 Hz or higher Rust version by Wil Thomason 59
  60. 60. Timer Interrupts Super visor A set alarm clock switch to program A Supervisor B Supervisor set alarm clock switch to program B What makes the alarm clock ring? 60
  61. 61. Who interrupts the supervisor? 61
  62. 62. The supervisor’s supervisor! a.k.a. Hypervisor 62
  63. 63. Support for hypervisor added to Intel x86 in 2005 (VT-x) 63
  64. 64. More general (quite similar) idea in MULTICS (but with 8-levels of supervision in hardware by 1975) 64
  65. 65. Charge Tutorial Part 3 and Problem Set 2 will be posted later today PS2 is due February 9 Longer and more challenging than PS1, don’t wait to get started Read the Process API and Direct Execution sections of the OSTEP book 65

×