进程(process)和线程(thread) 是所有学习计算机行业人员绕不过去的两个基本概念,但是它们却十分的抽象,十分不容易理解.
最近总结了一个例子来解释一下,可能要好一点.
1.我们知道,CUP是一个计算机的核心,它就像一个工厂一样,只要启动计算机,它就会一刻不停的运动.我这样假设,这个工厂的名字是xxx工厂,这个工厂里面有5个车间,车间门牌号是,"1","2","3","4","5",每个车间的标准配置(注意,是一个车间的配置)是有10个工人,有一个厕所,有一个三个床位的卧室,一个一次性可以容纳5个人的餐厅.
2.我们假设,这个工厂只能自己发电使用,这样电量就十分有限,每次只能供工厂内的一个车间正常运行.(cpu一次只能执行一个任务)(任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。)
3.我们假设,
星期一:
给车间"1"供电,现在"车间1"正常运行,这个车间生产的是茶叶蛋,它里面只有一个工人
这时候我们就可以这样认为:
一个车间就是一个进程.(一个任务至少有一个进程,每个进程都是拥有空间的或者说资源)
一个工人就是一个线程(线程不具有空间或者说资源) ,这个车间有一个工人,煮茶叶蛋他一个人就可以搞定.(一个进程中至少要有一个线程).
4.
星期二:
给车间"2"供电,现在"车间2"正常运行,这个车间生产的是国产红旗轿车,它里面有10个工人
这时候我们就可以这样认为:
一个车间就是一个进程.(一个任务至少有一个进程)
一个工人就是一个线程 ,这个车间有10个工人,生产一辆红旗轿车,需要多人共同合作才能完成.(一个进程可以包含多个线程)
线程,是进程的一个具体实例.程序运行的最小单位,是被系统独立调度和CPU的基本运行单元
进程是操作系统中可以并行工作的基本单元,一个应用程序有一个进程,一个进程中至少有一个线程
多线程开发:就是在一个进程中,有多个线程共同存在,每个线程都在执行各自的任务,互不干扰.比如网络请求这个操作比较耗费时间,可以单独开辟线程来做这个操作.主线程继续执行其他操作,这样就会提高进程的运行效率.但是会造成系统资源的消耗,而且,万一有一个线程死掉,就会造成整个进程崩溃,而且容易引起安全问题.
比如一个单例的访问,两个线程同时访问一个单例的实例,就会造成冲突,安全问题,所以才会在外边加上一个修饰关键字.保证安全
iOS中的实现多线程的方法:
NSThread: 类方法,需要开辟空间,需要手动管理.比如页面推送的时候,pop页面消失,则销毁的页面内的线程必须关闭,否则程序会崩溃
CGD: 是4.0版本后出的,效率很高,只关心内部block的实现.含有主队列,和全局队列.也可以自己定义队列.它是基于C的API
使用NSOperationQueue(GCD的封装)2.0 最大并发数为1