1.什么是线程
线程是操作系统能够进行运算调度的基本单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。和进程类似,一个线程也有就绪、运行、阻塞三种基本转状态。
2.时间片
时间片是分时操作系统分配给每个正在运行的进程微观上的一段CPU时间,时间片的大小对系统的性能影响很大。
如果时间片足够大,以至于所有进程都能在一个时间片内执行完毕,则时间片轮转调度算法就退化为先来先服务调度算发。如果时间片很小,那么处理机将在进程间过于频繁切换,使处理机的开销增大,而真正用于处理用户作业的时间将减少,因此时间片的大小应选择适当。
3.线程安全
线程不持有资源,但是同一进程中的所有线程可以共享进程的资源,所以说我们遇到的大部分线程的问题基本是因为共享资源引起的。 也就是说,当多个线程同时访问一块共享资源(某一块内存),因为时序性问题,会导致数据错乱,这就是线程不安全。
4.并发、并行
-
并发是同一个时间段内,几个作业都在同一个CPU上运行,但任意一个时刻点上只有一个作业在处理机上运行。
-
并行是同一个时间段内,几个作业在几个CPU上运行,任意一个时刻点上,有多个作业在同时运行,并且多个作业之间互不干扰。
5.线程和进程关系
- 同一进程的不同线程共享进程的资源
- 切换同一进程中的线程,系统的开销小;而切换不同进程中的线程,系统的开销较大
6.进程和队列的关系
在多线程编程中,一个进程可以包含多个线程,这些线程共享进程中的内存空间和资源。为了控制多个线程之间的执行顺序,有时需要使用队列来管理线程的执行。
7.向当前的串行队列,同步添加任务,会产生死锁导致crash的原因。
向当前的串行队列同步添加任务会导致死锁的原因是因为串行队列会按照任务的先后顺序依次执行,而同步添加任务会阻塞当前线程直到任务执行完成。如果在当前的串行队列中同步添加任务,那么这个任务需要等待当前队列中其他任务执行完毕才能执行,从而造成了循环等待,导致死锁发生。
iOS中的线程:
层次NSThread < GCD < NSOperation
(1)NSThread主要用于线程的创建,并且开发者不需要管理线程生命周期。
(2)GCD将线程这个概念抽象出来,让开发者不再直接与线程交互。开发者要做的是向队列中添加代码块,然后GCD来管理线程池和代码块运行的实际线程。 这缓解了创建过多线程的问题,因为线程现在是GCD集中管理的,并从开发者那里抽象出来。这让开发者更集中关注的是任务队列而不是线程本身。
(3)NSOperation、NSOperationQueue 是苹果提供给我们的一套多线程解决方案。实际上 NSOperation、NSOperationQueue 是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。
相对来说,简化了一些同时也增强了一些,比如弱化了对于串行和并行的逻辑,增强了对于队列的使用,也提供了对于任务之间的依赖逻辑。 NSOperation需要配合NSOperationQueue来实现多线程。因为默认情况下,NSOperation单独使用时系统同步执行操作,并没有开辟新线程的能力,只有配合NSOperationQueue才能实现异步执行。
因为NSOperation是基于GCD的,那么使用起来也和GCD差不多,其中,NSOperation相当于GCD中的任务,而NSOperationQueue则相当于GCD中的队列。