iOS 멀티스레드 면접 문제

4717 단어 ios
iOS의 다중 스레드
1. 프로세스 및 스레드
  • 프로세스: 1.프로세스는 일정한 독립된 기능을 가진 프로그램으로 특정한 데이터 집합에 대한 실행 활동으로 운영체제가 자원을 분배하는 기본 단원이다.2. 프로세스란 시스템에서 실행 중인 응용 프로그램을 말한다. 바로 프로그램의 실행 과정이다. 우리는 휴대전화의 앱으로 이해할 수 있다.3. 각 프로세스는 독립적이며 각각의 프로세스는 전용 메모리 공간에서 실행되며 독립적으로 실행하는 데 필요한 모든 자원을 가지고 있다
  • 스레드 1.프로그램 실행 흐름의 최소 단원입니다. 루틴은 프로세스의 실체입니다.2. 하나의 프로세스가 임무를 수행하려면 최소한 하나의 라인이 있어야 한다.응용 프로그램이 시작될 때 시스템은 기본적으로 하나의 라인, 즉 주 라인을 열 것이다
  • 프로세스와 라인의 관계 1.루틴은 프로세스의 실행 단원으로 프로세스의 모든 작업이 루틴에서 실행됩니다.스레드는 CPU가 자원을 분배하고 스케줄링하는 최소 단위이다.한 프로그램은 여러 프로세스 (다중 프로세스) 에 대응할 수 있으며, 한 프로세스에 여러 개의 프로세스가 있을 수 있지만, 적어도 한 개의 프로세스가 있어야 한다.같은 프로세스 내의 루틴 공유 프로세스 자원
  • 주로 세 가지가 있는데 그것이 바로 NSThread, NSoperationQueue, GCD 1.NSThread: 가벼운 멀티스레드 기술
  • iOS 개발 교류 기술군: [563513413]점프 중), 당신이 소든 흰둥이든 모두 입주를 환영합니다. BAT, 아리 시험문제, 면접 경험을 공유하고 기술을 토론하며 모두 교류하고 성장하세요!
    우리가 수동으로 개척한 서브라인입니다. 초기화 방식을 사용하려면 우리가 직접 시작해야 합니다. 구조기 방식을 사용하면 자동으로 시작됩니다.우리가 수동으로 개척한 라인이라면, 모두 우리 스스로 이 라인을 관리해야 한다. 시작뿐만 아니라, 이 라인을 사용한 후의 자원 회수도 필요하다
    NSThread \*thread = \[\[NSThread alloc\] initWithTarget:self selector:@selector(testThread:) object:@"    "\]; //                 start   \[thread start\]; //              thread.name = @"NSThread  "; //   Thread             0 ~ 1 。      ,          ,     ,                     ,    0.5 thread.threadPriority = 1; //             \[thread cancel\]; //              \[NSThread detachNewThreadSelector:@selector(testThread:) toTarget:self withObject:@"     "\];
  • performSelector...NSObject의 하위 클래스나 대상이라면 모두 호출 방법을 통해 하위 루트와 주 루트에 들어갈 수 있다. 사실 이런 방법이 개척한 하위 루트도 NSThread의 또 다른 표현 방식이다.컴파일 단계에서 방법이 유효한지 확인하지 않고 존재하지 않으면 경고만 준다
  • *   //     。  1s  。   OC      :            \[self performSelector:@selector(aaa) withObject:nil afterDelay:1\]; //      。waitUntilDone:                   ,   YES:                       ,            ;   NO:          ,         \[self performSelectorOnMainThread:@selector(aaa) withObject:nil waitUntilDone:YES\]; //      \[self performSelectorInBackground:@selector(aaa) withObject:nil\]; //        \[self performSelector:@selector(aaa) onThread:\[NSThread currentThread\] withObject:nil waitUntilDone:YES\]

    주의해야 할 것은 애프터 딜레이가 있는 시간 지연 함수라면 내부에 NSTimer를 만들고 현재 라인의 Runloop에 추가합니다.즉 현재 라인이runloop을 열지 않으면 이 방법은 효력을 상실합니다.하위 라인에서runloop을 시작해야 합니다. (호출 순서 주의)\[self performSelector:@selector(aaa) withObject:nil afterDelay:1\]; \[\[NSRunLoop currentRunLoop\] run\];
    performSelector: withObject: 단순한 메시지 발송일 뿐 시간과 아무런 관계가 없다.그래서 서브라인에 추가할 필요가 없는 Runloop에서도 실행할 수 있어요.
    2. GCD 대비 NSOprationQueue
    우리는 NSOperationQueue와 GCD 간의 관계를 명확히 해야 한다. GCD는 밑바닥을 향한 C 언어의 API이고 NSOpertaionQueue는 GCD로 포장된 GCD의 고급 추상이다.1. GCD의 실행 효율이 높고 대기열에서 실행되는 것은 Block으로 구성된 작업이기 때문에 이것은 경량급 데이터 구조로 쓰기에 더욱 편리하다. 2. GCD는 FIFO의 대기열만 지원하고 NSOperationQueue는 최대 병발수를 설정하고 우선순위를 설정하며 의존 관계를 추가하는 등 실행 순서를 조정할 수 있다. 3. NSOperationQueueueue는 심지어 대기열을 뛰어넘어 의존 관계를 설정할 수 있지만 GCD는 직렬 대기열을 설정할 수 밖에 없다.또는 대기열에 barrier(dispatch barrier async) 작업을 추가해야 실행 순서를 제어할 수 있습니다. 비교적 복잡합니다. 4. NSOperationQueueue는 대상을 대상으로 하기 때문에 KVO를 지원하고 Operation이 실행 중(isExecuted), 종료(isFinished), 취소(isCanceld) 여부를 모니터링할 수 있습니다.
  • 실제 프로젝트 개발에서 비동기적인 조작만 하고 특별히 복잡한 라인 관계 관리가 없을 때가 많기 때문에 애플이 선호하는 최적화되고 완벽하며 운행이 빠른 GCD가 우선이다
  • 비동기적인 작업 간의 사무성, 순서, 의존 관계를 고려하면 다중 스레드 다운로드와 같은 GCD는 스스로 더 많은 코드를 써서 실현해야 한다. NSOperationQueue는 이미 이러한 지원을 내장했다
  • GCD든 NSOperationQueue든 우리가 접촉한 것은 모두 임무와 대기열이고 직접 라인에 접촉하지 않았다. 사실상 상위 라인 관리도 우리가 걱정할 필요가 없다. 시스템은 라인의 창설, 스케줄링 관리와 방출에 대해 모두 잘했다.NSThread 는 스레드 수명 주기를 직접 관리하고 스레드 동기화, 잠금 문제를 고려하여 일부 성능 오버헤드
  • 를 발생시킵니다.
    GCD 실행 원리?
  • GCD에는 하층 스레드 탱크가 있는데 이 탱크에 저장된 것은 하나의 스레드이다.'못'이라고 부르는 이유는 이'못'중의 라인이 중용될 수 있다는 것을 쉽게 이해할 수 있다. 한동안 이 라인이 호출되지 않으면 이 라인은 소각될 것이다.주의: 몇 개의 스레드를 켜느냐는 하부 스레드 탱크에 의해 결정된다(스레드는 3~5개를 제어할 것을 권장한다). 탱크는 시스템이 자동으로 유지보수를 하기 때문에 우리 프로그래머가 유지할 필요가 없다(이 말을 보니 기쁘지 않니?)우리 프로그래머가 관심을 가져야 할 것은 무엇일까?우리가 관심 있는 것은 대기열에 임무를 추가하는 것이다. 대기열 스케줄링만 하면 된다.
  • 만약에 대기열에 동기화 작업이 저장되어 있다면 작업이 대기열에서 나오면 밑바닥 스레드 탱크에서 이 작업을 수행할 수 있는 스레드를 제공하고 작업이 끝난 후에 이 스레드 탱크로 돌아간다.이렇게 대기열의 작업을 반복적으로 스케줄링합니다. 동기화되기 때문에currentThread로 인쇄할 때 같은 라인입니다.
  • 만약에 대기열에 비동기적인 작업이 저장되어 있다면 (이동기적인 작업은 라인을 열 수 있음을 주의함) 임무가 줄을 나가면 밑바닥 스레드 풀은 임무를 수행할 수 있는 라인을 제공한다. 비동기적인 작업이기 때문에 대기열의 임무가 현재 임무가 끝날 때까지 기다리지 않고 다음 임무를 스케줄링할 수 있다. 이때 밑바닥 스레드 풀은 두 번째 임무를 수행할 수 있는 라인을 다시 제공한다.실행이 끝난 후에 다시 밑바닥 스레드 탱크로 돌아간다.
  • 이렇게 하면 라인에 대한 복용을 완성하고 모든 임무의 집행이 필요하지 않고 새로운 라인을 열어서 시스템의 비용을 절약하고 효율을 높인다.iOS7.0일 때 GCD 시스템을 사용하면 보통 58개의 라인만 열 수 있다. iOS8.0 이후 시스템은 많은 라인을 열 수 있지만 실제 개발 응용에서 라인 개수 35개가 가장 합리적임을 권장합니다.
  • 좋은 웹페이지 즐겨찾기