코딩하다보면 자주 나오는 용어들
기계어보다 좀 더 인간의 언어에 가까움. 저레벨언어보다 읽기 쉬우며(어셈블리어를 생각해보자)읽기 뿐만아니라 쓰기, 유지보수에도 용이. 즉 프로그램을 생산하기 수월.
대신 이를 기계어로 변환하기 위해 인터프리터나 컴파일러가 필수적으로 요구됨.
2) 저레벨언어 (low-level language)
- 전체소스코드를 보고 명령어를 수집하고 재구성
- 일반적으로 컴파일러가 인터프리터보다 실행시간이 빠름(컴파일러는 번역기에 한번에 넣고 돌리는데 인터프리터는 한줄 한줄씩 번역하니까 그렇겠지?)
- 전체 소스코드를 변환 한 뒤 에러를 보고
- 소스코드의 각 행을 연속적으로 분석하며 실행
- 고레벨 언어를 바로 기계어로 변환하는 것이 아닌 중간형태로 변환 한다음 실행
- 인터프리터는 각 행 마다 실행하는 도중 에러가 보고되면 이후 작성된 코드를 살펴보지 않음
정적 라이브러리(Static Link library) vs 동적 라이브러리(Dynamic Link Library), 더 자세한 설명
1) 동적 라이브러리
- .dll(윈도우), .so(리눅스)
- 실행 바이너리를 링크 단계에서 실행 바이너리의 *.obj 파일들과 DLL의 *.lib 파일을 함께 링크하여 이 정보를 토대로 runtime에 DLL의 함수 코드를 참조하게 됨
- 프로그램이 한번 메모리에 올려진 것을 공유하므로 메모리 사용 공간이 정적 라이브러리에 비해 적다.
- 프로그램 변경시 변경된 부분의 공유 라이브러리만 재배포하면 되므로 유지보수가 쉽다.
- 프로그램 빌드 시에 라이브러리가 제공하는 코드를 실행 파일에 넣는 방식의 라이브러리
- 컴파일의 링킹 단계에서 실행 파일에 결합됨
- 시스템 환경이 변해도 애플리케이션에 아무런 영향이 없고, 완성된 애플리케이션을 안정적으로 사용할 수 있다.
- 런타임시 외부를 참조할 필요가 없기 때문에 속도에서 장점이 있다.
- 라이브러리 변경이 필요할 시, 변경된 라이브러리만 재배포하면 안되고 프로그램을 다시 재배포 해야 한다.
1) 어떤 라이브러리가 제공하는 기능을 다른 애플리케이션에서 사용하고 싶을 때 라이브러리 코드를 메모리에 하나만 두고 각 애플리케이션에서 이를 공유하는 방식의 라이브러리
- 명령어를 여러 프로세서로 분할
- 공유 메모리를 사용
- 동일한 작업을 수행하는 데 더 좋음
- 장치에 더 많은 기능을 제공하기 위해 동일한 명령어를 여러 프로세서로 실행
- 분산 처리는 다른 작업을 수행하는 데 더 좋음
Multi-processing : 다수의 프로세서(CPU의 멀티코어)가 서로 협력적으로 일을 처리
Multi-programming : 자원 낭비를 줄이기 위해 여러 프로그램이 하나의 프로세서에서 다수의 프로그램을 처리
Multi-tasking : OS의 스케쥴링에 의해 여러 Task를 번갈아가며 처리. 여러 개의 task를 자주, 빠르게 수행하다보니 사용자는 동시에 수행되고 있다고 느낌
멀티 스레딩 : 하나의 프로세스를 여러 개의 실행 단위이며, 여러 개의 스레드끼리 자원을 공유하는 것
2) 멀티 스레딩 vs 멀티 태스킹 : 멀티 스레딩은 스레드들끼리의 자원 공유가 가능하며, 프로그래밍을 통해 구현 가능하나, 멀티 태스킹은 OS에서 지원하는 것으로 독립된 메모리를 가지며, 서로 간의 자원 공유가 이루어지지 않음
2) 오버라이딩 : 상속개념. 부모 자식 간에 함수를 각각 내용을 다르게 정의 할 수 있고, 부를 수 있는 것
동기/비동기 프로그래밍(Asynchronous-synchronous programming)
ex) 은행에 은행원이 한명밖에 없어 다음 손님은 무조건 기다려야 함
ex) 은행에 은행원 조수들이 있어 손님의 업무를 조수들에게 맡기고 조수들에게 답변을 받을 때 까지 다음 손님을 받는다.
코드(code) 영역 : 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부름. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리함.
데이터(data) 영역 : 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸.
스택(stack) 영역 : 지역 변수와 매개변수가 저장되는 영역. 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출. 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작
말 그대로 넘친다는 뜻임
메모리 안에서 Heap영역(런 타임에 크기가 결정됨, 낮은 주소에서 부터 시작)과 Stack영역(컴파일시 크기가 결정됨, 높은 주소에서 시작)이 상대 공간을 침범하는 일이 발생하는 것
3) Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클수록 Stack 영역이 작아짐
Overhead : 프로그램의 실행흐름 도중에 동 떨어진 위치의 코드를 실행시켜야 할 때, 추가적으로 시간/메모리/자원이 사용되는 현상
메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)를 의미
Code, Data, Stack, Heap의 구조로 되어 있으며, 이러한 구조로 된 독립된 메모리 영역을 할당함
1) CPU : 입출력장치, 기억장치, 연산장치 등을 포함한 컴퓨터 리소스를 관리하는 최상위 계층의 중앙처리장치
2) GPU : 반복적이고 비슷한 대량의 연산을 수행하며 이를 병렬적(parallel)으로 나누어 작업하기 때문에 CPU에 비해 속도가 압도적으로 빠름. GPU는 병렬 처리용으로 설계된 수 천 개의 보다 소형이고 효율적인 코어로 구성되어 있음.