본문 바로가기

CS Knowledge/OS

OS Basic

 

 

 

이번 블로그에서는 운영체제를 전체적으로 실습과 함께 알아보고자 한다.

 

 

운영체제의 종류

운영체제의 종류는 위와같이 정말 다양하다. 보통은 임베디드, 서버, 모바일, 데스크탑이 주된 사용 고객이고 각 기계마다 다양한 OS를 사용하고 있다.

예를 들어, 안드로이드 운영체제는 안드로이드만의 운영체제를 사용하는데 이는 리눅스 커널을 기반으로 사용하고 리눅스는 유닉스와 유사한 운영체제이다. 따라서, 안드로이드는 리눅스의 많은 특성을 상속받아 사용한다고 위의 표를 보며 해석할 수 있다.

 

커널 : 운영체제의 핵심 구성요소로, 자원, 프로세스, 파일 시스템, 장치 드라이브, 시스템 콜 등의 관리 및 역할을 수행한다.

 

 

위에서도 대표적인 운영체제인 Windows, Unix, Linux에 대해 자세히 알아보려고 한다.

 

 

 

Windows

마이크로소프트에서 제작한 대표적인 운영체제로 데스크탑에 사용되는 운영체제 중 가장 점유율이 높다고 한다. 

 

장점

  • 명령이 아닌 클릭으로 여러가지 기능 수행
  • 윈도우즈 프로그램들은 일관성이 있어 다른 프로그램들도 적응하기에 어려움이 없다.

단점

  • 오픈소스가 아닌 유로 프로그램 
  • 사용자가 변경하여 이용할 수 없고 버그 발생시 운영체제를 개발하는 개발자가 응답을 해주기전까지 기다려야 한다.
  • 일반 개발자를 위한 환경을 제대로 갖추지 않아 개발을 할 때 많이 사용되지 않는다.

 

개발자 입장에서 윈도우의 사용을 선호하지 않는 이유를 살펴보면 아래와 같다.

즉, 어떠한 프레임워크나 도구를 개발할 때 보통은 macOS나 Linux 환경에서 작업을 한다고 한다. 따라서, 이 프로그램을 사용한다고 가정할 때, 좀 더 호환성이 높을 수 밖에 없다는 점에서 개발자들은 다른 운영체제를 선호하는 것 같다.

 

좀 더 예시를 살펴보면 아래와 같다.

 

결론적으로 보면, 개인적인 견해가 추가 되었지만, 오픈 소스 프로그램이나 도구들을 개발할 때 자원들의 활용이나 여러면에서 운영체제를 사용할 때, 리눅스나 MacOs 환경 등에 적합하게 제작을 하였고 이러한 차이를 개선하였지만 어느정도는 차이가 남아있다 라고 볼 수 있겠다.

 

 

 

Unix

대부분 고급 언어인 C언어로 작성되어 있고 소스코드를 쉽게 구할 수 있어 다른 컴퓨터 하드웨어나 새로운 기종에 쉽게 이식이 가능하다. 

이러한 이유로 다양한 컴퓨터에서 사용되었고 현대의 컴퓨터 운영체제는 윈도우를 제외하면 Unix의 변종이나 그 자손으로 볼 수 있다.

서버 운영의 필수적인 CLI가 상당히 강력해서 서버 시장에서는 Windows 이상으로 인기가 좋다.

 

장점

  • 이식성이 좋다 -> 다른 하드웨어 플랫폼이나 환경에서도 비교적 쉽게 동작한다.

단점

  • 하드웨어 호환성이 낮다 -> 문제 발생 가능성이 윈도우보다 크다.

 

CLI : Command Line Interface (터미널)

GUI : Graphic User Interface (아이콘)

 

 

Linux

완전히 무료 오픈소스이며, 이를 기반으로 여러 자신만의 운영체제를 만들 수 있다. 현재도 계속 개발되고 개선되는 운영체제인만큼 무한한 성장가능성이 있는 운영체제로 볼 수 있다.

 

 

계열 정리

데비안 계열 : 데비안, 우분투, 칼리 리눅스, 구름 OS, 라즈베리 파이

레드헷 계열 : 레드헷 엔프라이즈 리눅스 등

안드로이드 계열 : 안드로이드, 크롬 OS 등

 

 

장단점

오픈소스이기에 사용자가 원하는대로 수정하여 이용할 수 있고, 즉 개발자는 자신의 기호에 맞춰 운영체제를 수정해 원하는 프로그램을 만들 수 있다. 버그나 에러 발생시 그 자리에서 수정가능하다. 하지만 오픈소스이기에 실시간 처리와 보안의 취약하다.

 

 

 

 

 

 

기본 용어정리

 

1. FHS (File Hierarchy System)

- 리눅스와 유닉스 기반 운영체제에서 파일과 디렉토리의 조직 및 배치에 대한 표준을 정의한 문서이다. 이는 다양한 리눅스 배포판 및 유닉스 시스템에서 일관된 파일 시스템 구조를 유지하고 호환성을 보장하기 위해 사용된다.

- 즉, FHS는 리눅스 및 유닉스 시스템을 사용하는 사용자 및 개발자들에게 일정한 지침을 통해 일관된 파일 시스템 구조를 유지하고 호환성 관리를 향상시키는 역할을 한다. 따라서 일종의 약속이라고 볼 수 있다.

 

-> FHS의 주요 원칙

 

 

2. 환경 변수

- 운영체제나 애플리케이션에서 사용되는 중요한 설정 정보를 저장하는데 사용되는 변수이다.

- 텍스트 형식으로 키와 값 형식으로 구성된다. 

- 시스템 전반에 사용되는 설정 정보를 저장하고 공유하는데 유용하다.

 

예시 : Spring에서는 yml이나 properties 파일에 변수 저장 후 @Value로 전역에서 사용

 

-> 환경변수의 주요 특징 및 용도

-> 예시

 

다른 예시로 자바를 처음 설치할 때, 환경변수를 설정하는 것을 알것이다.

아래는 왜 자바 설치시 환경변수 설정이 필요한 이유를 정리해 보았다.

 

1. java 파일의 실행을 용이하게 한다. 

-> 터미널에서 자바 실행 파일명을 직접 입력하지 않고도 실행 가능하다.

2. classpath 관리를 해준다.

-> java 애플리케이션에서 필요한 클래스 파일을 찾는데 사용하는 경로를 설정 가능하다.

3. 버전 관리

-> 자바의 여러 버전이 컴퓨터에 설치되어있을 수 있는데 버전을 변경 및 설정하는데 용이하다.

 

보통 JAVA_HOME, PATH 로 설정을 한다.

 

 

 

 

3. Shell

- 셸은 운영체제와 사용자간의 중요한 인터페이스로 시스템 관리, 스크립팅, 개발 및 다양한 시스템 작업을 수행한다.

- 사용자가 명령을 입력하고 운영체제의 기능을 수행하게 해주며, 프로그램을 실행하고 파일을 관리하며 다양한 시스템 작업을 수행하는데 사용된다.

 

- 하나의 명령어 해석기 또는 텍스트 기반의 사용자 인터페이스로 생각 하면된다. 예를 들어, 환경변수 생성을 위한 인터페이스

- 터미널이라는 CLI를 통해 명령어 작성시 이를 Shell이 해석하고 운영체제에게 여러 동작을 시킨다.

- 셸을 활용해 배포 스크립트 등을 작성해 배포 자동화를 처리하는 것도 셸의 사용 예시이다.

 

 

-> 주요 특징과 사례

 

 

 

4. Job Scheduler

- 작업 스케쥴러는 일정한 주기나 특정 이벤트에 따라 작업을 실행하거나 예약하는데 사용되는 도구 또는 소프트웨어를 의미한다.

- 자동화된 프로세스나 작업을 관리하고 예약하기 위해 사용된다. 

- 리눅스와 유닉스에서는 cron이라는 작업 스케줄러가 사용된다.

- 반복적이고 예측 가능한 작업을 자동화 하는데 유용하며, 시스템 관리, 데이터 관리, 보안 정책 준수, 백업 등 다양한 영역에서 사용된다.

 

 

-> 주요 특징과 적용 사례

 

 

 

5. Practice

 

- 셸을 이용해 환경변수 설정하고 Spring에서 사용 - 

 

현재 본인은 MacOs를 사용중이기에 여러가지 MacOs를 중심으로 간단한 실습을 정리해보고자 한다.

셸 스크립트 작성을 해서 모든 작업을 자동화하는 것도 가능하다.

현재 예시에서는 Zsh 셸 사용하였다.

 

 

환경 변수 생성 : 아래와 같이 설정시 터미널 종료시 삭제됨

export TEST_KEY=hello

 

영구 저장

echo 'export TEST_KEY=hello' >> ~/.zshrc

 

환경변수 삭제

unset TEST_KEY

 

변경사항 현재 세션에 적용 : 터미널 종료로도 가능

source ~/.zshrc

 

현재 세션 수정 (종료 ctrl+x)

nano ~/.zshrc

 

환경 변수 전체 확인

env

 

특정 환경 변수 확인

echo $TEST_KEY

 

 

환경 변수는 사용자 세션 환경변수가 아닌 프로그램의 환경변수로도 설정가능하다. 

둘의 차이는 위치에 따라 다르다. 사용자 세션 환경변수는 셸이나 터미널 등에서 사용가능하며 프로그램의 환경변수는 프로그램 내부에서 사용가능하다. 

이 후, 만약 Spring에서 사용시 STS나 IntelliJ 등에서 환경변수를 입력해 프로그램 내부에서 사용 가능하다.

 

1. properties 적용

TEST_KEY = ${TEST_KEY}

 

2. 코드에서 사용

import org.springframework.beans.factory.annotation.Value;

@Value
String key;

 

이 후, 사용하면 된다. 이는 보안면에서 좀 더 띄어나다는 점을 가진다.

 

또한 properties 파일을 건너뛰고 바로 코드에서 사용원할시 아래와 같이 사용한다.

System.out.println("전체 OS 환경변수 값 : " + System.getenv());
System.out.println("특정 OS 환경변수 값 : " + System.getenv("TEST_KEY"));

 

 

 

 

 

- Job Scheduler 사용해보기 - 

 

맥 OS를 현재 사용중인데 맥북은 기본적으로 리눅스환경과 유사한 운영체제를 운영하며

스케줄러로 cron을 사용한다.

 

해당 스케줄러로 특정 시간에 스크립트 또는 명령을 실행시키는 기능또한 수행 가능하다. 

예를들어, 배포 스크립트를 셸로 작성 후, 스케줄러로 시간을 설정하고 자동 실행을 설정해 자동 배포를 설정할 수 있다. 

 

 

기본적인 명령어는 아래와 같다.

 

크론 편집기 실행

crontab -e

 

크론 작업 추가

* * * * * command_to_execute

첫번째 별표는 분 (0-59)

두번째 별표는 시 (0-23)

세번째 별표는 일 (1-31)

네번째 별표는 월 (1-12)

다섯번째 별표는 요일(0-6) -> 0은 일요일을 의미

그냥 *유지시 모든것을 포함시킨다는 의미다

 

아래의 의미는 매요일 매월 매일 9시 정각에 해당 스크립트를 실행시켜라 라는 의미이다.

0 9 * * * /path/to/your/script.sh

 

크론 편집기 종료

참고로 나는 vi를 사용하는데 작성시 i를 눌러 작성하고 작성 완료시 esc 이후 :wq 엔터 처리면 저장된다.

 

크론 작업 리스트 확인

crontab -l

 

크론 작업 삭제를 원한다면 편집기에 다시 들어가 해당 줄을 삭제하면 된다.

 

 

 

 

참조

https://btcd.tistory.com/100