리눅스의 정의
리눅스 커널에 기반한 UNIX 계열 운영체제의 통칭. 그렇다면 운영체제는? Unix 계열은 무슨 뜻? 리눅스 커널은 무엇인지에 대한 의문이 생길 것이다.
운영체제의 종류
운영체제는 크게 범용 운영체제와 특수 목적 운영체제로 나눌 수 있다.
범용 운영체제는 대부분의 사람들이 일반적으로 사용하는 운영체제이다. 하드웨어의 발전에 따라서 다음과 같은 순서로 발전해왔다.
1. 배치 시스템 : 한 번에 하나의 태스크만을 처리하는 시스템
2. 다중 프로그래밍 : 멀티 태스킹이 가능한 시스템
3. 시분할 시스템 : 시간을 태스크별로 분배해서 처리하는 시스템.
4. 개인용 컴퓨터 시스템
특수목적 운영체제에는 다음과 같은 종류가 있다.
* 병렬 / 분산 시스템
* 실시간 시스템
* 내장형 / 휴대형 시스템 : 어디에 삽입을 한다거나 휴대하고 다닐 수 있는 것.
특정 목적에 따라서 운영체제가 발전되었음을 알 수 있다.
Unix 의 태동
유닉스는 1969년 AT&T 벨 랩에서 개발을 시작했다. 초기에는 Unics 라는 이름으로 불리웠다. Multics(Multiplexed Information and Computing Service)라는 프로젝트에서 파생되었다.
개발 의도
이식성이(Portability) 강한 운영체제를 만들기 위한 시도에서 시작되었다. 또한 여러 사용자가 동시에 사용할 수 있으며 (Multi-tasking, Multi-User) 한번에 많은 작업을 처리할 수 있는 운영체제로서 고안되기도 했다. 단, Network 와 Security 의 개념은 없었다.
70년대 유닉스의 재정비 및 발전
1970년대에 들어서 유닉스를 C언어로 다시 코딩한다. 현재의 유닉스, 리눅스 시스템은 모두 C언어로 개발되어 있다. 이렇게 해서 차츰 버전6, BSD1.0, 버전7, System V 와 같은 다른 버전들이 나온다.
1980년대 표준 제정
80년대에 들어와서는 BSD와 System V 가 양대 산맥으로 발전한다. 분할된 발전 과정을 통합하려는 노력이 있었고 이 노력의 일부로 88년 POSIX라는 공통 표준 API를 제정한다. 리눅스는 87년 만들어진 MINIX로부터 발전하여 개발된 시스템이다.
1990년대
91년 Linus Torvalds 가 Linux 를 개발하기 시작한다.
Linux 역사
80년대 Free Software 운동에서 영향을 받았다. 83년 GNU 프로젝트에서 C 컴파일러, 에디터, 라이브러리등을 개발하였다. 91년 8월 리누스 토발즈가 커널을 최초로 공개했는데 이는 MINIX에서 GNU C로 개발을 한 것이었다. 초창기에는 Freax 라는 이름으로 시작하였다.
리눅스는 오픈소스로, 코드가 모두 공개되어 있고 상업적이지 않은 프로젝트이다. GPL이라는 자유 소프트웨어 라이선스 하에서 개발이 이루어진다. 배포판은 상업용, 비상업용 배보판들이 있다. 우분투는 대표적인 비상업용 운영체제이다.
UNIX 계통도
양대 산맥 - BSD패밀리 vs 시스템파이브&쓰리 패밀리
용어들
* FSF : Free Software Foundation 자유롭게 공짜로 소프트웨어를 이용하자는 생각에 만든 재단
* GNU : GNU is Not Unix
* GPL
* OSS : Open Source Software 소스가 공개된 소프트웨어
* CCL : Creative Commons License 창작물에 대한 자유로운 활용을 허용하는 것
오픈소스 소프트웨어의 장단점
<Linux 소개>
UNIX/Linux
많은 사람들이 한 물 간 고전적인 운영체제가 아닌가? 생각할 수 있는데, 하지만 유닉스와 리눅스 운영체제는 매우 안정성이 높다. 많은 개발자들이 참여하여 만들고 운영되기 때문에 도전적인 요소들이 많이 빠져있기 때문이다(MS와 같은 운영체제에 비해서). 뿐만 아니라 지속적으로 변화하고, 진화하는 특성을 띤다.
전 세계 서버 OS의 50% 이상을 점유하고 있다. 국내는 약 70% 이상의 점유율을 보인다. 특히 high-end (enterprise) 서버(기업의 가장 큰 서버단)는 거의 다 UNIX를 이용한다.
리눅스는 가장 빠른 속도로 성장하는 운영체제라 할 수 있다.
UNIX의 특징
* 다중 태스킹과 다중 사용자를 지원한다. 많은 사용자들이 서버에 접속해서 여러 태스크들을 처리할 수 있다.
* 대화형 시스템이다. 사용자의 쿼리에 따라 반응할 수 있다.
* 이식성과 확장성이 좋다. 다른 하드웨어 환경에도 잘 적응할 수 있다.
* 다중 프로세서를 지원한다. CPU를 여러 개 장착해 병렬 처리도 가능함.
* 강력한 네트워킹 기능을 기본적으로 내포한다.
* 풍부하고 강력한 유틸리티들을 제공한다.
* 풍부한 소프트웨어 개발 환경을 제공한다.
특정 집단 소유의 소프트웨어 | 오픈 소스 소프트웨어 |
폐쇄형 개발. 소수의 개발자만이 참여한다. | 개방형 개발. 누구나 개발에 참여할 수 있다. |
개발자 중심 | 사용자 중심 |
소스코드 없이 사용만 가능 | 소스코드가 공개되어 변형 가능 |
제품 정보는 개발업체가 제공하는 것이 전부 | 개발자 및 사용자들에 의한 자발적 문서화 |
저작권에 대한 비용 지불 | 저작권 비용 없음 |
서로 다른 환경의 시스템 통합 또는 이식성이 어렵다. | 소스코드를 이용해 시스템 통합과 이식이 자유롭다. |
버그 수정은 저작권 소유자에 의해서만 가능 | 버그 수정에 사용자와 개발자 모두 참여 |
소프트웨어의 존속이 저작권 소유자에 의존 | 사용자가 있는 한 소프트웨어 존속 보장 |
리눅스 특징
* 다양한 프로세서 아키텍처를 지원
* 광범위한 하드웨어 지원
* 다수 개발자와 사용자에 의한 테스트와 디버깅. 신뢰성이 높다.
* 운영자가 직접 보안 사항을 설정할 수 있음. 커널 수준 보안이 제공됨. 엔터프라이즈 서버단에서 사용하는 이유.
* Robustness (안정성이 높다)
리눅스 시스템 구조
* 계층 구조를 이룬다.
* 사용자 공간과 커널 공간이 분리되어 있다.
* 하드웨어와 소프트웨어의 분리
하드웨어 - 디바이스 드라이버 - 커널 <= 커널 스페이스 / => 유저 페이스 쉘 - 시스템서비스, 어플리케이션, 커맨드, 유틸리티
커널 (Kernel)
시스템 기능의 핵심 부분. 메모리에 상주하면서 시스템에 존재하는 자원을 관리한다. 디스크에 파일로서 존재하는 프로그램, 라이브러리.
1. 자원 관리
* 하드웨어와 사용자 프로그램의 중간에 위치
* CPU, 메모리, 하드디스크, 네트워크카드, 그래픽 카드 등의 하드웨어 자원을 제어.
2. 서비스 제공
* 응용 프로그램 실행, 파일관리, 시스템 호출 인터페이스, 입출력 서비스, 네트워킹 서비스 등의 기능을 사용자에게 제공.
* 일반적으로 커널과 함께 패키지로 공급되는 실행 프로그램들이 있다. 시스템 소프트웨어라고도 한다.
* 서비스 : 운영체제 구동과 함께 시작되어, 대기 상태에 있다가 사용 요청이 올 때 자신의 기능 수행. 네트워킹, 프린팅, GUI, 안티바이러스 등
* 유틸리티 : 사용자가 별도로 실행을 명령할때 실행됨.
쉘 (Shell)
* 커널과 사용자 간의 인터페이스이다. 운영체제 부팅 후 자동으로 실행되는 특수 프로그램이다. 사용자가 입력한 명령을 해석해 커널에 전달, 커널이 실행한 결과를 보여주는 명령 해석기이다.
* 명령 해석 외에 입출력 방향 전환 등의 일을 수행한다.
* 쉘의 종류는 매우 다양하다. sh, csh, ksh, bash, zsh ... 등 전통적인 CLI 모드 쉘이 있고, GNOME, KDE, Xface 등 GUI모드 쉘이 있다.
실행 프로그램
* 사용자가 직접 시스템과 접하는 수단
실행 프로그램의 종류
* 운영체제에 내장된 명령 (쉘 명령, 시스템 프로그램 등)
* 실행 가능한 쉘 스크립트 (텍스트 형태)
* 응용 소프트웨어 - 임의의 소스를 컴파일한 바이너리 코드.
* ELF (Executable and Linking Format) : 유닉스 표준 실행 파일 형식
리눅스의 응용 소프트웨어는 대부분 오픈소스.
'Linux Programming Basics' 카테고리의 다른 글
Shell 사용하기 (0) | 2020.07.03 |
---|---|
[Linux Programming] Process Related API (0) | 2020.06.30 |
[Linux Programming ] File Related API (0) | 2020.06.28 |
Linux : File Management Commands (0) | 2020.06.28 |
Linux : Command Environment (0) | 2020.06.28 |