iOS开发————线程与进程的区别于联系

浅谈编者对线程与进程的认识与理解


开门见山吧,打个比方,你在一台计算机上正在用QQ音乐听歌,同时在用微信跟女票聊天,这时你的电脑上就有两个进程,QQ音乐和微信(可能不止两个,但是最起码是两个),当你在微信上打字的时候同时收到了女票的一个表情,这时微信这个应用程序中就有最起码两个线程,一个控制你键盘的输入,另一个是接收你女票的表情。

通过这样一个简单的例子是不是对进程和线程有了初步的认识呢,形象说起来一台计算机可同时执行多个进程,每个进程中可包含多个线程,然而在活动监视器或者windows的任务管理器中可以实时观察到计算机的进程,但是不可看到每个进程的线程内容。


线程是CPU最小的调度单位,是程序执行的最小单元,一个程序有且只有一个主线程,程序启动时创建(调用main来启动),主线程的生命周期是和应用程序绑定的,程序退出时,主线程也就停止了。

每一个进程是可以共享一个内存空间的,其中的线程都可以使用这些共享内存,但是一个线程使用某些共享内存时,其他线程必须等它结束才能使用这些内存。


相关名词解释:

线程池:管理线程的容器,提前创建的一些线程先放在其中,用到的时候取出,用完放回。

串行:使用一条数据线,将数据一位一位一次传输,每一位数据占用固定的时间长度。

并行:多个处理器或者多核处理器同时处理多个不同的任务。

同步:调用一个任务开始执行之后,等到执行结果才会继续执行下面的任务。多个任务单个单个执行。

异步:调用的多个任务连续执行,不用等待执行结果。

阻塞:调用结果返回之前,线程被挂起,函数等得到结果后才返回。

非阻塞:函数不会阻挡当前的线程,会立刻返回。

互斥锁:多线程编程中防止两条线程同时对一个公共资源进行读写的机制。

信号量:是一个计数器,它用来记录对某个资源的存取状况。


线程状态:

新建状态:新创建一个线程对象。

就绪状态:线程对象创建之后,其他线程调用了该对象的start方法,该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

运行状态:就绪状态的线程获取了CPU,执行程序代码。

阻塞状态:因某种原因放弃CPU使用权,暂停运行,知道线程进入就绪状态,才有机会转到运行状态。

死亡状态:线程执行完了或者因异常退出了run方法,该线程结束生命周期。


下面来谈谈CPU跟线程的一点联系。

CPU是一台计算机用来计算的核心部位,所有的计算操作都在此完成,事实上单核CPU只能同时处理一个进程的计算,但是早先的计算机照样可以同时处理多个应用,这就涉及到类似于通信原理的时分复用技术了,在不同的时段处理不同进程的计算任务,让用户看起来好像是在同时处理多个应用程序。之后又产生了双核,四核甚至更多核的CPU来增强数据处理能力,多个核都真正的实现了多线程的处理,使工作效率更高。


谈一些实用的概念和方法吧

一个应用程序只有一个主队列,主队列中是一个主线程,其中的任务都是串行执行的。可以通过方法添加并行队列。从main中开始的程序,到APPDelegate再到ViewDidLoad,因此viewDidLoad本身中执行的代码是在主队列中的任务。主线程在属于主队列,主线程中可以添加多个任务,必须依次串行执行。


NSOperationQueue是用来创建队列,可以通过它的方法来创建并发队列,同时可以给创建出来的操作队列添加任务。没设置最大并发数的前提下会开启多线程。设置最大并发数后程序同时执行的线程会受限,更多的任务会在他们不同的并发队列中按序执行。


NSOperation是一个抽象类,使用它的子类来创建任务,这个任务可以添加到任何队列中去,可以是主队列也可以是并发队列。

两个子类:NSBlockOperation和NSInvocationOperation。通过他们创建出来的任务如果添加到主队列中就是串行执行,如果添加到并发队列中,并且没有设置最大并发数的时候是多线程同时执行的。






本文只是编者对进程和线程的初步认识,如有误请指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值