赞
踩
一、进程与线程
进程是被执行的应用程序,同时也是系统资源分配的最小单位(虚拟地址空间等资源,见下图),一个进程中可以包含多个线程。操作系统会为每个进程分配一定的虚拟地址空间,该虚拟地址空间由进程独享
线程则是CPU进行运算调度的最小单位。线程被包含在进程之中,是进程中的实际运作单位。一个进程中可以包含多个线程,这些线程可以同时执行不同的任务(例如一个线程监听用户输入,一个线程执行IO任务,它们是同时进行互相独立的)。同一个进程中的多个线程共享操作系统为该进程分配的系统资源(如虚拟地址空间,信号量等...),但同时多个线程又独立的拥有各自的调用栈,寄存器环境,和线程本地存储(thread-local storage)。
一个操作系统中可以有多个进程,这些进程可以异步(同时)或同步(顺序)执行,操作系统为这些进程分配独立的系统资源。而进程中又可以拥有多个线程(至少一个),这些线程共享进程的系统资源,线程又被称为轻量级的进程。
二、同步与异步
同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到返回的值或消息后才往下执行其他的命令。
异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程
同步如打电话,通信双方不能断(我们是同时进行,同步),你一句我一句,这样的好处是,对方想表达的信息我马上能收到,但是,我在打着电话,我无法做别的事情。
异步如收发收短信,对比打电话,打电话我一定要在电话的旁边听着,保证双方都在线,而收发短信,对方不用保证此刻我一定在手机旁,同时,我也不用时刻留意手机有没有来短信。这样的话,我看着视频,然后来了短信,我就处理短信(也可以不处理),接着再看视频。
三、并发与并行
并发是指的是在一个重叠的时间段内,有多个任务(两个以上的task)可以被启动,执行或者完成,但是这并不意味着,这些任务必须在这一时间段内的某一时刻同时被运行。比如在一个拥有单核CPU上计算机上,我们可以同时运行浏览器和文档编辑器程序,却并不会感受到任何操作上的延迟。这是因为操作系统采用了时间片轮转算法(Round-Robin,RR),操作系统中的每个进程被分配了一定的时间段(时间片),操作系统将CPU分配给某一进程让其在处理器上执行一个时间片。当进程占用CPU的时间超过时间片的时间后,将由计时器发起中断请求,随后操作系统保存该进程的执行状态并将其挂起,然后将CPU分配给另一个进程执行一个时间片。由于时间片划分的很短,而且进程间的切换(进程间的切换也被称为上下文切换Context switch)也很快,所以会给人一种好像多个进程在同时执行的错觉。(在进行context switch的时候也会占用一定的时间,需要保存将被挂起的进程的执行状态,还需要把将要执行的进程的指令与内存载入到缓存中,在这期间CPU无法执行其他指令,因而过多的context switch会降低CPU的效率。)
并行是指在同一时刻有多个任务同时运行。比如在一个双核的CPU上,在A核心上运行浏览器进程,而在B核心上运行文档编辑器进程,在两个核心上运行的进程相互独立,同时运行(多进程并发)。又比如在一个游戏进程中,可以同时存在一个逻辑线程(处理游戏逻辑)和一个IO线程(处理IO任务),它们可以同时运行在两个不同的CPU核心上(多线程并发)。(并发的概念是包含并行的,并行是多线程的一种形式,多线程是并发的一种形式。)
使用多进程并发时,进程的创建与销毁速度都比较慢,而且进程间的通信也比较复杂(需要通过套接字,管道等..),但是操作系统会在进程间提供附加的保护机制,这可以我们更容易写出并发安全的代码。而使用多线程并发时,线程的创建与销毁速度则要更快,由于同一进程中的所有线程共享虚拟地址空间,因此线程间的通信开销要小得多,但由于缺少线程间的数据保护,可能会出现多个线程同时读写同一数据造成的数据不一致现象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。