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

并行~并发

并发

Concurrency逻辑及的还要发生,一个计算机(在不同随时还是说以同一时间间隔内)”同时”处理多只任务。宏观及是起的,微观上是依照排队等待、唤醒、执行之手续序列执行。并发性是针对少物理资源强制行使多用户共享(多路复用)以提高效率。

并行

Parallelism物理高达的还要有,多对处理器或多只电脑(在同样时刻)同时处理多独任务。并行性允许多个次一样时刻可在不同CPU上以执行。

Concurrency is not Parallelism.

图片 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:

图片 2

示例2:

图片 3

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

相关文章