ubiquitous4g 2021. 9. 22. 02:51

 

 

18.1. 파일과 폴더를 다루는 방법

- File

: 저장 매체에 기록되는 데이터의 묶음

- Directory(Folder)

: 파일이 위치하는 주소

- System.IO 의 클래스

 

- 주요 메소드와 프로퍼티

18.2. 파일의 "내용"을 읽고 쓰는 방법

- Stream

: 네트워크나 데이터 백업 장치의 데이터 입/출력 구조

: 순차 접근 구조

- System.IO.Stream

: 추상 클래스

- C# CLR Byte Order

: Little Endian (vs. Java JVM: Big Endian)

18.3. using

: 네임스페이스, 파일, 소켓 등

- UsingDeclaration

: 별칭

- 자동 Dispose()

18.4. BinaryWriter/BinaryReader

: 스트림에 이진 데이터를 기록하고읽어 들이기 위한 목적

: BianryWriter + FileStream = BinaryWriter

: BianryWriter + FileStream + Network

 

18.5. StreamWriter/StreamReader

: 텍스트 파일을 쓰고 읽기

18.6. Serialization(직렬화)

: 객체의 상태를 메모리나 영구 저장 장치에 저장이 가능한 0과 1의 순서로 바꾸는 것

: Binary(이진), JSON(JavaScript Object Notation), XML 형식 직렬화

: [Serializable] 애트리뷰트를 클래스 선언부 앞에 붙이면 메모리나 영구 저장 장치에 저장할 수 있는 형식

19. Thread

19.1. 요약

- Process: 실행 파일이 실행되어 메모리에 적재된 인스턴스

- Thread: 운영체제가 CPU 시간을 할당하는 기본 단위

- Thread 약자: thd

- Synchronous vs. Asynchronous

Eng. Exp. call back timing Kor. HanJa
Synchronous 동시에 발생함 함수 호출이 끝난 직후 동기화  한가지   기약할    
Asynchronous 동시에 발생하지 않음 임의의 타이밍 비동기화  아닐 

- Thread 클래스

: public delegate void ThreadStart();

: public delegate void ParameterizedThreadStart(object obj);

 

- ThreadPool 클래스

: 리턴 값이 필요 없는 경우

: .NET 4.0 32bit 1023개, 64bit 32768개

 

- 비동기 델리게이트 (Asynchronous Delegate)

: 리턴값이 필요한 경우

: BeginInvoke(), IAsyncResult, EndInvoke()\

 

- BackgroundWorker 클래스

: 이벤트를 기반 비동기 처리

 

- Task Parallel Library(TPL)

: .NET 4.0

: Task, Parallel 관련 클래스

: 다중 CPU 병렬 처리 기반

 

- Task 클래스

: ThreadPool.QueueUserWorkItem()과 같이 리턴값 필요 없는 경우

 

- Task<T> 클래스

: T는 리턴 타입을 Result 속성으로 참조

: 쓰레드가 실행 중이면, 결과까지 해당 쓰레드 완료 대기

 

- Parallel 클래스

: Parallel Framework (PFX)

: 병렬 프로그래밍: 큰 작업 분할 -> 분할된 작업 병렬 실행 -> 결과 집계

(1) Data Parallelism = PLINQ (Parallel LINQ) + Parallel 클래스 (For/Foreach 메서드)

(2) Task Parallelism = Task, TaskFactory (Parallel.Invoke()는 Task Parallelism을 지원)

19.1. Thread

 

19.2. Thread 강제 종료

- Thread.Abort( )

- 프로세스 내의 스레드는 즉시 종료되지 않는다.

: Thread 객체에 Abort ( ) 메소드를 호출하면 CLR은 해당 스레드가 실행 중이던 코드에 ThreadAbortException을 던집니다.

: 이때 이 예외를 catch가 있으면 처리한 다음, finally 블록까지 실행한 후 스레드가 완전히 종료된다.

:Abort ( ) 메소드를 goto 문만큼 신중하게 사용 (쓰지마라)

 

19.3. ThreadState

- 비트 연산을 통해 ThreadState가 어떤 상태에 있는지 쉽 게 알아낼 수 있다

스레드 상태 변화 규칙

19.4. Thread.Interrupt()

- 스레드 Running 상태를 피해서 WaitJoinSleep 상태에 들어갔을 때 ThreadInterruptedException 예외를 던져 스레드를 중지

- 최소한 코드가 “절대로 중단되면 안 되는” 작업을 하고 있을 때는 중단되지 않음 보장

19.5. Thread Synchronization - Lock, Monitor

: 자원을 한 번에 하나의 스레드가 사용하도록 보장”하는 것

- Critical Section(크리티컬 섹션): 한 번에 한 스레드만 사용할 수 있는 장치

 

스레드의 자원 공유 문제

- lock( ) = Monitor.Enter( ) + Monitor.Exit( )

19.6. Monitor.Wait( )와 Monitor.Pulse( )

- lock 대신 Monitor 를 사용해야 한다면, Wait( ) 와 Pulse( ) 메소드 영향이 크다

 

 

19.7. Task 클래스

19.8. Task<T> 클래스

19.8. Task 작업 종료

https://www.csharpstudy.com/Threads/taskOfT.aspx

 

19.9. Parallel

Parallel.For()와 Parallel.ForEach() 메서드를 통해 다중 CPU에서 다중 쓰레드가 병렬로 데이타를 분할하여 처리

- 순차처리 vs Parallel 병렬처리

- Parallel.Invoke()

19.7. 병렬 처리와 비동기 처리

: 여러 개의 코어가 동시에 작업을 수행할 수 있도록 하는 병렬 처리, 비동기 처리 기법

- 병렬 처리

: 하나의 작업을 여러개로 나눠서 처리

- Synchronous(동기)

: 작업이 호출되면, 실행 완료가 확인(반환)되어야 다음 작업 호출

: “Shoot And Forget”

- Asynchronous(비동기)

: 여러 작업의 완료를 대기하지 않고, 다음 동작 수행

- System.Threading.Tasks

: 네임스페이스의 클래스들은 하나의 작업을 쪼개 동시에 처리하는 코드와 비동기 코드를 위해 설계

: Task, Task<TResult>, Parallel

: async, await

- Thread 클래스

: 여러 개의 작업을 (나누지 않고) 각각 처리해야 하는 코드에 적합

- Task

: Task 클래스는 인스턴스를 생성시, Action 대리자(반환형 없는 메소드, 익명 메소드, 무명 함수 등)을 넘겨받는다

- Task<TResult>

: 비동기 실행 결과를 손쉽게 취합

: Task가 비동기로 수행할 코드를 Action 대리자로 받는 대신 Func 대리자로 받는다

- Task, Task<TResult>, Parallel

: 메소드를 병렬로 호출할 때 몇 개의 스레드를 사용할지는 Parallel 클래스가 내부적으로 판단하여 최적화

- async, await 한정자

: 호출 결과를 기다리지 않고 바로 다음 코드로 이동하도록 실행 코드를 생성

: await 연산자를 만나는 곳에서 호출자에게 제어를 돌려주며, await 연산자가 없는 경우 동기로 실행된다

 

19.8. .NET이 제공하는 비동기 API