iOS开发 - 线程与进程的认识与理解
进程:
- 进程是指在系统中正在运行的一个应用程序,比如同时打开微信和Xcode,系统会分别启动2个进程;
- 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内;
线程:
- 一个进程要想执行任务,必须得有线程(每一个进程至少要有一条线程),是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位;
- 一个进程(程序)的所有任务都在线程中执行;
- 一个程序有且只有一个主线程,程序启动时创建(调用main来启动),主线程的生命周期是和应用程序绑定,程序退出时,主线程也停止;
- 同一时间内,一个线程只能执行一个任务,若要在1个进程中执行多个任务,那么只能一个个的按顺序执行这些任务(线程的串行);
- 线程自己不拥有系统资源,只拥有在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源;
线程的几种状态:
- 新建状态:新创建一个线程对象;
- 就绪状态:线程对象创建之后,其他线程调用了该对象的start方法,该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权;
- 运行状态:就绪状态的线程获取了CPU,执行程序代码;
- 阻塞状态:因某种原因放弃CPU使用权,暂停运行,知道线程进入就绪状态,才有机会转到运行状态;
- 死亡状态:线程执行完了或者因异常退出了run方法,线程生命周期结束;
进程和线程比较:
- 线程是CPU调度(执行任务)的最小单位,是程序执行的最小单元;
- 进程是CPU分配资源和调度的单位;
- 一个程序可以对应多个进程,一个进程可以有多个线程,但至少要有一个线程,而一个线程只能属于一个进程;
- 同一个进程内的线程共享进程的所有资源;
多线程:
- 概念:一个进程中可以开启多条线程,每一条线程可以并行(同时)执行不同的任务;
- 原理:同一时间,CPU只能处理一条线程,只有一条线程在工作,多线程并发(同时)执行,其实是CPU快速的在多条线程之间调度(切换),如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象;
- 注意:如果线程很多,CPU会在N多线程之间调度,会消耗大量CPU资源,每条线程被调度执行的频次会降低(线程的执行效率会降低);
多线程的优缺点:
- 优点: 能适当的提高程序的执行效率以及资源利用率(CPU、内存利用率)
- 缺点: 创建线程是有开销的,iOS下主要成本包括:内核数据结构(大约1kb)、栈空间(子线程512kb,主线程1MB)、创建线程大约需要90毫秒的创建时间,如果开启大量的线程,会降低程序的性能(一般最多3到5个);线程越多,CPU在调度线程上的开销就越大; 程序设计更加复杂(比如线程之间的通信、多线程的数据共享)
主线程:
- 一个iOS程序运行后,默认会开启1条线程,称为“主线程”或“UI线程”
- 作用: 显示/刷新UI界面, 处理UI事件(点击事件,滚动事件,拖拽事件)
- 使用注意:不要将耗时的操作放到主线程中,耗时操作应放在子线程(后台线程,非主线程); 凡是和UI相关的操作应放在主线程中操作
iOS中多线程的实现方案:
- pthread :一套通用的多线程API,适用于Unix、Linux、Windows等系统,跨平台、可移植,使用难度大,c语言,线程生命周期由程序员管理
- NSTread:oc语言,面向对象,简单易用,可直接操作线程对象 ,线程生命周期由程序员管理
- GCD:(常用)替代NSTread等线程技术,充分利用设备的多核,线程生命周期自动管理,c语言
- NSOperation:(常用)底层是GCD,比GCD多了一些更简单实用的功能,使用更加面向对象,线程生命周期自动管理
后面的文章将着重介绍多线程的实现方案,本文旨在整理收集关于多线程的知识,加深对多线程的理解与认识,如有理解不当之处,欢迎交流与指正!
转载于:https://www.cnblogs.com/hs-funky/p/6512515.html
iOS开发 - 线程与进程的认识与理解相关推荐
- iOS开发中自旋和互斥锁的理解以及所有锁的性能比较
补充: 可以看到除了 OSSpinLock 外,dispatch_semaphore 和 pthread_mutex 性能是最高的.苹果在新系统中已经优化了 pthread_mutex 的性能,所以它 ...
- iOS开发线程同步技术-锁
概览 1,什么是锁(临界区)? 2,常用的锁有哪些? 3,相关链接 什么是锁(临界区) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法. 常用的锁有哪些? 互斥锁:是一种用于多线程编 ...
- iOS 开发线程 gcd
基础知识: 下午9:09 一.基础概念 1.什么是GCD 全称是Grand Central Dispath 纯C语言编写,提供非常多且强大的函数,是目前推荐的多线程开发方法,NSOperation便是 ...
- iOS开发--线程通信
线程间的通信主要用于主线程与子线程的,也有用于子线程与子线程的 介绍下面几种通信方式 1.利用GCD方式(推荐) - (void)touchesBegan:(NSSet<UITouch *> ...
- (0077)iOS开发之直播播放器技术名词理解以及开发准备(待实现直播demo)
本文主要是为了理解最近比较火的直播软件.播放器软件的实现原理的调研.为以后研究相关开发做准备.调研整理: 关键词:iOS直播 类似斗鱼,虎牙等直播平台都运用了哪方面前后端技术? https://www ...
- ios开发中计算代码运算时间_理解Unity中的优化(二):内存
内存: 内存消耗是一个关键的性能指标,尤其是在内存资源有限的平台上,比如低端移动设备. 内存消耗分析: 在Unity中诊断内存问题,Unity介绍了一款开元的可视化内存分析工具--MemoryProf ...
- IOS开发中委托代理(degegate)的理解和使用示例
委托代理(degegate),顾名思义,把某个对象要做的事情委托给别的对象去做.那么别的对象就是这个对象的代理,代替它来打理要做的事. 反映到程序中,首先要明确一个对象的委托方是哪个对象,委托所做的内 ...
- android 线程信号量,iOS开发 多线程的高级应用-信号量semaphore
在iOS开发的道路上,多线程的重要性不言而喻. 大部分我们都停留在基础的使用上面.缺乏高级应用. 缺乏提升,是因为我们面对他太少,复杂的事情重复做,复杂的事务基础化. 差距就是这样拉开了 言归正传: ...
- iOS开发里的线程安全机制
[编者按]本文为再读苹果<Threading Programming Guide>笔记第四篇,主要分享了线程安全机制以及设计时所需要注意的事项.从最初的"什么是线程"到 ...
最新文章
- ubuntu:通过封装验证码类库一步步安装php的gd扩展
- mybatis里的日志动态代理
- [KMP]一本通(http://ybt.ssoier.cn:8088) 1698:字符串匹配
- 从单租户IaaS到多租户PaaS——金融级别大数据平台MaxCompute的多租户隔离实践
- c++数据结构中 顺序队列的队首队尾_用队列实现栈,用栈实现队列,听起来有点绕,都搞懂了就掌握了精髓
- 程序员如何搞定前端高频面试难题?附答案汇总 | 技术头条
- 07.用户控件弹窗提示后页面显示不正常;
- latex怎么打区间_涨出天际的安阳房价,这个月怎么样了?
- 把矩阵变为0,1矩阵
- Python 监控linux之dstat
- 考研倒计时软件 终结版
- RemoveWGA升级了
- 2021年N1叉车司机考试及N1叉车司机考试试卷
- 2018高中计算机会考时间,2018年高中会考什么时候考哪些科目
- A Retinex based GAN Pipeline to Utilize Paired and Unpaired Datasets for Enhancing Low Light Images
- Windows:nginx: [error] CreateFile() “/logs/nginx.pid“ failed (2: The system)
- 上海之旅,再让键盘长几天草
- 单片机STM32直连电调控制航模涵道电机的方法总结
- Android QPython3 制作简易GUI长文本框界面
- 成信大807程序综合设计2015-2022历年真题及答案【持续更新中】
热门文章
- python 修改计算机名_静心学数据分析002-python基础
- java中什么是空指针异常_java中空指针异常的问题,是怎么回事?请看代码
- 【C++】多线程(链式、循环队列)实现生产者消费者模式
- php模拟超级课程表,一个功能完善、UI简洁的仿超级课程表的课表控件 TimetableView...
- Paper4:Voxel-Based Extraction and Classification of 3-D Pole-Like Object From Mobile LIDAR Point Clo
- BGR图像与HSV图像互相转换(opencv)
- AI视频行为分析系统项目复盘——技术篇4:deepsort原理图
- 【深度学习】(7) 交叉验证、正则化,自定义网络案例:图片分类,附python完整代码
- 【ios开发/Xcode】实现简易省会问答
- phalcon php 5.4,如何在php上安装phalcon