进程,代表cpu所能处理的单个任务
任何时刻,cpu总是运行一个进程
一个进程可以包含多个线程
一个进程的内存空间是共享的,每个线程都可以共享这一块内存
一个线程在使用某些内存时,其他线程必须等它结束,才能使用这一块内存
防止多个线程同时读写某一块区域,叫互斥锁
(Mutual exclusion缩写Mutex)
某些内存区域,只能供给固定数目的线程使用
用来保证多个线程不相互冲突,叫做信号量
(semaphore)—>mutex是semaphore得一种特殊的情况(n = 1),但是,因为mutex较为简单,且效率高,所以在保证资源独占的情况下,还是采用这种设计。
操作系统的设计,可以归纳为三点
- 以多线程形式,允许多个任务同时进行;
- 以多线程形式,允许单个任务分成不同的部分运行;
- 提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
进程概念
一、进程是一个实体。
每个进程都有她自己的地址空间,包括:
1、文本区域(text region)存储处理器执行的代码
2、数据区域(data region)存储变量和进程执行期间使用的动态分配的内存
3、堆栈(stack region)存储着活动过程调用的指令和本地变量
二、进程是一个“执行的程序”。
进程与程序的区别
程序是指令和数据的有序集合,是一个静态的概念;进程是程序在处理机上的一次执行过程,是一个动态的概念。
程序可以作为一种软件资料长期存在,而进程是有一定生命期的;程序是永久的,进程是暂时的。
进程是由进程控制块、程序段、数据段三部分组成。
同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,也就是说同一程序可以对应多个进程。
在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。
进程的缺点
- 独立的地址空间使得不同的进程共享状态信息变得非常困难,为了共享信息,他们必须显式的使用(进程通信机制)
- 进程之间通信比较慢,因为进程控制和进程通信机制开销很大。
线程
进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
一个线程就是运行在进程上下文的一个逻辑流。现代操作系统允许我们编写一个进程里同时运行多个线程的程序。线程由内核调度。每个进程开始生命周期时都是单一线程,这个线程称为主线程,在某一时刻,主线程创建一个对等线程。从这个时间点开始,两个线程就并发运行。最后,因为主线程执行一个慢速系统调用,如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;
- (BOOL)isMainThread;
+ (BOOL)isMainThread;
- (BOOL)isExecuting;
- (BOOL)isFinished;
NSOPeration

NSOperationQueue queue = [[NSOperationQueue alloc]init];

NSInvocationOperation operation = [[NSInvocationOperation alloc]
initWithTarget:self selector:@selector(doSomething:) object:@"hi"];
[queue addOperation:operation];

NSOperationQueue queue = [[NSOperationQueue alloc]init];

NSBlockOperation operation = [NSBlockOperation
blockOperationWithBlock:^{
[self doSomething];
}];

[queque addOperation:operation];