본문 바로가기
cs공부/운영체제

운영체제 - 병렬처리(Parallel Loops, Parallel Invoke,Parallel Partitioning)

by 코딩하는 돼징 2023. 6. 6.
반응형

순차처리

한 번에 하나씩 처리하는 방식, 이는 서로 독립적으로 실행한다.

병렬처리

여러 작업을 동시에 처리하는 방식, 이는 작업을 분할하면서 동시에 실행할 수 있다. 그러므로 실행 순서가 보장 되지 않는다.


Parallel 클래스

병렬처리를 위한 기능을 제공하는 클래스

public static class Parallel

01 Parallel Loops

배열 또는 컬렉션의 요소를 병렬적으로 처리한다. 작업의 실행 순서와 출력 순서가 보장되지 않는다.

for 

public static System.Threading.Tasks.ParallelLoopResult For (int fromInclusive, int toExclusive, Action<int,System.Threading.Tasks.ParallelLoopState> body);

매개변수

fromInclusive : 시작 인덱스(포함)

toExclusive : 끝 인덱스(제외)

body : 반복당 한 번씩 호출되는 대리

int[] numbers = { 1, 2, 3, 4, 5 };
Parallel.For(0, numbers.Length, i => { Console.WriteLine($"i의 값은 {i}"); });

foreach

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Generic.IEnumerable<TSource> source, Action<TSource> body);

매개변수

TSource : 소스의 데이터 형식

source : 열거가능한 데이터

body : 반복하는 동안 호출되는 대리자

int[] numbers = { 1, 2, 3, 4, 5 };
Parallel.ForEach(numbers, number => { Console.WriteLine($"i의 값은 {number}");} );


02 Parallel  Invoke

Parallel.Invoke를 사용하면 내부적으로 Task객체가 자동으로 생성된다. 이를 스레드 풀을 사용하면서 작업을 처리한다. 

public static void Invoke (params Action[] actions);

매개변수

actions : 실행할 Action의 배열

public static void PrintMessage()
{
    Task.Delay(1000).Wait();
    Console.WriteLine("Thread : " + Thread.CurrentThread.ManagedThreadId);
}
static void Main(string[] args)
{
    Parallel.Invoke(PrintMessage, PrintMessage, PrintMessage, PrintMessage, PrintMessage);
}


03 Parallel  Partitioning

데이터를 작은 조각으로 분할하여 데이터를 병렬적으로 처리한다. 데이터의 순서는 분할 방식에 따라 유지되지만 작업의 실행순서는 보장되지 않는다.

public static OrderablePartitioner<TSource> Create<TSource>(IEnumerable<TSource> source);

 


int[] numbers = { 1, 2, 3, 4, 5 };
Parallel.ForEach(Partitioner.Create(numbers), number => { Console.WriteLine($"i의 값은 {number}"); });

반응형

댓글