언어 54

CLR 스레딩1 기본

윈도우 스레드 도입 응용 프로그램의 인스턴스는 '프로세스' 라고 부르는 공간 내에서 수행된다. 개별 프로세스는 자신만의 가상 주소 공간을 가지고 있어서 다른 프로세스가 자신의 코드나 데이터에 접근할 수 없다. 그러나 만약 한 응용프로그램이 무한 루프에 빠졌다면? 그리고 CPU가 하나밖에 없다면? 이렇게 되면 다른 코드나 사용자의 요청에 응답할 수 없는 상태가 되어버린다. 이러한 문제를 해결하기 위해 만들어 진 것이 '스레드'이다. 스레드는 CPU를 가상화 하기 위한 윈도우 운영체제의 개념이다. 스레드는 비용이 있지만 운영체제의 응답성이 좋아지게 하는 효과가 있다. 스레드의 비용 모든 스레드는 다음의 비용을 하나씩은 가진다. 스레드 커널 객체 : OS는 개별 스레드별로 고유의 데이터 구조체를 할당화하고 초..

언어/C# 2022.04.10

런타임 Serialization - 1

개요 serialization(직렬화) : 객체나 객체 그래프를 바이트 스트림으로 변환하는 과정 deserialization(역직렬화) : 바이트 스트림을 다시 연결된 객체 그래프로 되돌리는 과정 이런 직렬화와 역직렬화는 다음과 같은 기능을 한다. 응용프로그램의 상태(=객체 그래프)를 파일이나 DB에 쉽게 저장하고 다시 불러올 수 있다. 객체들을 시스템의 클립보드에 복사/붙여넣기 할 수 있다. 사용자가 객체를 수정하는 동안 원본 객체들을 백업하는 용도로 쓸 수 있다. 객체를 네트워크를 통해 전송한다. 객체를 바이트 스트림으로 메모리에 serialize하면 데이터의 암호화나 압축 같은 작업을 수행할 때 유용하다. Serialization 해보기 public static void Main() { Memory..

언어/C# 2022.04.03

Cpp 함수 (C++11 lambda, std::function)

C++11에 추가된 람다와 function wrapper는 Cpp에서도 함수형 프로그래밍이 어느정도 가능하게 해줬다. (그럼에도 Cpp는 기본적으로 객체지향 프로그래밍 + performance에 최적화 되어있다고 보아야 한다. + DOP를 더한 정도?) 아무튼 함수를 object/variable 처럼 다루기 편해짐. Function Object 함수형 프로그래밍의 시작은 함수를 변수처럼 다룰 수 있어야 한다는 것이다. 기존(C++11이전의) Cpp에서는 함수 오브젝트를 사용했는데 대충 다음과 같다. #include using namespace std; class Plus { public: explicit Plus(int val) : local_val_{val} {} int operator() (int x..

언어/C++ 2021.07.31

Cpp - 상속#2

2021.07.18 - [언어/C++] - Cpp - 상속#1 Cpp - 상속#1 기본적인 내용은 안 씀. 상속 상속은 왜 쓸까? 클래스 간의 관계 : 동물 -> 고양이 사람.. 코드 재사용 : 동물은 잠을 자.. 그럼 고양이 사람도 다 잠을 자 일관적인 클래스 인터페이스 (class interface tsyang.tistory.com Object Slicing 오브젝트 슬라이싱은 Cpp 상속에서 발생하는 문제이다. using namespace std; class Animal { public : void virtual Speak() { cout

언어/C++ 2021.07.22

Cpp - 상속#1

기본적인 내용은 안 씀. 상속 상속은 왜 쓸까? 클래스 간의 관계 : 동물 -> 고양이 사람.. 코드 재사용 : 동물은 잠을 자.. 그럼 고양이 사람도 다 잠을 자 일관적인 클래스 인터페이스 (class interface consistency) : abstract, interface , pure virtual function dynamic function binding (virtual function, virtual table) 상속을 받을 때는 public, protected, private 키워드를 붙일 수 있다. 설명은 주석으로 대신한다. class A { public: int x; protected: int y; private: int z; }; class B : public A { // x is..

언어/C++ 2021.07.18

C# - 리플렉션 (Reflection)

리플렉션 리플렉션은 컴파일 시에 알 수 없었던 타입이나 멤버들을 찾아내고 사용할 수 있게 해주는 메커니즘이다. 그러나 다음의 주요한 단점이 존재한다. 리플렉션을 사용하면 컴파일 시에 타입 안정성을 해친다. 리플렉션은 전반적으로 느리다. 어셈블리에서 정의하는 메타데이터를 살필 때 항상 문자열 검색이 수행되어야 한다. 리플렉션을 이용하여 멤버를 호출하면 성능에 좋지 않은 영향을 미친다. 따라서 먼저 매개변수들을 배열로 포장해야 한다. 내부적으로는 이렇게 포장된 내용을 다시 꺼내어 스레드의 스택에 옮긴다. 추가적으로 CLR이 메서드 호출 전에 각각의 매개변수들이 올바른 타입을 가지고 있는지 확인하고 호출자가 호출하려는 멤버에 접근할 보한 권한이 있는지 확인해야 한다. 상기의 이유로, 타입의 필드나 메서드 혹은..

언어/C# 2021.07.04

C# - CLR 호스팅과 앱도메인

호스팅 & 앱도메인 호스팅이란? 어떤 응용프로그램에서도 CLR을 사용할 수 있도록 해주는 기능이다. 이 기능을 이용하면 기존에 개발된 응용프로그램에 추가 기능을 관리 코드를 이용해 작성할 수 있다. 그러나 이런 확장은 위험의 여지가 있는데, 제 3자의 DLL을 프로세스 공간에 로드함으로써 DLL이 응용 프로그램의 데이터나 코드를 손상시키거나 접근할 수 없는 리소스에 접근(보안 컨텍스트 취득)할 수 있기 때문이다. 이를 해결하기 위해 앱도메인 기능이 있다. 앱도메인은 제 3자의 코드를 프로세스에 로드할 수 있게 해주지만 데이터나 코드 및 보안 컨텍스트가 손상되거나 탈취되지 않도록 보장해준다. 호스팅과 앱도메인 기능을 어셈블리 로딩과 리플렉션과 사용하면 .NET Framework의 참맛을 알 수 있다고 한다..

언어/C# 2021.06.27

C# - 관리 힙과 GC (2)

네이티브 리소스의 처리 네이티브 리소스 네이티브 리소스란 파일이나 커널 객체 같은 걸 말한다. 대부분의 타입들은 메모리만을 이용하지만 네이티브 리소스를 사용하는 애들(파일 핸들, 소켓) 같은 애들은 그렇지 않다. 이런 경우에 GC가 네이티브 리소스를 감싸고 있는 타입을 수거해 간다면 네이티브 리소스에 대한 누수가 발생하게 된다!! GC는 네이티브 리소스에 대해 알지 못하기 때문에 이에 대한 처리가 필요해 보인다. Finalization 파일, 네트워크 연결, 소켓, 뮤텍스 같은 네이티브 리소스를 감싸고 있는 타입은 finalization이란걸 지원한다. CLR은 GC가 이런 객체를 가비지 수집하는 과정에서 Finalize 라는 메서드를 호출하여 객체가 감싸는 네이티브 리소스를 정리할 기회를 준다. pub..

언어/C# 2021.04.03

C# - 관리 힙과 GC (1)

관리 힙 C#은 왜 관리 힙을 쓰나? 메모리 관리를 수동으로 해줘야 하는 C++의 경우 메모리 해제를 까먹어 메모리 누수가 발생하거나, 이미 해제한 메모리에 접근하여 메모리 손상이 발생하는 경우가 많고 이는 결국 버그나 보안 취약점으로 연결된다. 리소스 할당 CLR환경 하에서는 모든 객체가 관리 힙에 할당된다. 프로세스가 초기화되면, CLR은 관리 힙으로 쓸 주소 공간을 할당하고 다음 객체를 할당할 위치를 가리키는 포인터(이하 NextObjPtr)을 시작 주소를 가리키게 한다. 이 주소 영역이 가득 차면 CLR은 프로세스의 주소 공간이 사용될 때 까지 영역을 확대한다. new연산자 CLR에서 new연산자는, 필요한 용량을 계산한다. (특정 타입의 필드, 상속한 타입의 필드까지) - 여기에는 type ob..

언어/C# 2021.03.28

C# Nullable, Null 결합 연산자

Nullable CLR의 값 타입은 null을 가질 수 없다. 그러나 여러 이유로 값 타입이 null을 가져야 할 때가 있다. 이에 대비하기 위해 CLR은 null을 허용하는 값 타입을 지원한다. FCL에는 System.Nullable 구조체가 정의되어 있다. (여러 이유 : 데이터베이스에서는 32비트 정수 값이 null을 가질 수 있음, Java의 Date클래스는 참조 타입이어서 null을 가질 수 있음 그러나 C#은 그렇지 않음... 등) Nullable에서 T는 구조체여야 하며 Nullable에는 여기에 현재 값을 가지고 있는지에대한 Boolean필드 정도만 추가한 값 타입이다. int? 는 Nullable와 같은 의미이다. Nullable의 박싱/ 언박싱 Nullable 타입은 값 타입이기에 박싱..

언어/C# 2021.03.06