... | ... | @@ -6,8 +6,10 @@ |
|
|
* **garbage collector :** 메모리를 관리해주는 mechanism.
|
|
|
|
|
|
* **garbage collection :** 메모리를 해제하고 새롭게 재배치 하는 작업을 칭하고 자동으로 수행되지만 수동으로도 수행을 명령할 수도 있다. garbage collection이 수행되는 시기는 개발자가 알 수 없지만 분명한 것은 메모리가 부족하면 분명 garbage collection이 일어난다는 것이다.
|
|
|
[garbage collector 동작방식](##### #A garbage collector 동작 방식)
|
|
|
|
|
|
* **garbage collector 동작방식 :** CLR의 heap은 generation로 나뉘어 관리된다. managed heap 입장에서 generation을 구분하는 것은 단지 메모리의 위치를 가리키는 내부 포인터에 의해 이뤄진다. 처음 new로 할당된 객체는 generation 0에 속한다. generation 0객체의 총 용량이 일정 크기를 넘어가면 GC는 가비지 수집을 한다. 사용되지 않는 generation 0 객체가 있으면 없애고, 그 시점에도 사용되고 있는 객체는 generation 1로 승격한다. generation 1로 승격된 객체의 총 용량도 일정 크기를 넘어가게 되면 CG는 generation 0, 1세대에 모두 가비지 수집을 한다. 1세대의 객체가 그 시점에도 사용되고 있으면 generation 2로 승격한다. generation 2로 승격된 객체의 총 용량도 일정 크기를 넘어가게되면 GC는 generation 0, 1, 2의 모든 객체를 가비지 수집한다. CLR의 generation은 generation 2가 끝이다. 이후 generation 2의 메모리 공간은 시스템이 허용하는 한 계속 커지게 된다.
|
|
|
|
|
|
* **==garbage collector 동작방식^noteA)^ :==** CLR의 heap은 generation로 나뉘어 관리된다. managed heap 입장에서 generation을 구분하는 것은 단지 메모리의 위치를 가리키는 내부 포인터에 의해 이뤄진다. 처음 new로 할당된 객체는 generation 0에 속한다. generation 0객체의 총 용량이 일정 크기를 넘어가면 GC는 가비지 수집을 한다. 사용되지 않는 generation 0 객체가 있으면 없애고, 그 시점에도 사용되고 있는 객체는 generation 1로 승격한다. generation 1로 승격된 객체의 총 용량도 일정 크기를 넘어가게 되면 CG는 generation 0, 1세대에 모두 가비지 수집을 한다. 1세대의 객체가 그 시점에도 사용되고 있으면 generation 2로 승격한다. generation 2로 승격된 객체의 총 용량도 일정 크기를 넘어가게되면 GC는 generation 0, 1, 2의 모든 객체를 가비지 수집한다. CLR의 generation은 generation 2가 끝이다. 이후 generation 2의 메모리 공간은 시스템이 허용하는 한 계속 커지게 된다.
|
|
|
|
|
|
* **full garbage collector :** GC가 generation을 구분한 이유는 프로그램 실행 도중 generation 0에 할당되고 수집되는 비율이 매우 높다는 통계적 근거를 기반으로 한다. 따라서 generation 0객체가 꾸준히 할당되어 가비지 수집이 될 기준을 넘어서면 GC는 모든 세대에 걸쳐 가지 수집을 하지 않고 우선 generation 0 heap에 대해서만 빠르게 수행한다. generation 0에만 가비지 수집을 하게 되면 generation 1 heap이 필연적으로 자라게된다. 그래서 generation 0 가비지 수집만으로 메모리 확보가 부족해지면 generation 1 heap까지 가비지 수집을 하게된다. 이런 현상이 계속되면 전체 generation에 가비지 수집을 하는 경우가 발생하는데 이를 Full GC라고 한다.
|
|
|
|
... | ... | @@ -177,13 +179,10 @@ DateTime은 struct로정의된 value type이다. |
|
|
return 0;
|
|
|
}
|
|
|
```
|
|
|
linux 환경에서 위와 같은 main.c를 작성하고 실행시키면 다음과 같은 결괏값이 나온다.
|
|
|
linux환경에서 위와 같은 main.c를 작성하고 실행시키면 다음과 같은 결괏값이 나온다.
|
|
|

|
|
|
|
|
|
구해지는 시간(1448967159)은 1970년 1월 1일 0시부터 함수를 호출할 때 까지의 초단위이므로 milisecond값인 1448967159000값을 입력값으로 코드를 실행하면 (`long unixMillis = 1448967159000;`)
|
|
|
 이다.
|
|
|
|
|
|
|
|
|
구해지는 시간(1448967159)은 1970년 1월 1일 0시부터 함수를 호출할 때 까지의 초단위이므로 milisecond값인 1448967159000값을 입력값으로 윈도우환경에서 코드를 실행하면(`long unixMillis = 1448967159000;`) 아래와 같은 결괏값이 나온다.
|
|
|

|
|
|
|
|
|
<br>
|
|
|
|
... | ... | @@ -268,6 +267,19 @@ _ _ _ |
|
|
|
|
|
ThreadStart는 parameter를 직접 전달 받지 않는다. ParameterizedThreadStart는 하나의 parameter를 전달하고 리턴값이 없는 형식이다. Parameter의 전달은 Thread.Start() method를 호출할 때 Parameter를 전달한다.
|
|
|
<br>
|
|
|
**2. race condition**
|
|
|
race condition은 두개 또는 그 이상의 thread가 shared data에 동시에 접근해서 data를 변경할 때 발생한다.
|
|
|
``` cs
|
|
|
if (x == 5) // The "Check"
|
|
|
{
|
|
|
y = x * 2; // The "Act"
|
|
|
|
|
|
// If another thread changed x in between "if (x == 5)" and "y = x * 2" above,
|
|
|
// y will not be equal to 10.
|
|
|
}
|
|
|
race condition이 발생하는 것을 막으려면 shared data에 대한 동기화 처리를 해줘야 한다. 동기화를 처리하는 데는 여러 가지 방법 중에 shared data에 오직 한 개의 thread만 접근 할 수 있게 만드는 class가 Monitor이다.
|
|
|
|
|
|
```
|
|
|
**3. System.Threading.Monitor**
|
|
|
``` cs
|
|
|
List<Task> tasks = new List<Task>();
|
... | ... | @@ -374,25 +386,32 @@ thread로 하여금 이벤트를 기다리게 만들 수 있고, 다른 thread |
|
|
}
|
|
|
```
|
|
|
_ _ _
|
|
|
### **9. Dictonary 및 Path 관련 method 정리**
|
|
|
### **9. Directory 및 Path 관련 method 정리**
|
|
|
|
|
|
* **Dictionary**
|
|
|
* **System.IO.Directory**
|
|
|
|
|
|
| method | 설명 |
|
|
|
| method | 설명 |
|
|
|
|--------|--------|
|
|
|
| Add(TKey, TValue) | Key, Value를 Dictionary에 추가 |
|
|
|
| Remove(TKey) | Key, Value를 Dictionary에 제거 |
|
|
|
| ContainsKey(TKey, TValue) | Dictionary에 Key를 포함하는지 검사 |
|
|
|
|
|
|
* **Path**
|
|
|
|
|
|
| method | 설명 |
|
|
|
| CreateDirectory(String) | directory를 생성한다. 이미 directory가 존재한다면 아무런 작업도 하지 않는다 |
|
|
|
| Delete(String) | 지정된 경로에서 빈 directory만 삭제, subdirectory가 존재할 경우 IOException발생 |
|
|
|
| Delete(String, Boolean) | Boolean이 true이면 지정된 경로에서 directory 및 subdirectory, file 삭제 |
|
|
|
| Exists(String) | directory가 존재하는지 true/false로 반환한다 |
|
|
|
| GetDirectories(String) | 지정된 경로의 subdirectory목록을 문자열 배열로 반환한다 |
|
|
|
| GetDirectories(String, String) | 지정된 경로에서 지정된 pattern을 가진 subdirectory목록을 문자열 배열로 반환한다 |
|
|
|
| GetFiles(String) | 지정된 경로에 있는 파일을 문자열 배열로 반환한다 |
|
|
|
| GetLogicalDrives() | 시스템에 설치된 디스크의 드라이브 문자 목록을 string 배열로 반환한다 |
|
|
|
| Move(String, String) | 디렉토리를 이동한다 |
|
|
|
|
|
|
* **System.IO.Path**
|
|
|
|
|
|
| method | 설명 |
|
|
|
|--------|--------|
|
|
|
| ChangeExtension(String, String) | 첫 번째 인자로 전달된 경로에서 확장자 부분을 두 번재 인자로 전달된 문자열로 바꿔준다 |
|
|
|
| Combine(String, String) | 전달된 문자열 인자를 모두 합쳐서 하나의 경로로 만든다 |
|
|
|
| GetDirectoryName(String) | 전달된 문자열에서 파일 이름이 포함된 경우 그 파일의 부모 디렉터리 이름을 반환한다. 반면 디렉터리 이름이 포함된 경우 그 부모 디렉터리 이름을 반환한다|
|
|
|
| GetDirectoryName(String) | 전달된 문자열에서 파일 이름이 포함된 경우 그 파일의 부모 디렉터리 이름을 반환한다. 반면 디렉터리 이름이 포함된 경우 그 부모 디렉터리 이름을 반환한다 |
|
|
|
| GetExtension(String) | 전달된 문자열의 확장자를 반환한다 |
|
|
|
| GetFileName(String) | 전달된 문자열의 파일명을 반환한다 |
|
|
|
|
|
|
_ _ _
|
|
|
### **10. `ObservableCollection<T>`**
|
|
|
닷넷 3.0에서 System.Collections.ObjectModel namespace에 ObservableCollection<T>라는 collection이 새롭게 추가되었다. 이 collection의 장점은 **UI가 업데이트 되었을 경우 그 값이 변경되었다는 알람을 받을 수 있다는 것이다.**
|
... | ... | |