iOS 进程 线程以及多线程
什么是进程?
在系统中正在运行的一个应用程序会开辟一个进程,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
比如同时打开QQ、Xcode,系统就会分别启动2个进程 通过"活动监视器"可以查看Mac系统中所开启的进程。
什么是线程?
1个进程要想执行任务,必需得有线程(每1个进程至少要有1条线程);
线程是进程的基本单元,一个进程(程序)的所有任务都在线程中执行;
比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行;
主线程: iOS程序启动时,在创建一个进程的同时,会开始运行一个线程,该线程就是主线程,对界面的操作原则上放到主线程中。
什么是多线程?
1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。
多线程的原理:
同一时间CPU只能处理1条线程,也就是只有1条线程在工作(执行);
多线程并发执行,其实是CPU快速地在多条线程之间调度(切换);
CPU调度线程的速度足够快,就造成了多线程并发执行的假像.
多线程的优缺点:
优点:
- 能适当提高程序的执行效率;
- 能适当提高资源利用率(CPU、内存利用率).
缺点:
- 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M=1024KB,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能。
- 线程越多,CPU在调度线程上的开销就越大(如果有N条多线程,cpu会在N多线程之间调度,CPU会累死,消耗大量的CPU资源,每条线程被调度执行的频次会降低,线程的执行效率就下降了)
- 程序设计更加复杂:比如线程之间的通信,多线程的数据共享.
多线程在iOS开发中的应用:
主线程:一个iOS程序运行后,默认会开启1条线程,称为 "主线程" 或 "UI线程"
主线程的主要作用: 显示\刷新UI界面、处理UI事件(比如:点击 滚动 拖拽)
主线程的使用注意: 别将比较耗时的操作放在主线程中, 耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种"卡"的坏体验.
注意:
原则上官方只允许UI主线程修改UI,虽然部分第三方库,并不是这样;
不允许工作线程修改如progress进度读条等UI控件;
每个线程都需要有@autoreleasepool,否则可能会出现内存泄漏。
代码实例:BlockingMainThreadDemo
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *buttonNames = @[@"阻塞主线程", @"看看卡不卡"];
for (NSInteger i=0; i<buttonNames.count; i++) {
UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(10, 200+70*i, self.view.frame.size.width-20, 30)];
[btn setTitle:buttonNames[i] forState:UIControlStateNormal];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
btn.tag=100+i;
[btn addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
}
-(void)buttonClick:(UIButton *)button{
if (button.tag == 100) {
NSLog(@"%@", [NSThread mainThread]);
NSLog(@"%@", [NSThread currentThread]);
NSLog(@"耗时操作执行开始!!!");
//当前线程休眠多长时间,例如模拟请求网络数据
[NSThread sleepForTimeInterval:60.0];
NSLog(@"耗时操作执行结束!!!");
}
if (button.tag == 101) {
NSLog(@"不卡了!!!");
}
}
@end
KB、MB、GB、TB的换算关系
位:位(b it,缩写为b)是存储器的最小单位,可以表示一位二进制数。
字节:1字节(B yte,缩写为B)由8个位组成,即1 B yte = 8 b it,是存储器的基本单位,通常被作为一个存储单元。
另外,还使用千字节(K B)、兆字节(M B)、吉字节(G B)甚至太字节(T B),换算关系为:
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB