线程
- 线程是进程的基本单元,一个进程的所有任务都在线程中执行
- 进程要想执行任务,必须得有线程,进程至少要有一天线程
- 程序启动会默认开启一条线程,这条线程被称为
主线程
进程
- 进程是指在系统中正在运行的一个应用程序
- 每个进程之间是都是独立的,每个进程均运行在其专用的且受保护的内存空间中
iOS是单进程,Mac是多进程
线程和进程的关系
-
地址空间
,同一进程的线程共享本进程的地址,而进程之间的地址时相互独立的 -
资源拥有
,同一进程内的线程共享本进程的资源,如I/O,CPU等
,但是进程之间的资源是独立的
1: ⼀个进程崩溃后,在保护模式下不会对其他进程产⽣影响,但是⼀个线程崩溃整个进
程都死掉。所以多进程要⽐多线程健壮。
2: 进程切换时,消耗的资源⼤,效率⾼。所以涉及到频繁的切换时,使⽤线程要好于进
程。同样如果要求同时进⾏并且⼜要共享某些变量的并发操作,只能⽤线程不能⽤进程
3: 执⾏过程:每个独⽴的进程有⼀个程序运⾏的⼊⼝、顺序执⾏序列和程序⼊⼝。但是
线程不能独⽴执⾏,必须依存在应⽤程序中,由应⽤程序提供多个线程执⾏控制。
4: 线程是处理器调度的基本单位,但是进程不是。
5: 线程没有地址空间,线程包含在进程地址空间中
多线程意义
优点:
- 适当提高程序的执行效率
- 适当提高资源的利用率(I/O,CUP等)
- 线程上的任务执行完成后,线程会自动销毁
缺点:
- 开启线程需要占用一定的内存空间(默认情况下,每个线程512KB)
- 如果开启大量的线程,会占用大量的内存空间,降低程序性能
- 线程越多,CPU在调度线程上的开销就越大
- 程序设计更加复杂,比如线程间的通讯,多线程的数据共享
iOS多线程原理
WX20210802-172729@2x.png我们所看到的并发
,其实是CPU在多个任务之间快速切换
,这并不是真正意义的并发
,只有多核
,才会实现真正意义的并发
时间片
时间片:cpu在多个任务之间快速切换,这个时间间隔就是时间片
- 单核cpu同一时间,只能处理一条线程
- 多线程同时执行:其实时
CPU
快速的在多个线程之间的切换,只要CPU
的调度足够快,就会造成多线程的同时执行
- CPU 会在N个线程之间切换,消耗大量的CPU资源
- 线程越多,每条线程被调度的次数会降低,线程的执行效率会降低
多线程技术方案
WX20210802-174128@2x.png线程的生命周期
image.png- 创建:new新建线程后,调用
start
,并不会立马执行,而是进入就绪状态(Runable)
等待着CPU
调度 - 运行:CPU调度当前的线程,来进入运行状态,执行任务,如果当前的线程在执行任务,CPU这从
可调度池中来调用其他线程,执行任务
- 阻塞:在运行中,如果碰到了
sleep或者同步锁的情况
,会进入阻塞状态,所有线程都将停止,等待sleep结束或者同步锁解锁
,回到Runable 就绪状态
- 死亡:运行中的任务,在任务执行完或被强制退出时,线程自动进入Dead销毁。
线程池调度
image.png饱和策略
- AbortPolicy 直接抛出RejectedExecutionExeception异常来阻⽌系统正常运⾏
- CallerRunsPolicy 将任务回退到调⽤者
- DisOldestPolicy 丢掉等待最久的任务
- DisCardPolicy 直接丢弃任务
任务执行速度的影响因素
- CPU的调度情况
- 任务的复杂度
- 线程的优先级
- 线程状态
优先级反转
- IO密集型,频繁的等待线程,容易被杀死,就会出现优先级提升
- CPU密集型
优先级影响因素
- 用户指定
- 等待的频繁度
- 长时间不执行,会提升优先级
网友评论