美文网首页
iOS 进程 线程以及多线程

iOS 进程 线程以及多线程

作者: RyderZhang | 来源:发表于2018-10-22 16:11 被阅读12次

什么是进程?

在系统中正在运行的一个应用程序会开辟一个进程,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
比如同时打开QQ、Xcode,系统就会分别启动2个进程 通过"活动监视器"可以查看Mac系统中所开启的进程。

什么是线程?

1个进程要想执行任务,必需得有线程(每1个进程至少要有1条线程);
线程是进程的基本单元,一个进程(程序)的所有任务都在线程中执行;
比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行;
主线程: iOS程序启动时,在创建一个进程的同时,会开始运行一个线程,该线程就是主线程,对界面的操作原则上放到主线程中。

什么是多线程?

1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。

多线程的原理:
同一时间CPU只能处理1条线程,也就是只有1条线程在工作(执行);
多线程并发执行,其实是CPU快速地在多条线程之间调度(切换);
CPU调度线程的速度足够快,就造成了多线程并发执行的假像.

多线程的优缺点:
优点:

  1. 能适当提高程序的执行效率;
  2. 能适当提高资源利用率(CPU、内存利用率).

缺点:

  1. 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M=1024KB,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能。
  2. 线程越多,CPU在调度线程上的开销就越大(如果有N条多线程,cpu会在N多线程之间调度,CPU会累死,消耗大量的CPU资源,每条线程被调度执行的频次会降低,线程的执行效率就下降了)
  3. 程序设计更加复杂:比如线程之间的通信,多线程的数据共享.

多线程在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

相关文章

网友评论

      本文标题:iOS 进程 线程以及多线程

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