关于进程和线程的问题,今天说点概念性的东西
首先、我从百度百科中摘取了这样的内容:
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位
当然,上面这种晦涩的不是一般人能看懂语言我们一般都会很无语,那我就给大家翻译一下。
1、进程:
进程其实就是在系统中“正在运行”的一个应用程序。这里我们需要注意的是“正在运行”,也就是说进程他实际上就是“活着”的。这么说吧,我们在手机上打开微信应用,这个时候对于我们的手机系统而言,微信就是一个进程。而当我们将微信关闭后,微信就不再是一个进程,这就说明了进程他必须是“活着”的这么一个状态。
每个进程之间是相互独立的,每个进程均运行在其专用的且受保护的内存空间中。
一个应用程序可以对应多个进程、比如同时开两个qq程序等。
2、线程:
线程是CPU调用(执行任务)的最小单位。就比如我们打开微信和别人聊天的时候一个聊天就相当于一个线程。
一个进程想要执行任务就必须要有线程,也就是说:一个进程至少要有一条线程。
真正用来做任务的是线程,进程相当于只是给线程提供一个执行操作的平台。
3、线程串行:
一个线程中任务的执行是串行的。
如果要在一个线程中执行多个任务,只能一个一个的按顺序执行这些任务。
也就是说:在同一时间内 一个线程只能执行一个任务。
比如在一个线程中下载四个文件,需要按照文件下载的添加顺序依次执行,下载完文件1后再去下载文件2,以此类推。
也可以认为说 线程是进程中的一条执行路径。
4、线程和进程的比较:
线程是CPU调用(执行任务)的最小单位。
进程是CPU分配资源和调度的单位。
一个程序可以对应多个进程,一个进程中可以有多个线程,但至少要有一个线程。
同一个进程内的多个线程共享进程的资源。
5、多线程:
一个进程可以开启多条线程,每条线程可以“并行”执行不同的任务。这个就是我们常说的多线程。
就比如说我们想要开启多线程去下载多个文件,那就可以看作是这几个线程同时执行:
6、多线程实现原理:
其实,在同一时间,CPU只能处理一条线程,只有一条线程在工作(这里我们设定是单核处理,一个CPU执行)。
那么,所谓的多线程同时并发执行,其实就是CPU快速的在多条线程之间调度(切换)
如果CPU的切换速度足够快,就会造成我们看到的“多线程并发”操作的假象。
7、多线程优缺点:
优点:
能适当的提高程序的执行效率
能适当提高资源利用率(CPU,内存利用率)
缺点:
创建线程是需要有开销的(时间、空间)
创建线程大约需要消耗90毫秒的创建时间
如果大量的开启多个线程,就会降低程序的性能
线程越多、CPU在调度线程上的开销就会越大,消耗的资源就越多
CPU会在N多线程之间来回切换,大量消耗CPU资源。切换的时候需要保存数据(保存上下文)
使得程序的设计更加复杂:需要考虑线程之间的通讯、多线程之间的数据共享等
8、主线程:
一个iOS程序运行后,默认会开启一条线程,称为“主线程”/“UI线程”
主线程的作用主要是:
显示/刷新UI界面
处理UI事件(比如点击事件、滚动事件、拖拽事件等)
也就是说:凡是和UI相关的事件都要放在主线程中执行。
这里要注意的一点是:我们程序只有一条主线程,我们能开启的都是子线程。我们尽量不要将耗时的操作放在主线程中以免阻塞线程,造成程序体验下降。
另外,其实我们可以通俗的去理解线程进程之间的关系:
我们可以将CPU看做是一个工厂,将进程看做是工厂的车间,将线程看成是车间的工作人员。这里我们设定工厂的资源有限,同一时间内只能供一个车间运转。那么,一个工厂可以有多个车间,一个车间也是有多个工人的,同一车间的多个工人之间是可以共享该车间的资源的。这就好比我们的一个进程有多个线程,多个线程之间是可以共享进程提供的资源的。
我画了草图一幅,来借以说明线程进程和CPU的关系。
希望我的文章能对大家有所帮助。
上一篇:UIView和CALayer