리눅스는 사용 유닉스와는 다르게 엄격한 정책 하에서 이루어지는 작업도 아니고, 특별한 정책 하에 개발자가 분해서 작업을 진행하지도 않는다. 인터넷을 통해 연결된 전 세계 개발자 그룹들의 개발 노력으로 이루어진다.
일명 리눅스 공동체는 리눅스와 관련된 다양한 소프트웨어의 개발을 위해서 다양한 메일링 리스트, 유즈넷 뉴스그룹 등을 통해 대화한다. 자연스럽게 많은 관례들이 생겨났고, 리눅스 커널도 이러한 방식으로 발전하게 되었다.
현재 리눅스 커널은 처음 개발자인 리누스 토발즈의 주도하에 개발이 진행되는데, 특정 개발자가 개발한 소스를 메일로 보내면 토발즈가 이 소스를 테스트하여 유용하다고 판단되면 커널에 포함시키는 동시에 공식 버전을 만들어 배포한다.
많은 자유 소프트웨어와 공개 소프트웨어들도 최초 개발자가 중심이 되어 수많은 개발자들의 참여하에 개발이 이루어진다.
특징
다중 사용자 및 다중 처리 시스템
하나의 시스템에 다수의 사용자들이 동시에 접속하여 사용할 수 있고(Multi-User), 각 접속자들은 다수의 응용 프로그램을 실행할 수 있다(Multitasking).
공개된 시스템
운영체제의 핵심인 커널뿐만 아니라, 같이 내장되어 배포되는 대부분의 응용 프로그램이 소스가 공개된 프로그램이다.
뛰어난 네트워크 환경
가장 널리 쓰이는 이더넷, SLIP, PPP, ATM 등의 다양한 네트워크 환경을 지원하며, TCP/IP, IPX, AppleTalk 등 대부분의 네트워크 프로토콜을 지원한다.
다양한 파일 시스템 지원
리눅스는 프로그램과 자료를 저장하기 위해 리눅스 고유의 파일 시스템인 ext2 ~ 4등을 사용한다. 그러나 다른 운영체제와는 달리 다양한 파일시스템을 지원한다.
리눅스는 약간의 어셈블리와 대부분이 C언어로 이루어져 있다. 따라서 C를 컴파일할 수 있으면 어셈블리 부분만 수정해서 C부분을 다시 컴파일함으로써 다른 시스템에 이식할 수 있다.
유연성과 확장성
리눅스는 상업용 UNIX의 모든 특성을 가지고 있으며, 유닉스의 표준인 포직스(POSIX)를 준수하고있다. 따라서 공개용 유닉스 프로그램들을 컴파일해서 사용할 수 있고, 커널, 장치드라이버, 라이브러리, 응용 프로그램, 개발도구 등 리눅스의 원시코드를 쉽게 접할 수 있다.
리눅스에서 설계하고 만들어진 프로그램은 다른 시스템에 이식이 쉽고 자유로운 배포가 가능하다. 일반적인 유닉스 운영체제는 특정제품의 하드웨어만 동작하도록 만들어져 있으나, 리눅스는 다양한 채널을 통해 다양한 하드웨어 관련 지원을 받을 수 있다.
뛰어난 안정성과 보안성
리눅스는 소스가 공개되어 있기 때문에 Windows와 같은 폐쇄형 운영체제에 비해 보안상의 취약점이 쉽게 노출될 가능성이 있으나, 수많은 프로그래머들이 빠르게 오류 수정과 보안 관련 패치를 발표하고있다.
다양한 응용 프로그램의 제공
Shell과 기본 명령어, X Window 시스템(Xorg, KDE, GNOME 등의 GUI 시스템), 편집기(Vim, emacs 등), 서버 및 클라이언트 프로그램(웹, 메일, FTP 등), 개발도구(C, C++, Java, Python 등), 보안도구(nmap, tcpdump 등), 게임 등을 포함하여 배포하고있다.
다양한 배포판의 존재
국외에는 레드헷, 데비안, 우분투, 수세 등이 있고, 국내에는 한컴리눅스, SULinux 등이 있다. 이러한 배포판들은 같은 리눅스 커널을 사용하지만 시스템 도구, 관리 시스템, 응용 프로그램 등이 차이가 난다. 상용 배포판인 레드헷 엔터프라이즈 리눅스, 수세 리눅스 엔터프라이즈 서버
등과 커뮤니티에서 무료로 배포와 지원을 받을 수 있는 CentOS, Fedora 등으로 나눌 수 있다.
단점
기술지원의 부족
리눅스에서 사용되는 응용 프로그램들이 비상업적인 제품이기 때문에 전 세계에 흩어져 있는 개발자들이 일일이 기술지원을 하는 것이 불가능하다. 이로 인해 사용하면서 발생하는 문제점들은 모두 사용자의 몫이다.
특정 하드웨어에 대한 지원이 부족
이식성, 확장성은 뛰어나지만, 특정 하드웨어에 설치가 어렵고 모든 플랫폼에서 작동하지는 않는다.
사용자의 숙련된 기술이 요구
최근 리눅스는 GUI 환경이 보편화되면서 비교적 쉬워졌으나, 여전히 중요한 설정은 명령어를 입력하거나 관련 설정 파일을 편집기로 수정해야한다.
기술적인 특징
계층적인 파일 구조
/(root)를 기준으로 usr, var, bin 등이 존재하고 다시 usr 디렉토리 밑에는 local, src 등의 디렉토리가 존재한다. 이러한 구조를 계층적 파일 구조라 하며, 거꾸로 뒤집어 놓으면 나무처럼 생겨 트리 구조라고도 한다.
장치의 파일화
장치(하드디스크, 키보드, 프린트, 화면 출력 장치 등 시스템에 여러가지 하드웨어적 자원)들을 파일화하여 사용한다. 따라서 특정 하드웨어에게 명령을 수행하려면 해당하는 장치 파일에 명령을 내리면 된다.
가상 메모리 사용
가상메모리(하드디스크의 일부를 메모리처럼 사용)를 사용하여 RAM(메모리)의 공간이 작으면 실행할 수 없는 큰 프로그램들을 실행할 수 있게끔 한다. 이 영역을 스왑(Swap)영역이라고 부른다.
※ 스와핑(Swapping): 메모리에 올라와 있지만 사용하지 않고 있는 프로그램을 하드디스크에 설정된 가상메모리 공간으로 보내고 그 빈 공간에 새로운 프로그램을 로딩한다. 또한 가상메모리에 있는 내용을
사용하려면 다시 메모리에 올리고(이 과정에서 약간의 오버헤드가 발생하여 속도에 차이가 발생), 그 대신에 메모리에 있던 다른 내용을 하드디스크에 저장한다. 메모리와 하드디스크 사이의 데이터 교환을
스와핑이라고 한다.
동적 라이브러리 지원
프로그램에서 특정한 기능을 하는 루틴들을 모아 놓은 것을 라이브러리하여, 프로그램 개발 시 필요한 루틴들을 받아서 링크 시킨다. 이렇게 되면 같은 기능을 하는 루틴들이 실행 파일마다 들어가므로,
실행 파일의 크기도 커지고 메모리도 남게 된다. 그래서 같은 루틴들을 공유하는 것을 공유 라이브러리라 한다. 정적 라이브러리는 컴파일할 때 이러한 라이브러리를 프로그램에 넣지만, 동적 공유 라이브러리는
실행 파일 내부에 넣어두지 않고, 프로그램을 실행할 때 가져다 사용하므로 메모리의 효율성이 아주 높다.
가상 콘솔(Virtual Console)
가상 콘솔은 하나의 모니터를 장착한 시스템에 여러 개의 가상 화면을 제공하는 기능이다. 리눅스는 기본적으로 6개의 콘솔을 제공한다. 최근 리눅스 배포판은 그래픽카드 메모리를 활용하여 지나간 작업 내용을 볼 수 있는 기능을 제공한다.
파이프(Pipe)
프로세스간의 통신을 위해 도입한 것으로 어떤 프로세스의 표준 출력(stdout)이 다른 프로세스의 표준 입력(stdin)으로 쓰이게 하는 것을 말한다.
리다이렉션(Redirection)
프로세스의 입/출력을 표준 입출력이 아닌 다른 입출력으로 변경할 때 사용한다. 출력 결과를 파일로 저장하거나 파일의 내용을 프로세스의 입력으로 사용하는 기법