多线程的底层实现MJ

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

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

多线程之间的通信
(1)

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

(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)