본문 바로가기

전체 글

(270)
메모리 단편화 메모리 단편화는 메모리 공간이 조각나 있어 전체 사용 가능 공간이 충분해도 프로세스를 할당할 수 없는 현상. 메모리 단편화를 최소화하기 위해 가상 메모리를 사용한다. 그 중 페이징 기법은 메모리를 고정된 크기의 페이지로 나누어 관리한다. 프로세스는 필요한 페이지만을 메모리에 요청하여 사용하기 때문에 프로세스 실행을 위해 데이터를 연속적으로 할당하지 않아도 되어 단편화 현상이 심해지는 것을 막을 수 있다. 이때 프로세스가 원하는 페이지가 메모리에 없으면 페이지 폴트에 의해 보조기억장치에서 필요한 페이지를 가져온다. 만약 보조기억장치로부터 가져온 페이지를 적재할 메모리 공간이 부족하면 페이지 교체가 일어난다. 페이지 교체 알고리즘에 의해 보조기억장치로 스와핑되어질 페이지가 선택되고 필요한 페이지와 교체된다...
TLS TLS 는 Transport Layer Security 의 약자이다. 네트워크 통신에서 보안과 개인 정보 보호를 위해 사용되는 암호화 프로토콜이다. 전송 계층에서 동작하는 안전성을 보장하기 위한 표준 프로토콜이다. TLS를 사용하여 제3자가 데이터 송수신간에 데이터 변조 및 참조를 방지한다. 프로토콜 : 컴퓨터 네트워크에서 통신을 규제하고 관리하기 위한 규칙의 집합 TLS의 주요 기능1. 암호화 데이터를 암호화하여 안전하게 통신하는 두 당사자 사이에서 전송되는 데이터를 읽을 수 없도록 만든다. 암호화는 주로 공개키 및 대칭키 암호화 기술을 사용하여 이루어진다. 2. 인증 서버와 클라이언트 간에 서로가 누구인지 확인할 수 있도록 한다. 보안 인증서를 사용하여 이루어지며, 클라이언트가 서버의 신원을 확인하고..
push_back, emplace_back push_back 은 생성된 객체를 넣고, emplace_back 은 정보를 받아 함수 내에서 객체를 생성하여 넣는다. push_back 은 이동 생성자를 호출하고 emplace_back은 호출하지 않는다. emplace_back 을 사용하면 불필요한 객체 생성을 줄일 수 있는 장점이 있지만, 정보만 넣는 특성상 과정이 생략되어져 의도치 않은 결과를 가져올 수 있다. 이러한 결과들은 컴파일러가 잡아주지 않기 때문에 위험하다. 객체를 이동하는 비용이 커질 경우에는 emplace_back 을 사용하여 이동 생성자 호출을 막는 것이 좋다. 실수 및 확실히 알아보기 힘든 코드의 경우에는 push_back 을 사용하여 에러를 방지하는 것이 좋다.
move move 는 rvalue 캐스팅해주는 함수이다. 객체를 인자로 전달하면 rvalue 로 캐스팅 해준다. std::vector v; std::string str = "aaa"; v.push_back(std::move(str)); str.clear(); 위와 같은 상황에서 str 은 move 에 의해 rvalue 로 캐스팅되어진다. v 에 push 되는 객체는 str 이 가리키는 메모리를 받고 str 은 nullptr 이 할당된다. 따라서 str 은 요소와 관련한 함수를 호출 할 수 없지만 clear 할 수 있다. 복사와 이동 차이 복사의 경우 복사가 되어질 근본 변수가 유지된다. 이동의 경우 근본 변수가 사용되어지지 않는다는 가정이 있을 경우 사용되며 이동 후 nullptr 된다. 이동은 기존 변수의 소유..
클래스의 기본 메소드 6가지 정리 1. 기본 생성자 2. 기본 소멸자 3. 복사 생성자 4. 복사 대입 연산자 5. 이동 생성자 6. 이동 대입 연산자 1. 기본 생성자 객체 생성 시 사용자가 초깃값을 명시하지 않았을 때, 컴파일러가 자동으로 제공하는 생성자. 특정 경우에 자동으로 삭제된다. 1. & 혹은 const 멤버변수가 있을 때 2. 기반 클래스의 기본 생성자가 삭제 됐을 때 3. 기반 클래스가 기본 소멸자가 삭제 됐을 때 4. 멤버 변수의 기본 생성자가 삭제 됐을 때 2. 기본 소멸자 객체의 수명이 끝나면 컴파일러에 의해 자동으로 호출되는 함수. const, volatile, static 으로 선언되 수 없다. 생성자는 여러개 가질 수 있지만 소멸자는 하나만 가질 수 있다. 인자를 가지지 않는다. 특정 경우에 삭제된다. 1. s..
프로그래머스 타겟 넘버 Dfs 사용 시 for 문 안씀 생각. for 문을 쓴다면 모든 경우를 확인할 경우 #include #include #include using namespace std; vector num; vector visited; int tarNum; int DfsSum(int index, int sum) { int ans = 0; if(index == num.size()) { if(sum == tarNum) { return 1; } return 0; } ans += DfsSum(index + 1, sum + num[index]); ans += DfsSum(index + 1, sum - num[index]); return ans; } int solution(vector numbers, int target) { in..
프로그래머스 피로도 탐색에서 다시 돌아온다면 방문을 다시 false 로 만들어주자. 탐색 재귀 시에 그냥 인덱스 쪽에 + 1 만 해주면 되는 경우를 항상 생각하자. 던전의 방문 최대 횟수는 던전의 총 갯수 일 것이기 때문이다. 방문 불가 시 어짜피 다음 던전으로 이동한다. 또 k 의 값을 함수 내에서 변화를 주지 말자. 함수 구현부에서 변화를 주면 해당 반복문 동안 k의 값이 변해있어 문제 풀이가 어렵다. 아래 구문처럼 k를 매개변수로 넣을 때 - 해주자. 그럼 for 문에서 의 k 값에는 변화가 없지만 Dfs 에 재귀 되어질 k 값은 변화가 있다. #include #include using namespace std; vector inDun; vector visited = vector(8, false); int answer..
03 - 2 명령어 2 명령어는 연산 코드와 오퍼랜드로 구성 된다.명려어가 수행할 연산을 연산 코드, 연산에 사용할 데이터나 주소 를 오퍼랜드라고 한다.연산 코드는 연산자, 오퍼랜드는 피연산자라고도 부른다.연산 코드가 담기는 영역을 연산 코드 필드, 오퍼랜드가 담기는 영역을 오퍼랜드 필드라고 한다.기계어와 어셈블리어는 명령어라서 연산 코드와 오퍼랜드로 구성된다.오퍼랜드연산에 사용할 데이터나 데이터의 주소 값이다.대부분의 경우에는 메모리 주소 혹은 레지스터 이름을 담기에 주소 필드라고도 부른다.오퍼랜드는 하나의 명령어 안에 존재하지 않거나 다수 존재할 수 있다.가령 오퍼랜드가 없이 연산 코드만 있다면 >> ( 0 - 주소 명령어 )오퍼랜드가 하나 이면 >> ( 1 - 주소 명령어 ) 가 되는 것이다.연산 코드연산 코드는 말 그대..