서평

[나는 리뷰어다] 혼자 공부하는 컴퓨터구조+운영체제

작삼심일 2022. 12. 24. 15:17

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

혼자 공부하는 컴퓨터구조 + 운영체제

이번에 리뷰할 도서는 <혼자 공부하는 컴퓨터구조+운영체제>입니다. 컴퓨터 공학을 전공하지는 않았지만, 예전에 간혹 프로그래밍 관련 책을 보면 컴퓨터 구조나 운영체제에 대해 심도 깊게 다루는 것을 본 적이 있었습니다. 하지만 최근 프로그래밍 분야의 책이나 강의, 블로그 등을 찾아보면 이런 내용들을 간단히 언급하거나 아얘 다루지 않고 "Hello world"만으로 시작하는 경우가 대부분입니다.

물론 최근 소프트웨어 분야에서 컴퓨터구조나 운영체제에 대해 소홀한 부분은 대부분의 디테일은 사용자가 직접 관여하지않아도 잘 작동할 수 있도록 숨겨져 있습니다. 하지만 아는 만큼 보인다고, 개발 실력을 높이기 위해선 하드웨어까지 신경 쓸 수 있어야 합니다.

가령 2차원 행렬에 대한 연산을 프로그래밍 언어로 직접 구현해 본다고 생각해 보겠습니다. 그 중 두 행렬의 덧셈에 대해 구현한다고 생각하면 다음과 같이 구현해볼 수 있다.

#include <vector>

using namespace std;

vector<vector<double>> add_1(vector<vector<double>> lhs, vector<vector<double>> rhs) {
	vector<vector<double>> result(lhs.size(), vector<double>(lhs[0].size());
    
    for (size_t r = 0; r < lhs.size(); ++r) {
    	for (size_t c = 0; c < lhs[0].size(); ++c) {
        	result[r][c] = lhs[r][c] + rhs[r][c];
        }
    }
    return result;
}

vector<vector<double>> add_2(vector<vector<double>> lhs, vector<vector<double>> rhs) {
	vector<vector<double>> result(lhs.size(), vector<double>(lhs[0].size());
    
    for (size_t c = 0; c < lhs[0].size(); ++c) {
    	for (size_t r = 0; r < lhs.size(); ++r) {
        	result[r][c] = lhs[r][c] + rhs[r][c];
        }
    }
    return result;
}

두 행렬의 크기가 같아야 한다는 것과 같은 세부사항은 제외하고 보면 두 행렬의 덧셈을 공식대로 구현하였습니다. 위 코드에서는 add_1과 add_2라는 두 개의 함수가 있습니다. 두 함수는 거의 내용이 동일하지만, 반복문의 순서가 약간 차이가 있습니다. add_1의 경우 행에 대한 반복문 (r) 안에 열에 대한 반복문 (c)가 있고, add_2의 경우에는 반대로 열에 대한 반복문 안에 행에 대한 반복문이 있습니다. 이러한 순서의 차이를 시각적으로 표현하면 아래 그림처럼 나타낼 수 있습니다.

두 함수의 차이는 아주 작아 보입니다. 하지만 컴퓨터 구조에 대해 알고 있다면 add_2와 같은 방법은 특별한 이유가 없다면 사용하지 않을 것입니다. 이에 대해 간략히 설명하면, 메모리 상에 있는 데이터를 CPU가 접근해야 할 때 효율적이기 위해 다음 연산에 필요할 것으로 예상되는 변수를 CPU 내부에 위치한 캐시 메모리에 저장하게 됩니다. 이때, add_1의 경우 인접한 메모리를 순차적으로 연산하기 때문에 캐시 메모리에 저장한 데이터가 유효한 정보가 되고, add_2의 경우 멀리 떨어진 메모리를 반복해서 연산하게 되어 캐시에 올라간 정보는 무용지물이 됩니다. 따라서 간단한 내용이지만 일부 연산에 대해 연산량을 줄일 수 있게 됩니다.

과거에는 한정된 자원에서 얼마나 효율적으로 구현할 수 있는지가 개발에 있어서 중요한 항목이었다면, 지금은 넘처나는 자원을 통해 등한시되고 있습니다. 하지만 컴퓨터구조에 대해 학습하고 운영체제의 동작 원리를 이해하는 것은 불필요하게 낭비되는 자원을 줄일 수 있고, 개발 과정에서 필연적으로 마주치게 되는 운영처제나 컴퓨터구조에 대한 용어들을 잘 이해할 수 있도록 도와줍니다.

조코딩 유튜브 채널 컴퓨터구조+운영체제 저자 직강 영상

 

 

728x90
반응형