코딩하다보면 자주 나오는 용어들



  1. 고레벨, 저레벨 언어

    1. 고레벨(high-level programming language)

    2) 저레벨언어 (low-level language)

  2. 컴파일러와 인터프리터의 차이

    1. 컴파일러

    - 전체소스코드를 보고 명령어를 수집하고 재구성

    - 일반적으로 컴파일러가 인터프리터보다 실행시간이 빠름(컴파일러는 번역기에 한번에 넣고 돌리는데 인터프리터는 한줄 한줄씩 번역하니까 그렇겠지?)

    - 전체 소스코드를 변환 한 뒤 에러를 보고

    1. 인터프리터

    - 소스코드의 각 행을 연속적으로 분석하며 실행

    - 고레벨 언어를 바로 기계어로 변환하는 것이 아닌 중간형태로 변환 한다음 실행

    - 인터프리터는 각 행 마다 실행하는 도중 에러가 보고되면 이후 작성된 코드를 살펴보지 않음

  3. 정적 라이브러리(Static Link library) vs 동적 라이브러리(Dynamic Link Library), 더 자세한 설명

    1) 동적 라이브러리

    - .dll(윈도우), .so(리눅스)

    - 실행 바이너리를 링크 단계에서 실행 바이너리의 *.obj 파일들과 DLL의 *.lib 파일을 함께 링크하여 이 정보를 토대로 runtime에 DLL의 함수 코드를 참조하게 됨

    - 프로그램이 한번 메모리에 올려진 것을 공유하므로 메모리 사용 공간이 정적 라이브러리에 비해 적다.

    - 프로그램 변경시 변경된 부분의 공유 라이브러리만 재배포하면 되므로 유지보수가 쉽다.

    1. 정적 라이브러리

    - 프로그램 빌드 시에 라이브러리가 제공하는 코드를 실행 파일에 넣는 방식의 라이브러리

    - 컴파일의 링킹 단계에서 실행 파일에 결합됨

    - 시스템 환경이 변해도 애플리케이션에 아무런 영향이 없고, 완성된 애플리케이션을 안정적으로 사용할 수 있다.

    - 런타임시 외부를 참조할 필요가 없기 때문에 속도에서 장점이 있다.

    - 라이브러리 변경이 필요할 시, 변경된 라이브러리만 재배포하면 안되고 프로그램을 다시 재배포 해야 한다.

    1. *.lib 파일은 링크시 필요하고, *.dll 파일은 실행시 필요하다.
  4. 공유 라이브러리(Shared Library)

    1) 어떤 라이브러리가 제공하는 기능을 다른 애플리케이션에서 사용하고 싶을 때 라이브러리 코드를 메모리에 하나만 두고 각 애플리케이션에서 이를 공유하는 방식의 라이브러리

  5. 병렬처리 시스템과 분산처리 시스템

    1. 병렬처리 시스템 : 프로세서를 늘려서 여러 일을 동시에, 더 빨리 처리 할 수 있게 해주는 시스템 방식

    - 명령어를 여러 프로세서로 분할

    - 공유 메모리를 사용

    - 동일한 작업을 수행하는 데 더 좋음

    1. 분산처리 시스템 : 처리할 수 있는 장비(컴퓨터 등)을 네트워크로 상호 연결하여 전체적인 일의 부분 부분을 나누어 더 빨리 처리 할 수 있게 하는 시스템 방식

    - 장치에 더 많은 기능을 제공하기 위해 동일한 명령어를 여러 프로세서로 실행

    - 분산 처리는 다른 작업을 수행하는 데 더 좋음

  6. 멀티 프로세싱 VS 멀티 프로그래밍 VS 멀티 태스킹

    1. Multi-processing : 다수의 프로세서(CPU의 멀티코어)가 서로 협력적으로 일을 처리

    2. Multi-programming : 자원 낭비를 줄이기 위해 여러 프로그램이 하나의 프로세서에서 다수의 프로그램을 처리

    3. Multi-tasking : OS의 스케쥴링에 의해 여러 Task를 번갈아가며 처리. 여러 개의 task를 자주, 빠르게 수행하다보니 사용자는 동시에 수행되고 있다고 느낌

  7. 멀티 스레딩 : 하나의 프로세스를 여러 개의 실행 단위이며, 여러 개의 스레드끼리 자원을 공유하는 것

    1. 멀티 프로세싱 vs 멀티 스레딩 : 멀티프로세싱은 fork를 통해 프로세스를 다수개로 늘려 여러 개의 프로그램들을 병렬로 처리하며, 멀티스레딩은 하나의 프로그램 안에서 병렬 처리를 함

    2) 멀티 스레딩 vs 멀티 태스킹 : 멀티 스레딩은 스레드들끼리의 자원 공유가 가능하며, 프로그래밍을 통해 구현 가능하나, 멀티 태스킹은 OS에서 지원하는 것으로 독립된 메모리를 가지며, 서로 간의 자원 공유가 이루어지지 않음

  8. 오버로딩, 오버라이딩

    1. 오버로딩 : 이름은 같지만 인자가 달라 다른 메소드로써 선언하는 방법

    2) 오버라이딩 : 상속개념. 부모 자식 간에 함수를 각각 내용을 다르게 정의 할 수 있고, 부를 수 있는 것

  9. 동기/비동기 프로그래밍(Asynchronous-synchronous programming)

    1. 동기적 일처리 방식 : 순차적으로 일을 스스로 끝내 나가는 방식

    ex) 은행에 은행원이 한명밖에 없어 다음 손님은 무조건 기다려야 함

    1. 비동기적 일처리 방식 : 해야 할 일을 위임하고 기다리는 방식

    ex) 은행에 은행원 조수들이 있어 손님의 업무를 조수들에게 맡기고 조수들에게 답변을 받을 때 까지 다음 손님을 받는다.

  10. 프로그래밍할때 메모리의 구조

    1. 코드(code) 영역 : 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부름. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리함.

    2. 데이터(data) 영역 : 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸.

    3. 스택(stack) 영역 : 지역 변수와 매개변수가 저장되는 영역. 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출. 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작

    1. 힙(heap) 영역 : 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨.

  11. Overflow

    1. 말 그대로 넘친다는 뜻임

    2. 메모리 안에서 Heap영역(런 타임에 크기가 결정됨, 낮은 주소에서 부터 시작)과 Stack영역(컴파일시 크기가 결정됨, 높은 주소에서 시작)이 상대 공간을 침범하는 일이 발생하는 것

    3) Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클수록 Stack 영역이 작아짐

  12. Overhead : 프로그램의 실행흐름 도중에 동 떨어진 위치의 코드를 실행시켜야 할 때, 추가적으로 시간/메모리/자원이 사용되는 현상

    1. 특히 외부 함수를 사용할 때 나타남

  13. 프로세스와 스레드의 차이

    1. 프로세스 : 운영체제로부터 CPU 자원을 할당받는 작업의 단위
    1. 스레드 : 프로세스 내에서 실행되는 여러 흐름의 단위. 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유함
  14. Thread-safe

  15. GPU와 CPU의 차이

    1) CPU : 입출력장치, 기억장치, 연산장치 등을 포함한 컴퓨터 리소스를 관리하는 최상위 계층의 중앙처리장치

    2) GPU : 반복적이고 비슷한 대량의 연산을 수행하며 이를 병렬적(parallel)으로 나누어 작업하기 때문에 CPU에 비해 속도가 압도적으로 빠름. GPU는 병렬 처리용으로 설계된 수 천 개의 보다 소형이고 효율적인 코어로 구성되어 있음.

  16. 교착상태(데드락)