728x90
반응형

CS Interview 37

Thread, 스레드란?

정의 Thread is a basic unit of CPU utilization. CPU, 프로세서 사용의 기본 단위를 말한다. 왜 프로세스가 아닌 스레드가 동작하는 최소단위인가? 동일한 목적을 가진 프로세스가 여러 개가 된다면 code, data stack을 따로 만들어야한다. 하지만 같은 일을 한다면 필요한 데이터를 굳이 2번 만들필요는 없다. (같은 일을 처리하기 위해 동일한 프로그램을 여러 개의 프로세스로 만들게 되면, 그만큼 메모리를 차지하게 되고 PCB 도 각각 만들어야되고 프로세스간 통신을 위해 비용이 커진다.) 데이터의 각 부분만 다르게 각자 읽어서 수행하는 것이 더 효율적이라는 말이다. CPU 수행에 관련된 부분은 나누되 나머지 메모리, 자원같은 것들을 공유하며 존재한다. **Stack ..

CS Interview 2021.06.29

Process, 프로세스란?

21.11.01 Update (멀티 프로세스 내용 추가) 정의 실행 중인 프로그램, Program in execution이다. 다시 말하지만 프로그램 자체는 프로세스가 아니다. 프로그램은 명령어 리스트를 내용으로 가진 디스크에 저장된 파일, 단지 실행 파일일 뿐인다. 그래서 수동적인 존재라고도 한다. 프로세스 문맥교환이란? (Context Switching) 문맥교환은 CPU 레지스터에 저장된 한 프로세스의 상태 정보를 저장하고, 다른 프로세스를 위한 새로운 상태 정보를 레지스터로 읽어 들이는 연산이다. (CPU에서 일어나는 일) PCB는 프로세스가 실행되지 않을 때 기존의 CPU 레지스터를 복사해서 가지고 있는다. 즉, 한 프로세스의 실행이 멈추었을 때는 모든 CPU 레지스터의 내용응 PCB에 저장해놓..

CS Interview 2021.06.28

Virtual Memory, 가상메모리란?

가상메모리란 메모리를 관리하는 방법으로 실제 메모리 주소가 아닌 논리적 주소를 이용해서 관리한다. 이로써 실제 주기억장치보다 큰 프로그램도 적재할 수 있다고 사용자에게 Illusion을 준다. 다시 말하면 프로그램의 일부만 실제로 적재함으로써 즉, 실제로 프로그램 수행에 필요한 부분만 메모리에 올려놓음으로써 주기억장치의 용량보다 큰 프로그램파일이라도 사용자가 메모리에 올려놓을 수 있게 하는 기법이다. 왜쓰냐?? 실제 주기억장치의 크기보다 더 큰 공간을 사용할 수 있다. 가상 주소 공간을 통해 논리적으로는 연속성을 가지게 되고(물리적 x) Translation을 통해 실제 물리적 메모리에 매핑되기 때문에 물리적주소에 대해 알 필요가 없어진다. -> 메모리에 직접 올리게 되면 주기억장치의 한계로 파편화가 발..

CS Interview 2021.06.28

Cache, 캐시란?

물론 캐시에 대해서 할 말은 많지만 우아한 테크톡의 설명을 보면서 https://www.youtube.com/watch?v=c33ojJ7kE7M&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=123 을 보면서 같이 내 언어로 바꿔보는 시간을 가져보려고 한다. # 동영상의 내용 메모리의 속도와 용량은 반비례? 설명이 틀렸다. 속도와 가격이 비례라고 하는 것이 더 맞는 표현이겠다. 메모리 계층구조가 왜 나왔는지를 설명하기에 조금 부족했다. 메모리 계층 구조는 locality를 이용하기 위해 나왔는데 계층구조를 설명하고 그 다음에 locality를 설명했다. 파레토 법칙을 이용해서 캐시의 지역성을 설명하는 것은 좋았다. 배열에 대해서는 단일 메모리 블럭, 연속된 메모리를 사..

CS Interview 2021.06.23

Tree 자료구조

우리가 흔히 보는 위와 같은 그림이 트리구조이다. 왜 Tree냐면 나무를 거꾸로 박아놓은 것처럼 생겼기 때문이다. 그래서 시작이 Root Node라고 부른다. 실제로 물론 한 노드에 여러가지 노드를 가질 수 있지만 우리는 이진 트리, Binary Tree라고 가정하고 진행한다. 각 노드는 자신의 밑에 있는 2개의 노드를 가리킨다. struct Node{ std::string data; node* first; node* second; }; 각 노드들은 자신의 하위 노드를 가리킨다. 즉, 이를 통해서 계층적 구조를 나타낼 수 있다. 트리구조를 처음 만들기 위해서는 Root Node가 필요하다. 해당 노드는 처음에 first와 second가 NULL이다. 내가 예전에 썼던 글이다. 내가 다시 쓰기보다 아래 글..

CS Interview 2021.06.15

비선형 자료구조를 사용하는 이유

앞서 선형 자료구조만을 공부했는데 비선형 자료구조는 왜 필요할까??? 모든 것이 선형구조가 효율적이지 않음을 알기 때문이다. 알아보자 선형 자료구조로 표현할 수 없는 문제가 생긴다. 계층적 문제와 순환 종속성 문제다. 계층적 문제란 가계도, 어느 단체의 조직도, 고등학교 교육과정 등 다양한 예가 있다. 그냥 이런 것과 비슷하다. 과연 이것의 의미를 선형 자료구조가 담을 수 있을까? 라고 생각해보면 된다. 순환 종속성 문제란 아래와 같다. ABC 순서대로 그냥 저장하면 위의 정보가 전달이 될까? 아무튼 위와 같은 문제들은 비선형 자료구조의 필요를 가져왔고 우리는 트리, 그래프라는 자료구조를 배우게 되었다. 차차 알아보자

CS Interview 2021.06.15

C++에서 vector의 단점을 극복한 deque

[프로그래밍언어(Programming Language)/C || C++] - Deque, 덱 , 자료구조 [CPP] 물론 덱에 대한 글은 썼지만 그냥 사용법만 적어놨다. 아무래도 모든 자료구조는 trade-off 관계일 수 밖에 없다. 하지만 이익을 최대한보고 손해를 최소한으로 하는 인간의 끊임 없는 노력은 vector의 단점마저 극복하고자 하였다. vector에서 push_front() 는 insert로 대신한다고 하였다. erase도 마찬가지다. 즉, 맨 앞에서 일어나는 삽입과 삭제는 cost가 높다. 즉, 시간이 오래걸린다. 그래서 사람들은 덱을 만들어냈다. 덱은 아래 3가지의 조건을 만족해야 한다. push_front(), pop_front(), push_back(), pop_back()에 있어서..

CS Interview 2021.06.15

C++ 에서의 자료구조 list를 쓰는 이유

우선 forward_list가 기름기를 뺀 리스트라면 이건 건강한 음식인 list이다. 이 list는 이중 연결 리스트, doubly-linked list 구조로 되어 있다. 때문에 prev를 가리키는 포인터가 있기에 더 메모리를 먹는다는 점부터 알고 시작하자. 다시 말해서 데이터, 다음 노드를 가리키는 포인터, 이전 노드를 가리키는 포인터 3가지를 가지고 있다는 것이다. forward_list와 list의 차이점은 list에서 _after로 끝나는 함수들이 이제는 after가 없어진다. insert_after -> insert emplace_after -> emplace 왜냐하면 원소 이동을 역방향으로도 가능하니까 원소 삽입이나 삭제를 위해 특정 원소의 이전 원소 반복자를 제공하지 않아도 되니까..? ..

CS Interview 2021.06.15

C++에서 반복자, iterator의 차이

연결된 구조, 연속된 구조에서 둘 다 반복자, iterator를 쓰지만 서로 다르게 구현되어 있다. 그도 그럴 것인게.. 메모리 주소 접근 방식을 생각해보면 쉽다. 단일 메모리 블럭에 들어있는 주소에 접근과 여러 메모리 블럭에 퍼져있는 주소에 접근하는 것은 다를게 분명하기 때문이다. 배열이나 벡터에서 우리가 쓰는 iterator는 random access iterator라고 한다. 임의의 위치에 바로 접근이 가능하다. forward_list 에서 쓰는 iterator는 forward iterator라고 한다. **하지만 양방향 연결리스트를 들어봤다면 bidirectional iterator도 있겠네라고 생각할 수 있다. 정확하게 맞다. 아무튼 위 연결된 구조 연속된 구조와 다르게 임의의 위치에 바로 접근..

CS Interview 2021.06.15
728x90
반응형