게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
프로그램과 컴퓨터...
게시물ID : programmer_19649짧은주소 복사하기
작성자 : 오늩의유머
추천 : 1
조회수 : 431회
댓글수 : 0개
등록시간 : 2017/01/24 15:53:20
컴퓨터는 원래 수치 계산을 쉽게 하기 위한 도구였습니다. 컴퓨터가 개발될 당시에는 실제로 컴퓨터라는 직업이 있었습니다. 정보이론의 창시자로 잘 알려진 클로드 섀넌은 벨랩 근무 당시 벨랩에서 컴퓨터로 근무하던 여인을 아내로 맞이했습니다. 

이렇게 개발된 컴퓨터는 오늘날에는 계산 뿐 아니라, 통신, 제어 등 갖가지 다른 용도로 활용됩니다. 하나 놀라운 점은 이 모든 컴퓨터들이 알란 튜링이 제안한 "튜링 머신"으로서 동작한다는 것입니다. 튜링 머신이란 1차원 테이프 위에 기록된 변수들을 바꾸는 간단한 규칙 몇 개로 이루어진 기계입니다. 이론상으로 이 기계로 모든 계산 가능한 문제를 계산할 수 있습니다. 
https://ko.wikipedia.org/wiki/튜링_기계

오늘날의 컴퓨터들은 테이프가 아닌 하드디스크나 메모리 등에 변수를 기록하지만, 이들 모두 1차원으로 처리되기 때문에 사실상 튜링 기계와 같습니다.

프로그램이란, 앞을 뜻하는 프로와 글을 뜻하는 그램이 합쳐진 말로, 미래에 일어날 일을 써 두는 것입니다. 텔레비전에 뭐가 나올지를 알려주는 TV프로그램이나, 식순을 뜻하는 프로그램과 같이, 컴퓨터가 할 일을 정해 컴퓨터에게 알려주는 것입니다.

컴퓨터 프로그램은 기계어로 이루어진 변수와 명령어들을 죽 나열한 것입니다. 이 프로그램을 컴퓨터에 입력하면, 컴퓨터는 프로그램에 정해진대로 연산을 수행합니다. 

하지만, 이와 같이 기계어로 이루어진 프로그램을 튜링이나 폰 노이만같은 천재가 아닌 보통 인간이 직접 작성하기란 쉽지 않기 때문에 미천한 보통인간들은 컴파일러라는 프로그램을 개발했습니다. 컴파일러는 인간이 이해할 수 있게 작성한 코드를 컴퓨터가 이해할 수 있는 코드로 변환해 줍니다. 이와 같은 코드를 오브젝트 코드라고 하는데, 이를 "링커"를 이용해서 운영체제와 연결시키면 이 프로그램으로 컴퓨터를 구동할 수 있습니다. 

보통 프로그래머가 프로그램의 코드를 만들면 이는 하드디스크에 저장됩니다. 이 코드를 컴파일러와 링커를 이용해 컴파일과 링킹을 하면 컴퓨터가 이해할 수 있는 프로그램이 생성됩니다. 생성된 프로그램 또한 하드디스크에 저장됩니다. 이를 실행시키면, 운영체제는 이 프로그램을 메모리 공간으로 복사합니다. 복사가 완료되면 프로그램에 기록된 순서대로 변수와 명령어들을 규칙에 따라 컴퓨터 각 부위로 전송합니다. 만일 계산을 하라는 명령어가 수행되면 프로그램은 명령어와 변수를 CPU로 전송하고 CPU는 이를 받아서 계산한 후, 그 결과물을 CPU의 레지스터에 올려놓고, 프로그램은 이를 다시 받아서 메모리 상에 있는 프로그램 내부의 변수로 복사합니다. 

컴퓨터로 프로그램을 수행하는 것을 어떤 백수가 라면을 끓이는 것과 비교를 해 봅시다.
라면 봉다리 뒷면에 있는 조리법이 프로그램입니다. 
백수는 머리가 좋아서 조리법을 한번 보고 모두 기억합니다. 이것은 함수와 변수로 이루어진 프로그램 중 함수를 메모리 공간으로 불러들인 것과 같습니다. 변수는 무엇일까요? 냄비가 변수입니다. 즉 백수의 라면 끓이는 프로그램을 수행하기 위해서는 백수의 머리와 냄비가 메모리 역할을 하는 것입니다. 
백수의 냄비가 준비되면, 백수의 냄비 변수 속에 물과 라면, 그리고 스프를 넣습니다. 이것은 변수를 초기화하는 것과 같습니다. 
그리고 이 냄비를 가열하면 라면이 됩니다. 이때, 가열하는 가스렌지는 CPU이고, 냄비는 메모리의 역할과 함께 CPU의 레지스터 역할도 합니다. 이런 관점에서 보면 백수의 부엌은 폰노이만 식 컴퓨터가 아닙니다. 오늘날 우리가 이용하는 모든 컴퓨터는 폰 노이만식 컴퓨터입니다. 백수의 부엌을 폰 노이만식으로 다시 설계해 보겠습니다.

백수의 가스렌지는 냄비 일체형입니다. 그러니까 가스렌지보다는 커피포트에 더 가깝다고 할 수 있겠습니다. 가열장치와 가열 용기가 일체입니다. 여기서 가열장치는 연산 유닛이고, 가열 용기는 레지스터입니다. 
백수는 커피포트에 물과 라면, 스프를 넣습니다. 이는 레지스터에 메모리 상의 변수를 복사하는 것과 같습니다. 그리고 처리가 끝나면 레지스터에는 처리가 완료된 완성된 라면이 들어있습니다. 백수는 이를 사발로 옮깁니다. 프로그램이 완성되어 결과물이 나온 것입니다. 냄비째로 먹어도 되는데, 굳이 사발을 마련해서 설겆이를 두번 해야 하는 것은 폰 노이만식 컴퓨터의 한계입니다. 매번 옮겨담아야 하는 번거로움을 폰 노이만 병목 현상이라고 합니다. 

백수가 여자친구가 있어서 라면을 두개 끓여야 한다고 합시다. 일반적으로 라면을 두개 끓이기 위해서 새로 프로그램을 만들 필요는 없습니다. 오늘날의 cpu는 클록을 나눠서 멀티 태스킹을 할 수 있습니다. 백수는 라면 봉지 두 개를 가져와서, 하나를 뜯어서 조리법을 기억하고, 커피포트 하나에 라면을 끓입니다. 멀티태스킹을 하고 싶은데, 커피 포트에 라면을 끓이는 작업은 atomic 명령이라서 라면 두개를 동시에 끓일 수는 없습니다. 포트에 라면을 끓이기 시작한 순간 프로세스가 블록되면서, 어쩔 수 없이 라면이 다 될 때까지 기다려야 합니다. 그리고 끝나고 나면 완성된 라면을 사발 1에 옮겨담고, 새로 라면을 투입하여 두번째 라면 조리를 시작합니다.

이때 흥미로운 점은, 백수의 머릿속에는 조리법이 두 개가 자리잡고 있다는 것입니다. 

...

죄송합니다 ㅠㅠ 글이 산으로 가고 말았네요 




꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호