effective i o
play

Effective I/O an unpromising approach to systems programming - PowerPoint PPT Presentation

Effective I/O an unpromising approach to systems programming Stephen Dolan KC Sivaramakrishnan OCaml Labs Effect handlers let do_stuff x = if x.is_bad then log oh no; process x 2 Effect handlers let do_stuff x = if x.is_bad then


  1. Effective I/O an unpromising approach to systems programming Stephen Dolan KC Sivaramakrishnan OCaml Labs

  2. Effect handlers let do_stuff x = if x.is_bad then log “oh no”; process x 2

  3. Effect handlers let do_stuff x = if x.is_bad then raise PrettyBad; process x match ... with | result -> result | exception PrettyBad -> log “it's pretty bad”; exit 1 3

  4. Effect handlers let do_stuff x = if x.is_bad then raise PrettyBad; process x match ... with | result -> result | exception PrettyBad -> (* wish it kept going *) 4

  5. Effect handlers let do_stuff x = if x.is_bad then raise PrettyBad; process x match ... with | result -> result | exception PrettyBad -> continue 5

  6. Effect handlers let do_stuff x = if x.is_bad then perform PrettyBad; process x match ... with | result -> result | effect PrettyBad k -> continue k 6

  7. Scheduling tasks let run_q = Queue.create () let enqueue k = Queue.push k run_q let rec dequeue () = if Queue.is_empty run_q then () else continue (Queue.pop run_q) () 7

  8. Scheduling tasks effect Yield : unit effect Fork : (unit -> unit) -> unit let rec schedule f = match f () with | () -> dequeue () | effect Yield k -> enqueue k; dequeue () | effect (Fork f) k -> enqueue k; schedule f 8

  9. Direct-style I/O let copy_channels = let buf_len = 65536 in let buf = Bytes.create buf_len in let rec loop ic oc = match input ic buf 0 buf_len with | 0 -> () | n -> output oc buf 0 n; loop ic oc in loop 9

  10. An effective stdlib type in_channel = Reader.t effect Input : in_channel * bytes * int * int -> int let input ic buf pos len = perform (Input (ic, buf, pos, len)) 10

  11. Direct-style with Async val run : (unit -> 'a) -> 'a Deferred.t let run f = match f () with | x -> return x | effect (Input (ic, buf, pos, len)) k -> Reader.read ic buf ~pos ~len >>= fun x -> continue k x 11

  12. Direct-style I/O ● Simple I/O interfaces use direct calls ● Effjcient ones use callbacks, for overlapping ● With effects, we can write the simple code but run the fast code 12

  13. Mixing styles ● Effects let us mix direct and monadic code ● Parts of the code can choose whether they need to control scheduler interactions ● Libraries can expose code without imposing a particular I/O style 13

  14. Managing resources let file = open_in “words.txt” in match parse_contents file with | result -> close file; result | exception e -> close file; raise e 14

  15. Managing resources ● Computations holding resources are linear – so their continuations are too! ● Linear continuations are very, very fast ● Lacking linear types, we fake them dynamically 15

  16. Blocking I/O ● The operating system provides select(), telling us whether I/O will block ● But it lies, and it lies, and it lies. ● Async uses thread pools to deal with this 16

  17. Thread pools vs. effects ● For operations which happen not to block, thread pools have high overhead ● With effects, we don't have to decide in advance whether to switch to another thread ● We can invoke continuations on any C thread 17

  18. Overlapping with effects | effect (Delayed id) k -> Hashtbl.add ongoing_io id k | effect (Completed id) k -> let k’ = Hashtbl.find ongoing_io id in Hashtbl.remove ongoing_io id; enqueue (fun () -> continue k ()); continue k’ () 18

  19. Questions? 19

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend