운영체제 개요 및 프로그램(어플리케이션) 동작 원리

민준·2024년 12월 26일
0
post-thumbnail

1. 하드웨어 : 어플리케이션(소프트웨어)이 구동되는 머신

  • 내부 자원 : CPU + Memory
  • 외부 자원 (입출력) : 네트워크 IO, 저장장치 IO, 마우스/키보드

2. 소프트웨어 : 시스템 소프트웨어(OS) + 응용 소프트웨어

  • 시스템 소프트웨어 = OS 운영체제(커널이라고도 함) : 아래 응용 소프트웨어에게 하드웨어 제공

    • OS(운영체제) : 운영체제는 컴퓨터 하드웨어를 관리하고, 사용자와 컴퓨터 간의 상호작용을 가능하게 해주는 소프트웨어
      (사용자 인터페이스 제공, 자원관리, 파일 시스템, 프로그램 실행 및 제어, 보안)

      • CPU 자원관리 : 스케줄링 알고리즘(FCFS, SJF, RR 등등)
    • 커널(Kerner) : 커널은 운영체제의 핵심 부분으로, 하드웨어와 직접적으로 상호작용하는 역할을 합니다. 운영체제에서 가장 중요한 "중앙 제어 장치"

      • 하드웨어 제어, 프로세스 관리, 메모리 관리, 디바이스 드라이버 관리(하드웨어 장치와 상호작용 지원), 시스템 호출 처리
  • 응용 소프트웨어 = 어플리케이션 = 프로그램

    • Shell(운영체제의 API) : 유저가 커널을 직접 다루기는 너무 어려워서 응용 소프트웨어로 간편한 제어 및 사용을 제공
      • CLI(명령줄 인터페이스), GUI로 제공
    • 그 외 모든 응용 소프트웨어 : 사용자의 목적에 따라 설치하고 사용하는 프로그램

2.1. 프로그램, 프로세스와 스레드 설명

  • 프로세스 = 프로그램이 메모리에 적재되어 실행중인 상태, 실행 단위가 크고 + 한개의 프로그램에 한개의 프로세스만 존재한다

    • 다른 프로세스와 데이터 공유가 어려움(IPC 필요.)
      IPC(Inter-Process Communication) : 프로세스 간 통신을 의미하며, 서로 독립적으로 동작하는 프로세스들이 데이터를 교환하거나 자원을 공유하기 위해 사용하는 기술
  • 스레드 = 프로세스 내에서 실제 작업을 수행하는 더 작은 실행단위, 실행 단위가 작고 + 한개의 프로그램 (한개의 프로세스) 내 수많은 스레드가 존재가능하다

    • 스레드마다 프로그램 카운터(실행 위치) + 명령어 레지스터(실행 함수) + 스택 영역(실행 변수) 을 가짐
    • 스레드는 프로세스 내에서 메모리를 공유하여 효율적으로 작업을 처리

2.2. 1 요청 : 1 프로세스 vs. 1 요청 : 1 스레드

1). 1 요청 : 1 프로세스

  • 하나의 요청마다 독립된 프로세스를 생성.
  • 안정적이지만 많은 자원을 소비.
  • 예: 과거 CGI(Common Gateway Interface) 방식의 웹서버.

2). 1 요청 : 1 스레드

  • 하나의 요청마다 프로세스 내 스레드를 생성.
  • 자원을 공유하므로 효율적이나, 동시성 문제 발생 가능.
  • 예: 현대 웹서버(Apache, Nginx).

임계구역(Critical Section)과 동시성 문제

  • 임계구역(Critical Section): 여러 스레드가 동시에 접근하면 문제가 발생하는 공유 자원.

  • 경쟁상태(Race Condition): 여러 스레드가 임계구역에 동시 접근해 잘못된 결과를 초래하는 상황.

해결 방법

  • 동기화(Synchronization) = 동시성 제어 = 여러 스레드가 하나의 단일 자원에 동시에 접근

  • 동기화(Synchronization) 기법의 종류로 2개의 타입

    • Mutex(뮤텍스) 상호배제 : Lock 혹은 Key 방식 = 0 잠금, 1 열림
      자물쇠처럼 동시 접근을 막음. 하나의 스레드만 접근 가능.
      예: 변기 하나에 한 명만 들어갈 수 있음.

    • Semaphore(세마포어) : Counter 방식 = 1, 2, 3, 4 넘버링
      카운터를 통해 동시 접근을 제한.
      예: 화장실 칸이 여러 개일 때, 특정 수의 사람만 들어갈 수 있음.

  • 심화 : 프로세스 - Daemon 및 리눅스 초기화

    • 데몬(Daemon) : 데몬은 백그라운드에서 실행되는 프로세스로, 일반적으로 사용자가 직접 상호작용하지 않고 시스템을 지원하는 역할을 합니다.

      • 프로세스에는 2가지 종류가 있다 : Foreground Process (부모 O) + Background Process (부모 X)

      • 우리도 모르게 동작중인 Background Process 를 리눅스에서는 Daemon 이라 부른다

      • 리눅스 예시, 끝에 d 가 붙는 프로세스들이 모두 데몬을 뜻한다 : sshd, httpd, mysqld

      • 특징
        부모 프로세스가 없음: 부모 프로세스가 종료되더라도 독립적으로 동작.
        시스템 서비스를 제공: 네트워크 연결 관리, 데이터베이스 서비스 등.
        예: sshd(SSH 서비스), httpd(웹 서버), cron(작업 스케줄러).


2.3. 운영체제 위 어플리케이션 동작 원리

운영체제 (커널)은 커널 부팅 직후 초기화 프로세스(init/systemd)를 시작 = 시스템에 필요한 프로세스가 자동으로 실행되는 단계

  • 초기화 프로세스 (초기화 시스템명 : init 혹은 현대에는 systemd)

    • 커널 부팅이 끝나면 (운영체제가 하드웨어의 모든 기능을 제어하게 되었을 때)

    • 초기화 시스템은 구성 파일을 읽고 구성 상태에 따라 서비스와 프로세스를 시작

    • 초기화 프로세스는 모든 프로세스의 시작점이자 가장 첫 프로세스이기 때문에 1번 PID가 부여 (pid = 1)

      • init(systemd): 운영체제가 하드웨어를 제어한 뒤 실행.
        • PID 1: 모든 프로세스의 시작점으로 "부모 프로세스".

3. 컴파일과 인터프리팅 : 어플리케이션 개발 및 구동

가장 먼저, 프로그램이 동작하는 기본 원리를 짚자면, 기계어가 머신에서 (해석되어) 실행되는것 기계어는 CPU가 이해하고 실행할 수 있는 언어

3.1. 프로그램과 프로세스의 차이

  • 기계어, 프로그램(정적)
    실행되지 않은 상태의 코드.
    컴파일된 기계어로 구성된 파일로, 디스크에 저장된 상태.
  • 프로세스(동적)
    실행 중인 프로그램으로, CPU와 메모리를 할당받아 동작.

3.1.1. 컴파일 과정

Compile 컴파일 과정 : Java 코드 (.java) ⇒ Bytecode (.class) - 자바 컴파일러(Javac)를 통해
(컴파일은 소스코드를 한 번에 기계어 또는 중간 코드로 변환하는 과정입니다.)

  • Compiler 컴파일러 = 자바 컴파일러(Javac)
  • C, C++ 코드 (.c .cpp)기계어(Binary Code) - GNU 컴파일러(GCC)를 통해
    • GCC = GNU 컴파일러 모음 (GNU Compiler Collection ← GNU C Compiler)

3.1.2 C언어

C 언어는 어떤 머신에 구동할지 **컴파일 단계에서 옵션을 주어 머신에 맞는 기계어를 컴파일(생성)

  • C, C++ 코드 (.c .cpp) 의 경우에는 컴파일러(GCC/LLVM)을 통해 ⇒ 기계어(Binary Code) 변환 후 바로 머신**에 동작

  • GCC는 어떤운영체제로 할지 정할수 있다.

3.1.3. JAVA언어

Java 언어는 컴파일 단계에서 단일 바이트코드 생성 후 JVM 이 머신에 맞추어 기계어로 인터프리팅 후 실행

  • Runtime 런타임 과정 : Bytecodes (.class) ⇒ 기계어(Binary Code) - 자바 엔진(JVM)을 통해

    • Interpreter 인터프리터 = 자바 엔진(JVM)

3.1.4. 컴파일 에러와 런타임 에러

Intellij 에서 컴파일 시 인지되는 문법 오류 등을 발생시키는걸 컴파일 에러라 하고, 실제 동작중에 발생하는 에러는 런타임 에러

로그를 발생시켜서 에러가 나오면 역으로 추적할수 있다.

0개의 댓글