수강 목적C 프로그래밍 수업을 들으면서 저수준에서 메모리를 관리하고 어셈블리어까지 컴퓨터 공학적인 지식을 배우는 것이 즐거웠다. C++ 도 언매니지드 프로그래밍 답게 메모리 관리 측면에서 개체지향까지 곁들여서 어떤식으로 처리할 수 있는지 궁금했다. C++ 은 사실 학교에서도 OpenCV 로 이미지 처리를 하고, 인턴을 통해 SVM Top View 를 개발할 때도 썼었지만, 거의 로직 위주의 개발이 많았고, C++ 과 언매니지드 프로그래밍 관점에서는 놓치는 부분이 많았다. 개인적으로 로직에 집중하는 것도 좋지만, 저수준에서 메모리 관리를 직접 해보고 동작하는 것을 보는 것이 가려운 부분을 긁어주는 부분이 컸기 때문에, 이번 강의는 재밌을 것 같았고, 개체지향 관점에서의 메모리 관리도 알아볼 수 있겠다고 생..
수강 목적이번에는 개체지향 프로그래밍 및 설계 강의를 들었다.본인은 이미 백엔드 개발자이기 때문에 자바에는 익숙한 상태였다. 하지만 비전공자로서 늘 기초 지식에 대해서 깊게 배우는 것에 대한 갈망이 남아있고, POCU 의 모든 과정을 듣기로 결심했다. 개체지향을 어느정도는 알고 있었지만, 관련 실습, 과제들이 어떻게 나오는지 궁금하기도 했고, 포프 선생님이 생각하는 개체지향에 대한 내용을 알고 싶었다.강의 내용이번 개체지향 강의는 다른 과목들과 달리 추상적인 내용이 많았다. OOP 의 필요성부터 OOP의 4대 특성까지 예시를 들어가며 설명해주셔서 더 잘 이해할 수 있었다. 또 개체지향 '설계' 를 위해 상속을 이해하기 위한 방법, 개체 모델링등을 실 생활 예제를 통해 설명해주셔서 어느 상황에 적절하게 ..
수강 목적POCU 아카데미의 로드맵을 쭉 따라가서 "전문 프로그래머가 되기 위한" 과정을 밟아가고 싶었다. 현재 총 7개의 로드맵이 열려있는데, 이제 3개의 로드맵이 끝났다. C 프로그래밍 수업은 사실 대학교때도 수업을 들었다. 하지만 C언어로부터 컴퓨터 공학 지식을 배운다기보다는 단순히 그 언어를 배우는데 초점을 두고 배웠기 때문에 당시에 공부를 할 때도 깊은 이해를 할 수 없었던 것 같다. 과목 이름에서도 "언매니지드" 가 붙어있듯이 "관리되지 않는" 이라는 말을 몸소 경험해보고 싶었다. 백엔드 개발자로 살아가고는 있지만, 기초를 잘 아는 것이 항상 중요하다고 생각했고 이러한 욕망은 COMP2200 수업으로 채우기에 충분했던 것 같다.강의 내용POCU 강의를 여러번 들어본 결과, 항상 초반에는 해당 ..
CPU가 4바이트 정수에 접근할 때, 캐시 히트를 하지 못하면 간단히 캐시에 4바이트 정수를 저장하면 된다고 생각함.그러나 그렇지 않음.캐시와 메모리 상호 작용의 기본 단위: 캐시 라인프로그램이 어떤 데이터에 접근하면 다음에는 인접한 데이터에 접근할 가능성이 높으므로 접근해야 할 데이터만 캐시에 저장하지 않음.해당 데이터가 있는 곳의 ‘묶음’ 데이터를 캐시에 저장함.이를 캐시 라인 이라고 함.묶음 데이터는 일반적으로 64바이트임.캐시와 메모리 사이의 상호 작용에 대한 세부 내용은 다중 스레드 프로그래밍이고, 일반인이라면 생각해 낼 수 없음. → 매우 흥미로운 문제를 가져옴.첫 번째 성능 방행자: 캐시 튕김 문제atomic a;void threadf(){ for (int i = 0; i atomic a;v..
최신 컴퓨터 시스템에서 프로그램이 메모리에 접근할 때 캐시의 적중률이 매우 중요함.캐시 친화적인 프로그램을 작성하여 캐시 적중률을 향상 시켜야 함. 프로그램 지역성의 원칙지역성이란 프로그램이 ‘매우 규칙적으로’ 메모리에 접근한다는 의미임.프로그램이 메모리 조각에 접근하고 나서 이 조각을 여러 번 참조하는 경우 → 시간적 지역성(temporal locality) 라고 함.시간적 지역성은 캐시 친화성이 매우 높음.데이터가 캐시에 있는 한 메모리에 접근하지 않아도 반복적으로 캐시의 적중이 가능함.프로그램이 메모리 조각을 참조할 때, 인접한 메모리도 참조할 수 있음. → 공간적 지역성(spatial locality) 라고 함.캐시가 적중하지 않으면 메모리의 데이터를 캐시에 적재해야 함.일반적으로 요청한 메모리의..
프로그램이 실행되는 동안 CPU는 메모리와 빈번하게 상호작용 해야 함.캐시, 어디에나 존재하는 것폰 노이만 구조에서는 CPU가 실행하는 기계 명령어와 명령어가 처리하는 데이터가 모두 메모리에 저장되어 있어야 함.하지만 레지스터 용량은 극히 제한되어있기에, CPU는 반드시 빈번히 메모리에 접근하여 명령어의 데이터를 가져와야 함.또 명령어 실행 결과도 메모리에 다시 기록해야 함.CPU와 메모리 속도가 서로 잘 맞는지 확인해야 함.CPU와 메모리의 속도 차이시스템 성능의 속도가 상대적으로 느린 쪽에 맞추어 제한됨.CPU와 메모리의 속도가 같아야 가장 좋은 성능을 발휘할 수 있는 나무통 원리(cannikn law)를 만족함.하지만, CPU와 메모리는 시간이 지날 수록 속도 차이가 남.속도가 미친듯이 빠른 CPU..
함수 호출과 실행 시간 스택함수를 호출할 때, CPU가 호출된 함수의 첫 번째 기계 명령어로 점프한 이후 함수 실행이 완료되면 다시 원래 위치로 점프해야 함.함수 상태의 보존과 복원을 포함해야함.보존해야하는 상태 정보에는 반환 주소 뿐만 아니라 사용한 레지스터 정보도 포함됨.함수 A가 함수 B를 호출할 때 실행 정보는 함수 A 스택프레임에 저장됨.함수 B가 실행 완료되면 스택 프레임 정보를 기반으로 함수 A의 실행이 재개됨.시스템 호출과 커널 상태 스택디스크 파일을 읽고 쓰거나 새로운 스레드 생성할 때, 누가 파일을 읽고 쓰는 작업을 하는가? 누가 스레드를 생성하는가?운영체제ex) open 함수 호출 → 운영 체제가 파일을 여는 작업을 진행함.응용 프로그램은 시스템 호출을 통해 운영 체제에 서비스를 요청..
컴퓨터 시스템에는 함수 호출, 시스템 호출, 프로세스 전환, 스레드 전환, 인터럽트 처리와 같은 구조들이 있음.함수 호출을 통해 프로그래머는 코드 재사용성을 개선할 수 있음.시스템 호출로 프로그래머는 운영체제에 요청을 보낼 수 있음.프로세스와 스레드 전환으로 다중 작업이 가능함인터럽트 처리로 운영 체제가 외부 장치를 관리하게 할 수 있음.이러한 구조는 컴퓨터 시스템의 기반이 됨.레지스터레지스터를 사용하는 이유는 바로 속도 때문임.CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도의 대략 100분의 1정도임.사실 레지스터와 메모리는 본질적 차이가 없음. 둘 다 정보를 저장하는데 사용함.단지 레지스터의 읽기 쓰기 속도가 훨씬 빠르고 제조 비용도 훨씬 비싸기에 용량에 한계가 있을 뿐임.스택 포인터 (스..
프로그래머는 모두 인터페이스 개념을 알고 있음.CPU 에 있어 인터페이스란?명령어 집합을 의미함.인터페이스에 해당하는 명령어 집합은 변경할 수 없지만 CPU 내부 구현, 즉 명령어 실행 방식은 변경이 가능함.이를 이해한 천재적인 엔지니어는 마이크로 명령어 개념을 제시함. 이길 수 없다면 함께하라: RISC와 동일한 CISC축소 명령어 집합의 주요 장점은 파이프라인 기술을 잘 활용할 수 있다는 것이었음.반면 복잡 명령어 집합은 명령어 실행 시간이 고르지 않아 파이프라인을 활용할 수 없었음.간단히 생각하면 복잡 명령어 집합이 축소 명령어 집합에 가깝게 변하면 문제가 해결됨.바로, 복잡 명령어 집합의 명령어를 CPU 내부에서 축소 명령어 집합의 간단한 명령어로 변환하는 것임.축소 명령어 집합의 간단한 명령어와..
시간이 흐르고 기술이 발전하면서 더이상 컴파일러와 저장 장치의 용량 제한 같은 객관적 조건의 제한을 받지 않음.메모리 용량 대비 가격이 급격히 떨어지기 시작함.컴파일러 기술이 발전해 프로그래머도 점점 고급 언어로 프로그램을 작성하기 시작함.복잡함을 단순함으로컴퓨터 과학자 데이비드 패터슨은 다음과 같이 말함.복잡 명령어 집합에서 성능을 향상 시키는 것으로 여겨지는 명령어는 실제로 CPU 내부 마이크로코드에 의해 가로막힘.오히려 마이크로코드를 제거하면 프로그램이 더 빠르게 실행되며, CPU를 구성하는 트랜지스터를 절약할 수 있음.마이크로코드 설계 아이디어는 복잡한 기계 명령어를 CPU 내부에서 비교적 간단한 기계 명령어로 변환하는 것임.컴파일러는 이 프로세스를 알지 못함.마이크로코드에 버그가 있으면 컴파일러..