UNIX와 POSIX
리눅스와 관련된 설명이나 기능들을 살펴보다보면 계속해서 유닉스라는 키워드가 나온다. 나는 리눅스 시스템을 쓰려고 하는데 왜 자꾸 “유닉스 기능, 유닉스 함수”라는 말이 나오는건지 궁금해서, 관련된 내용에 대해서 알아보았다.
UNIX의 전파와 POSIX의 등장 배경
알고리즘 타고 널리퍼진 UNIX
Unix가 등장하기 전에는 각 회사마다 전용의 OS를 사용하는 환경이였다. IBM 컴퓨터 → IBM 전용 OS / DEC 컴퓨터 → DEC 전용 OS. 우리로 친다면 Dell OS / ASUS OS / macOS / Samsung OS 가 모두 따로 있는 느낌일까 싶다. 이렇다보니, 프로그램을 하나 만든다고 하더라도 각 OS에 맞게 전체 프로그램을 다시 작성해야 하는 문제가 있었고, 개발자가 각각의 OS를 모두 알아야 하는 문제가 있었다. 기업 입장에서도 특정 OS에서 다른 OS로 넘어가려면 모든 소프트웨어를 버리고 새로 만들어야 하는 골치아픈 문제가 있다. (벤더에게 종속되는 문제, 이건 지금의 macOS 아닌가..? 크흠...)
ㅤ
이 문제를 해결하기 위해서 AT&T Dell Labs 에서 켄 톰슨과 데니스 리치가 (원래 목적과는 다르게) UNIX라는 OS를 만들게 된다. 그리고 UNIX 운영체제의 효율성, 이식성(Portability)을 높이기 위해서 C언어를 만들고 UNIX 커널의 대부분을 C언어로 다시 작성하였다. 이들 다음의 장점들이 UNIX에 생겼다.
- 단순한 설계 : 한가지 일을 잘하는 작은 도구들을 모아서 작업을 처리하기
- 하나의 복잡한 프로그램(함수)를 사용하지 않고, 여러 유틸리티들을 연결해서 동작시키도록 설계
ls | grep ".txt" | wc -l파이프로 연결하는 형태의 명령어 호출- 얼마나 단순하게 만드는 것에 몰두했냐면, 이름부터 “UNI-X” 이다. (UNIX를 만들기 전에 실패했던 OS 이름은 Multics 였고, 깨져보니 단순한게 더 좋다고 생각해 UNIX가 탄생하게 되었다)
- 이식성
- 기존의 OS 들이 어셈블리어로 작성되어 HW에 종속적이였다면
- UNIX는 C언어로 작성되어 다른 하드웨어로 바뀌더라도 그대로 포팅 가능!
- 계층적 파일 시스템
- 모든 것을 파일로 관리한다!
- 터미널, 디스크, 심지어 실행중인 프로세스도 파일로 간주
ㅤ
이 시점에 UNIX가 C언어로 OS를 작성하겠다고 시도한 것은 파격적인 행보였음.
이때까지만 해도 “OS는 무조건 어셈블리어로 작성해야한다”는 불문율이 있었는데, 이 규칙을 깨고 감히 고수준 언어인 C로 OS를 짠다고..?? 그런데 C를 사용해서 좋은 성능을 내는 UNIX라는 OS를 진짜로 만들어냈기에 좋은 평가를 받고 UNIX가 다양한 연구의 대상이 될 수 있었다고 생각된다.
재밌는건, UNIX 이후로는 “OS는 무조건 C언어로 작성해야 한다”는 불문율이 새로 생겼다고 한다.
ㅤ
사실 이런 시도를 한 게 단순히 UNIX 뿐만은 아닐거라고 생각한다. UNIX가 널리 사용하게 된 이유는 뭔지 궁금해서 잠깐 찾아봤다.
- AT&T 에서 UNIX를 UC 버클리 대학에 무료로 배포 (독점과 관련된 정부규제로 판매를 못했음)
- 학생, 연구자들의 손을 거쳐 BSD UNIX(Berkeley Software Distribution UNIX)의 탄생
- 전 세계 대학에서 OS로 UNIX를 가르침
- 학생들이 졸업 후 회사에서 UNIX를 사용하면서 자연스럽게 UNIX가 널리 퍼짐
ㅤ
왜 하필 UNIX가 이렇게 대성공을 할 수 있었을까를 생각해보면 이게 무료로 배포가 되었기 때문이 아닐까 싶다. 다른 OS들은 돈 받고 파는 녀석들이였는데, 얘는 연구, 학술용으로 쓰라고 학교에 무료로 뿌렸고, 덕분에 카카오톡처럼 시장을 꽉 잡을 수 있었던게 아닐까. (팩트체크 안됨)
ㅤ
UNIX의 번식과 진영 싸움
이후에 각 회사에서 자신만의 UNIX 버전을 내놓기 시작한다. 원조 맛집인 AT&T 에서 내놓은 UNIX가 AT&T System V 이였는데 여기에 이어서 많은 UNIX계열의 OS 들이 등장한다.
- AT&T의 AT&T System V
- Sun Microsystems의 SunOS (Solaris)
- IBM의 AIX
- HP의 HP-UX
- SGI의 IRIX
- DEC의 Ultrix
- 심지어 BSD UNIX는 FreeBSD, NetBSD, OpenBSD 로 쪼개기
ㅤ
회사마다 각자 고유의 UNIX 들이 나오면서 또 다시 문제가 시작되었다. 기존 HW에 의존적인 프로그램에 대한 문제를 해결하고나 UNIX가 등장한 것이였는데, 이제는 프로그램이 UNIX 종류에 의존적이게 되어버린 것! 초기 UNIX에서 사용하던 시스템콜의 방식이나 명령어 옵션 등이 서서히 달라지고 파일 구조가 달라지는 등으로 인해, g하나의 프로그램을 만들어 배포하려면 각각의 OS에 따라 새로 작성해야하는 문제가 다시 발생해버렸다.
ㅤ
이를 해결하고자 Sun Microsystems와 AT&T가 손을 잡고 방식을 통일하려고 했는데 또 같은 시장의 참여자인 HP, IBM, DEC 등이 견제를 안할수가 있을까. 그래서 이 회사들도 OSF(Open Software Foundation)을 결성하고 AT&T vs OSF 진영의 대립 구도가 만들어졌다.
ㅤ
POSIX의 두둥등장
다시 한 번, 이를 해결하고자 IEEE 에서 UNIX에 대한 표준화를 진행하였다. 사실 이건 OS 제조사들이 자발적으로 통일시킨게 아니라 미국 정부에서 표준을 만들어 통일하라고 압박한 것이였다 ㅋㅋㅋ. 미국 정부에서 UNIX를 정부 시스템에 도입하려고 하는데, 너무 회사마다 구현 방식이 다르니 특정 회사에 의존하지 않기 위해서 (아마 채택했다가 구리면 입찰을 통해 더 싼 OS로 갈아타기 쉽게 만들기 위해서) 통일을 요구했고, 이를 공신력있는 기관인 IEEE에 요청하여 POSIX라는 UNIX 표준이 만들어지게 되었다.

ㅤ
POSIX (Portable Operating System Interface + uniX) 는 유닉스 계열의 OS들이 공통적으로 따르는 표준 API에 대한 명세이다. POSIX 에서는 다음의 것들을 규정한다. POSIX 2 버전과 이후도 계속 있다. 심지어 2024년에도 표준 문서가 업데이트되었다.

- 파일 입출력 (
open,read,write,close) - 시그널 (
signal,sigaction,kill) - 파일시스템 관리 (
mkdir,stat,opendir,readdir) - 메모리 관리 (
malloc,mmap,mprotect) - 동기화 방식 (
mutex,semaphore,condition variable) - 프로세스와 스레드 관리 (
fork,exec,pthread) - 등등
ㅤ
POSIX에서 이 함수나 명령어들의 내부 동작에 대한 구현까지 규정하는 것은 아니다. 최소한 이런 기능들은 갖추어야한다는 가이드를 제시한 것. 그렇기에, 동일한 write 함수 또는 명령어라도 각 UNIX 마다 더 다양한 옵션과 파라미터, 기능을 붙여서 사용할 수 있게 만들어두었다.
ㅤ
예를 들면, int log_fd = open("/var/log/can.log", O_WRONLY | O_APPEND | O_DIRECT) 이 뒤에 붙는 옵션들은 리눅스의 확장임!
ㅤ
pthread라고 부르던 것이 POSIX Threads 였다. 나는 이 p가 약간 개발사 이름이나 UIKit 같은 접두어인 줄 알았는데 POSIX의 표준이였다니…
만약 내가 짠 프로그램이 정말 POSIX UNIX 간에 이식성 100% 를 하고싶다면 공통 표준만을 이용해 작성하면 되고, 이식성을 조금 포기하더라도 조금 더 퍼포먼스나 편리하게 개발하고싶다면 특정 UNIX에서만 지원하는 기능을 사용해 구현하면 된다. 대신 이 경우에는 다른 UNIX로 이식할 때 해당 부분을 다시 수정해주어야한다.
ㅤ
POSIX 표준의 등장으로 여러 OS 벤더들이 자신의 UNIX를 POSIX와 호환되도록 만들었다. 미국 정부의 주도로 이루어진 대-표준의 시대 덕분에 UNIX 위에서 개발된 프로그램과 개발자들이 많아지고, 이로 인해 사용자도 많아지고, 이렇게 이루어진 선순환으로 UNIX가 번영하게 되었다.
ㅤ

ㅤ
위 그림에서 V family 기반의 Solaris, AIX, HP-UX 등의 OS는 상업용으로 여전히 잘 사용되고 있고, BSD 기반에서도 FreeBSD (넷플), 애플의 macOS, iOS, watchOS 등이 활발하게 사용되고 있다.
ㅤ
앞으로 살펴보게될 Linux와 Android 역시 UNIX를 기반으로 만들어진 OS로 분류된다.
Linux 같은 경우에는 UNIX를 참고해 “새로 작성”하였기 때문에, 사실상 UNIX와는 피 한방울 섞이지 않은 쌩판 남이라고 볼 수 있다. 그렇지만 아버지와 닮았다는 이유로 UNIX 가족에 편입되었다.
ㅤ
혹시 윈도우는 어디에…? 가 궁금해서 찾아보니 마이크로소프트는 시장 독점을 위해 UNIX를 사용하는 대신에 자신만의 길을 걷고싶어서 독자적인 OS를 만들어냈다. 대신 미국 정부 납품을 위해 POSIX를 지원하는 Windows NT 같은걸 만들어보기도 하고, 상업용으로 발전하던 UNIX와 달리 일반 소비자용 프로그램이나 GUI 위주의 기능 등을 발전시키면서 일반 사용자에게 인기있는 OS가 되었고, PC 혁명으로 빠르게 성장할 수 있었다. 즉, 윈도우는 독자적으로 개발, 발전되면서 UNIX와는 전혀 다른 아키텍처로 평행하게 발전해왔다!
ㅤ
다들 어셈블리로 OS를 짤 때 고수준 언어로 OS를 작성한 UNIX → 대박남
다들 UNIX를 기반으로 OS를 만들 때 혼자 독자 규격의 OS를 작성한 Windows → 대박남
뭘 해야 인생을 성공할 수 있을까. 인생 날로 먹고 싶은데, 저 2가지 방법은 날로 먹은건 아닌 것 같긴 해
ㅤ
단일 유닉스 규격 (SUS, Single UNIX Specification)
POSIX 표준의 규정 이후에 또 필요에 의해, 이번에는 UNIX 벤더들이 모여서 상용 UNIX 시스템을 위해 필요한 내용들이 포함된 개선된 표준을 제시한다. 이게 바로 SUS.
ㅤ
POSIX 이후 SUS가 제시되면서 두 표준은 계속해서 평행하게 발전했지만, 그 방향이 비슷했기에 Austin Group 에서 이 둘을 통합하면서 현재의 SUS가 되어왔다.
ㅤ
SUS는 아래의 내용들이 담겨있다.
- 기본 정의 : 표준 규격을 위한 시스템, 데이터 형식 정의, 규약과 표준 C언어 헤더 목록 등
- 셸과 유틸리티 : 표준 셸
sh와 명령어 (CLI 명령어 + 옵션) - 시스템 인터페이스 : 시스템을 호출하는 API 함수, 동작 방식, C 라이브럴ㅣ 목록 등
- 해설 : 위 표준에 대한 해설
ㅤ
SUS를 따르는 시스템 + 공식 기관에서 인증을 받았다면 해당 시스템은 “UNIX”라고 부를 수 있고, UNIX 상표를 사용할 수 있다. 만약 SUS를 따르긴 하는데 인증을 받지 않았다면 UNIX-like OS로 분류되게 된다. 이게 시간과 돈이 들기 때문에, 굳이 UNIX 상표가 필요하지 않다면 그냥 UNIX-like 로 남아있기도 한다.
ㅤ
macOS는 최근 UNIX 상표를 얻었다고 들었다. 앞으로 배울 Linux는 근데 이걸 취득하지 않아 UNIX-like 이다. Linux는 그래서 UNIX 라고 말 할 수 없다!
ㅤ
Linux
리눅스의 등장
1980년대 말, UNIX 시장이 아직 춘추전국시대일 무렵에는 각 벤더에서 판매되는 UNIX는 라이센스가 비싸고 + 내부 소스코드 공개가 안되어있고 + PC에서 UNIX를 돌릴 수 없어, 학생들과 개발자들에게 저렴하고 내부가 투명한 UNIX기반 OS에 대한 니즈가 있었다.
ㅤ
이에 따라서 MINIX 라는 UNIX 기반의 교육용 OS가 등장했다. 요 친구는 책을 통한 해설과 함께 소스코드도 공개가 되어있었지만, 교육용으로 나온 OS라 기능도 제한이 있었고, 상업적으로도 이용 제한이 있었다. 또, 교육용 OS이기에 최대한 단순하게 구성을 유지하고나 기능 확장도 지양했다.
ㅤ
이에 많은 개발자들은 여전히 갈증을 느끼고 있었고, 그 중 한 명이였던 리누스 토발즈가 1991년에 MINIX 기반의 운영체제인 Linux의 초기 모델인 Linux 0.01을 만들었다. 이때는 i386 CPU의 PC에서만 돌아감 + 아주 간단한 기본 기능만 제공 + 사실상 실용성이 아예 없는 OS였지만, 업데이트를 추가한 Linux 0.02 에서는 bash 쉘의 실행, gcc 컴파일러의 실행 등이 추가되어 그나마 쓸만해졌다.
ㅤ
GNU와 손 잡기
이쯤에 GNU 프로젝트가 있었다. GNU 프로젝트는 완전히 자유로운 UNIX를 만드는 것을 목표로 하는 프로젝트였다. 이미 gcc, bash, glibc (C언어 라이브러리), coreutils (터미널 명령어+유틸리티) 등을 갖추었지만, OS에 들어갈 커널을 개발하는 도중이였다. 사실상 커널 빼고 다 있었음. 그런데 Linux는 다 빼고 커널만 있는 상태. 마침 그래서 GNU + Linux 로 하나의 온전한 UNIX OS가 만들어질 수 있었다.
ㅤ
즉, 리눅스는 사실 커널이고, 나머지 시스템의 요소들은 GNU임. 그래서 OS 자체는 GNU/Linux 라고 부르는게 맞지만, 사람들은 이걸 Linux라고 부른다. (GNU 만든 스톨만 아저씨는 진짜 서운해서 펑펑 울었을 듯)
ㅤ
일단 공짜니깐 한 번 잡숴봐
Linux 0.12 버전에서부터 GPL 라이센스를 적용하겠다고 한 선택이 Linux의 시장 경쟁력을 높여 지금의 위치로 데려왔다고 생각한다.
ㅤ
GPL 라이센스 (General Public License)는
- 소스코드 공개해야함
- 수정이나 재배포 모두 자유로움
- 상업적으로 사용할 수 있음
- 대신 수정본도 GPL 라이센스를 따라야 함
ㅤ
즉, Linux를 기반으로 뭔가 업데이트를 해서 사용한다면 이걸 무료로 + GPL 라이센스로 코드까지 공개해야한다. 대신 공짜임 + 상업적으로 이용할 수도 있다는 장점이 있다.
ㅤ
일단 돈이 안들고, 이걸로 돈을 벌 수도 있으니깐 대학교와 연구소, 그리고 스타트업에서 Linux를 많이 사용할 수 있었다. 심지어 코드까지 공개가 되어있다니, 개발자들의 갈증을 해소하기에 아주 좋은, 니즈를 정확하게 맞춘 OS가 아닐 수 없다.
ㅤ
그렇게 Linux를 기반으로 공부와 연구를 한 학생들이 회사로 가서 Linux를 기반으로 한 시스템을 만들어 사용하고, 이게 또 공개가 되니깐 더 많은 자료가 생기면서 덕분에 더 많은 사람들이 들어오고. 유명해서 유명한 Linux가 되면서 시장을 장악할 수 있게 되었다. 물론 성능이 좋은 것도 있겠지.
ㅤ
Linux 의 이름
Linux Kernel
리누스가 작성하고 발전시켜온 리눅스 커널은 OS의 핵심이다. FreeRTOS에서 스케줄링을 담당했던 녀석도 이 커널이였다.
ㅤ
리눅스 커널은 다음의 역할들을 담당한다.
- 프로세스 스케줄링
- 메모리 관리
- 파일 시스템
- 디바이스 드라이버
- 네트워크 슻택
- System Call의 인터페이스 (호출, 결과 반환)
ㅤ
커널 자체는 OS가 아니기 때문에 bash 쉘, gcc 컴파일러, 유틸리티 프로그램 (ls, cp, mv 같은 명령어), 라이브러리 (glibc), 기타 애플리케이션 프로그램들은 포함하지 않는다. 이건 GNU의 것들을 사용한다.
ㅤ
리눅스를 말할 때 GNU/Linux를 말할 때도 있고 Linux Kernel 만을 말할 때도 있기 때문에 누가 물어보면 함정을 판게 아닌지 잘 살피자.
ㅤ
Linux 배포판
리눅스 배포판이라고 하면, 완제품 OS를 말한다.
커널 + 시스템 유틸리티 + 패키지 관리자 + 애플리케이션 = 설치하면 바로 사용 가능!
ㅤ
리눅스 배포판은 기본적으로 다음의 내용들을 포함한다.
- Linux Kernel
- GNU 도구 (bash shell, coreutils)
- C 라이브러리 (glibc)
- Init 시스템 (systemd)
- 패키지 관리자 (apt, yum)
- 기본 애플리케이션
-
- GUI는 옵션
ㅤ
보통 Linux 벤더에서 판매하는게 이 리눅스 배포판을 말하나보다.
| 데스크톱용 주요 Linux 배포판 | 서버용 주요 Linux 배포판 | 임베디드용 주요 Linux 배포판 |
|---|---|---|
| Ubuntu | Red Hat | Raspberry Pi OS |
| Fedora | CentOS | Yocto/OpenEmbedded |
| Linux Mint (이건 윈도우용) | Ubuntu Server | |
| Arch Linux (처음 들어봄 ㅋㅋ) | Debian |
배포판들은 모두 동일한 Linux 커널을 이용하지만, 옆에 붙어있는 다양한 도구들의 버전이나 구성이 달라진다. 물론 필요에 따라서 이 Linux 커널의 크기를 줄이기 위해 구 버전을 일부러 탑재하는 경우도 있겠지. 핵심은, Linux 커널은 그대로 + 주변의 쉘, 기본앱, 패키지 관리자 등의 구성이 다른다는 점.
ㅤ
커널 업데이트만 되면 성능이 좋아진다는데, 이게 Free Lunch지.
ㅤ
Embedded Linux
임베디드에서도 리눅스를 쓴다. 나의 실습환경인 Raspberry Pi 4 모델B 에서도 OS를 올려서 터미널에서 여러 명령어를 입력하고 리눅스 커널을 맛보고 있으니깐. 다만 이러한 곳에 일반 데스크탑용 리눅스 배포판이나 서버용 리눅스 배포판같은 배포판을 올리기에는 너무 용량도 크고 불필요한 기능도 많고 무겁다는 단점이 있다.
그래서, 불필요한 건 빼고 필요한 핵심만 쏙쏙 골라 담고 하드웨어에 특화시키는 방식으로 최적화를 시켜서 용량도 줄이고 부팅도 몇 초밖에 안걸리고 속도도 가벼운게 임베디드 리눅스의 특징이다. 그럼에도 커널 자체는 데스크탑이나 서버용 커널과 동일한 걸 쓴다!!
ㅤ
라고 생각하고 클로드한테 물어봤는데, 리눅스의 커널은 모듈식으로 구성되어 있기 때문에 불필요한 것들은 비활성화하고, 필요한 것들은 모듈로 추가하여 사용한다고 한다. 그래서 커널을 빌드할 때 옵션을 넣어줘서 필요한 것만 쏙쏙 골라담을 수 있게 만들어졌기에, 완전히 동일한 것은 아니지만… 동일한게 맞긴 하다!
ㅤ
라즈베리파이의 OS는 교육용이다보니 GUI 같은 기능들도 제공되긴 하고, Linux 배포판인 Debian을 기반으로 만들어졌다. 이런 특징을 보면 임베디드 리눅스보다는 배포판에 더 가깝다. 그치만 작은 임베디드 보드용으로 구성되었다는 점에서는 라즈베리파이 OS는 배포판과 임베디드 리눅스의 중간 지점 어딘가에 서있다고 볼 수 있다. (그 덕에 교육용으로 쓰기에는 좋지만, 실제 제품으로 쓰기에는 너무 무겁다고 한다)
ㅤ
'Embedded System > Embedded Linux' 카테고리의 다른 글
| [Embedded Linux] Linux 시그널 (0) | 2025.11.29 |
|---|---|
| [Embedded Linux] 리눅스의 프로세스 타파 (0) | 2025.11.27 |
| [Embedded Linux] 라즈베리파이의 부팅 (1) | 2025.11.25 |
| [Embedded Linux] Linux 커널 아키텍처 (1) | 2025.11.25 |
| [Embedded Linux] 시스템콜 함수가 호출되면 아래에선 무슨일이 일어나나 (0) | 2025.11.24 |