多线程

进程,代表cpu所能处理的单个任务
任何时刻,cpu总是运行一个进程
一个进程可以包含多个线程
一个进程的内存空间是共享的,每个线程都可以共享这一块内存
一个线程在使用某些内存时,其他线程必须等它结束,才能使用这一块内存
防止多个线程同时读写某一块区域,叫互斥锁(Mutual exclusion缩写Mutex)
某些内存区域,只能供给固定数目的线程使用
用来保证多个线程不相互冲突,叫做信号量(semaphore)—>mutex是semaphore得一种特殊的情况(n = 1),但是,因为mutex较为简单,且效率高,所以在保证资源独占的情况下,还是采用这种设计。

操作系统的设计,可以归纳为三点

  1. 以多线程形式,允许多个任务同时进行;
  2. 以多线程形式,允许单个任务分成不同的部分运行;
  3. 提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

进程概念

一、进程是一个实体。
每个进程都有她自己的地址空间,包括:
1、文本区域(text region)存储处理器执行的代码
2、数据区域(data region)存储变量和进程执行期间使用的动态分配的内存
3、堆栈(stack region)存储着活动过程调用的指令和本地变量
二、进程是一个“执行的程序”。

进程与程序的区别

    程序是指令和数据的有序集合,是一个静态的概念;进程是程序在处理机上的一次执行过程,是一个动态的概念。
    程序可以作为一种软件资料长期存在,而进程是有一定生命期的;程序是永久的,进程是暂时的。
    进程是由进程控制块、程序段、数据段三部分组成。
    同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,也就是说同一程序可以对应多个进程。
    在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。

进程的缺点

  1. 独立的地址空间使得不同的进程共享状态信息变得非常困难,为了共享信息,他们必须显式的使用(进程通信机制)
  2. 进程之间通信比较慢,因为进程控制和进程通信机制开销很大。

线程

    进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
    一个线程就是运行在进程上下文的一个逻辑流。现代操作系统允许我们编写一个进程里同时运行多个线程的程序。线程由内核调度。每个进程开始生命周期时都是单一线程,这个线程称为主线程,在某一时刻,主线程创建一个对等线程。从这个时间点开始,两个线程就并发运行。最后,因为主线程执行一个慢速系统调用,如read或者sleep,控制就会通过上下文切换传递到对等线程。在控制传递回主线程前,对等线程会执行一段时间

iOS有三种多线程编码技术

  • NSThread
  • NSOperation
  • GCD
    他们的抽象程度由低到高,越高的使用越简单。

NSThread

显示调用NSThread类
  • 类方法
    [NSThread detachNewThreadSelector:@selector(doSomething:) 
toTarget:self withObject:@"hi"];
  • 实例方法
   NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(doSomething:) object:@"hi"];
   [thread start];
隐式调用
  • 开启后台线程
  [self performSelectorInBackground:@selector(doSomething:)
withObject:@"hi"];
  • 在主线程中运行
  [self performSelectorOnMainThread:@selector(doSomething:)
withObject:@"hi" waitUntilDone:YES];
  • 在指定线程中执行,但该线程必须具备run loop
    [self performSelector::@selector(doSomething:) onThread:thread
withObject:@"hi" waitUntilDone:YES];
常见NSThread的方法
+ (NSThread *)currentThread; //获取当前进程
+ (void)sleepForTimeInterval:(NSTimeInterval)ti; //线程休眠
+ (NSThread *)mainThread; //主线程,即UI线程
- (BOOL)isMainThread;
+ (BOOL)isMainThread; //当前线程是否为主线程
- (BOOL)isExecuting; //线程是否正在运行
- (BOOL)isFinished; //线程是否结束

NSOPeration

  • NSInvocationOperation
// 创建一个队列
NSOperationQueue queue = [[NSOperationQueue alloc]init];

// 创建子任务,定义子任务必须是NSOperation的子类
NSInvocationOperation operation = [[NSInvocationOperation alloc]
initWithTarget:self selector:@selector(doSomething:) object:@"hi"];
// 当把任务添加到队列后,自动开启线程
[queue addOperation:operation];
  • NSBlockOperation
//创建一个队列
NSOperationQueue queue = [[NSOperationQueue alloc]init];

// 创建NSBlockOperaion对象
NSBlockOperation operation = [NSBlockOperation
blockOperationWithBlock:^{
[self doSomething];
}];

// 加入队列
[queque addOperation:operation];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值