시스템 소프트웨어 = OS 운영체제(커널이라고도 함) : 아래 응용 소프트웨어에게 하드웨어 제공
OS(운영체제) : 운영체제는 컴퓨터 하드웨어를 관리하고, 사용자와 컴퓨터 간의 상호작용을 가능하게 해주는 소프트웨어
(사용자 인터페이스 제공, 자원관리, 파일 시스템, 프로그램 실행 및 제어, 보안)
커널(Kerner) : 커널은 운영체제의 핵심 부분으로, 하드웨어와 직접적으로 상호작용하는 역할을 합니다. 운영체제에서 가장 중요한 "중앙 제어 장치"
응용 소프트웨어 = 어플리케이션 = 프로그램
프로세스 = 프로그램이 메모리에 적재되어 실행중인 상태, 실행 단위가 크고 + 한개의 프로그램에 한개의 프로세스만 존재한다
스레드 = 프로세스 내에서 실제 작업을 수행하는 더 작은 실행단위, 실행 단위가 작고 + 한개의 프로그램 (한개의 프로세스) 내 수많은 스레드가 존재가능하다
1). 1 요청 : 1 프로세스
2). 1 요청 : 1 스레드
임계구역(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(작업 스케줄러).
운영체제 (커널)은 커널 부팅 직후 초기화 프로세스(init/systemd)를 시작 = 시스템에 필요한 프로세스가 자동으로 실행되는 단계
초기화 프로세스 (초기화 시스템명 : init 혹은 현대에는 systemd)
커널 부팅이 끝나면 (운영체제가 하드웨어의 모든 기능을 제어하게 되었을 때)
초기화 시스템은 구성 파일을 읽고 구성 상태에 따라 서비스와 프로세스를 시작
초기화 프로세스는 모든 프로세스의 시작점이자 가장 첫 프로세스이기 때문에 1번 PID가 부여 (pid = 1)
- init(systemd): 운영체제가 하드웨어를 제어한 뒤 실행.
- PID 1: 모든 프로세스의 시작점으로 "부모 프로세스".
가장 먼저, 프로그램이 동작하는 기본 원리를 짚자면, 기계어가 머신에서 (해석되어) 실행되는것 기계어는 CPU가 이해하고 실행할 수 있는 언어
Compile 컴파일 과정 : Java 코드 (.java) ⇒ Bytecode (.class) - 자바 컴파일러(Javac)를 통해
(컴파일은 소스코드를 한 번에 기계어 또는 중간 코드로 변환하는 과정입니다.)
C 언어는 어떤 머신에 구동할지 **컴파일 단계에서 옵션을 주어 머신에 맞는 기계어를 컴파일(생성)
C, C++ 코드 (.c .cpp) 의 경우에는 컴파일러(GCC/LLVM)을 통해 ⇒ 기계어(Binary Code) 변환 후 바로 머신**에 동작
GCC는 어떤운영체제로 할지 정할수 있다.
Java 언어는 컴파일 단계에서 단일 바이트코드 생성 후 JVM 이 머신에 맞추어 기계어로 인터프리팅 후 실행
Runtime 런타임 과정 : Bytecodes (.class) ⇒ 기계어(Binary Code) - 자바 엔진(JVM)을 통해
Intellij 에서 컴파일 시 인지되는 문법 오류 등을 발생시키는걸 컴파일 에러라 하고, 실제 동작중에 발생하는 에러는 런타임 에러
로그를 발생시켜서 에러가 나오면 역으로 추적할수 있다.