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多了一些更简单实用的功能,使用更加面向对象,线程生命周期自动管理
后面的文章将着重介绍多线程的实现方案,本文旨在整理收集关于多线程的知识,加深对多线程的理解与认识,如有理解不当之处,欢迎交流与指正!
iOS开发 - 线程与进程的认识与理解的更多相关文章
- Python全栈开发 线程和进程
一.线程 线程是程序工作的最小单元,由进程生成,生成的线程间会共享内存空间.Python中创建线程比较简单,导入threading模块,创建线程实例.下面这段代码是一个简单的多线程例子 import ...
- iOS 开发线程 gcd
基础知识: 下午9:09 一.基础概念 1.什么是GCD 全称是Grand Central Dispath 纯C语言编写,提供非常多且强大的函数,是目前推荐的多线程开发方法,NSOperation ...
- iOS 之 线程和进程
进程是系统调度单位,拥有自己的资源 线程是CPU调度的基本单位 进程的同步机制: 原子操作.信号量机制.自旋锁.分布式系统
- iOS开发线程同步技术-锁
概览 1,什么是锁(临界区)? 2,常用的锁有哪些? 3,相关链接 什么是锁(临界区) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法. 常用的锁有哪些? 互斥锁:是一种用于多线程编 ...
- iOS开发--线程通信
线程间的通信主要用于主线程与子线程的,也有用于子线程与子线程的 介绍下面几种通信方式 1.利用GCD方式(推荐) - (void)touchesBegan:(NSSet<UITouch *> ...
- iOS开发线程安全问题
先来看一下代码: - (void)viewDidLoad { [super viewDidLoad]; self.testStr = @"String initial complete&qu ...
- iOS开发中GCD在多线程方面的理解
GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中 ...
- iOS开发:(线程篇-上)线程和进程
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS 开发进程与线程
进程(process)是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元.进程中所包含的一个或多个执行单元称为线程(thread).进程还拥有一个私有的虚拟地址空间,该空间仅 ...
随机推荐
- centOS7安装docker步骤
首先准备一台linux系统, Docker需要一个64位系统的系统,内核的版本必须大于3.10,可以用命令来检查是否满足要求: 满足条件后,下面开始正式安装步骤: 1.更新yum: sudo yum ...
- 20170314 OO ALV 出现双滚动条
1.出现双进度条,用户改变屏幕大小操作出现问题: 解决方法: [园童]BJ-ABAP-可乐(708925365) 16:08:55240 * 200改为240 200,然后将滚动条的步进改为1即可 ...
- POSTGRESQL主备部署模式
一.预期目的 主数据库(Primary pg ,假定主机名为A,后文不再赘述)和备用数据库(Standby pg,假定主机名为B,后文不再赘述)之间的数据能够相互备份. 主数据库发生故障时备用数据库可 ...
- 对于URL中文和特殊字符的处理方法
1.中文的处理方法 NSString* string1 = @"https://www.cloudsafe.com/文件夹"; NSString* string2 = [strin ...
- Sublime Text 相关教程(转)
曾经有人说过,世界上有两种编辑器,好用和不好用的:而在好用的编辑器中,又分两种,免费的和死贵死贵的.譬如说VIM 和 TextMate,就是免费和死贵的典型.很不幸,今天的主角 Sublime Tex ...
- 简单使用FusionCharts(Free)
介绍 FusionCharts Free 是一个跨平台,跨浏览器的flash图表组件解决方案,能够被 ASP.NET, ASP, PHP, JSP, ColdFusion, Ruby on Rails ...
- TensorFlow 图像预处理(一) 图像编解码,图像尺寸调整
from: https://blog.csdn.net/chaipp0607/article/details/73029923 TensorFlow提供了几类图像处理函数,下面介绍图像的编码与解码,图 ...
- eclipse导入jsp文件第一行报错
- 解决向github提交代码不用输入帐号密码
解决方案:方案一: 在你的用户目录下新建一个文本文件.git-credentials Windows:C:/Users/username Mac OS X: /Users/username Linux ...
- 使用json-lib的JSONObject.toBean( )时碰到的日期属性转换的问题
今天碰到这样一个问题:当前台以JSON格式向后台传递数据的时候,对于数据中的日期属性,无法正常转换为相应的Date属性.JSON数据是这样的:{"birthday":"1 ...