标签:有一个 eset 示例 bsp 处理 内存地址 同步问题 高效 变量
转自原文 C# - 多线程 之 进程与线程
并发
Concurrency,逻辑上的同时发生,一个处理器(在不同时刻或者说在同一时间间隔内)"同时"处理多个任务。宏观上是并发的,微观上是按排队等待、唤醒、执行的步骤序列执行。并发性是对有限物理资源强制行使多用户共享(多路复用)以提高效率。
并行
Parallelism,物理上的同时发生,多核处理器或多个处理器(在同一时刻)同时处理多个任务。并行性允许多个程序同一时刻可在不同CPU上同时执行。
Concurrency is not Parallelism.
并行一定是并发的、并发不一定是并行的。并行性是并发性的特例、并发性是并行性的扩展。
并行分解:以一种安全和可伸缩性的方式使程序并行化。
可伸缩性:目的就是做更多的事情,是衡量应用程序加速比大小的尺度之一。
其中,加速比是应用程序串行化与并行化之间所花费时间之比,表示并行化后的效率提升结果。
关于Scalability Principle(可伸缩性原则)具体参考:可伸缩性原则; 可伸缩性的最差实践;
参考:并行思维[I-III];
1
|
命名空间:using System.Diagnostics; |
进程
Process,是程序在计算机上的一次执行活动。运行一个程序、启动一个进程。程序是死的(静态的),进程是活的(动态的)。Windows系统利用进程把工作划分为多个独立的区域,每个应用程序实例对应一个进程。进程是操作系统分配和使用系统资源的基本单位。进程包含一个运行-ing应用程序的所有资源、进程(占用的资源)间相互独立。进程资源包括:
多进程
多任务:在同一计算机系统中,同一个时刻允许两个或两个以上的进程处于运行状态。现代操作系统是典型的基于抢占式调度机制的多任务操作系统。
特点
时间片轮转进程调度算法:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短,CPU轮流为多个进程服务(实际上任意时刻有且仅有一个进程占有CPU);
线程快而进程可靠性高
1
|
命名空间:using System.Threading; |
线程
Thread,轻量级进程,是进程的一个实体(线程本质上是进程中一段并发运行的代码),执行线程、体现程序的真实执行情况,是处理器上系统独立调度和时间分配的最基本的执行单元。同一进程的所有线程共享相同的资源和内存(共享代码,全局变量,环境字符串等),使得线程间上下文切换更快、可以在同一地址空间内访问内存。线程资源包括:
一个进程可以有多个线程、一个线程必须有一个父进程,一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
多线程
多任务可以由多进程完成,也可以由一个进程内的多线程完成。
其中,若多个线程分属于不同的进程,宏观上多个进程同时执行、实现多任务处理。
优点
缺点
辅助线程与主线程并行执行代码,多个线程并行工作完成多项任务、提高系统效率。具体地:
多线程处理可以解决吞吐量、响应性等问题,但会导致资源共享问题、为单个资源分配多个线程也可能会导致同步问题。
参考:线程与线程处理 - msdn; .NET多线程总结和实例介绍;
多线程 - 异步
相同:避免调用线程阻塞;
区别:(预备知识:拥有DMA直接内存访问功能的硬件在和内存进行数据交换时可以不消耗CPU资源)
参考:C#中异步和多线程的区别;
其他
Thread Pool,C#/.Net线程池,即CLR线程池,用于在后台执行多个任务的线程的集合,通常用于服务器应用程序。CLR为每一个进程维护一个CLR线程池,池内的线程即CLR线程,一个CLR线程与一个Windows操作系统线程对应,默认属于后台线程(Background Thread)。分为两种:
CLR线程池在CLR初始化时不会立即建立线程、而是在应用程序要创建线程来处理任务时,线程池才会初始化一个线程。线程完成任务后,不会自行销毁、而是以挂起的状态返回到线程池,直到应用程序再次向线程池发出请求时,线程池里挂起的线程会被激活执行任务。
具体参见:C# - 多线程 之 Process与Thread与ThreadPool;
当一个线程操作内存时,其他线程都不能对这个内存地址进行操作、等待直到该线程完成操作。
目的:多个线程同时访问(读/写)共享数据时,防止数据被损坏
存在问题:同步锁的获得和释放
实现方式和机制
其中,建议使用的线程同步手段: Monitor、Mutex、ManualResetEvent、AutoResetEvent。具体地:
参考:线程同步 - msdn;
线程安全主要考虑线程间共享变量的安全操作。同一进程的不同线程共享进程的内存空间(全局区、静态区、堆内存),线程的私有空间包括栈、寄存器、局部变量等。多线程访问时公共资源时,采用了加锁机制,避免数据不一致、数据污染等问题。
示例1:
示例2:
线程安全问题由全局变量及静态变量引起,Microsoft的.Net Framework类库(FCL)保证所有的静态方法都是线程安全的,但不保证实例方法是线程安全的。多线程对共享数据的只读访问不存在线程安全问题。
标签:有一个 eset 示例 bsp 处理 内存地址 同步问题 高效 变量
原文地址:http://www.cnblogs.com/arxive/p/7221150.html