11장 스레드.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

네트워크 프로그래밍 및 실습.
10. 예외 처리.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
최윤정 Java 프로그래밍 클래스 상속 최윤정
JAVA 클래스와 멤버 2014년 4월 2일 19:00 손은경 강원대학교 데이터베이스 연구실 강원대학교 데이터베이스 연구실.
명품 JAVA Programming 제 13 장 스레드와 멀티태스킹.
명품 JAVA Essential.
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
Chapter 4 Multi-Threaded Socket
Java 10장. 다중 스레드 public class SumTest {
Lesson 5. 레퍼런스 데이터형.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
4장. 웹로직 서버상에서의 JDBC와 JTA의 운용
Lesson 6. 형변환.
5장. 참조 타입.
명품 JAVA Essential.
제 3장. C보다 나은 C++ II.
07. 디바이스 드라이버의 초기화와 종료 김진홍
스레드란? 멀티 태스킹(muli-tasking)는 여러 개의 애플리케이션을 동시에 실행하여서 컴퓨터 시스템의 성능을 높이기 위한 기법 그림23-1. 병철 처리의 예.
Chap08 다중 스레드 8.1 스레드 개요 8.2 Thread 클래스와 스레드 생명주기 8.3 스레드 생성과 사용
Chapter 06 프로세스와 예약작업 관리 Solaris 1. 프로세스 관리
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
자바 5.0 프로그래밍.
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
Java 6장. 클래스 : 속성 public class SumTest {
Sungkyunkwan University OS Project Dongkun Shin
Lesson 7. 클래스와 메소드 - 1.
03. 병행 프로세스 (Parallel Process)
자바 5.0 프로그래밍.
CHAP 12. 리소스와 보안.
13. 연산자 오버로딩.
7장 인터페이스와 추상 클래스.
Method & library.
JA A V W. 03.
인터넷응용프로그래밍 JavaScript(Intro).
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
자바 5.0 프로그래밍.
System.Threading Process / Thread SD50 – C# & .NET Platform.
데이터베이스실험실 석사 2학기 조정희 TCP/IP Socket Programming… 제 18장 윈도우 기반 쓰레드 사용하기 데이터베이스실험실 석사 2학기 조정희
Part 4 클래스 라이브러리 Chapter 10 : 다중 스레드 Chapter 11 : 패키지와 주요 클래스
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
자바 5.0 프로그래밍.
Power Java 제11장 상속.
JA A V W. 06.
CHAP 21. 전화, SMS, 주소록.
( Windows Service Application Debugging )
Chapter 17. 스레드.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
안드로이드 앱 개발과정 Step1. 기초과정 강사 : 정 훈 희.
3. 모듈 (5장. 모듈).
JSP Programming with a Workbook
MIDP 네트워크 프로그래밍 ps lab 김윤경.
발표자 : 이지연 Programming Systems Lab.
Android -Data Base 윤수진 GyeongSang Univ. IT 1.
엔코더 프로그램 설명 // 쓰레드를 사용하기 때문에 변수와 핸들을 전역변수로 지정 HANDLE hDevice;
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 05. 복사 생성자.
자바 객체 지향 프로그래밍 Ps lab 김윤경.
CODE INJECTION 시스템B 김한슬.
Power Java 제23장 스레드.
OOP Practices OOP presentation 6 작성자 Kimjinsik 소속 Mobile computing Lab
상속 (Inheritance) private 전용부분 전용부분 공용부분 공용부분 public 기본 클래스
7 생성자 함수.
2. 프로세스 B 안우진 - 운영체제 -.
Presentation transcript:

11장 스레드

프로세스(Process) - 추적 관리 되는 메모리와 리소스들을 사용하는 실행중인 프로그램 - 고유의 프로세스 식별자(PID)가 할당 - 프로세스별 자원을 할당 - IPC : 파이프, 메시지큐, 세마포, 공유메모리 스레드(Thread) - 프로그램 내의 일련의 작업 단위 - 스레드 단위로 CPU의 작업 제어권을 확보 - 스레드를 프로그래머가 직접 제어 가능 - 스레드들이 자원을 공유 프로세스와 스레드의 관계 및 구조 - 스레드 : 프로세스에 의해 할당된 자원 내에서 특정 명령을 수행하는 모듈 - Call Stack : 스레드 내에서 메소드 호출 순서와 메소드 작업에 필요한 메모리 - TLS(Thread Local Storage) : 스레드 자신의 정보를 저장

System.Threading 네임 스페이스 - 다중 스레드 프로그래밍을 가능하게 하는 여러 형식(클래스, 델리게이트, 열거형을 포함) 형식 설명 Interlocked 다중 스레드에 의해 공유되는 객체들에게 동기화된 접근을 제공(클래스) Monitor locks, wait/signals를 이용해서 스레딩 객체의 동기화를 제공(클래스) Mutex 두 개 이상의 스레드들이 동시에 공유 데이터에 접근할 때 사용되는 동기화 클래스 Thread 스레드를 만들고 제어하며, 속성을 설정하고, 상태를 구하는 클래스 ThreadPool 프로세스 내의 관련 스레드들을 관리(클래스) Timer 지정된 시간 간격으로 메서드를 실행하기 위한 메커니즘을 제공(클래스) ThreadStart 스레드에서 실행되는 메서드를 등록하는 델리게이트 WaitCallBack 스레드 풀에 메서드를 등록하는 델리게이트 TimerCallBack Timer에 의해 호출되는 메서드를 등록하는 델리게이트 ThreadState 스레드가 가질 수 있는 유효한 상태를 지정(열거형) ThreadPriority 스레드 우선순위의 유효한 수준을 지정(열거형)

- Thread 클래스, ThreadPool 클래스, Timer 클래스를 이용 스레드 생성 방법 - Thread 클래스, ThreadPool 클래스, Timer 클래스를 이용 - 스레드를 생성하는 가장 일반적인 방법은 Thread 클래스의 객체 참조를 생성 - 생성자는 ThreadStart 델리게이트 인자를 필요로 한다. - 스레드를 생성하고 시작하는 절차 delegate void ThreadStart(); //ThreadStart 델리게이트 정의 Thread th = new Thread(new ThreadStart(My_fun)); //스레드 생성, My_fun은 스레드로 만들 메서드 th.Start(); //스레드를 시작 - 예) using System; using System.Threading; class Program { public static void Print1() { // 스레드로 만들 정적 메서드 Console.WriteLine("Print1 스레드 시작"); } public void Print2() { //스레드로 만들 일반 메서드 Console.WriteLine("Print2 스레드 시작"); public static int Main(string[] args) { // 주 스레드 Thread thread = new Thread(new ThreadStart(Print1)); thread.Start(); // 스레드 시작 thread = new Thread(new ThreadStart((new Program()).Print2)); Console.WriteLine("주 스레드 시작"); return 0;

ThreadPool 클래스를 이용한 스레드 생성 향상을 제공 - QueueUserWorkItem 정적 메서드를 사용하여 메서드를 큐에 대기시키고 메서드에서 사용할 데이터가 들어 있는 개체를 지정 - 두개의 스레드를 Pool 에 요청하는 작업(아래의 사용법 참조) - 정적 메서드인 QueueUserWorkItem은 WaitCallback 델리게이트를 인자로 하여 Count1, Count2를 Pool에 등록 (아래의 사용법 참조) // Count1 메서드를 큐(Pool)에 대기 ThreadPool.QueueUserWorkItem(new WaitCallback(Count1)); // Count2 메서드를 큐(Pool)에 대기, obj는 메서드에서 사용할 데이터가 있는 객체 ThreadPool.QueueUserWorkItem(new WaitCallback(Count2), obj);

- 예) class Program { public static void Main() { // 정적 메서드 이용한 ThreadPool에 대한 작업 요청, 두 번째 인수는 메서드가 사용할 객체 ThreadPool.QueueUserWorkItem(new WaitCallback(Print1),null); // 일반 메서드를 이용한 ThreadPool에 대한 작업 요청 ThreadPool.QueueUserWorkItem(new WaitCallback((newProgram()).Print2),null); // 주 스레드를 1초 간격으로 대기상태로 전환 for(int i = 0 ; i < 10 ; i++) { Console.WriteLine("주스레드: {0}", i); Thread.Sleep(1000); } private static Random random = new Random(); // 전역 Random 객체 생성 public static void Print1(object obj) { // 스레드로 만들 정적 메서드 for( int i = 0 ; i < 3; i++){ Console.WriteLine("Print1 스레드 :{0} ", i); Thread.Sleep(random.Next(5001)); // 랜덤 시간 동안 sleep public void Print2(object obj) { // 스레드로 만들 메서드 for( int i = 0 ; i < 3; i++) { Console.WriteLine("Print2 스레드 :{0} ", i); Thread.Sleep(random.Next(3001)); // 랜덤 시간 동안 sleep

- 일정한 간격을 두고 특정 메서드를 호출해야 하는 경우 Timer 클래스를 이용한 스레드 생성 - 일정한 간격을 두고 특정 메서드를 호출해야 하는 경우 - Timer 클래스 객체를 생성한 다음에 TimerCallback 델리게이트와 메서드로 전달할 인자, 기간을 지정해 스레드를 생성 delegate void TimerCallback(object obj); // TimerCallback 델리게이트 정의 // 스레드로 실행될 callback 메서드 func, callback에서 사용할 정보가 포함된 객체(null) // callback 지연시간 500, callback 호출 간격 500 Timer timer = new Timer(new TimerCallback(func), null, 500, 500);

- 예) class Program { static int i = 0; public static void Print1(object obj) { // 스레드로 만들 정적 메서드 for( i = 0 ; i < 3; i++){ Console.WriteLine("Print1 스레드 :{0}", i); Thread.Sleep(100); } public void Print2(object obj) { // 스레드로 만들 메서드 for( int i = 0 ; i < 3; i++){ Console.WriteLine("Print2 스레드 :{0}", i); public static void Main() { // 정적 메서드를 이용한 Timer에 대한 작업 요청 Timer timer = new Timer(new TimerCallback(Print1), null, 500, 500); // 일바 메서드를 이용한 Timer에 대한 작업 요청 Timer timer1 = new Timer(new TimerCallback((new Program()).Print2), null, 500, 500); for(int i = 0 ; i < 10 ; i++) { Console.WriteLine("주스레드: {0}", i);

- System.Diagnostics.Process클래스의 GetCurrentProcess 메서드와 Getprocesses 프로세스의 정보와 목록 - System.Diagnostics.Process클래스의 GetCurrentProcess 메서드와 Getprocesses 메서드 이용 class Program { static void Main(string[] args) { Process proc = Process.GetCurrentProcess(); // 현재 실행중인 프로세스 string processName = proc.ProcessName; DateTime startTime = proc.StartTime; int proID = proc.Id; Console.WriteLine("******* 현재 프로세스 정보 *****"); Console.WriteLine(" Process: {0}\n ID: {1}\n 시작시간: {2}\n 메모리:{3}\n", processName, proID, startTime, memory); Console.WriteLine("\n******* 모든 프로세스 정보 *****"); Process [] allProc = Process.GetProcesses(); // 실행중인 모든 프로세스 Console.WriteLine("시스템에서 실행중인 프로세스의 수: {0}", allProc.Length); int index = 1; foreach(Process pro in allProc) { Console.WriteLine("----- {0}번째 프로세스 -----", index++); processName = pro.ProcessName; // 프로세스이름정보 startTime = pro.StartTime; // 프로세스 시작 시간 //프로세스 PID(운영체제 식별번호) proID = pro.Id; memory = pro.VirtualMemorySize; // 메모리 사용량 }

스레드 상태와 목록 - 생성직후상태(Unstarted) : 스레드가 생성된 직후를 의미 - 실행가능상태(Runnable) : 새로운 스레드가 생성되어 Start 메서드를 호출 - 대기상태(Suspended) : 실행중인 스레드에서 Suspend, Sleep 메서드를 호출 - 종료상태(Stopped) : 스레드가 할 일을 모두 마친 상태

스레드의 정보를 제공하거나 설정하는 속성 스레드의 상태를 변경하는 메소드 속성 설명 CurrentThread 현재 실행중인 스레드 값 CurrentContext 스레드가 실행 중인 현재 컨텍스트(개체의 환경을 정의하는 속성) IsAlive 스레드의 실행 여부 Name 스레드의 이름 IsBackground 스레드가 백그라운드 스레드인지의 여부 ThreadState 스레드의 상태 Priority 스레드의 우선순위 스레드의 상태를 변경하는 메소드 속성 설명 Abort 스레드를 종료 GetApartmentState 아파트 상태를 나타내는 ApartmentState 값 GetDomain 현재 스레드가 실행 중인 도메인 Interrupt 대기 스레드 상태에 있는 스레드를 중단 Join 해당 스레드의 실행 종료 때까지 대기 Resume 해당 스레드를 실행 상태로 변경 Sleep 해당 스레드를 특정시간동안 대기상태로 변경 Start Suspend 해당 스레드를 대기상태로 변경 Tostring 스레드 객체를 문자열로 반환

ThreadState는 스레드의 실행 상태를 저장 속성 설명 Unstarted 생성된 스레드에 Thread.Start 메서드가 호출되지 않은 상태 Running 스레드가 차단되지 않고 시작된 상태 WaitSleepJoin Wait, Sleep 또는 Join을 호출한 결과 스레드가 차단된 상태 SuspendRequest 스레드를 일시 중단하도록 요청한 상태 Suspended 스레드가 일시 중단된 상태 AbortRequestede 스레드에서 Thread.Abort 메서드가 호출되었지만 해당 스레드는 자신을 종결시키 려는 보류된 ThreadAbortException을 받지 못한 상태 Stopped 스레드가 중지된 상태

class Program { static void Main(string[] args) { //현재 스레드에 관한 정보를 가져온다. Thread primaryThread = Thread.CurrentThread; Thread.CurrentThread.Name = " TheFirstThread"; Console.WriteLine(" ***** 첫 번째 스레드 정보 *****"); //응용 프로그램의 도메인 이름 Console.WriteLine(" 현 응용프로그램 이름 : {0}" ,Thread.GetDomain().FriendlyName); //스레드 이름 Console.WriteLine(" 스레드 이름 : {0}", primaryThread.Name ); //아파트 상태 Console.WriteLine(" Apt 상태 : {0}", primaryThread.GetApartmentState()); //활동중인지? Console.WriteLine(" 활동중 ? : {0}", primaryThread.IsAlive ); //우선순위 Console.WriteLine(" 우선순위 : {0}", primaryThread.Priority ); //상태 Console.WriteLine(" 스레드 상태 : {0}", primaryThread.ThreadState ); Console.WriteLine(); Thread SecondaryThread = new Thread(new ThreadStart(MyThreadProc)); //우선순위 Highest로 설정 SecondaryThread.Priority = ThreadPriority.Highest; SecondaryThread.Start(); } static void MyThreadProc() { Console.WriteLine(" ***** 두 번째 스레드 정보 ***** ");

Thread.CurrentThread.Name = " TheSecondThread"; Console.WriteLine(" 스레드 이름 : {0}", SecondThread.Name); //아파트 상태 Console.WriteLine(" Apt 상태 : {0}", SecondThread.GetApartmentState() ); //활동중인지? Console.WriteLine(" 활동중 ? : {0}", SecondThread.IsAlive ); //우선순위 Console.WriteLine(" 우선순위 : {0}", SecondThread.Priority ); //상태 Console.WriteLine(" 스레드 상태 : {0}", SecondThread.ThreadState ); Console.WriteLine(); }

} 스레드 우선 순위 - 여러 개의 멀티스레드가 사용될 때 CLR은 단지 하나의 스레드만 CPU를 점유할 수 있도록 제어 - 스레드의 우선권을 설정하기 위하여 ThreadPriority 열거형을 제공 멤버 설명 Highest 가장 높은 우선권 AboveNormal 높은 우선권 Normal 평균의 높은 우선권 BelowNormal 낮은 우선권 Lowest 가장 낮은 우선권 class Program { public static int th; // 여러 객체가 공유 public static void Print1() { for(int i=0;i<3;i++){ Console.WriteLine("첫 번째 스레드 {0}",th); th++; }

public static void Print2() { for(int i=0;i<3;i++) { Console.WriteLine("두 번째 스레드 {0}",th); th++; } public static void Print3() { Console.WriteLine("세 번째 스레드 {0}",th); public static void Main() { Thread th1 = new Thread(new ThreadStart(Print1)); // 첫 번째 스레드 생성 Thread th2 = new Thread(new ThreadStart(Print2)); // 두 번째 스레드 생성 Thread th3 = new Thread(new ThreadStart(Print3)); // 세 번째 스레드 생성 // 스레드 th1는 최우선 순위로 설정 th1.Priority = ThreadPriority.Highest; // 스레드 th3는 최저 순위로 설정 th3.Priority = ThreadPriority.Lowest; th3.Start(); th2.Start(); th1.Start();