Pune-Cocoa: Blocks and GCD


Published on

Blocks is a cool concept and is very much needed for performance improvements and responsiveness. GCD helps run blocks effortlessly by scheduling on a desired queue, priority and lots more.

Published in: Technology
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Pune-Cocoa: Blocks and GCD

  1. 1. Blocks & GCD
  2. 2. • History• GCD• Queues• Blocks• Syntax and Examples• Demo
  3. 3. Grand Central Dispatch
  4. 4. History• Historically, microprocessors gained speed by running at faster and faster clock speeds; and software become automatically faster.• Processor clock speeds began to reach a limit because power consumption and heat became problematic, particularly for mobile systems.• CPU vendors shifted their focus from increasing clock speed to putting multiple processor cores into a single CPU• software no longer automatically becomes
  5. 5. History• We required threads to make use of multithreading, NSThread is not that simple to use for each and every small data processing task, need locks.• NSOprationQueue was an alternative, but not so lightweight and required some boilerplate code• Or use o performSelectorInBackground:withObject: o performSelectorOnMainThread:withObject:wait UntilDone:
  6. 6. Solution• The dominant model for concurrent programming—threads and locks—is too difficult to be worth the effort for most applications. To write a an efficient application for multi- core using threads, you need to: – Break each logical task down to a single thread Lock data that is in danger of being changed by two threads at once Build a thread manager to run only as many threads as there are available cores Hope that no other applications running on the system are using the processor cores
  7. 7. How?• GCD shifts the responsibility for managing threads and their execution from applications to the operating system.• Units of work are described as blocks in your code, while queues are used to organize blocks based on how you believe they need to be executed.• GCD has a multicore execution engine that reads the queues created by each application and assigns work from the queues to the threads it is managing.
  8. 8. Hooray!• Apple introduced Grand Central Dispatch and Blocks for SnowLeopard; and decided to remove support for PPC.• Apple came up with multicore HandHelds, soon after blocks and GCD were announced for iOS
  9. 9. Programming Model• Blocks are used as a Unit of Work• Dispatch Objects - reference counted, uses dispatch_retain() and dispatch_release()• Queues (four system defined) are used to execute Blocks – Serial / Concurrent• Event Sources – associate blocks/queues to asynchronous event source e.g. timer, socket• A thread-pool of max 512 threads can be maintained, old threads are reused
  10. 10. Queues
  11. 11. Queues• Most of the intelligence behind Grand Central Dispatch is provided by queues. – Global Queues – Private Queues – Main Queue• A queue can execute operation in Sync or Async
  12. 12. Queuesdispatch_queue_t dispatch_get_global_queue( long priority, unsigned long flags);DISPATCH_QUEUE_PRIORITY_HIGHDISPATCH_QUEUE_PRIORITY_DEFAULTDISPATCH_QUEUE_PRIORITY_LOWdispatch_queue_t dispatch_queue_create( const char *label dispatch_queue_attr_t attr);dispatch_queue_t dispatch_get_main_queue(void);
  13. 13. Using Queues
  14. 14. Using Queues
  15. 15. Using Queues• the block thats submitted with the barrier function doesnt run concurrently with other work on that queue• pointless on a serial queue• non-functional when used on the global queues
  16. 16. Blocks
  17. 17. Blocks: What is it?• Blocks are a nonstandard extension added by Apple Inc. to the C, C++, and Objective- C programming languages that uses a lambda expression-like syntax to create closures within these languages. Blocks are supported for programs developed for Mac OS X 10.6+ and iOS 4.0+. – wikipedia
  18. 18. What is it?• A block is an anonymous inline collection of code that: – Has a typed argument list just like a function
  19. 19. What is it?• A block is an anonymous inline collection of code that: – Has an inferred or declared return type
  20. 20. What is it?• A block is an anonymous inline collection of code that: – Can capture state from the lexical scope within which it is defined
  21. 21. What is it?• A block is an anonymous inline collection of code that: – Can optionally modify the state of the lexical scope
  22. 22. What is it?• A block is an anonymous inline collection of code that: – Can share the potential for modification with other blocks defined within the same lexical scope • Multiple blocks in the same lexical score shares the same instance. • If a variable is __block is is passed as reference and hence can be accessed by multiple blocks
  23. 23. What is it?• A block is an anonymous inline collection of code that: – Can continue to share and modify state defined within the lexical scope (the stack frame) after the lexical scope (the stack frame) has been destroyed • Each __block has a __strong reference hence even if current stack frame is destroyed it can work on that variable. • The compiler and runtime arrange that all variables referenced from the block are preserved for the life of all copies of the block
  24. 24. What is it?• You can copy a block and even pass it to other threads for deferred execution (or, within its own thread, to a runloop). (use Block_copy instead)
  25. 25. Blocks Usage• Used for lightweight task, Blocks represent typically small, self-contained pieces of code.• They’re particularly useful as a means of encapsulating units of work that may be executed concurrently, or over items in a collection, or as a callback when another operation has finished.
  26. 26. Small, Self contained
  27. 27. Work over over items in a collection
  28. 28. Callbacks• Asynchronus Network tasks • Snippet from MKNetworkEngine.m by @mugunthkumar
  29. 29. Usage in cocoa• Asynchronus UI tasks
  30. 30. Under the Hood• Extracted from "Pro Multithreading and Memory Management for iOS and OS X with ARC, Grand Central Dispatch, and Blocks" by Kazuki Sakamoto and Tomohiko Furumotovoid (^blk)(void) = ^{printf("Blockn");};is translated tostatic void __main_block_func_0(struct __main_block_impl_0*__cself) {printf("Blockn"); }by compiler, there is lot of other boilerplatecode created to help invocation of this methodand other blocks operation (sharing a variable,copy, pass by reference)
  31. 31. Dispatch Source
  32. 32. Dispatch Source• dispatch source is an object which monitors for one of following event : – Mach port send right state changes. – Mach port receive right state changes. – External process state change. – File descriptor ready for read. – File descriptor ready for write. – Filesystem node event. (kqueue) – POSIX signal. – Custom timer. – Custom event.
  33. 33. Dispatch Source example
  34. 34. Thank You!• Sources: – Apple Documentation – libdispatch Wiki – CGD Technology Brief Prepared for PuneCocoa By Prashant Rane (@the69geeks)