Uknow's Lab.
article thumbnail

 

 

 

 

 

들어가기에 앞서

컴퓨터 구조론과 운영체제. 컴퓨터 관련 전공을 한 사람이라면 수강했을 과목입니다.

저 역시 마찬가지로 수강을 하였으나... 사람의 뇌는 휘발성인 법...

CS 면접 질문에 대비하기 위함인 것도 있지만 

단순 CS 면접 질문 대비를 떠나서

개발자로써 더 나은 개발자가 되고 더 깊게 알기 위해서는

컴퓨터 구조론과 운영체제 지식은 필수라고 생각했기에

다시 한 번 공부해보자는 마음을 갖고 있었습니다.

 

 

 

그러던 중 인스타를 보다가 혼공학습단 11기를 모집한다는 광고를 보고

마침 잘 됬다 싶어 컴퓨터 구조론 + 운영체제를 선택해 지원했더니 선정되었습니다.

 

다른 도서들에 비해 혼공컴운이 압도적으로 많더라고요... 저와 비슷한 생각을 가진 분이 많았나봅니다.

아무튼 스터디도 참여했겠다, 열심히 해봐야겠네요!

 

 

 

컴퓨터 구조와 운영체제를 어째서 알아야 하는가?

 

운영체제에는 여러 종류가 있습니다. 저는 윈도우, 맥 OS, 안드로이드, 리눅스로 네 개의 운영체제를 쓰고 있는데요.

개발할 때에는 윈도우(데스크탑)와 맥 OS(노트북)을 번갈아가며 개발하는데,

간혹가다 윈도우에서 Github에 push한걸 맥에서 pull/clone 해오면 작동이 되지 않는 경우가 종종 있었습니다.

서로 다른 운영체제가 아니라 같은 윈도우 환경 / 맥 OS 환경에서도 타인의 컴퓨터에선 작동하지 않는 경우도 있었고요.

 

 

 

이상하다 분명 내 컴에서는 되는데;

Docker 사용합시다...

 

 

이럴 때 컴퓨터 구조와 운영체제에 관한 지식이 있다면 조금은 실마리를 찾을 수 있습니다.

지식이 있는 순간, 미지의 대상이 아닌 분석의 대상이 되는 것이지요.

 

컴퓨터 구조와 운영체제 지식이 단순히 오류가 발생했을 때 고치기 위해서만 필요한 것은 아닙니다.

제가 개발한 프로젝트를 배포할 때에는 서버가 필요한데요.

서버를 구축할 때 어떤 걸 선택하냐에 따라 성능, 용량, 비용이 달라집니다.

돈이 아주 많다면 아무 고민 없이 단순히 초고사양을 선택할 수 있겠으나,

이익 집단인 회사에서는 성능, 용량, 비용을 따져 계산해야만 하며, 이는 단순 개발(코딩)만 잘해서는 파악하기 어렵습니다.

컴퓨터구조 지식이 도움이 될 수 있겠군요.

 

운영체제 지식 또한 개발에 많은 도움을 줍니다.

스레드나 코루틴을 사용하여 동시성 처리를 할 때,

임계 구역이나, 공유자원, 교착 상태와 같은 지식이 큰 도움이 되니까요.

저도 안드로이드를 할 때 Kotlin Coroutines로 동시성 프로그래밍을 했을 때

관련 지식이 빈약해 다소 버벅였던게 기억납니다. 🤣

 

이외에도 C/C++의 메모리 동적할당/관리나 자바의 스케쥴링 처리 기법이라던가, 가비지컬렉터 등도

언어와 운영체제 사이에 있는 지식이라 생각되기도 해서,

운영체제를 알면 이들을 이해하는데도 도움이 될 것 같네요. 👏

 

 

 

 

컴퓨터는 바보다. 아는 건 데이터와 명령어 뿐이다.

어릴때엔 컴퓨터가 엄청난 똑똑이인줄 알았습니다!

고등학교 때 처음으로 코딩을 접한 뒤 게임할때도 안쳤던 키보드 샷건을 치기 전 까진.

 

컴퓨터가 알고 있는 것은 오직 데이터명령어 뿐 입니다.

이미지, 동영상, 숫자, 문자 등을 저장하고

이 정보 덩어리들을 명령어를 입력해가며 가공하고 조회하는 것이지요.

 

 

 

컴퓨터의 4가지 핵심 부품

 

컴퓨터는 여러 종류가 있습니다.

흔하게 볼 수 있는 데스크탑/노트북과 스마트폰,

아두이노/라즈베리파이와 같이 작은 컴퓨터, TV 셋톱박스도 컴퓨터입니다.

 

수많은 종류가 있지만, 핵심이 되는 부품은 다르지 않습니다.

바로 CPU (Central Processing Unit, 중앙처리장치),

주기억장치 (Main Memory - RAM/ROM)

보조기억장치 (Secondary Storage),

입출력장치 (Input/Output Device)

4개 입니다.

 

메모리는 현재 실행되는 프로그램이 위치한 곳입니다.

일반적으로 프로그램이라 하면 그냥 깔려 있는 프로그램, 실제 실행되는 프로그램을 구분하지 않습니다만

프로그램과 프로세스를 나누어 설명할 때엔

프로그램은 하드디스크 내에 저장된 소스코드를 의미합니다.

메모리가 할당되어 프로그램이 실행되고 있는 상태를 프로세스라 합니다.

 

중앙처리장치(이하 CPU)는 명령어를 읽어들이고, 해석하고, 실행하는 부품입니다.

뇌라고도 할 수 있지요.

 

메모리는 휘발성이기에 전원을 껏다가 키면 저장된 내용을 잃습니다.

때문에 이를 어딘가에 저장해놓아야 하는데,

이때 사용하는 것이 보조기억장치입니다.

컴퓨터가 꺼져도 데이터가 남아있을 수 있도록 저장해놓는 장치이지요.

HDD, SSD, USB, DVD 등이 있습니다.

 

 

입출력장치는 다른 장치들에 비해선 직관적입니다.

마이크, 스피커, 프린터, 마우스, 키보드처럼 컴퓨터에 연결하여

컴퓨터와 정보를 교환할 때 쓰이는 장치들이지요.

 

 

 

0과 1의 세계

평소 우리는 10진법을 사용합니다.

1,2,3, ... ,8, 9, 10.

9를 넘어가는 시점에서 자리 올림을 합니다. 19, 29도 마찬가지입니다.

시간과 날짜의 경우, 시(Hour)의 경우는 24진법, 분과 초는 60진법, 년은 365진법을 사용하지요.

 

반면 컴퓨터는 2진법을 사용합니다.

전류가 흐르냐 흐르지 않느냐, 단 두 가지의 상태를 표현하기에 2진법을 사용합니다.

이와같이 0과 1로 나타내는 가장 작은 정보 단위를 비트(bit)라고 합니다.

9가 넘어가는 순간 자리 올림을 했듯,

1이 넘어가는 순간 자리 올림을 함으로써 0, 1 보다 큰 수를 표현합니다.

 

 

 

2진법과 16진법

 

2진법으로 표현하기엔 간혹 길이가 너무 길어진다는 문제점이 있습니다.

때문에 컴퓨터 세상에서는 2진법 말고도 16진법도 자주 사용합니다.

2진법과 16진법의 변환이 타 진법에 비해 간편하기 때문입니다.

2진법을 4개씩 끊어 읽어 이진법<->십육진법으로 변환해 이어붙여주면 됩니다.

 

 

16진법에서는 0~9와 A~F를 사용해 표기합니다.

9 다음 10 대신 A, 11대신 B를 사용하며, 16이 되는 순간 자리 올림을 하여 10이 됩니다.

16진법의 10은 사실 10진법으로 16을 의미합니다.

 

 

가장 친숙한 예제는 컬러를 표현할 때 사용하는 헥사코드일 것 같네요.

기존의 RGB(0~255, 0~255, 0~255) 대신 6자리의 숫자로 색상을 표현합니다.

 

 

 

0과 1로 문자 표현하기 : 아스키 코드

0과 1로 이루어진 컴퓨터 세상이지만, 문자를 표현할 수 있습니다.

 

0~127까지 각각의 고유한 수에 일대일로 대응됩니다.

A를 표현할 때 숫자 65를 사용하여 표기할 수 있습니다.

자세한 내용은 아래 포스팅을 참고해주세요.

https://uknowblog.tistory.com/5

 

ASKII(아스키 코드)를 이용한 문자출력

ASCII (American Standard Code for Information Interchange, 미국 정보 교환 표준 부호) 아스키 코드 (ASKII)란 7개의 비트를 사용하여 2^7 = 128,000(0x00)부터 127(0x7F)까지 총 128개의 문자를 표현할 수 있다. (8개 비트

uknowblog.tistory.com

 

 

 

 

소스 코드와 명령어

C/C++, 자바, 파이썬과 같은 프로그래밍 언어로 프로그램을 작성하면,

컴퓨터는 이를 그대로 알아들어 프로그램을 실행할까요?

 

기계어로 작성된 코드

아닙니다.

컴퓨터는 오직 저급언어만 알아들을 수 있습니다.

C/C++, 자바, 파이썬 등과 같은 고급언어로 프로그램을 작성하면

별도로 저급언어로 변환되어 컴퓨터가 알아들을 수 있는 형태로 만들어집니다.

사람의 언어에 가까울수록 고급 언어, 위와 같은 기계어에 가까울 수록 저급 언어라 표현하는데요.

C/C++를 배울 때엔 파이썬에 비해 굉장히 로우 레벨 언어라 느꼈지만,

기계어에 비하면 꽤나 하이 레벨 언어라는 느낌이 들죠?

 

그럼 기계어를 굳이 알아야 할 필요가 있을까요?

이는 어떤 개발자가 되냐에 따라 다릅니다.

평생 기계어를 볼 일도 만질 일도 없는 직군도 있는가 하면,

게임, 임베디드, 정보보안과 같이 하드웨어와 밀접할 수록 기계어/어셈블리어를 사용할 수 있습니다.

 

언리얼을 공부하는 후배가 있는데,

알 수 없는 오류를 해결하고자 컴파일된 어셈블리어를 까보며 고통받던게 기억나네요 🤣

아 난 게임 개발 안해서 다행이다 

 

 

 

컴파일

개발자들이 고급 언어로 작성한 프로그램은

크게 컴파일과 인터프리터라는 두 가지 방식으로 저급 언어로 변환됩니다.

 

 

컴파일(Compile) 언어로는 C/C++, Java, Kotlin 등이 있습니다.

컴파일을 수행하는 컴파일러(Compiler)가 개발자가 작성한 코드 전체를 훑어보며 저급 언어로 변환합니다.

전체를 한 번에 훑기 때문에 이 과정에서 컴파일 에러가 하나라도 발견되면 컴파일이 중지됩니다.

컴파일 에러로는 흔히 실행 가능한 코드인지, 문법적인 오류는 없는지를 확인하는 과정인데요.

예를 들어 print("HelloWorld")를 prnt("HelloWorld")등으로 오타를 냈다거나,

세미콜론을 붙여야 하는 언어인데 세미콜론을 빠뜨렸거나 하는 오류입니다.

 

개발자 입장에서는 사실 가장 반가운 오류인데요.

런타임 환경에서 발생하는 오류에 비해 잡기 수월하고,

실제 서비스 시작 전에 잡을 수 있기에 너무나도 고마운 오류입니다.

 

 

 

인터프리터

인터프리터는 소스코드가 한 줄씩 실행되는 방식입니다. 대표적으로 Python을 들 수 있을 것 같네요.

소스 코드 전체를 훑는 컴파일 방식에 비해 한 줄씩 실행되기 때문에

특정 라인에 오류가 있다 하더라도, 해당 줄을 번역하기 전 까지는 정상적으로 실행됩니다.

 

컴파일 언어와 인터프리터 언어는 사실 명확하게 구분되지는 않습니다.
파이썬도 컴파일을 아예 하지 않는 것은 아니며
자바도 컴파일과 인터프리트를 동시에 수행합니다.

명확하게 구분하기 보다는 대표적으로 두 가지 정도가 있다 정도로 이해하는 것이 좋습니다.

 

 

 

 

숙제

스터디인 만큼 숙제가 있습니다.

 

기본미션

p. 51의 확인 문제 3번

프로그램이 실행되려면 반드시 (메모리)에 저장되어 있어야 합니다.

 

p. 65의 확인 문제 3번 풀고 인증하기

1101(2)을 음수로 표현한 값은 0011(2) 입니다.

 

p. 100의 스택과 큐의 개념을 정리하기

기존에 포스팅한 글이 있어 이로 대체합니다

https://uknowblog.tistory.com/360

 

[자료구조] 스택, 큐, 데크 - 자료구조 삼대장

이번에 알아볼 것은 굉장히 유명한 자료구조 삼대장들인 스택(Stack), 큐(Queue), 데크(Deque) 입니다. 스택 (Stack) 스택은 자료구조의 맨 위에서만 삽입과 삭제가 일어나는 자료구조 입니다. 포인터가

uknowblog.tistory.com

 

 

 

마치며

코딩을 하는게 즐거워 컴퓨터공학과에 입학했기에,

사실 1~2학년 때에는 언어 실습 과목을 좋아해 이론 과목은 다소 신경을 덜 썼고,

3학년 즈음부터 이론의 중요성을 뒤늦게 깨달았지만

4학년이 되고나니, 더 깊게 알기 위해 이론을 다시 공부하고 있네요.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.