2015-09-01 21:25:09 dll1885 阅读数 230
  • C++ 百万并发网络通信引擎架构与实现 (Socket、全栈...

    本课程由刘远东、张立铜两位工程师将两人在企业多年积累的开发经验结合而成。从基础的网络知识开始由浅入深地讲解如何使用C++实现一套支持百万级别并发的网络通信引擎。包含:高频并发、多线程、多进程、线程池、内存池、软件硬件瓶颈、如何测试优化网络处理能力等技术知识。可以应用在Windows、Linux、Android、IOS系统上。对从事高性能网络处理的前后端开发人员有极大帮助。咨询群:648738912

    13706 人正在学习 去看看 张立铜

线程和进程

一般而言进程包含如下3个特征:

  • 独立性:进程是系统中独立存在的实体,拥有自己独立的资源,拥有自己私有的地址空间。在没有进过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间。
  • 动态性:程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。
  • 并发性:多个进程可以在单个处理器上并发执行,多个进程间不会互相影响。
并发性和并行性是两个概念,并行指在同一时刻有多条指令在多个处理器上同时执行;
并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在
宏观上具有多个进程同时执行的效果。

线程

  • 多线程扩展了多进程的概念,使得一个进程可以同时并发处理多个任务。线程也被称为轻量级进程,线程是进程的执行单元。当进程被初始化后,主线程就被创建了。
  • 线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,但不再拥有系统资源,它与父进程的其他线程共享改进程所拥有的全部资源。一个线程可以撤销和创建另一个线程,同一个进程中的线程之间可以并发执行。

多线程的优点

  • 进程间不能共享内存,但线程之间共享内存非常容易。
  • 系统创建进程需要为该进程重新分配系统资源,但创建线程代价小的多,因此使用多线程来实现多任务并发比多进程的效率高。

创建线程

  • 使用实例方法,返回一个NSThread对象,必须调用start方法启动线程:
    NSThread *thread = [[NSThread alloc]initWithTarget:self 
                                              selector:@selector(run)
                                                object:nil];
    [thread start];
  • 直接创建并启动线程
    [NSThread detachNewThreadSelector:@selector(run)
                             toTarget:self withObject:nil];
程序可以通过setName:方法为线程设置名字

线程状态

  • 当程序创建线程后,该线程处于新建状态,仅仅由系统为其分配了内存,并初始化其成员变量的值;当线程对象调用了start方法后,该线程处于就绪状态,系统会为其创建方法调用栈和程序计数器,处于这种状态中的线程并没有开始运行,它只是表示该线程可以运行了,至于何时运行取决于系统的调度。
  • 如果希望调用子线程的start方法后子线程立即开始执行,程序可以使用[NSThread sleepForTimeInterval:0.001];让当前运行的线程(主线程)睡眠1毫秒。

终止线程

线程会以一下3中方式之一结束:

  • 线程执行体方法执行完成,线程正常结束
  • 线程执行过程中出现了错误
  • 直接调用NSThread类的exit方法来终止当前正在执行的线程
当主线程结束时,其他线程不受任何影响,并不会随之结束。一旦子线程启动起来后,它就
拥有和主线程相同的地位。为了测试某个线程是否正在运行,可以调用线程对象的
isExecuting、isFinished方法;如果希望在UI中终止子线程,NSThread并没有提供
方法来终止某个线程,可以通过先执行[thread cancel]改变线程状态,然后在此线程
执行体方法中使用[NSThread currentThread].isCancelled判断thread对象的状态,
如果isCancelled为YES,就使用[NSThread exit]终止当前子线程。

线程睡眠

如果需要将当前正在执行的线程暂停一段时间,并进入阻塞状态,可以通过以下方法实现:

//让当前正在执行的线程暂停t秒,并进入阻塞状态
[NSThread sleepForTimeInterval:t];
//让当前执行的线程暂停到aDate代表的时间,并进入阻塞状态
[NSThread sleepUntilDate:aDate];

回调主线程刷新UI一般使用以下方法:

[self performSelectorOnMainThread:@selector(updateUI:)
                       withObject:image waitUntilDone:YES];
或者
dispatch_async(dispatch_get_main_queue(), ^{...});

改变线程的优先级

每个线程执行时都具有一定的优先级,优先级高的线程获得较多的执行机会。NSThread提供如下方法设置获取线程的优先级:

//该类方法获取当前正在执行的线程的优先级
[NSThread threadPriority];
//该实例方法获取调用该方法的线程对象的优先级
[thread threadPriority];
//该类方法用于设置当前正在执行的线程的优先级,参数可以是double类型的0.0~1.0的浮点数
[NSThread setThreadPriority:priority];
//该实例方法用于设置该方法的线程对象的优先级
[thread setThreadPriority:priority];
2015-12-28 17:52:26 sevenquan 阅读数 887
  • C++ 百万并发网络通信引擎架构与实现 (Socket、全栈...

    本课程由刘远东、张立铜两位工程师将两人在企业多年积累的开发经验结合而成。从基础的网络知识开始由浅入深地讲解如何使用C++实现一套支持百万级别并发的网络通信引擎。包含:高频并发、多线程、多进程、线程池、内存池、软件硬件瓶颈、如何测试优化网络处理能力等技术知识。可以应用在Windows、Linux、Android、IOS系统上。对从事高性能网络处理的前后端开发人员有极大帮助。咨询群:648738912

    13706 人正在学习 去看看 张立铜
A.进程
什么是进程
进程是指在系统中正在运行的一个应用程序
每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
比如同时打开QQ、Xcode,系统就会分别启动2个进程
通过“活动监视器”可以查看Mac系统中所开启的进程
 
B.线程
主线程、子线程占用内存分别是1M和512K
1.什么是线程
1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)
线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行
比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行
 
2.线程的串行
1个线程中任务的执行是串行的
如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务
也就是说,在同一时间内,1个线程只能执行1个任务
比如在1个线程中下载3个文件(分别是文件A、文件B、文件C)
 
3.多线程
什么是多线程
1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务
进程  车间,线程  车间工人
多线程技术可以提高程序的执行效率
比如同时开启3条线程分别下载3个文件(分别是文件A、文件B、文件C)
 
4.多线程原理
多线程的原理
同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象
思考:如果线程非常非常多,会发生什么情况?
CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源
每条线程被调度执行的频次会降低(线程的执行效率降低)
 
5.多线程的优缺点
多线程的优点
能适当提高程序的执行效率
能适当提高资源利用率(CPU、内存利用率)

多线程的缺点
开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能
线程越多,CPU在调度线程上的开销就越大
程序设计更加复杂:比如线程之间的通信、多线程的数据共享
 
6.主线程
什么是主线程
一个iOS程序运行后,默认会开启1条线程,称为“主线程”或“UI线程”

主线程的主要作用
显示\刷新UI界面
处理UI事件(比如点击事件、滚动事件、拖拽事件等)

主线程的使用注意
别将比较耗时的操作放到主线程中
耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验
 
7.iOS多线程实现技术
  • pthread
  • NSThread
  • GCD
  • NSOperation
Image(33)
 
C.需要掌握的
多线程
1.NSThread
1> 开线程的几种方式
* 先创建,后启动
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];

* 直接启动
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
[self performSelectorInBackground:@selector(run) withObject:nil];

2> 其他用法
NSThread *current = [NSThread currentThread];
+ (NSThread *)mainThread; // 获得主线程

3> 线程间通信
performSelectorOnMainThread.....

2.GCD(重点)
1> 队列的类型
* 并发队列
获得全局的并发队列: dispatch_get_global_queue

* 串行队列
a.自己创建
dispatch_queue_create

b.主队列
dispatch_get_main_queue

2> 执行任务的方法类型
* 同步(sync)执行
* 异步(async)执行

3> 了解队列和方法的配合使用

4> 线程间通信
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   // 执行耗时的异步操作...
   dispatch_async(dispatch_get_main_queue(), ^{
       // 回到主线程,执行UI刷新操作
   });
});

5> 其他用法
dispatch_once
dispatch_after
dispatch_group_async\dispatch_group_notify

3.NSOperation
1> 基本使用
NSInvocationOperation
NSBlockOperation

2> NSOperationQueue(重点)
* 最大并发数设置
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
 
注意:此方法仅能限制同时执行的线程数,不能限制特定的线程(即可能每次执行的线程组都是不一样的)
 
 
* 设置依赖
[operationB addDependency:operationA]; // 操作B依赖于操作A

3> 自定义Operation(了解基本流程)

4> 如何解决一张图片(一个url)重复下载的问题
2016-04-19 18:33:41 Lerryteng 阅读数 2109
  • C++ 百万并发网络通信引擎架构与实现 (Socket、全栈...

    本课程由刘远东、张立铜两位工程师将两人在企业多年积累的开发经验结合而成。从基础的网络知识开始由浅入深地讲解如何使用C++实现一套支持百万级别并发的网络通信引擎。包含:高频并发、多线程、多进程、线程池、内存池、软件硬件瓶颈、如何测试优化网络处理能力等技术知识。可以应用在Windows、Linux、Android、IOS系统上。对从事高性能网络处理的前后端开发人员有极大帮助。咨询群:648738912

    13706 人正在学习 去看看 张立铜

浅谈编者对线程与进程的认识与理解


开门见山吧,打个比方,你在一台计算机上正在用QQ音乐听歌,同时在用微信跟女票聊天,这时你的电脑上就有两个进程,QQ音乐和微信(可能不止两个,但是最起码是两个),当你在微信上打字的时候同时收到了女票的一个表情,这时微信这个应用程序中就有最起码两个线程,一个控制你键盘的输入,另一个是接收你女票的表情。

通过这样一个简单的例子是不是对进程和线程有了初步的认识呢,形象说起来一台计算机可同时执行多个进程,每个进程中可包含多个线程,然而在活动监视器或者windows的任务管理器中可以实时观察到计算机的进程,但是不可看到每个进程的线程内容。


线程是CPU最小的调度单位,是程序执行的最小单元,一个程序有且只有一个主线程,程序启动时创建(调用main来启动),主线程的生命周期是和应用程序绑定的,程序退出时,主线程也就停止了。

每一个进程是可以共享一个内存空间的,其中的线程都可以使用这些共享内存,但是一个线程使用某些共享内存时,其他线程必须等它结束才能使用这些内存。


相关名词解释:

线程池:管理线程的容器,提前创建的一些线程先放在其中,用到的时候取出,用完放回。

串行:使用一条数据线,将数据一位一位一次传输,每一位数据占用固定的时间长度。

并行:多个处理器或者多核处理器同时处理多个不同的任务。

同步:调用一个任务开始执行之后,等到执行结果才会继续执行下面的任务。多个任务单个单个执行。

异步:调用的多个任务连续执行,不用等待执行结果。

阻塞:调用结果返回之前,线程被挂起,函数等得到结果后才返回。

非阻塞:函数不会阻挡当前的线程,会立刻返回。

互斥锁:多线程编程中防止两条线程同时对一个公共资源进行读写的机制。

信号量:是一个计数器,它用来记录对某个资源的存取状况。


线程状态:

新建状态:新创建一个线程对象。

就绪状态:线程对象创建之后,其他线程调用了该对象的start方法,该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

运行状态:就绪状态的线程获取了CPU,执行程序代码。

阻塞状态:因某种原因放弃CPU使用权,暂停运行,知道线程进入就绪状态,才有机会转到运行状态。

死亡状态:线程执行完了或者因异常退出了run方法,该线程结束生命周期。


下面来谈谈CPU跟线程的一点联系。

CPU是一台计算机用来计算的核心部位,所有的计算操作都在此完成,事实上单核CPU只能同时处理一个进程的计算,但是早先的计算机照样可以同时处理多个应用,这就涉及到类似于通信原理的时分复用技术了,在不同的时段处理不同进程的计算任务,让用户看起来好像是在同时处理多个应用程序。之后又产生了双核,四核甚至更多核的CPU来增强数据处理能力,多个核都真正的实现了多线程的处理,使工作效率更高。


谈一些实用的概念和方法吧

一个应用程序只有一个主队列,主队列中是一个主线程,其中的任务都是串行执行的。可以通过方法添加并行队列。从main中开始的程序,到APPDelegate再到ViewDidLoad,因此viewDidLoad本身中执行的代码是在主队列中的任务。主线程在属于主队列,主线程中可以添加多个任务,必须依次串行执行。


NSOperationQueue是用来创建队列,可以通过它的方法来创建并发队列,同时可以给创建出来的操作队列添加任务。没设置最大并发数的前提下会开启多线程。设置最大并发数后程序同时执行的线程会受限,更多的任务会在他们不同的并发队列中按序执行。


NSOperation是一个抽象类,使用它的子类来创建任务,这个任务可以添加到任何队列中去,可以是主队列也可以是并发队列。

两个子类:NSBlockOperation和NSInvocationOperation。通过他们创建出来的任务如果添加到主队列中就是串行执行,如果添加到并发队列中,并且没有设置最大并发数的时候是多线程同时执行的。






本文只是编者对进程和线程的初步认识,如有误请指正。

2015-10-10 21:35:53 FengGe_wen 阅读数 4890
  • C++ 百万并发网络通信引擎架构与实现 (Socket、全栈...

    本课程由刘远东、张立铜两位工程师将两人在企业多年积累的开发经验结合而成。从基础的网络知识开始由浅入深地讲解如何使用C++实现一套支持百万级别并发的网络通信引擎。包含:高频并发、多线程、多进程、线程池、内存池、软件硬件瓶颈、如何测试优化网络处理能力等技术知识。可以应用在Windows、Linux、Android、IOS系统上。对从事高性能网络处理的前后端开发人员有极大帮助。咨询群:648738912

    13706 人正在学习 去看看 张立铜

       线程进程的区别和联系

    (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。

   (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。

    (3)处理机分给线程,即真正在处理机上运行的是线程。

    (4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

    进程和线程并不是一一对应的,一个程序执行在不同的数据集上就成为不同的进程,可以用进程控制块来唯一地标识每个进程。而这一点正是程序无法做到的,由于程序没有和数据产生直接的联系,即使是执行不同的数据的程序,他们的指令的集合依然是一样的,所以无法唯一地标识出这些运行于不同数据集上的程序。一般来说,一个进程肯定有一个与之对应的程序,而且只有一个。而一个程序有可能没有与之对应的进程(因为它没有执行),也有可能有多个进程与之对应(运行在几个不同的数据集上)。

        


2016-07-30 01:50:10 KimmyKin 阅读数 841
  • C++ 百万并发网络通信引擎架构与实现 (Socket、全栈...

    本课程由刘远东、张立铜两位工程师将两人在企业多年积累的开发经验结合而成。从基础的网络知识开始由浅入深地讲解如何使用C++实现一套支持百万级别并发的网络通信引擎。包含:高频并发、多线程、多进程、线程池、内存池、软件硬件瓶颈、如何测试优化网络处理能力等技术知识。可以应用在Windows、Linux、Android、IOS系统上。对从事高性能网络处理的前后端开发人员有极大帮助。咨询群:648738912

    13706 人正在学习 去看看 张立铜
线程和进程的区别主要在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式的影响下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等同于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。



     线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段)。



     进程是资源分配的基本单位(进程是一块包含了某些资源的内存区域)。



     进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程是线程的容器,真正完成代码执行的线程,而进程则作为线程的执行环境。一个程序至少包含一个进程,一个进程至少包含一个线程,一个进程中的所有线程共享当前进程所拥有的资源



文/大花森(简书作者)
原文链接:http://www.jianshu.com/p/8d261837f905
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS线程与进程

阅读数 294

没有更多推荐了,返回首页