进程:

  • 进程是指在系统中正在运行的一个应用程序,比如同时打开微信和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开发 - 线程与进程的认识与理解的更多相关文章

  1. Python全栈开发 线程和进程

    一.线程 线程是程序工作的最小单元,由进程生成,生成的线程间会共享内存空间.Python中创建线程比较简单,导入threading模块,创建线程实例.下面这段代码是一个简单的多线程例子 import ...

  2. iOS 开发线程 gcd

      基础知识: 下午9:09 一.基础概念 1.什么是GCD 全称是Grand Central Dispath 纯C语言编写,提供非常多且强大的函数,是目前推荐的多线程开发方法,NSOperation ...

  3. iOS 之 线程和进程

    进程是系统调度单位,拥有自己的资源 线程是CPU调度的基本单位 进程的同步机制: 原子操作.信号量机制.自旋锁.分布式系统

  4. iOS开发线程同步技术-锁

    概览 1,什么是锁(临界区)? 2,常用的锁有哪些? 3,相关链接 什么是锁(临界区) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法. 常用的锁有哪些? 互斥锁:是一种用于多线程编 ...

  5. iOS开发--线程通信

    线程间的通信主要用于主线程与子线程的,也有用于子线程与子线程的 介绍下面几种通信方式 1.利用GCD方式(推荐) - (void)touchesBegan:(NSSet<UITouch *> ...

  6. iOS开发线程安全问题

    先来看一下代码: - (void)viewDidLoad { [super viewDidLoad]; self.testStr = @"String initial complete&qu ...

  7. iOS开发中GCD在多线程方面的理解

    GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中 ...

  8. iOS开发:(线程篇-上)线程和进程

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  9. iOS 开发进程与线程

    进程(process)是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元.进程中所包含的一个或多个执行单元称为线程(thread).进程还拥有一个私有的虚拟地址空间,该空间仅 ...

随机推荐

  1. linux环境下安装的activemq的输出日志

    activemq输出日志的位置: activemq/data/activemq.log 查看activemq.log文件即可.

  2. Linux常用命令——持续更新(2018-05-09)

    此命令默认是在centos环境下执行,除非特殊标明. 1.查看ip: ifconfig 2.创建指定用户并分配到某个组:创建用户user并分配到root组 useradd -g root user 3 ...

  3. 手把手原生js轮播图

    在团队带人,突然被人问到轮播图如何实现,进入前端领域有一年多了,但很久没自己写过,一直是用大牛写的插件,今天就写个简单的适合入门者学习的小教程.当然,轮播图的实现原理与设计模式有很多种,我这里讲的是用 ...

  4. Unity导包配置详解

    Player Settings is where you define various parameters (platform specific) for the final game that y ...

  5. Understand .sync in Vue

    Preface The first time I met .sync modifier, I didn't know it very well. So, I seldom use that. Toda ...

  6. dhcpcd守护进程分析【转】

    本文转载自;http://blog.csdn.net/lishanmin11/article/details/37930073 最近在调android ethernet功能,android本身不带 e ...

  7. 关于lock锁

    在 jdk1.5 之后,并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能,Lock 接口提供了与 synchronized 关键字类似的同步功能,但需要在使用时手动获取锁和释放锁. lo ...

  8. PYTHON 爬虫笔记二:Urllib库基本使用

    知识点一:urllib的详解及基本使用方法 一.基本介绍 urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的 ...

  9. 程序移植到VS2010,编译成功但是无法启动lib文件

    今天遇到的这个问题,是由于解决方案下有多个项目,其中包含生成库的项目,也有可执行程序的项目 解决方法:邮件解决方案,属性-通用属性-启动项目进行设置就OK了,我的是设置单启动项目为包含可执行程序的项目 ...

  10. linux应用之apache服务的安装及配置(centos)

    CentOS Apache服务器安装与配置   一.安装Apache程序,一般有三种安装方式:1.直接网络安装:2.下载rpm包,上传至服务器进行安装:3.通过原代码编译安装: yum -y inst ...