Upload
prashant-rane
View
648
Download
0
Tags:
Embed Size (px)
DESCRIPTION
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.
Citation preview
Blocks & GCD
• History• GCD• Queues• Blocks• Syntax and Examples• Demo
Grand Central Dispatch
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 faster.
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:w
aitUntilDone:
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 onceBuild 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
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.
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
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
Queues
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
Queuesdispatch_queue_t dispatch_get_global_queue( long priority, unsigned long flags);DISPATCH_QUEUE_PRIORITY_HIGHDISPATCH_QUEUE_PRIORITY_DEFAULTDISPATCH_QUEUE_PRIORITY_LOW
dispatch_queue_t dispatch_queue_create( const char *label dispatch_queue_attr_t attr);
dispatch_queue_t dispatch_get_main_queue(void);
Using Queues
Using Queues
Using Queues• the block that's submitted with the barrier function doesn't run
concurrently with other work on that queue• pointless on a serial queue• non-functional when used on the global queues
Blocks
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
What is it?• A block is an anonymous inline collection of
code that:– Has a typed argument list just like a function
What is it?• A block is an anonymous inline collection of
code that:– Has an inferred or declared return type
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
What is it?• A block is an anonymous inline collection of
code that:– Can optionally modify the state of the lexical scope
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
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
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)
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.
Small, Self contained
Work over over items in a collection
Callbacks
• Asynchronus Network tasks• Snippet from MKNetworkEngine.m by @mugunthkumar
Usage in cocoa
• Asynchronus UI tasks
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 Furumoto
void (^blk)(void) = ^{printf("Block\n");};
is translated to static void __main_block_func_0(struct __main_block_impl_0 *__cself) {printf("Block\n"); }
by compiler, there is lot of other boilerplate code created to help invocation of this method and other blocks operation (sharing a variable, copy, pass by reference)
Dispatch Source
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.
Dispatch Source example
Thank You!
• Sources:– Apple Documentation– libdispatch Wiki– CGD Technology Brief
Prepared for PuneCocoaBy Prashant Rane
(@the69geeks)