摘自《iOS程序员面试笔试宝典》
什么是线程?线程与进程有什么区别?为什么要使用多线程
线程指程序在执行过程中,能够执行程序代码的一个执行单元。线程主要有4种状态:运行、就绪、挂起、结束。
进程指一段正在执行的程序。而线程有时候也被称为轻量级进程,是程序执行的最小单元。一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程拥有自己的栈空间。进程与线程的关系如图所示。
进程与线程的关系在操作系统级别上,程序的执行都是以进程为单位的,而每个进程中通常都会有多个线程互不影响地并发执行,那么为什么要使用多线程呢?其实,使用多线程为程序研发带来了巨大的便利。具体而言,有以下几个方面的内容:
1)使用多线程可以减少程序的响应时间。在单线程(单线程指程序执行过程中只有一个有效操作的序列,不同操作之间都有明确的执行先后顺序)的情况下,如果某个操作很耗时,或者陷入长时间的等待(如等待网络响应),那么此时程序将不会响应鼠标和键盘等操作,使用多线程后,可以把这个耗时的线程分配到一个单独的线程去执行,使得程序具备了更好的交互性。
2)与进程相比,线程的创建和切换开销更小。由于启动一个新的线程必须给这个线程分配独立的地址空间,建立许多数据结构来维护线程代码段、数据段等信息,而运行于同一进程内的线程共享代码段、数据段,所以线程的启动或切换的开销比进程要少很多。同时多线程在数据共享方面效率非常高。
3)多CPU或多核计算机本身就具有执行多线程的能力,如果使用单个线程,那么将无法重复利用计算机资源,造成资源的巨大浪费。因此,在多CPU计算机上使用多线程能提高CPU的利用率。
4)使用多线程能简化程序的结构,使程序便于理解和维护。一个非常复杂的进程可以分成多个线程来执行。
如何理解多线程
多线程(multithreading)指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件的支持而能够在同一时间执行多个线程,进而提升整体处理性能。要深入了解iOS中的多线程技术,先需要了解以下几个概念。
1.进程
每个正在系统上运行的程序都是一个进程。每个进程之间是相互独立的,每个进程均运行在其专用且受保护的内存空间内。进程在系统内存中的关系如图所示。
系统内存中的进程通过“活动监视器”可以查看Mac系统中开启的所有进程。
活动监视器中的进程2.线程
线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。每个进程包含至少一个线程。线程基本上是轻量级的进程,它负责在单个程序中执行多个任务。通常由系统负责多个线程的调度和执行。
需要注意的是,在同一个线程中执行的任务是串行的。也就是说,在同一时间内,一个线程只能执行一个任务。
线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。多线程技术主要是为了充分利用CPU,提高程序的执行效率。多线程之间的关系如图所示。
多线程之间的关系事实上,在同一时间,CPU只能处理一条线程,只有一条线程在执行。多线程的并发执行,其实就是CPU快速地在多条线程之间调度。如果CPU调度线程的速度足够快,那么就会产生多条线程并发执行的假象。
多线程技术的优点如下:
1)可以很大程度上提高程序的执行效率,提高程序的响应速度。
2)使用线程可以把占据时间长的程序中的任务放到后台去处理,这样就不会阻塞程序主线程,用户体验更好(耗时操作会卡住主线程,严重影响UI的流畅度)。
3)提高计算机资源的利用率,如:更加充分利用内存,多CPU计算机上提高CPU利用率。
4)将进程分块,优化简化程序逻辑结构。
多线程技术的缺点如下:
1)多线程程序的代码会更加复杂、难读,增加交接和维护难度。
2)创建和调度线程会有额外的开销,线程越多,开销越大,甚至反而降低程序的性能。
3)通常模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
因此,在实际使用多线程时,需要适当开启线程,当线程使用完成后,需要及时释放资源。在最新的iOS技术中,已经很少需要直接操作线程了,因为苹果公司已经将大部分复杂的操作封装好。
网友评论