컴퓨터 시스템에서의 추상화는 각 요소들에게 독립성을 제공해줍니다. 프로세서는 인스트럭션 집합으로 추상화되어 상위 단계에서는 특정한 인스트럭션이 순차적으로 실행될 수 있다는 사실만 이해하면 됩니다. 이러한 추상화 덕분에 동일한 기계어 코드를 다른 프로세서에서도 실행할 수 있게 되었습니다. 소프트웨어 단에서도 운영체제는 입출력 장치를 단순히 파일로 추상화하고 메인 메모리와 디스크를 가상메모리로 추상화합니다. 또한 메인 메모리, 입출력 장치, 프로세서를 프로세스로 추상화합니다. 더 크게 운영체제와 프로세스는 가상 머신(VM)으로 추상화될 수 있습니다.
프로세서 수준의 병렬성 단일 프로세서에서 시분할(Time Sharing) 기법을 사용하여 여러 개의 프로세서를 동시에 실행하는 것처럼, 혹은 여러 명의 사용자가 동시에 시스템을 사용하는 것처럼 느끼도록 할 수 있었습니다. 멀티 프로세서는 하나의 운영체제에 의해 관리되는 여러 개의 프로세서를 의미합니다. 멀티코어프로세서는 멀티 프로세서의 범주에 포함되며 코어(cpu)가 단일 집적회로에 여러 개 집적된 프로세서를 의미합니다. 프로세서 내부에서 코어를 제외한 나머지 하드웨어 자원을 공유합니다. 하나의 코어에서 여러 개의 쓰레드를 동시에 실행하는 하이퍼쓰레딩 기술이 적용될 수도 있습니다. 인스트럭션 수준의 병렬성 프로세서 내부에서 파이프라이닝 기법을 통해 수 클럭이 소요되는 인스트럭션을 동시에 처리할 수 있습니..
운영체제는 응용프로그램과 하드웨어 사이에 있는 시스템소프트웨어입니다. 응용프로그램이 하드웨어를 동일하고 간단한 방식으로 제어할 수 있도록 보조해줍니다. 프로세스는 실행 중인 프로그램이 운영체제에 의해 추상화된 결과물이다. 커널은 프로세스들을 관리하기 위해 메모리에 적재되는 코드와 데이터 집합을 의미한다. 쓰레드는 프로세스를 구성하는 실행 단위이며 쓰레드끼리 코드와 전역데이터를 공유한다. 쓰레드 간의 통신이 프로세스 간의 통신보다 쉬우며 멀티쓰레딩을 통해 프로그램 실행 속도를 증가시킬 수 있다. 가상 메모리는 각각의 프로세스에 독점적으로 할당된 추상화된 메모리를 의미한다. 파일은 연속된 바이트입니다. 모든 입출력장치가 파일로 추상화되며 따라서 응용프로그램은 공통된 방식으로 입출력 하드웨어를 제어할 수 있습..
컴퓨터 시스템의 구조를 관찰하면 컴퓨터는 프로세서와 메모리로 구성되어 있다는 것을 확인할 수 있습니다. 어떠한 작업을 하면 프로세서와 메모리 사이에서 많은 양의 데이터가 여러 번 복사되게 됩니다. 이때 느린 적재(Load), 저장(Store) 시간은 프로그램의 성능을 저하시키는 오버헤드가 될 수 있습니다. 물리학적 법칙에 따라 메모리의 속도는 크기와 반비례하고 비용에 비례합니다. 또한 프로세서의 성능 향상에 비해 메모리의 성능 향상은 상대적으로 느려 속도의 차이가 점점 벌어지고 있습니다. 이러한 상황에서 메모리와 프로세서 간의 데이터 교환 속도를 증가시키기 위해 그 사이에 캐시를 추가하였습니다. 캐시가 성능 향상에 도움을 줄 수 있었던 이유는 프로그램의 지역성(Locality)에 있습니다. 대부분의 프로..
버스는 시스템 내의 배선 집합입니다. 워드 단위로 시스템 내 구성요소 간에 데이터를 전송하는 역할을 담당합니다. 워드는 시스템에서 한 번에 처리하는 데이터의 양을 의미합니다. 시스템마다 워드의 크기가 다를 수 있으며 현재 범용 컴퓨터에서는 64bit를 주로 사용하고 있습니다. 입출력 장치는 시스템과 외부를 연결하는 장치입니다. 컨트롤러와 어댑터, I/O bus로 시스템과 연결됩니다. 메인 메모리는 실행 중인 프로그램의 정보를 저장하는 장치입니다. 물리적으로는 DRAM으로 구현되며 논리적으로 선형적인 바이트 배열로 표현됩니다. 바이트 단위로 고유 주소를 가지고 있습니다. 프로세서는 메인 메모리에 저장된 명령어를 해석하고 실행하는 장치입니다. 명령어의 종류와 크기는 인스트럭션 집합에 따라 다르지만 대개 적재..
아스키 코드로 작성된 프로그램은 일련의 과정(컴파일)을 거쳐 기계어로 번역된다. 보통 이 컴파일 과정은 4단계의 프로그램에 의해 수행된다. 전처리기, 컴파일러, 어셈블러, 링커가 컴파일 시스템을 구성한다. 전처리 단계에서는 소스코드에서 ‘#’으로 시작하는 지시자(directive)에 따라 소스코드를 수정한다. 컴파일 단계에서는 C언어를 어셈블리어 프로그램으로 번역한다. 어셈블리 단계에서는 텍스트 파일 형태의 어셈블리어 프로그램을 재배치 가능한 목적프로그램(Relocatable object program)으로 변환한다. 링크 단계에서는 라이브러리에 있는 목적파일들을 결합하여 최종적으로 실행가능한 목적파일(Excutable object program)을 만들어냅니다.
프로그램은 에디터를 통해 작성되고 텍스트 파일로 저장됩니다. 텍스트 파일은 아스키 문자로 구성된 파일이다. 그 이외의 비트로 구성된 파일을 바이너리 파일이라고 한다. 아스키 문자는 문자를 컴퓨터가 이해할 수 있는 정수(바이트)로 인코딩하는 문자인코딩의 방식 중 하나이다. 컴퓨터의 모든 정보는 동일한 비트(0, 1)로 표현되며 서로 다른 방식으로 해석될 수 있다. 컴퓨터 내의 정수나 실수는 정확하지 않을 수 있다. 어디까지나 유한한 근사값에 불과하다. 따라서 정확하고 빠른 프로그램을 작성할 때 주의를 기울여야 한다.
github에서 clone을 하고 git log --graph --all을 입력하면 original/main 과 같은 브랜치를 관찰할 수 있다. 이러한 브랜치들을 리모트 브랜치라고 한다. 리모트 브랜치는 원격 저장소 상의 브랜치이며 로컬에서는 마음대로 사용할 수가 없다. 로컬에서 원격 저장소의 브랜치(업스트림 브랜치)에 대응하는 브랜치를 생성하여 해당 브랜치(트래킹 브랜치)를 사용해야만 한다. main 브랜치는 자동으로 origin/main 과 연결된다. git checkout -b 로컬 브랜치명 서버브랜치명 명령어를 사용하면 서버브랜치부터 로컬브랜치를 시작할 수 있다. git checkout --track 서버브랜치명 명령어를 통해 서버 브랜치와 이름이 동일한 로컬 브랜치를 만들 수 있다. git br..
master 브랜치가 merge할 브랜치의 조상이라면 master 브랜치가 merge할 브랜치로 이동하는 fast forward 방식으로 merge를 진행한다. master 브랜치가 merge할 브랜치의 조상이 아니라면 해당 두 브랜치와 그것들의 조상이 되는 브랜치를 가지고 3-way merge방식으로 merge를 진행한다. 3-way merge 방식으로 merge를 진행하면 merge된 결과로 새로운 커밋으로 만들고 master 브랜치가 해당 커밋을 가지키게 된다. 새로운 커밋은 이전의 master 브랜치가 가리키던 커밋과 merge한 브랜치가 가리키는 커밋을 부모로 두게 된다. 만약 master 브랜치와 merge할 브랜치에서 동일한 파일의 어떤 부분을 수정했다면 merge를 할 때 충돌이 발생하게 ..
git에는 코드를 복사하여 독립적인 작업을 진행할 수 있도록 도와주는 기능으로 브랜치가 있다. git에서 commit을 하면 파일에 대한 정보, 디렉토리 구조에 대한 정보, 이전 커밋에 대한 포인터 등의 정보 등이 저장된다. 브랜치는 일종의 포인터로 현재 작업중인 가장 마지막의 commit을 가리킨다. head는 현재 작업하는 브랜치를 가리키는 포인터이다. git checkout 브랜치이름 명령어로 head를 이동시킬 수 있다. head가 가리키는 브랜치가 앞으로 수행되는 commit을 계속 따라가게 된다. 각각의 브랜치에서 commit을 수행하면 분기가 되어 별도의 commit을 진행한다. 브랜치의 분기는 git log --graph --all로 확인할 수 있다. 브랜치를 만들면서 head까지 바로 이..
git remote 명령어를 사용하면 현재 등록된 리모트 저장소의 이름를 확인할 수 있다. -v 옵션을 통해 URL 도 함께 확인할 수 있다. clone한 저장소의 경우 clone한 주소가 origin이라는 이름의 리모트 저장소로 자동으로 등록된다. git remote add 이름 URL을 사용하면 리모트 저장소를 추가할 수 있다. git fetch 이름을 통해 리모트 저장소에 있는 데이터를 모두 가져올 수 있다. 예로 들어 git fetch origin 명령어를 입력하면 clone 이후 수정된 모든 것을 가져오게 된다. 가져온 파일과 현재 작업중인 파일의 merge는 수동으로 진행해야한다. git pull 명령어는 git fetch 후 현재 작업 중인 코드와 merge를 진행한다. git push (리..
git 에서 파일을 제거할 수 있다. 그냥 디렉토리에서 일반적으로 파일을 지우면 파일이 변경되어 Unstaged 상태가 된다.(파일제거) git rm 명령어를 사용하여 파일을 지우면 디렉토리에 파일이 지워짐과 동시에 지워졌다는 사실이 Staged 상태되어 다음 commit부터 파일이 추적되지 않는다.(파일 제거, 추적 중단) 디렉토리에서 파일을 지우지 않고 단순히 추적만을 하지 않게 하려면 git rm --cached 명령어를 사용해야 한다.(추적중단)
git repository에서 파일의 상태는 Untracked, Unmodified, Modified, Staged 4가지로 분류된다. Untracked는 git 관리 시스템에서 추적하지 않는 파일의 상태, 즉 스냅샷에 없는 파일을 의미한다. git add 파일경로(파일명) 명령어로 파일을 Untracked->Tracked로 변경할 수 있다. Unmodified는 막 clone하였거나 commit한 파일을 수정하지 않았을 때의 상태를 의미한다. Modified는 수정한 파일의 상태를 의미한다. Modified 상태의 파일을 commit하기 위해서는 Staged 상태로 변경해야 하는 데 이때 git add 파일경로(파일명) 명령어를 사용해야 한다. git add 명령어는 파일을 Untracked->Trac..
git repository를 생성하는 방법은 두 가지가 있다. 기존의 폴더에서 git init 명령어를 입력하여 .git디렉토리를 생성하여 git repository로 만들거나 서버에 있는 git repository를 clone하여 다운로드 받아야 한다. git clone URL (원하는 폴더명) 명령어를 입력하면 된다. clone을 하면 단순히 한 지점의 스냅샷이 아닌 프로젝트의 모든 히스토리를 다운받아 열람하거나 수정할 수 있다. URL에 입력되는 프로토콜은 https, git, ssh 등을 사용할 수 있다.
- Total
- Today
- Yesterday
- 이진탐색
- 정렬
- 영어 어휘
- BOJ
- Push
- Git
- 큐
- 백준
- 영화
- 베릴로그
- Verilog
- gem5
- 건이의 특제 떡국 끓이기
- 구현
- 스택
- 구조체
- 완전탐색
- 너비우선탐색
- 알고리즘
- 백트래킹
- backtracking
- 애니메이션
- BFS
- recursive
- C언어
- 취미
- 이분법
- 재귀함수
- 메이플스토리
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |