1.进程
进程是独立运行、独立分配资源和独立接受调度的基本单位。
进程有三个基本状态。
(1)就绪状态
当进程已分配到除CPU外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态。在系统中处于就绪状态的进程往往会有多个,通常将这些进程存入一个队列中,称为就绪队列。
(2)执行状态
进程已获得CPU,其程序正在执行。
(3)睡眠状态(阻塞状态)
正在执行的进程由于某些事件暂时无法继续执行,便放弃CPU占用转入暂停。阻塞状态的进程也会排入队列中,操作系统会根据阻塞原因的不同将处于阻塞状态的进程排入多个队列。导致阻塞的事件有:请求I/O,申请缓冲空间。
在iOS中进程通过Progress ID(进程ID,即PID)来唯一辨识。进程还会将其和父进程的亲属关系保存在父进程ID(Parent Progress ID, PPID)中。父进程可以通过fork(或通过posix_spawn)创建子进程,并且预期子进程会消亡。子进程返回的整数由其父进程收集。
2.多线程概念
线程:是进程的基本执行单元,进程想要执行任务,必须要有线程,一个进程对应一个或多个线程。
资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
主线程:处理UI(其他子线程都是独立于cocoa Touch的),所有更新UI的操作都要放到主线程执行。不要把耗时操作放在主线程,会卡界面。
多线程:在同一个时刻,一个CPU只能处理一条线程,但CPU可以在多个线程之间快速切换,造成了多线程的假象。
3.进程和线程区别和联系
- 线程是进程的基本单元。
- 进程和线程都是由操作系统所产生的程序运行的基本单元,系统利用该基本单元实现系统对应的并发性。
- 进程和线程的主要区别是它们不同的操作系统管理方式。
- 进程有独立的地址空间,一个进程崩溃后,在保护模式下,不会对其他进程产生影响。
- 线程只是一个进程中的不同执行路径。
- 线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程崩溃就等于整个进程崩溃,所以多进程的程序要比多线程的程序健壮,但在进程切换时,资源耗费较大,效率差一些。
- 对于一些要求同时进行并且又要共享变量的并发操作,只能用线程,不能使用进程。
4.多线程状态和生命周期
多线程状态- 新建:实例化线程对象。
- 就绪:向线程对象发送start消息,线程对象就会被加入可调度线程池,等待CPU调度。
- 运行:CPU负责调度可调度线程池中线程的执行。线程执行完成之前,状态可能会在就绪和执行之间来回切换。就绪和运行状态由CPU负责,程序员不能干预。
- 阻塞:当满足某个预定条件时,可以使用休眠或锁,阻塞线程的执行。
sleepForTimeInterval
(休眠指定时长),sleepUntilDate
(休眠到指定日期),@synchronized(self)
:(互斥锁)。 - 死亡:正常死亡,线程执行完毕。非正常死亡,当满足某个条件后,在主线程终止执行线程对象。
-
NSThread exit
一旦强行终止线程,后续所有代码都不会被执行。 -
thread cancel
并不会取消线程,只会给线程对象添加isCancelled标记。 - 开启线程后不一定立即执行,要看CPU的调
5.iOS多线程四种方式
方案 | 简介 | 语言 | 线程生命周期 | 使用频率 |
---|---|---|---|---|
pthread | 一套通用的多线程API;适合用于unix/Linux/Windows等系统;跨平台、可移植;使用难度大。 | C | 程序员管理 | 几乎不用 |
NSThread | 使用更加面向对象;简单易用,可直接操作线程对象 | OC | 程序员管理 | 偶尔使用 |
GCD | 旨在替代NSThread等线程技术;充分利用设备的多核 | C | 自动管理 | 经常使用 |
NSOperation | 基于GCD;比GCD多了一些更简单实用的功能;使用更加面向对象 | OC | 自动管理 | 经常使用 |
6.多线程的优缺点
优点:
- 使用线程可以把占用时间的任务放到其他线程处理,避免阻塞主线程。
- 程序运行效率提高。
- 提高资源利用率(CPU、内存利用率)。
缺点:
- 开启线程需要占用一定的内存空间(默认情况下,主线程占1M,子线程占512KB)。
- 子线程越多,在CPU调度线程上的开销就越大。
- 程序设计更加复杂,如线程间通信、多线程数据共享。数据多个线程共享时,还需要防止死锁的产生。
网友评论