본문 바로가기
Learnings/Computer Science

유닉스와 리눅스

by abcdesong 2021. 1. 8.

노션에서 보기

🤷‍♀️ 이 학습이 필요한 이유

서버는 리눅스로 되어있다. 백엔드 개발자가 아니더라도 서버에 대한 이해는 필요하다.

터미널을 통해 서버에 접속하고 원하는 작업을 할 수 있도록 친숙해질 필요가 있다.

✏️ 리눅스와 유닉스

  • 유닉스는 C언어를 기반으로 만들어진 OS이다. 오늘날 사용되고 있는 대부분 OS의 시초라고 봐도 무방하다. 켄 톰슨 & 데니스 리치 제작

  • 리눅스도 그 중 하나다. 정확히 말하면 유닉스를 기반으로 한 교육용 OS인 미닉스가 변형되어 태어났다. 리누스 토르발즈 제작

미닉스를 만든 앤드루 테넌바움 교수의 학생이었던 리누스는 교수에게 미닉스를 개조해도 되는 지 물어보지만 거절 당한다.
매우 화가난 리누스는 홧김에 미닉스를 수정하여 자기 컴퓨터에서도 돌아가는 OS로 만들어서 무료 오픈소스로 공개해버린다.
이것이 바로 리눅스의 탄생기🔥

  • 리눅스는 오픈소스라는 특성으로 인해 여러 갈래로 파생될 수 있었다. 참고로 유닉스도 소스는 오픈이었으나 라이선스가 상용이었다.

  • 유닉스는 대형 서버용 컴퓨터에서, 리눅스는 개인용으로 많이 사용하는 추세였으나 요즘은 보안과 안정성이 많이 강화되어 은행 등 금융권에서도 리눅스를 사용할 수 있게 됐다.

  • 당연히도 리눅스는 유닉스와 완벽하게 호환된다.

✏️ 유닉스의 특징

  • C언어로 작성되어 쉽게 이식될 수 있고 장치/프로세스 간의 호환성이 우수하다.

C언어 이전엔 어셈블리어로 작성된 OS가 있었다. 어셈블리어는 정해진 CPU에서만 구동이 가능해서 CPU 100개가 있다면 각기 다른 100개의 코드가 있어야만 했다. 반면 C언어는 상호호환 가능하므로 변용 가능성이 무궁무진한 것.

어셈블리어 이해에 참고:
hello.c를 실행하기 위해 만든 컴파일 a.out은 맥OS에서 만든 경우 맥 끼리는 호환이 가능하지만, 윈도우로 보내면 해당 컴파일 파일 구동이 불가능하다.

  • 네트워킹 기능을 제공하므로 통신망 관리에 적합하다. 다중 사용자, 다중 작업을 지원한다.

시스템 구조

유닉스 시스템 구조는 다음과 같이 구성되어 있다.

출처: https://mindmajix.com/shell-scripting-tutorial

1. 커널 (Kernel)

  • 유닉스의 핵심이라고 할 수 있다. 좁은 의미로는 OS가 곧 커널이다. CPU 스케줄링, 기억장치 관리, 파일 관리, 입출력 관리, 프로세스 간 통신, 데이터 전송 및 변환 등 여러 기능을 수행한다.

  • 커널은 컴퓨터가 부팅되면 주기억장치에서 실행된다. 항상 메인메모리에 존재하면서, 하드웨어를 추상화하여 사용자 레벨 프로세스에게 서비스를 제공한다. 프로그램과 하드웨어 간의 인터페이스 역할을 하는 셈이다.

  • 이때, 서비스를 제공하는 통로가 바로 시스템 콜(System Call)이다. 아래 이미지처럼, 사용자 프로세스가 실행되면 시스템 콜이 요청되고 커널에서 실행된다. 그리고 커널에서 시스템 콜을 통해 서비스를 프로세스로 전송한다.

출처: https://fjvbn2003.tistory.com/306

  • 그리고 시스템 콜을 호출하기 위한 커널 API가 바로 CLI이다.

    # CLI에서 아래와 같은 명령을 입력하면 아래와 같은 시스템 콜이 발생할 수 있다.
    cp a.txt b.txt
    • 입력을 받기 위한 I/O 시스템 콜
    • 현재 디렉토리에서 a.txt에 접근 가능한 지 검사하는 시스템 콜
    • 만약 파일이 존재한다면 복사한 파일 저장을 위해 b.txt이 있는지 검사하는 시스템 콜
    • b.txt가 아직 없다면 파일을 저장하기 위한 시스템 콜
  • 가능한 모든 시스템 콜은 아래 이미지 참고

출처: https://fjvbn2003.tistory.com/306

2. 쉘 (Shell)

커널과 사용자를 이어주는 역할을 한다. 커널을 감싸고 있는 껍데기라고 생각하면 된다. 그러니 커널과 소통하기 위해서는 쉘을 통해야하는 것.

쉘에는 GUI와 CLI가 있다.
🎨 GUI (Graphical User Interface) - 맥으로 치자면 Finder
💬 CLI (Command Line Interface) - 맥의 Terminal

사용자는 Shell을 통해 명령을 입력하고, 쉘은 사용자의 명령을 해석하여 커널에 전달한다.

쉘은 메모리에 상주하지 않고 필요 시에 로드되어 일종의 응용프로그램으로 간주된다.

3. 유틸리티 (Utilities)

ls, cat 등이 바로 유틸리티이다. 유닉스 시스템을 편리하게 사용하기 위해 개발된 개발도구라고 할 수 있다.

 


 

 

참고 링크 모음

댓글