C# – 多线程 的 进程以及线程

并行~并发

并发

Concurrency逻辑直达的同时起,一个计算机(在不同随时还是说在同一时间间隔内)”同时”处理多只任务。宏观上是出现的,微观上是按照排队等待、唤醒、执行的步骤序列执行。并发性是本着个别物理资源强制行使多用户共享(多路复用)以提高效率。

并行

Parallelism物理达成之而产生,多对处理器或多独计算机(在同一时刻)同时处理多单任务。并行性允许多只次一样时刻可于不同CPU上而实行。

Concurrency is not Parallelism.

PHP 1

互相一定是出新的、并作不必然是相互的。并行性是并发性的特例、并发性是并行性的扩展。

  • 并发:一个人口(cpu)喂2只儿女(程序),轮换着每位喂一口,表面上点儿单子女还在就餐;
  • 并行:2只人口喂2独孩子,两独男女呢还要于进食;

互分解:以同一种植安全与可伸缩性的方要程序并行化。 

  • 多少交互;
  • 任务并行;
  • 掺杂方案:管道/流水线(合并数据及任务并行);

可伸缩性:目的就是是举行还多的工作,是权应用程序加速比较大小的规范之一。

中间,加速比较是应用程序串行化与并行化之间所花费时间的较,表示并行化后底效率提升结果。

  • Amdahl定律:最小化串行工作
  • Gustafson定律:并行化增长的工作量、更老的问题域

关于Scalability
Principle(可伸缩性原则)具体参考:可伸缩性原则; 可伸缩性的卓绝差实践;

参考:交互思维[I-III];

进程~多进程

命名空间:using System.Diagnostics;

进程

Process,是次于处理器及之一模一样浅施行活动。运行一个程序、启动一个进程。程序是大的(静态的),进程是生活的(动态的)。Windows系统利用过程将工作分为多单单身的区域,每个应用程序实例对应一个经过。进程是操作系统分配与采取系统资源的主导单位。进程包含一个运转-ing应用程序的富有资源、进程(占用的资源)间互动独立。进程资源包括:

  • 一个历程堆;
  • 一个或者多单线程;
  • 一个虚拟地址空间,该空间独立为外进程的地方空间;
  • 一个要么多单代表码段,包括.dll中的代码;
  • 一个或者多独包含全局变量的数据段;

  • 条件字符串,包含环境变量信息;

  • 外资源,比如打开的句柄、其他的堆等;  

多进程

多任务:在相同计算机体系受到,同一个天天同意两只或零星独以上的长河处于运行状态。现代操作系统是首屈一指的依据抢占式调度机制的几近任务操作系统。

特点

  • 经过中互动独立,可靠性强;
  • 进程中莫共享数据,没有沿问题、结构简单;
  • 急需跨越进程边界,多进程调度开销比较生;

光阴片轮转进程调度算法:在操作系统的管制下,所有正在周转的历程轮流使用CPU,每个过程允许占用CPU的时空大紧缺,CPU轮流为多独过程服务(实际上任意时刻发生且只有发生一个过程占有CPU);

线程~多线程

线程快而经过可靠性强

  • 进程优点:编程、调试简单,可靠性较高;
  • 过程缺点:创建、销毁、切换速度迟滞,内存、资源占用大;
  • 线程优点:创建、销毁、切换速度快,内存、资源占用小;
  • 线程缺点:编程、调试复杂,可靠性较差;

    取名空间:using System.Threading;

线程

Thread,轻量级进程,是过程的一个实体(线程本质上是经过面临平等段落并作运行的代码),执行线程、体现程序的真正执行情况,是计算机上系独立调度以及时分配的极中心的施行单元。同一进程的持有线程共享相同的资源同内存(共享代码,全局变量,环境字符串等),使得线程间及下文切换更快、可以以一如既往地方空间内访问内存。线程资源包括:

  • 库:创建线程时别,用于过程调用、中断、异常处理器以及机关储存,对每个线程唯一;
  • 线程本地存储(TLS):指针数组,允许线程分配存储以创自己特有的数量环境;
  • 上下文结构:由网基本通过机器注册表值来保障;

一个过程可以有差不多只线程、一个线程必须出一个父进程,一个线程可以创建与收回外一个线程,同一个历程遭到的大半单线程之间可以并作执行。

多线程

基本上任务可以由多进程就,也得以由一个过程内的多线程完成。

  • 操作系统将CPU时间片分配给多只线程,每个线程在指定的日片内处理任务。当前执行之线程在该日片了时吃吊于、另一个线程继续运行。当系统由一个线程切换到其他一个线程时,它会保留于争相的线程的线程上下文、并再次加载线程队列中产一个线程的都保存的线程上下文;
  • CPU时间片好有点,其长度在操作系统及电脑;

中,若多个线程分属于不同之过程,宏观上大多单过程又实施、实现多任务处理。

优点

  • 共享进程资源,无需过进程边界;
  • 由此网和Web服务器和数据库通信;
  • 加强响应速度,新建线程去实施占用大量时空之(后台)操作;
  • 区分并各自施行有不同优先级的任务;

缺点

  • 内存限制:系统将为经过、AppDomain对象、线程上下文信息分配内存;
  • 性能损失:线程的创办、销毁以及线程信息之跟占用处理器时间;
  • 线程同步:对资源的共享访问会促成冲突(死锁、争用口径);

帮助线程与主线程并行执行代码,多只线程并行工作成功差不多宗职责、提高系统效率。具体地:

  • 施行耗时的天职还是时间要求紧迫的任务,而毋庸占用主线程;
  • 桌面交互应用程序中尽“后台”任务,而只要主线程继续保持对用户操作的应;

多线程处理可以解决吞吐量、响应性等题材,但会促成资源共享问题、为单个资源分配多个线程也说不定会见导致同问题。

参考:线程与线程处理 –
msdn.aspx); .NET多线程总结暨实例介绍;

多线程 – 异步

无异于:避免调用线程阻塞;

分别:(预备知识:拥有DMA一直内存访问功能的硬件在与内存进行数据交换时方可免吃CPU资源)

  • 异步:DMA,硬件基础,I/O操作可以免吃CPU资源;
  • 线程:OS,逻辑功能,运行和调度需要CPU资源;

参考:C#受异步和多线程的界别;

其他

  • Java不能够用多进程,PHP不克以多线程;

线程池

Thread
Pool
,C#/.Net线程池,即CLR线程池,用于在后台执行多单任务的线程的聚集,通常用于服务器应用程序。CLR也各国一个经过维护一个CLR线程池,池内的线程即CLR线程,一个CLR线程与一个Windows操作系统线程对应,默认属于后台线程(Background
Thread)。分为两栽:

  • 劳力线程(WorkerThread):管理CLR内部对象的运转、计算密集型任务;
  • IO线程(CompletionPortThread):访问外部资源并跟该相信息(为异步IO服务,异步功能的实现依赖IO线程);

CLR线程池于CLR初始化时不见面马上成立线程、而是以应用程序要创造线程来拍卖任务时,线程池才会初始化一个线程。线程完成任务后,不见面自行销毁、而是为悬挂于底状态返回到线程池,直到应用程序再次向线程池发出请求时,线程池里挂于底线程会被激活执行任务。

  • 线程重用:避免频繁创建、销毁线程的付出;
  • 具有最老线程数限制;

切切实实参见:C# – 多线程 之
Process与Thread与ThreadPool;   

线程同步

当一个线程操作内存时,其他线程都未克针对是内存地址进行操作、等待直到该线程完成操作。

目的:多独线程同时做客(读/写)共享数据经常,防止数据被损坏

在问题:同步锁的获得同自由

  • 实现比较繁琐、易出错;
  • 多线程异步执行,但出总体性损失;
  • 每次只能同意一个线程访问资源;

心想事成方式与体制

  • 临界区Critical
    Section
    ):通过对多线程的失误行化、允许一个过程内之多线程访问公共资源还是代码段,速度快、适合控制数据访问; 任意时刻才同意一个线程访问共享资源、其他试图访问该公资源的线程将为挂于,直到访问临界区的线程离开、临界区被放出后,其他线程才方可抢占。
  • 互斥量Mutex):采用互斥对象机制,只有取得互斥对象的线程才出权力访问公共资源; 因为互斥对象只是出一个、可以管公共资源不见面又叫多单线程访问,实现均等应用程序公共资源的安共享(进程内之线程同步)以及不同应用程序公共资源的安全共享(跨进程的线程同步)。
  • 信号量Semaphore):允许多个线程同时做客同一资源,但如果限制同一时刻访问同一资源的顶要命线程数;
  • 事件Event):采用线程间触发事件通报操作的方维持线程同步,允许对几近只线程的优先级比较;

内部,建议使用的线程同步手段: MonitorMutexManualResetEventAutoResetEvent。具体地:

  • 锁系统:C# – 多线程 之
    锁系统;
  • 信号系统:C# – 多线程 之
    信号系统;
  • 异步编程:C# – 多线程 的
    异步编程;

参考:线程同步 –
msdn.aspx);

线程安全

线程安全首要考虑线程间共享变量的安康操作。同一进程的不比线程共享进程的内存空间(全局区、静态区、堆内存),线程的私有空间包括仓库、寄存器、局部变量等。多线程访问时公共资源时,采用了加锁机制,避免数据未同等、数据传等题材。

示例1:

PHP 2

示例2:

PHP 3

线程安全问题由全局变量及静态变量引起,Microsoft的.Net
Framework类库(FCL)保证有的静态方法都是线程安全的,但非包实例方法是线程安全之。多线程对共享数据的不过念访问不设有线程安全题材。 

相关文章