728x90
※ 응용 프로그램 = 어플리케이션 = 프로그램 모두 다 같은 의미이다.
✅하드웨어
프로그램(어플리케이션, 소프트웨어로 부름)이 동작되는 머신
- 내부 자원: CPU + Memory
- 메모리에 가까울수록 빨라야한다 (속도: 캐시 > 메모리 > 하드디스크, 용량은 반대)
- 외부 자원(입출력): 네트워크 IO, 저장장치 IO, 마우스 / 키보드
✅소프트웨어
시스템 소프트웨어(OS) + 응용 소프트웨어(통칭 어플리케이션)
- 시스템소프트웨어 = OS(a.k.a. 커널) 운영체제: 하드웨어를 사용하기 위한 API를 제공
- HW 자원 관리(자원 할당/회수)
- cpu연산 순서 결정
- 응용 소프트웨어 = 어플리케이션= 프로그램
- shell
- OS가 제공하는 API를 한번 더 감싼 API를 제공 -> os가 제공하는 api는 사용자가 사용하기 어려워서 한번 더 감싼것임
- `cd`, `mkdir` 이런 명령어를 쉘에 입력해서 OS를 다룰 수 있도록 한다
- HW관점에서 API 2가지: api 1계층(커널), api 2계층(쉘)
- 쉘 명령어는 OS를 감싸고 있다, 쉘 마다 api가 달라서 쉘에 따라 HW 조작 가능 수준이 다름
- `cd`, `mkdir` 이런 명령어를 쉘에 입력해서 OS를 다룰 수 있도록 한다
- 유저가 커널을 직접 다루기는 너무 어려워서 응용 소프트웨어로 간편하게 제어 및 사용을 제공
- OS가 제공하는 API를 한번 더 감싼 API를 제공 -> os가 제공하는 api는 사용자가 사용하기 어려워서 한번 더 감싼것임
- 그 외 모든 응용 소프트웨어: 우리가 다운받고, 설치해서 사용하는 모든것
- shell
✅프로그램, 프로세스와 스레드
1 요청 : 1 프로세스 실행과 1 요청 : 1 스레드 실행의 차이에 대해 설명하기에 앞서 프로세스와 스레드 간단 설명
프로세스와 스레드에 대한 설명: https://mystudylog.tistory.com/102
✅OS 위 어플리케이션 동작 원리
운영체제 (커널)은 커널 부팅 직후 초기화 프로세스를 시작 = 시스템에 필요한 프로세스가 자동으로 실행되는 단계
🔷초기화 프로세스
초기화 시스템명: `init` 혹은 현대에는 `systemd`
- 커널부팅이 끝나면 (운영체제가 하드웨어의 모든 기능을 제어하게 되었을 때를 말함) 초기화 시스템은 구성 파일을 읽고 구성 상태에 따라 서비스와 프로세스를 시작
- 초기화 프로세스는 모든 프로세스의 시작점이자 가장 첫 프로세스이기 때문에 1번 PID가 부여 (pid=1)
- 초기화 프로세스가 앱 실행을 위한 모든 프로세스를 실행
🔷초기화 시스템(Linux Service and Daemon Management)종류와 그 둘의 차이
리눅스 내 pstree로 확인해보면, systemd인지 init인지 확인 가능
- 과거
- SysVInit(프로세스명 init) -> unix에서 사용
- `service (start /stop / restart) -> `etc/init.d`
- 한번만 수행 후 종료 -> 이후 개별 프로세스 추적 불가
- 현대
- SystemD(데몬 프로세스명 systemd) -> Linux Distributions(Ubuntu 등) 에서 사용
- `systemctl (start / stop / status / restart) -> `/etc/systemd/system/.service`
- 한번 수행 후 계속 Daemon 형태로 떠있어서 이후 개별 프로세스 추적 가능
🔷Daemon 데몬이란 무엇인가?
프로세스에는 2가지 종류가 있다.
- Foreground Process(부모O)
- Background Process(부모X)
우리도 모르게 동작 중인 Background Process를 리눅스에서는 Daemon이라고 부른다.
- 리눅스 예시) 끝에 `d`가 붙는 프로세스들이 모두 데몬을 뜻한다. (sshd, httpd, mysqld) -> mysql 구동하면 block되지 않고 계속 돌아간다.
- 톰캣도 데몬이다.
✅컴파일 / 인터프리트(런타임)과정: 어플리케이션 개발 / 구동 방식
CPU는 기계어만 읽을 수 있음. 인터프리트 언어, 컴파일 언어의 결과는 기계어이다.
Complie 과정
고급언어 -> 저수준 언어(bytecdoe)로 변환하는 과정
[Java와 C, C++로 이해하는 컴파일 과정]
java 코드(.java) -> Bytecode(.class)
위 과정을 자바 컴파일러(Javac)를 통해 이루어진다.
- java 컴파일러 = javac
- c, c++ 컴파일러 = GNU 컴파일러(GCC) (c, c++(.c, .cpp -> 기계어(Binary code)
- GCC: GNU 컴파일러 모음(GNU complier collection <- GNU C Complier)
Runtime 과정
ByteCodes(.class) -> 기계어(Binary code) 로 변환하는 과정
[Java로 이해하는 런타임 과정]
java코드를 javac(컴파일러)를 통해 .class(bytecode)로 만들었다. 이 bytecode ->JVM(자바엔진) -> 기계어로 변환 과정을 거친다.
- Interperter = 자바엔진 (JVM)
- 인터프리터는 한줄한줄 읽으면서 기계어로 변환해준다.
- .class 파일을 JVM에 넣어주면 인터프리트 언어가 된다.
- 자바의 클래스 파일을 합친게 .jar 파일이라고 하고, 이 jar 파일을 jvm에 넣어서 기계어로 만든 후 실행파일이 되는 것이다.
- java는 컴파일 과정이 있는 인터프리터 언어이다.
[Intellij와 함께 컴파일, 런타임 에러 이해하기]
위에서 보았듯 Java는 컴파일과 인터프리드 단계가 나눠져있다. -> 컴파일과 런타임이 나눠져 있다.
컴파일에러: Intellij에서 컴파일 시 인지되는 문법 오류 등을 발생시키는것
런타임 에러: 실제 동작 중에 발생하는 에러
💡컴파일 에러 vs 런타임 에러
Q. 개발을 하다가 에러가 난다면 어떤 에러가 더 좋은 에러인가?
A. 컴파일 에러
런타임 에러는 실제 동작 중에 발생하는 에러이므로 유저가 서비스를 사용하다가 에러가 날 수도 있는게 런타임 에러이다.
따라서 컴파일 에러에서 한번 걸러주고(?) 런타임 에러를 최소화 하는 것이 좋다.
요즘 IDE가 잘 되어 있어서(Intellij만 해도...) 문법 오류 같은 경우 빨간줄로 표시해주고, 변수 자동 완성 등등 많은 기능을 지원해준다.
✅[심화] Blocking vs Non-Blocking & Synchronous vs Asynchronous
[연속성으로 비교] Blocking vs Non-Blocking: 일반적으로 CPU가 멈추는 걸 의미
- Blocking: 하나의 작업이 간간히 방해 받으며 수행된다.
- 방해: 주기적인 프로그램 실행 상태 확인 등등
- Non-Blocking: 하나의 작업이 어떠한 방해도 받지 않고 수행된다.
[동시성으로 비교] Synchronous vs Asynchronous
- 동기(synchronous): 앞선 작업이 완료되어야 그 다음 작업 수행
- 작업이 완료될때까지 하던 작업 멈추고 대기
- 비동기(Asynchronous): 앞선 작업이 완료되든말든 그 다음 작업을 수행할 수 있다. -> 웹 개발에서 많이 사용하는걸 볼 수 있음
- 작업이 완료되든말든 하던 작업 그대로 진행
- 작업이 완료되면, 완료되었다는 응답을 받음: callback
728x90