전체 글 262

[C++] 메모리 관리 (3) 주소 기반 초기화 placement new

new 연산자 new 연산자는 C++에서 특정 개체 타입을 동적할당하고 초기화하는데 사용한다. placement new 표현식 : new (Address) Type (Initialize arguments); 이미 메모리 할당이 이루어진 주소 공간에 해당 타입으로 초기화할 때 사용한다. 주로 메모리 풀이나 가비지 컬렉터와 같은 응용에 사용된다. new 연산자를 이용하지만 실제로 동적 할당이 이루어지는 것이 아니며 실제 행동은 초기화만 진행된다. segmentation fault가 발생한 경우 : 전달한 Address 주소가 유효하지 않은 메모리 주소 혹은 null 포인터일 경우 발생할 수 있다. 메모리 해제 : 힙 메모리의 경우 실제로 동적 할당을 수행한 주소를 가진 포인터를 삭제 시키는 것으로 해제하며 ..

Advanced C++ 2021.10.06

[C#] 메서드

함수 매개변수에 사용가능한 ref/out 키워드 ref 키워드 - 참조 전달을 위해 사용할 수 있다. namespace CSharpClass { class Product { private int price = 100; public ref int GetPrice() { return ref price; } } } 참조 인자로 반환할 경우 return의 반환 변수에도 ref 키워드를 붙여야한다. class Program { static void Main(string[] args) { Product carrot = new Product(); // 참조 변수로 밖에서 값을 수정할 수 있다. ref int ref_local_price = ref carrot.GetPrice(); // 지역 변수로 취급된다. int ..

C#/C# 기본 2021.10.05

[Windows] 완료 루틴 (Completion Routine)과 APC (Asynchronous Procedure Call)

앞 포스트에서 비동기 중첩 I/O 작업이 완료가 되면 등록한 Overlapped 구조체의 이벤트 핸들이 Signaled 상태가 되고 그 결과를 GetOverlappedResult를 통해 확인할 수 있었다. 완료 루틴이란 이벤트 핸들을 따로 생성할 필요없이 I/O 작업이 완료되면 자동으로 실행되는 루틴을 가리킨다. 이는 Overlapped 구조체를 등록하는 과정과 마찬가지로 비동기 입출력을 실행하는 함수에 등록하여 사용한다. ex) WriteFileEx BOOL WriteFileEx( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCom..

[Windows] Overlapped I/O

비동기 I/O를 위한 Windows에서 제공하는 API를 정리한다. ※ 동기 I/O와 비동기 I/O 프로그램에서 수반되는 입출력을 현재 실행중인 프로세스나 스레드에서 어떻게 처리할 것 인지에 대한 방법이다. 여러 작업을 동시에 처리하여 다중 CPU를 사용하는 컴퓨터에서 CPU의 이용률을 최대화하는 것이 유리하다. 만약 프로그램의 주 쓰레드에서 I/O 입출력 동작을 필요로 하는 상황에서 입출력이 끝날때까지 블로킹 상태로 놓인다면 입출력이 완료되는 시점에서 다음 실행이 진행되기 때문에 동기적 (Synchronous) I/O를 수행하는 것이다. 하지만 이는, I/O 작업동안 주 쓰레드는 아무것도 하지 않기 때문에 CPU를 최대한으로 이용한다고 볼 수 없다. 반면에 비동기적 I/O는 입출력 동작을 요청하기만 하..

[운영체제] OS관련 용어

기본적인 OS관련 용어를 정리한다. RTOS vs OS RealTime OS는 일반 OS보다 반응 속도가 빠른 운영체제를 지칭한다. 주로 반응 속도가 중요한 시스템에서 사용되며 범용적인 역할을 하는 OS보다 할 수 있는 일이 제한적이다. 반응 시간에 데드 라인이 있을 정도로 제약이 있는 경우 Hard RTOS라고 하며 자동차의 ABS, 에어백 동작과 같은 안전 시스템이나 반응 시간이 중요한 첨단 무기 체계의 시스템을 예로 들 수 있다. 그밖에 일반적인 RTOS를 Soft RTOS라고 한다. 선점형 OS vs 비선점형 OS 선점형 OS: 프로세스마다 우선순위를 부여하고 현재 실행중인 프로세스보다 우선순위가 높은 프로세스가 생성되었다면 그 프로세스를 먼저 실행시키도록 한다. 사용자의 입력에 반응을 하는 프로..

[C++] 메모리 관리 (2) 힙 메모리 new/malloc/HeapAlloc/VirtualAlloc

동적 메모리를 사용하는 이유 - 스택과 힙 프로그래머가 사용할 수 있는 메모리는 데이터 세그먼트, 스택 그리고 힙 영역을 사용할 수 있다. 데이터 세그먼트 영역은 정적 변수를 위한 메모리이기 때문에 주 사용 메모리라고 볼 수 없고 주로 스택과 힙 영역의 메모리를 다루게 된다. 스택 메모리는 함수를 위한 임시 메모리라고 할 수 있다. 실행 흐름에 쓰이는 모든 지역(자동) 변수와 함수 인자, 함수 호출 전 반환 값등을 위해 쓰이며 이 과정이 실행 흐름에서 스택 포인터를 따라 메모리를 차곡 차곡 쌓아가는 모습 때문에 스택이라고 부른다. 컴파일된 실제 어셈블리 코드를 보면 함수 실행 문맥에서 스택 메모리는 레지스터와 함께 값을 저장하기 위해 쓰이며 함수 종료시 현재 스택 포인터 레지스터에 프레임 포인터 레지스터..

Advanced C++ 2021.10.03

[C++] 메모리 관리 (1) Windows 메모리 관리

가상 메모리 관리 Windows에서 제공하는 가상 메모리를 관리하는 방법을 알아본다. 가상 메모리의 상태는 Reserve/Commit/Free를 가지는데, Free는 물리 메모리로 할당되지 않음, Commit은 물리 메모리로 할당된 상태 그리고 Reserve는 물리 메모리로 할당되지는 않았지만 접근을 금지하여 그 영역을 다시 Reserve 하거나 Commit하는 것을 막을 수 있다. 프로세스에 할당되는 메모리 가상 공간을 고정 크기로 나누어 사용하는 것을 페이징 시스템이라고 하는데, 페이지 하나의 크기가 메모리 조각 크기를 결정하게 된다. 가상 메모리를 효율적으로 관리하기 위해 Commit/Reserve/Free 상태를 두는 페이지는 Reserve 예약이라는 상태를 가질 수 있다. 나중에 물리 메모리로 ..

Advanced C++ 2021.10.03

[C#] 분기문

C#에서 보이는 분기문 특징을 알아본다. if-elseif-else 문 C/C++와 용법이 같다. switch 문 일반적인 사용법은 C/C++와 용법이 같다. C#에서 모든 자료형을 담을 수 있는 object 자료형이 있었는데, object 변수에 대한 swtich 문 : object가 갖고 있는 값의 실제 타입으로 분기시킬 수 있다. 또한 string 값으로부터 switch 문을 사용해 분기 시키는 것도 가능하다. namespace HelloWorld { class MainApp { static void Main(string[] args) { object obj = "str"; switch (obj) { case int i: Console.WriteLine($"{i}는 int 형식입니다."); brea..

C#/C# 기본 2021.10.02

[C#] 연산자

C#에서 쓰이는 연산자의 종류 증가/감소 연산자 : ++, -- 산술 연산자 : +,-,/,* 비트 시프트 : 관계 연산자 : , =, !=, == 비트 논리 연산자 : &, ^, | 논리 연산자 : &&, || 할당 연산자 : =, *=, -=, *=, /=, >>=, = is as 7. 관계 연산자 == != 8. 비트 논리 연산자 & 9. 비트 논리 연산자 ^ 10. 비트 논리 연산자 | 11. 논리 연산자 && 12. 논리 연산자 || 13. null 병합 연산자 ?? 14. 조건 연산자 ?: 15. 할당 연산자 = *= /= %= += -= = &= ^= |= 간단한 예제 using System; using System.Globalization; using System.Collections; u..

C#/C# 기본 2021.10.02

[C#] 문자열

String 형식의 문자열과 C#에서 기본으로 제공하는 기능 함수를 살펴본다. - 문자열 탐색 IndexOf() : 지정된 문자나 문자열이 나타나는 첫번째 위치를 찾는다. LastIndexOf() : 끝에서 부터 지정된 문자나 문자열이 나타나는 첫번째 위치를 찾는다. StartsWith() : 지정된 문자열로 시작하는 지 bool로 판별한다. EndsWith() : 지정되 문자열로 끝나는 지 bool로 판별한다. Contains() : 지정된 문자열을 포함하는 지 bool로 판별한다. Replace(string src, string dst) : 지정된 문자열을 찾아서 모두 다른 문자열로 치환한다. - 문자열 변형 ToLower() : 모두 소문자로 ToUpper() : 모두 대문자로 Insert(int ..

C#/C# 기본 2021.10.02