직무적성검사를 대비한 명료한 한(?) 문장 정리 및 링크를 통한 깊은 해설.


1. 엔디안(Endian)

- Byte Order를 뜻함. 

- 리틀 엔디안(Little Endian)과 빅 엔디안(Big Endian)이 존재.

- 리틀 엔디안은 메모리 시작 주소가 하위 Byte에서부터 기록(Intel, Window)

- 빅 엔디안은 메모리 시작 주소가 상위 Byte에서부터 기록(Unix)

- 하나의 시스템에서 돌아가면 상관없지만, 값을 주고받는 데이터 통신에서는 Byte Order가 무척 중요.

- int형(4byte)의 데이터 1을 보내도, 엔디안이 다르면 다른 값이 나옴. 왜냐하면 4byte라서 리틀 엔디안은 아래에서 위로 기록, 빅 엔디안은 위에서 아래로 기록. 그래서 1byte는 같아도, 나머지 byte에서 처리값이 차이가 나기 때문에 이상한 값이 나타남. 그래서 Char형(1byte)에서는 문제가 되지 않음.

- 이런 엔디안 문제에 따른 네트워크 통신으로 인해 네트워크 전용 엔디안(빅 엔디안)을 설정.

- 클라이언트 측은 네트워크 전용 엔디안으로 값을 변경 후 전송.

- 서버 측은 전송받은 값을 자신의 엔디안 값으로 변환 후 활용.

깊은 이해를 위한 링크: http://www.joinc.co.kr/w/Site/Network_Programing/Documents/endian


2. 구조체 패딩(Struct Padding)

- 패딩이란 빈 공간에 무언가를 채워넣는 것을 의미. (어깨에 넣는 뽕도 패딩이라 부르고, 파카에 털을 채우는 것도 패딩)

- 구조체 패딩의 문제는 네트워크를 통한 구조체 데이터를 전송할 때 문제가 발생.

- 왜냐하면 구조체가 메모리에 정의되는 형태는 OS와 컴파일러에 따라 달라진다. 

 (동일한 구조체를 서로 다르게 메모리에 정의하고 있는 시스템끼리 통신을 주고받으면 구조체 각 멤버는 서로 다른 값 가짐)

- 해결법 총 3가지 존재.

- 첫 번째 해결법, 프로그래머가 패딩 비트를 직접 설정.(최악의 방법 - 아주 위험함)

- 두 번째 해결법, #pragma pack(1)이라는 문구로 구조체를 1Byte로 자름.(성능이 안좋음, 표준도 아님)

- 세 번째 해결법, 구조체 멤버를 일일이 써주는 방법.

깊은 이해를 위한 링크: http://pangate.com/19


3. Race Condition(경쟁 상태)

- Race Condition은 두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓸 때, 데이터의 일관성을 해치는 현상.

- 회피 방법은 여러가지가 있지만 대표적인 방법으로는 Mutual Exclusion(상호배제), Critical Section(임계구역) 존재.

- Mutual Exclusion이란 두 개 이상의 프로세스가 공용 데이터 접근을 막음. (한 번에 하나씩 공용변수에 접근)

- Critical Section이란 공용 데이터에 접근하는 코드 영역으로 원자성을 띄고 있음. (이 구역에 접근은 한 번에 하나씩)

깊은 이해를 위한 링크: http://egloos.zum.com/agrumpy/v/362254


4. 컴파일 오류 vs 런타임 오류 vs 논리 오류

- 컴파일 오류란 프로그램의 실행을 막는 오류. (컴파일러가 이해하지 못하면, 컴파일러 오류. 형 변환 실패, ; 빠뜨리기 등등)

- 런타임 오류는 프로그램의 실행 중 나타나는 오류. (0으로 나누거나, 배열 index를 침범하거나, 스택 오버플로우 문제)

- 논리 오류는 코드의 흐름이 프로그래머의 의도와 다른 경우. (제일 어려운 경우)

깊은 이해를 위한 링크: https://msdn.microsoft.com/ko-kr/library/s9ek7a19(v=vs.90).aspx


5. 컴파일 과정과 인터프리터 과정

- 컴파일 과정

렉시컬 분석 -> [토큰열] -> 구문 분석 -> [파싱트리] -> 의미 분석 -> [중간코드 생성] -> 목적코드 생성 -> [목적프로그램]

- 인터프리터 과정

렉시컬 분석 -> [토큰열] -> 구문 분석 -> [파싱트리] -> 의미 분석 -> [중간코드 생성] -> 중간코드 실행 -> [실행결과]

깊은 이해를 위한 링크: http://ra2kstar.tistory.com/168


6. 언어의 종류

- 절차적 언어: C, Pascal

- 객체 지향 언어:  C++, JAVA, C#

- 선언형 언어: 함수형 언어, 논리 프로그래밍.

(선언형 언어는 이제 학계를 떠나 업계로 진출 중이다. 특히 신기술의 도입이 빠른 웹 앱 계열에서 선언형 스타일의 프로그램이 선호되고 Javascript 코드의 코딩 스타일이 점점 선언형으로 진화 중이다. 선언형으로 기술하는 가장 유명한 라이브러리로는 jQuery가 있으며 최신 트렌드인 반응형 프로그래밍 개념을 도입하고 있다.)

(순수 선언형, 함수형 언어의 가장 큰 특징은 '지연 평가(Lazy evaluation)'라는 특징이다. 계산이 필요한 순간이 올 때까지 미루는 개념인데, 쉽게 말해서 이 지연 평가의 강력함은 '무한'을 다룰 때 나타난다. 즉, 재귀의 스택 오버플로우를 예방하는 방식이다.)

- 함수형 언어: LISP, Scheme, Clojure, Erlang, ML, Haskell

- 논리 프로그래밍: Mercury

- 특수 목적 언어: SQL(DB), CUDA(GPU), Prolog(인공지능 언어), Processing(그래픽스), MATLAP(공학 시뮬레이션), PHP(웹)

깊은 이해를 위한 링크: https://namu.wiki/w/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%20%EC%96%B8%EC%96%B4


7. 프로세스와 쓰레드

- 프로세스는 프로그램의 인스턴스를 의미, 운영체제로 부터 자원을 할당받는다.

- 프로세스의 영역은 코드 | 데이터 | 메모리(Heap & Stack)를 가진다.

- 쓰레드는 경량 프로세스라고 불리며, 한 프로세스에서 동작되는 여러 실행의 흐름을 나타냄.

- 쓰레드들은 프로세스의 코드 | 데이터 영역을 공유하지만, 자신의 실행을 위한 실행 스택을 각각 따로 할당받음.(*)

- 기본적으로 하나의 프로세스 생성되면 하나의 쓰레드가 같이 생성, 이를 메인 쓰레드라 하며 프로그램 코드는 여기서 실행.

깊은 이해를 위한 링크: http://ralf79.tistory.com/34


8. OSI 7계층 과정

- 물리층 - 데이터링크층 - 네트워크층 - 트랜스포트층 - 세션층 - 프리젠테이션층 - 애플리케이션층

- 물리층: 네트워크의 하드웨어 전송 기술이 주를 이룸.

- 데이터링크층: 네트워크 카드의 주소인 MAC주소(물리적 주소)를 기반으로 데이터를 전달. (네트워크 브릿지와 스위치 작동)

(네트워크 위 개체들 간의 데이터를 전달하고, 물리 계층에서 발생할 수 있는 오류를 찾아 수정)

- 네트워크층: 논리적 주소 IP를 활용하며 데이터를 전송하며 라우팅이 일어난다. (라우터가 이 계층에서 수행)

- 트랜스포트층: 신뢰성 있는 데이터를 주고 받게 해줌. (UDP/TCP 프로토콜)

- 세션층: 네트워크 양 끝의 응용 프로세스가 통신을 관리하기 위한 방법 제공. (연결 시작 - 유휴 - 종료등을 수행)

- 프리젠테이션층: 코드간의 번역을 담당하여 인코딩, 암호화 또는 복호화같은 과정이 이루어짐. 

- 애플리케이션층: 응용 프로세스와 직접 관계된 응용 서비스를 제공. (텔넷 프로토콜)

깊은 이해를 위한 링크: https://ko.wikipedia.org/wiki/OSI_%EB%AA%A8%ED%98%95



+ Recent posts