美文网首页
多线程的底层实现MJ

多线程的底层实现MJ

作者: March_Cullen | 来源:发表于2017-03-08 22:11 被阅读0次

    一个应用程序即一个进程,一个进程中可以开多条线程;多线程编程,也叫并发编程。
    Mach是第一个以多线程方式处理任务的系统,因此多线程的底层是基于Mach的线程。开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的。

    • C语言的POSIX接口:#include <pthread.h>;
    • OC的NSThread;
    • C语言的GCD接口(原生的)(性能最好,代码更简洁)(充分利用系统的核)(Mac iOS内核是UNIX);
    • OC的NSOperation和NSOperationQueue(基于GCD);

    多线程之间的通信
    (1)

    [self performSelector:<#SEL#> onThread:<#NSThread#> withObject:@”123” waitUntilDone:(<BOOL>)];
    

    (2)NSMachPort
    实例:

    • 控制器向服务器发送数据请求,在子线程中实现;回到主线程刷新UI界面。
    // 在异步线程做事情
    dispatch_async(dispatch_get_main_queue(), ) {
    // 回到主线程刷新UI界面
    }
    

    网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题

    • (1)使用SDWebImage;
    • (2)开辟子线程下载图片,缓存处理;
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    NSData*data = [NSData dataWithContentsOfURL:url ];
    cell.imageView.image = [UIImage imageWithData:data];
    }];
    [self.queue addOperation:operation];
    

    GCD的底层实现
    (1)iOS和OS X的核心是XNU内核,因此GCD是基于XNU内核实现的;
    (2)GCD的API全部在libdispatch库中;
    (3)GCD的底层实现主要有Dispatch Queue和Dispatch Source;

    • Dispatch Queue:管理block,管理操作在主线程或者异步线程执行;
    • Dispatch Source:处理事件;
    dispatch_async(dispatch_queue_t, <#(void)block#>);
    

    GCD&NSOperation
    (1)GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装;
    (2)GCD只支持FIFO的队列,NSOperationQueue可以很方便的调整执行顺序,和最大并发数;queue.maxConcurrentOperationCount = 1;
    (3)GCD的执行速度比NSOperationQueue快;
    (4)GCD不支持KVO;
    (5)NSOperation可以轻松在Operation间添加依赖,设置执行顺序,而GCD需要写很多的代码才能实现;
    (6)NSOperation可以设置对大并发数,以及优先级;
    (7)NSOperationQueue支持KVO,可以监测operation是否正在执行(isExecuted),是否结束(isFinished),是否取消(isCanceled);
    (8)NSOperation基于GCD, 支持KVO,[operation isFinished]监听operation是否执行完成,监听任务的执行情况
    (9)NSOperation速度比GCD慢, 要求时刻监听,使用NSOperation
    (10)使用规则:

    • 任务之间不太相互依赖:GCD;
    • 任务之间有依赖或者要监听任务的执行情况:NSOperationQueue;

    GCD以及block的使用要注意些什么
    (1)循环引用
    (2)block的内存管理

    • MRC:__block
    • ARC:__weak/__unsafe_unretained

    block
    block里面所有的代码会自动执行,并且在后台执行。把下载操作放在block里面,系统会把下载操作放在子线程中执行,下载完成,回到主线程填充图片数据。

    self.images[@”124123.png”] = downloadImage;
    // 下载完成,存入缓存
    

    block的内存管理

    • 默认放在栈里面
    • 调用copy方法,是放在堆里面

    Socket, TCP/IP, UDP, XMPP, HTTP
    Http:超文本传输协议,用于网络数据传输的格式

    • 短链接,一次性的
    • 只有服务器能接收http请求,客户端不能接受http请求
    • 适合做一对一的相应
      Socket:套接字,是一个用于传输网络数据的工具,创建链接最耗时
    • TCP/IP:传输协议
    • 适合聊天
    • XMPP
    • 长链接
    • 传输速度慢(相对UDP),不会丢失数据包(安全)
    • UDP:传输协议
    • 一般用在游戏里面
    • 局域网游戏
    • 网络游戏
    • 传输速度快,容易丢数据包(不安全)
    • 大文件传输只能用Socket
    • 文件断点续传,使用socket,其他情况使用AFN
      XMPP:做即时通讯(基于TCP/IP)

    socket可以发送TCP\IP,UDP,HTTP请求

    • 大文件传输只能用socket,支持断点续传
    • 上传图片使用http请求
    • HTTP是一对一请求

    音频压缩
    音频序列服务
    音频文件 -> 字节压缩
    数据压缩框架

    相关文章

      网友评论

          本文标题:多线程的底层实现MJ

          本文链接:https://www.haomeiwen.com/subject/viyigttx.html