Grand Central DispatchS.O.Lab develop By oracleOn
흑마술회전하는 마우스 커서 와 처리중 메세지‘ ’웹 기반 프로그래밍 분야에서 새로고침백그라운드 프로세싱백그라운드 프로세싱스레드스레드
iOS Muti Tasking멀티코어 프로세서의 등장다중 Thread 프로그래밍 구현욕구iPhone 3GS : S5PC100 600MHz : 싱글코어 / iPhone 4 : A4(4): 싱글 코어iPhone 4s : A...
Apple 의 계획 ? 의도 ?WWDC2009 처음 GCD 가 공개되는 순간http://www.youtube.com/watch?v=nhbA9jZyYO4GCC ==> LLVM ==> LLVM 2.0LLVM 덕분에 가능해진...
메모리 관리와 Block 코딩iOS 4.0 부터 멀티태스킹을 지원메모리 부족문제를 GCD 를 이용하여 개선하고자 하였음GCD 를 구현하기위한 Block 코딩 (GCD 는 Block-based API)Block : 코드자...
ios ThreadNSThread 실험 1 (addSubview 와 Thread)- (void)viewDidLoad{[super viewDidLoad];_countlabel = [[UILabel alloc]initWit...
ios ThreadNSThread 실험 1 (addSubview 와 Thread)- (void)viewDidLoad{[super viewDidLoad];_countlabel = [[UILabel alloc]initWit...
ios ThreadNSOperation* 전역변수에 두개이상의 스래드에서 동시에 접근하는 경우* 많은 수의 스래드 생성이 발생하였을때 리소스와 퍼포먼스의 저하1. 직접 큐를 만들어서 NSThread 갯수를 제어하는 방식...
NSOperationQueueLIFO : 스택 / FIFO : 큐NSOperationQueue 는 NSOperation 을 담는 큐이며 FIFO 방식으로 들어간 순서대로 NSOperation 을 실행 시켜주는 기능NSO...
NSInvocationOperation Class- (void)viewDidLoad {[super viewDidLoad];self.navigationItem.rightBarButtonItem = [[UIBarButton...
Grand Central Dispatch1. NSOperationQueue 가 있듯이 GCD 에는 dispatch_queue_tNSOperationQueue *queue = [[[NSOperationQueue alloc...
Grand Central Dispatch메인큐는 메인스레드상에서dispatch_get_main_queue()직접 만든 큐는 하나의 스레드를 할당 받고 사용dispatch_queue_create글로벌 큐는 큐에 넣는대로 ...
Semaphore & MutexSemaphore : 공유 리소스에 접근할 수 있는 최대 허용치만큼 동시에 사용자 접근을 할 수 있게하는 것Mutex : 한 번에 하나의 쓰레드만이 실행되도록 하는 재 입장할 수 있는 코드...
Semaphore & MutexDispatch_semaphore_create(3)리소스Thread뮤텍스와 세마포어 .. 언떤 상황에서 어떻게 사용하는 것이 좋은가 ?
Grand Central Dispatchdispatch_semaphore_t Tsemaphore = dispatch_semaphore_create(3);dispatch_semaphore_wait ==> 먼저 하나의 블럭...
Grand Central Dispatch- (void)viewDidLoad{[super viewDidLoad];// Do any additional setup after loading the view, typically...
감사합니다 .
Upcoming SlideShare
Loading in …5
×

Gcd ppt

759 views

Published on

GCD, Grand Central Dispatch, iOS,

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
759
On SlideShare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Gcd ppt

  1. 1. Grand Central DispatchS.O.Lab develop By oracleOn
  2. 2. 흑마술회전하는 마우스 커서 와 처리중 메세지‘ ’웹 기반 프로그래밍 분야에서 새로고침백그라운드 프로세싱백그라운드 프로세싱스레드스레드
  3. 3. iOS Muti Tasking멀티코어 프로세서의 등장다중 Thread 프로그래밍 구현욕구iPhone 3GS : S5PC100 600MHz : 싱글코어 / iPhone 4 : A4(4): 싱글 코어iPhone 4s : A5 : 듀얼코어 / iPhone 5 : A6: : 듀얼코어
  4. 4. Apple 의 계획 ? 의도 ?WWDC2009 처음 GCD 가 공개되는 순간http://www.youtube.com/watch?v=nhbA9jZyYO4GCC ==> LLVM ==> LLVM 2.0LLVM 덕분에 가능해진 기술이 Block 과 GCD
  5. 5. 메모리 관리와 Block 코딩iOS 4.0 부터 멀티태스킹을 지원메모리 부족문제를 GCD 를 이용하여 개선하고자 하였음GCD 를 구현하기위한 Block 코딩 (GCD 는 Block-based API)Block : 코드자체 ( 데이터 , 함수 , 클래스 ) 를 객체화 할수 있는것
  6. 6. ios ThreadNSThread 실험 1 (addSubview 와 Thread)- (void)viewDidLoad{[super viewDidLoad];_countlabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 150, 30)];_countlabel.text = @"0";[self.view addSubview:_countlabel];_goBt =[UIButton buttonWithType:UIButtonTypeCustom];_goBt.frame = CGRectMake(100, 200, 100, 30);[_goBt setTitle:@"go Second page" forState:UIControlStateNormal];[_goBt addTarget:self action:@selector(goSecondPage) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:_goBt];[NSThread detachNewThreadSelector:@selector(firstThread) toTarget:self withObject:nil];}-(void) firstThread{for (int i=0; i<100; i++){NSString *t = [NSString stringWithFormat:@"%i",[_countlabel.text intValue]+1];[self performSelectorOnMainThread:@selector(mainThreadSetText:) withObject:t waitUntilDone:YES];[NSThread sleepForTimeInterval:1.0];}}-(void)mainThreadSetText:(NSString *)text{_countlabel.text = text;NSLog(@"count: %@",_countlabel.text);}-(void) goSecondPage{secondView *tempView = [[secondView alloc]init];[self.view addSubview:tempView.view];}
  7. 7. ios ThreadNSThread 실험 1 (addSubview 와 Thread)- (void)viewDidLoad{[super viewDidLoad];_countlabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 150, 30)];_countlabel.text = @"0";[self.view addSubview:_countlabel];_goBt =[UIButton buttonWithType:UIButtonTypeCustom];_goBt.frame = CGRectMake(100, 200, 100, 30);[_goBt setTitle:@"go Second page" forState:UIControlStateNormal];[_goBt addTarget:self action:@selector(goSecondPage) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:_goBt];[NSThread detachNewThreadSelector:@selector(firstThread) toTarget:self withObject:nil];}-(void) firstThread{for (int i=0; i<100; i++){NSString *t = [NSString stringWithFormat:@"%i",[_countlabel.text intValue]+1];[self performSelectorOnMainThread:@selector(mainThreadSetText:) withObject:t waitUntilDone:YES];[NSThread sleepForTimeInterval:1.0];}}-(void)mainThreadSetText:(NSString *)text{_countlabel.text = text;NSLog(@"count: %@",_countlabel.text);}-(void) goSecondPage{secondView *tempView = [[secondView alloc]init];[self.view addSubview:tempView.view];}
  8. 8. ios ThreadNSOperation* 전역변수에 두개이상의 스래드에서 동시에 접근하는 경우* 많은 수의 스래드 생성이 발생하였을때 리소스와 퍼포먼스의 저하1. 직접 큐를 만들어서 NSThread 갯수를 제어하는 방식- NSMutableArray 로 큐용 배열를 만들어두고 스래드 호출하면 큐에 넣는다 .- 현재 돌고있는 스래드 수를 확인한후 설정한 최대의 스래드 수를 넘지 않으면 스래드를 만들어서 진행한다 .- 전부 사용중일때는 하나가 끝날때 까지 기다린다 .NSOperation / NSOperationQueueNSOperation / NSOperationQueue구현하기도 복잡하고 , 상황에 대처하여 제어하기 어렵다 .
  9. 9. NSOperationQueueLIFO : 스택 / FIFO : 큐NSOperationQueue 는 NSOperation 을 담는 큐이며 FIFO 방식으로 들어간 순서대로 NSOperation 을 실행 시켜주는 기능NSOperation 은 NSThread 를 만들때 직접 함수와 그 함수가 들어있는 객체 (target) 를 지정해주는것과 대조NSOperation 은 실행 함수도 직접 자기자신으로 지정해두는것이 NSThread 와 다른점#import <Foundation/Foundation.h>@interface TempOperation : NSOperation@property(assign, nonatomic) int countNum;@end#import "TempOperation.h"@implementation TempOperation-(void) main{NSLog(@"Start : %i",_countNum);[NSThread sleepForTimeInterval:1.0];NSLog(@"End: %i",_countNum);}@end@implementation ViewController- (void)viewDidLoad{[super viewDidLoad];NSOperationQueue *queue = [[NSOperationQueue alloc]init];int i =0;[queue setMaxConcurrentOperationCount:2]; // 최대 큐수TempOperation *test = [[TempOperation alloc]init];test.countNum = i++;[queue addOperation:test];test = [[TempOperation alloc]init];test.countNum = i++;[queue addOperation:test];test = [[TempOperation alloc]init];test.countNum = i++;[queue addOperation:test];test = [[TempOperation alloc]init];test.countNum = i++;[queue addOperation:test];NSLog(@"queue adding complete");}
  10. 10. NSInvocationOperation Class- (void)viewDidLoad {[super viewDidLoad];self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Load" style:UIBarButtonItemStyleDone target:selfaction:@selector(loadData)];NSMutableArray *_array = [[NSMutableArray alloc] initWithCapacity:10000];self.array = _array;[_array release];}- (void) loadData {/* Operation Queue init (autorelease) */NSOperationQueue *queue = [NSOperationQueue new];/* Create our NSInvocationOperation to call loadDataWithOperation, passing in nil */NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:selfselector:@selector(loadDataWithOperation)object:nil];/* Add the operation to the queue */[queue addOperation:operation];[operation release];}- (void) loadDataWithOperation {NSURL *dataURL = [NSURL URLWithString:@"http://icodeblog.com/samples/nsoperation/data.plist"];NSArray *tmp_array = [NSArray arrayWithContentsOfURL:dataURL];for(NSString *str in tmp_array) {[self.array addObject:str];}[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];}The NSInvocationOperation class is a concrete subclass of NSOperation that manages the execution of asingle encapsulated task specified as an invocationYou can use this class to initiate an operation that consists of invoking a selector on a specified object
  11. 11. Grand Central Dispatch1. NSOperationQueue 가 있듯이 GCD 에는 dispatch_queue_tNSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];dispatch_queue_t dQueue = dispatch_queue_create(“com.apple.testQueue”, NULL);dispatch_queue_createdispatch_async(dQueue, ^{...}); // dispatch_async 는 큐에 블럭을 넣는 일을 하는함수dispatch_get_main_queue();GCD 의 큐의 경우 무조건 한번에 하나만 실행 ~~!!!
  12. 12. Grand Central Dispatch메인큐는 메인스레드상에서dispatch_get_main_queue()직접 만든 큐는 하나의 스레드를 할당 받고 사용dispatch_queue_create글로벌 큐는 큐에 넣는대로 바로 스레드를 만들어서 실행dispatch_get_global_queue();#import "ViewController.h"#include <dispatch/dispatch.h>@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad{[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.dispatch_queue_t dqueue = dispatch_queue_create("test01", NULL);__block int i =0;dispatch_async(dqueue, ^{NSLog(@"GCD : %i",i);[NSThread sleepForTimeInterval:2.0];NSLog(@"GCD %i END",i);i++;});dispatch_async(dqueue, ^{NSLog(@"GCD : %i",i);[NSThread sleepForTimeInterval:2.0];NSLog(@"GCD %i END",i);i++;});}[queue setMaxConcurrentOperationCount:1];dispatch_queue_create // 최대큐를 1 개로 지정한것과 같다 .[queue setMaxConcurrentOperationCount:100];dispatch_get_global_queue(); // 최대큐를 무한대까지 지정한 것과같다 .
  13. 13. Semaphore & MutexSemaphore : 공유 리소스에 접근할 수 있는 최대 허용치만큼 동시에 사용자 접근을 할 수 있게하는 것Mutex : 한 번에 하나의 쓰레드만이 실행되도록 하는 재 입장할 수 있는 코드 섹션에 직렬화된 접근을 허용하는것프로세스 간 메시지를 전송하거나 , 혹은 공유메모리를 통해서 특정 data 를 공유하게 될 경우 발생하는문제는 , 공유된 자원에 여러 개의 프로세스가 동시에 접근 하면서 발생한다 . 단지 , 한번에 하나의 프로세스만 접근 가능하도록 만들어 줘야 하고 , 이때 Semaphore 를 쓴다 .뮤텍스는 값이 1 인 세마포어리소스Thread
  14. 14. Semaphore & MutexDispatch_semaphore_create(3)리소스Thread뮤텍스와 세마포어 .. 언떤 상황에서 어떻게 사용하는 것이 좋은가 ?
  15. 15. Grand Central Dispatchdispatch_semaphore_t Tsemaphore = dispatch_semaphore_create(3);dispatch_semaphore_wait ==> 먼저 하나의 블럭이 실행되면 wait 을 호출 ==> 내부 카운트를 1 올린다 .그리고 내부 카운트가 먼저 생성할때 설정한 3 보다 적으면 바로 돌아가고 , 많을 경우 Sleep 을 걸어버린다 .dispatch_semaphore_signal ==> 내부 카운트 1 내린다 .그리고 다른 블럭에서 작업이 끝날때 signal 을 날려주면 내부 카운트가 하나 줄게된다 .내부 카운트가 줄었을때 설정한 3 보다 적으면 재우던 스레드를 깨워서 진행 시킨다 .dispatch_semaphore_t Tsignal = dispatch_semaphore_create(2); //2 개 짜리 세마포어 생성dispatch_async(dqueue, ^{dispatch_semaphore_wait(Tsignal, DISPATCH_TIME_FOREVER);dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSLog(@"GCD : %i 스레드 시작 ",i);[NSThread sleepForTimeInterval:2.0];NSLog(@"GCD : %i 스레드 끝 ",i);dispatch_semaphore_signal(Tsignal);});});
  16. 16. Grand Central Dispatch- (void)viewDidLoad{[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.dispatch_queue_t dqueue = dispatch_queue_create("test01", NULL);//__block int i =0;int i =0;dispatch_semaphore_t Tsignal = dispatch_semaphore_create(2); //2 개 짜리 세마포어 생성dispatch_async(dqueue, ^{dispatch_semaphore_wait(Tsignal, DISPATCH_TIME_FOREVER);dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSLog(@"GCD : %i 스레드 시작 ",i);[NSThread sleepForTimeInterval:2.0];NSLog(@"GCD : %i 스레드 끝 ",i);dispatch_semaphore_signal(Tsignal);});});i++;dispatch_async(dqueue, ^{dispatch_semaphore_wait(Tsignal, DISPATCH_TIME_FOREVER);dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSLog(@"GCD : %i 스레드 시작 ",i);[NSThread sleepForTimeInterval:2.0];NSLog(@"GCD : %i 스레드 끝 ",i);dispatch_semaphore_signal(Tsignal);});});i++;...........}
  17. 17. 감사합니다 .

×