-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
81ad376
commit 4c4c1ce
Showing
6 changed files
with
737 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
--- | ||
layout: single | ||
categories: | ||
- iOS | ||
tags: | ||
- Linux | ||
title: "Linux란?" | ||
comments: true | ||
--- | ||
|
||
Linux는 서버 시스템뿐만 아니라 클라우드 컴퓨팅, 임베디드 시스템 등 다양한 분야에서 사용된다. 특히 모바일 운영체제의 양대 산맥 중 하나인 안드로이드 역시 Linux 커널을 기반으로 만들어졌고, 이처럼 Linux가 활용되는 분야가 더욱 확대됨에 따라 Linux를 다루는 능력은 중요한 역량으로 평가받기도 한다. | ||
|
||
<br> | ||
|
||
### UNIX | ||
|
||
<hr/> | ||
|
||
UNIX는 1969년 브라이언 커니핸, 켄 톰슨, 데니스 리치 등 벨 연구소 직원들에 의해 개발된 다중 사용자(Multi-user), 다중 작업(Multi-tasking) 운영체제이다. | ||
|
||
따라서 UNIX는 여러 사용자들이 동시에 시스템에 로그인할 수 있으며, 각 유저들은 동시에 여러 작업이 가능하다. | ||
|
||
UNIX는 처음에 Assemby 언어로 작성되었지만, UNIX 개발자 중 한명인 데니스 리치가 C언어를 개발하고 나서 C언어로 다시 작성되었다. | ||
|
||
<br> | ||
|
||
### Linux | ||
|
||
<hr/> | ||
|
||
Linux는 1991년 리누스 토발즈가 출시한 Linux 커널에 기반을 둔 오픈소스 UNIX 계열 운영체제 계열이다. | ||
|
||
Linux는 GNU GPL(General Public Licnese)에 따라 누구든지 무료로 이용할 수 있게 개발되었고, 현재 오픈소스 소프트웨어의 대표적인 예시이다. | ||
|
||
Linux 배포판은 커널과 지원 시스템 소프트웨어 그리고 라이브러리를 포함하고 있으며, 이들 중 대부분은 GNU 프로젝트에 의해 제공된다. | ||
|
||
주된 Linux 배포판은 RedHat, Fedora, OpenSUSE, Debian의 Ubuntu Linux 등이 있다. | ||
|
||
안드로이드 또한 Linux는 아니지만, Linux 커널을 기반으로 구글이 제작하는 모바일 운영체제이다. | ||
|
||
<br> | ||
|
||
### Linux 시스템 | ||
|
||
<hr/> | ||
|
||
컴퓨터 시스템은 다음과 같은 구조를 가지며, 위 개념은 아래 개념을 포함한다. | ||
|
||
`응용 소프트웨어(Application software)` - 웹 브라우저, 게임, 워드 프로세서 등 | ||
|
||
`시스템 소프트웨어(System software)` - 운영체제(Operating System), 유틸리티(Utility) | ||
|
||
`하드웨어(Hardware)` - CPU, SSD, RAM 등 | ||
|
||
<br> | ||
|
||
`커널(Kernel)`은 항상 메모리에 올라가 있는 운영체제의 핵심적인 부분으로, 시스템의 모든 것을 완전히 제어한다. | ||
|
||
커널은 하드웨어와 소프트웨어 사이의 상호작용을 용이하게 하며, 그리고 하드웨어의 모든 자원들을 관리하고, 자원에 관련된 프로세스 간의 충돌을 중재한다. | ||
|
||
또한 커널은 CPU 및 캐시 사용, 파일 시스템 및 네트워크 소켓과 같은 공통 자원에 대한 사용을 최적화한다. | ||
|
||
![1280px-Kernel_Layout svg](https://user-images.githubusercontent.com/90020593/230552175-b1962df2-c4a8-42dd-aba3-fb18436f16bd.png) | ||
|
||
<br> | ||
|
||
다음은 Linux에서의 시스템 계층을 표로 나타낸 것이다. | ||
|
||
![image](https://user-images.githubusercontent.com/90020593/230564966-49f80b14-e68a-4f53-9779-25bdce124ef8.png) | ||
|
||
위 표는 시스템 계층을 User mode와 Kernel mode로 분리해서 보여주고 있다. | ||
|
||
User mode에는 응용 소프트웨어와 시스템 구성요소, C 표준 라이브러리가 있으며, Kernel mode에는 Linux kernel이 있다. 그리고 그 아래 계층으로 하드웨어가 있다. | ||
|
||
<br> | ||
|
||
원칙적으로 User mode는 커널에 접근을 할 수 없기 때문에 커널이 관리하는 자원을 사용할 수 없다. | ||
|
||
그래서 시스템 호출(System call)을 사용하는데, 이는 응용 프로그램이 커널이 관리하는 자원에 접근하기 위한 인터페이스이다. | ||
|
||
쉘(Shell)은 운영체제와 사용자 사이의 인터페이스를 제공하는 소프트웨어로 시스템 호출의 일종이다. 쉘은 사용자로부터 명령어를 입력받아 이를 처리하는 명령어 처리기 역할을 수행한다. | ||
|
||
<br> | ||
|
||
### 참고 자료 | ||
|
||
<hr/> | ||
|
||
\- [위키백과](https://en.wikipedia.org/wiki/Kernel_(operating_system)) | ||
|
||
\- [리눅스 시스템 이해와 활용](https://www.gjudec.com/content/61c55674192e57261ef25238) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
--- | ||
layout: single | ||
categories: | ||
- iOS | ||
tags: | ||
- ios | ||
title: "iOS 앱은 어떻게 실행될까?" | ||
comments: true | ||
|
||
--- | ||
|
||
|
||
|
||
## 미시경제이론과 거시경제이론 | ||
|
||
<hr/> | ||
|
||
한 국민경제는 가계, 기업, 정부라는 세 경제주체로 구성되어 있다. 가계는 생산된 상품의 소비자인 동시에, 이들 상품을 생산하는 데 필요한 생산요소의 공급자 역할을 하고 있다. 가계의 거래 상대방이 되는 경제주체는 기업인데, 이것이 수행하는 주요한 역할은 가계에서 공급된 생산요소를 적절하게 결합해 상품을 생산하는 일이다. 한편 정부는 조세를 부과하여 재원을 마련하고, 이를 재화나 서비스의 구입에 사용하거나 혹은 이전지출이라는 형태로 국민에게 나눠 주는 역할을 한다. | ||
|
||
미시경제이론은 자원배분과 소득분배의 문제에 초점을 두고 있다. 이런 문제를 다룰 때는 개별 시장 혹은 개별 경제주체의 차원에서 일어나는 일들이 주요 관심사가 된다. 그러므로 미시경제이론에서의 분석은 국민경제의 각 부문을 하나씩 세밀하게 들여다보는 방식으로 진행된다. | ||
|
||
한편 거시경제이론은 경제의 안정과 성장의 문제를 주요한 탐구 대상으로 삼는다. 안정과 성장은 국민경제 전체의 관점에서 볼 때 비로소 의미를 갖기 때문에 경제의 전반적 흐름에 초점을 두고 있다. | ||
|
||
미시경제이론에서는 개별 경제주체의 선택행위 그리고 개별 상품시장에서 이루어지는 균형이 주요 관심의 대상이다. 시장의 균형이란 수요와 공급이 서로 맞아떨어지는 것을 뜻하는데, 이 균형의 결과로 나타나는 개별 상품의 거래량과 가격에 초점을 두는 것이다. 미시경제이론을 가격이론이라고 부르기도 하는데, 이는 가격이 어떻게 결정되며 어떤 역할을 수행하는지가 미시경제이론에서 핵심적인 중요성을 갖는다는 것을 의미한다. | ||
|
||
|
||
|
||
시장 | ||
|
||
시장이란 어떠한 재화나 용역을 사고팔기 위해 서로 접촉하는 개인들이나 기업들의 모임을 뜻한다. 이때 어떠한 상품을 사려는 의지와 팔려는 의지는 각각 상반된 힘으로 시장에 표출되는데, 두 힘이 균형을 이루었을 때 형성되는 가격을 균형가격이라고 한다. | ||
|
||
시장에서 가격의 역할은 크게 두가지인데, 첫째는 배급기능이다. 만일 어떠한 비용도 지불하지 않고 상품을 얻을 수 있다면 사람들은 이를 무한정 많이 소비하려 할 것이다. 가격은 가장 높은 가치로 상품을 평가하는 사람들에게 상품을 배급함으로써 과도하게 소비하려는 욕구를 통제하는 기능을 수행한다. 둘째는 배분기능이다. 애덤 스미스가 말한 보이지 않는 손은 바로 이 기능을 의미한다. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
--- | ||
layout: single | ||
categories: | ||
- iOS | ||
title: "c파일이 exe파일이 되기까지" | ||
--- | ||
|
||
<h2>컴파일러(compiler)</h2> | ||
-컴파일러란 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 번역하는 프로그램입니다.<br> | ||
컴파일러는 실행 프로그램을 만들기 위해 고급 언어를 저급 언어(ex 어셈블리어, 오브젝트 코드, 바이트코드)로 바꾸는 데 사용됩니다.<br><br> | ||
|
||
* 어셈블리어(assembly language) : 기계어와 일대일 대응하는 컴퓨터 프로그래밍의 저급 언어<br> | ||
* 기계어(machine code) : CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어 | ||
|
||
|
||
<h2>인터프리터(interpreter)</h2> | ||
-인터프리터란 이전에 컴파일된 기계어 없이 코드를 바로 실행하는 프로그램입니다.<br> | ||
컴파일러는 문서 전체를 읽고 한 번에 번역하는 반면, 인터프리터는 코드를 한 줄씩 읽으며 바로 기계어로 번역해 실행하기 때문에 오브젝트 파일을 만들지 않습니다.<br> | ||
|
||
<h2>컴파일러와 인터프리터</h2> | ||
-컴파일러는 코드 전체를 읽고 기계어로 번역합니다. 따라서 컴파일 타임은 길지만 런타임이 짧습니다.<br> | ||
오브젝트 파일을 생성하므로 메모리를 비교적 많이 사용하며, 코드 전체를 컴파일해야 하므로 코드 수정이 어려운 편입니다.<br> | ||
관련 프로그래밍 언어로는 C, C++ 등이 있습니다.<br><br> | ||
|
||
인터프리터는 런타임 중 코드를 한 줄씩 읽어 실행합니다. 따라서 런타임이 긴 편입니다.<br> | ||
오브젝트 파일을 생성하지 않아 메모리를 비교적 적게 사용하며, 한 줄씩 읽기 때문에 코드 수정이 용이합니다.<br><br> | ||
관련 프로그래밍 언어로는 HTML, JavaScript, Python, Ruby가 있습니다. | ||
|
||
|
||
<h2>하이브리드 기법</h2> | ||
-컴파일 기법과 인터프리터 기법을 혼합한 형태입니다.<br> | ||
고급 언어로 작성된 프로그램을 쉽게 해석할 수 있도록 중간 언어로 번역(컴파일) 후, 프로그램을 해석(인터프리터)하여 실행합니다.<br> | ||
대표적인 하이브리드 언어인 Java로 예로 들겠습니다.<br><br> | ||
|
||
(1) 개발자가 자바 소스 코드(.java)를 작성합니다.<br> | ||
(2) 자바 컴파일러가 소스 코드를 컴파일하여 바이트코드로 작성된 파일(.class)를 생성합니다.<br> | ||
(3) 바이트코드 파일을 JVM(Java Virtual Machine)의 메모리에 올립니다.<br> | ||
(4) 자바 인터프리터가 바이트코드 파일을 한줄씩 읽어가면서 실행합니다.<br> | ||
|
||
추가적으로 최근 JVM은 실행 속도가 느린 인터프리터 방식의 문제를 해결하기 위해 JIT컴파일러를 지원합니다.<br> | ||
|
||
* JIT 컴파일(Just-In-Time) : 실행 전 파일 전체를 기계어로 번역하는 정적 컴파일 방식이 아닌, 런타임 중 일부 바이트코드를 기계어로 번역하는 방식. 번역된 기계어를 캐싱에 남겨둬 같은 코드가 반복 시, 다시 컴파일 하지 않고 재사용합니다. | ||
* 바이트코드(bytecode, p-code) : 특정 하드웨어가 아닌 가상머신에서 돌아가는 바이너리 코드. 하드웨어 의존도가 떨어지며 이식성이 높습니다.<br> | ||
|
||
|
||
<h2>C언어의 컴파일 과정</h2> | ||
-C언어로 작성된 소스 코드는 컴파일 과정을 통해 실행할 수 있는 프로그램이 됩니다.<br> | ||
컴파일은 전처리 - 컴파일 - 어셈블 - 링킹, 4단계에 거쳐 진행됩니다.<br> | ||
C로 작성된 HelloWorld.c라는 문서를 예를 들겠습니다. | ||
|
||
|
||
<h3>전처리(preprocessing)</h3> | ||
컴파일 전 실행되는 전처리기라는 프로그램으로 문서를 전처리합니다.<br> | ||
전처리기가 실행되면 각 코드 파일에서 지시자를 찾는데, 지시자란 #으로 시작해서 줄바꿈으로 끝나는 코드입니다.<br> | ||
|
||
<h4>헤더 파일 삽입</h4> | ||
<b>#include<파일명></b> 지시자는 그 위치에 파일을 복사합니다.<br> | ||
헤더 파일을 include 하는 것은 함수를 사용하기 전, 함수의 원형을 선언하는 C언어의 특성 때문입니다. | ||
|
||
<h4>매크로 치환 및 적용</h4> | ||
<b>#define</b> 지시자를 통해 매크로를 정의할 수 있습니다.<br> | ||
매크로 상수 : <b>#define Pi 3.1415</b>, 문서 내 모든 Pi를 상수 3.1415로 치환합니다.<br> | ||
매크로 함수 : <b>#define SQUARE(X) X*X</b>, 문서 내 SQUARE(X)라는 패턴을 X*X라는 수식으로 치환합니다.<br> | ||
|
||
전처리 과정을 통해 문서를 컴파일할 준비를 마칩니다.<br> | ||
또한 전처리 후 HelloWorld.c 파일에서 hello.i 파일을 생성합니다. | ||
|
||
|
||
<h3>컴파일(compile)</h3> | ||
컴파일 과정은 크게 전단부, 중단부, 후단부로 나눌 수 있습니다. | ||
|
||
<h4>전단부(Front-end)</h4> | ||
전단부에서는 언어 종속적인 부분을 처리합니다.<br> | ||
어휘 분석, 구문 분석, 의미 분석을 통해 소스코드가 해당 언어로 올바르게 작성되었는지 확인하고, 중단부로 넘겨줄 GIMPLE 트리(소스 코드를 트리 형태로 작성한 자료구조)를 생성합니다. | ||
|
||
<h4>중단부(Middle-end)</h4> | ||
중단부에서는 아키텍처 비종속적인 최적화를 수행합니다.<br> | ||
전단부에서 넘겨받은 GIMPLE Tree를 SSA(Static Single Assignment) 형태로 변환 후 아키택처 비종속적인 최적화를 수행 후, 후반부에서 사용할 RTL(Resister Transfer Language, 고급언어와 어셈블리어의 중간 형태)를 생성한다. | ||
|
||
*아키텍처 비종속적 최적화 : CPU 아키텍처에 구애받지 않고 공통적으로 수행할 수 있는 최적화. | ||
|
||
<h4>후단부(Back-end)</h4> | ||
후단부에서는 아키텍처 종속적인 최적화를 수행합니다.<br> | ||
중단부에서 넘겨받은 RTL를 이용해 아키텍처 종속적인 최적화를 수행 후 어셈블리 코드를 생성합니다.<br> | ||
아키텍처 종속적인 최적화를 수행하면 해당 아키텍처만 이해할 수 있는 언어가 되기 때문에 다른 아키텍처에서는 어셈블리 코드를 해석할 수 없습니다.<br> | ||
전처리가 끝난 HelloWorld.i 파일을 컴파일하면 어셈블리 코드로 이루어진 HelloWorld.s 파일이 생성됩니다. | ||
|
||
*아키텍처 종속적 최적화 : 명령어를 아키텍처 별로 더 효율적인 명령어로 대체하는 등 아키텍처 특성에 따른 최적화. | ||
|
||
|
||
<h3>어셈블(assemble)</h3> | ||
컴파일 후 어셈블리어로 작성된 HelloWorld.s 파일은 어셈블러에 의해 기계어로 어셈블됩니다.<br> | ||
어셈블러에 의해 생성되는 오브젝트 파일(hello.o)은 명령어와 데이터가 들어있는 ELF 바이너리 포맷 구조를 가집니다.<br> | ||
이는 링커가 여러 개의 오브젝트 파일을 하나의 실행파일로 묶을 때, 각 파일의 정보를 효과적으로 파악하기 위해 일정한 규칙을 가지도록 형식화 해둔 것입니다.<br> | ||
오브젝트 파일은 바이너리 코드의 형태이지만 아직 완전한 기계어가 아니기에 아직 실행할 수 없습니다. | ||
|
||
<h3>링크(linking)</h3> | ||
오브젝트 파일은 링킹 과정을 통해 실행 가능한 실행파일(HelloWorld.exe)로 만들어집니다.<br> | ||
링커는 오브젝트 파일들과 프로그램에 사용된 표준 C 라이브러리, 사용자 라이브러리들을 링크합니다.<br> | ||
printf() 함수와 같은 표준 라이브러리 함수들은 미리 컴파일 되어 있기 때문에 링킹 과정만 거치면 사용할 수 있습니다.<br> | ||
|
||
이러한 과정을 통해 C언어로 작성된 프로그램이 실행됩니다.<br> | ||
HelloWorld.exe 파일을 실행하면, 바이너리 파일의 내용들이 RAM으로 할당되어 동작하게 됩니다. |
Oops, something went wrong.