컴퓨터구조 & 운영체제

컴퓨터 구조&운영 체제 - 00

hakstroy 2025. 4. 17. 23:04


**컴퓨터 구조&운영 체제 

1. 컴퓨터 구조는 무엇이며, 왜 알아야 하나???

 : 컴퓨터 구조란
  - "컴퓨터가 어떻게 동작하는지" 큰 그림을 이해하기 위해서!!
  : 컴퓨터 구조를 알면 해당 내용 부분 등을 알 수 있다. 그래서 중요한 이유?
  - 코드가 메모리에 올라가고CPU가 어떻게 처리하는지 알면 성능 최적화에 유리하다.
  - 배포된 서버에서 장애가 생겼을 때 원인을 추측할 수 있다.
  - JVM이 어떻게 메모리를 쓰는지도 여기서 연결이 `된다.

2. 컴퓨터 구조
 개념 설명
 - CPU : 계산하고 명령 처리하는 두뇌이며, 코드가 실행되는 핵심 부품이다.

  --> 실무 예시

   : 서버가 느려졌을 때 top, htop 명령어로 CPU 사용률을 확인할 수 있다.

   : 병렬 처리할 때 CPU 코어 수에 따라 멀티스레드 효과가 달라진다. 

   : Java에서 Thread.sleep()은 CPU를 쉬게 하는 거고, while(true) 같은 코드가 CPU 계속 점유하면 과부하로 이어진다.

 

 - 메모리(RAM) - 주기억장치 : 임시 저장 공간이며, 실행중인 프로그램이 사용하는 작업 공간이다.

  --> 실무 예시

   : 서버에 프로그램 배포 시 메모리 부족으로 인한 Out Of Memory(OOM) 발생 가능성이 있다.

   : DB 쿼리로 너무 많은 데이터를 한 번에 가져오면 메모리가 터진다.(부족 현상) 

    - 페이징 처리로 해결을 해야한다. (데이터를 잘라서) LIMIT 20 OFFSET 0; 


 - 보조기억장치 : 파일 저장소, DB,로그파일,실행파일 저장된다.
 (SSD,HDD 등)

 

 - 명령어 : CPU가 이해하는 단위 명령어를 뜻하며, 우리가 작성한 자바 코드->컴파일->명령어(컴퓨터가 알아 먹는)로 바뀐다.

 

 - 레지스터 : CPU 안의 초고속 임시 메모리 저장 공간이며, 데이터 처리 속도 향상

  --> 실무 예시

   : 우리가 직접 다루진 않지만, 컴파일러가 성능 최적화(loop 안 변수 캐싱 등)할 때 레지스터, 캐시 관련 최적화 한다.

   : 고성능 연산 라이브러리 (예 : TensolFlow, Numpy) --> 내부적으로 CPU 캐시 활용 최적화가 핵심이다.

 

- 캐시메모리 : CPU와 메모리 사이 중간 저장소이다. 속도 차이 극복하고-> 성능 향상

   : 우리가 직접 다루진 않지만, 컴파일러가 성능 최적화(loop 안 변수 캐싱 등)할 때 레지스터, 캐시 관련 최적화 한다.

   : 고성능 연산 라이브러리 (예 : TensolFlow, Numpy) --> 내부적으로 CPU 캐시 활용 최적화가 핵심이다.

 

 - (시스템)버스 : 데이터 이동 통로이다. 부품끼리 어떻게 연결되는지 이해할 수 있다.

  --> 실무 예시

   : 하드웨어 통신 관련 드라이버 개발자나 펌웨어 개발자가 더 많이 신경 쓰는 영역이라고 볼 수 있다.

   : 일반적으로 (일반)백엔드는 거의 직접 다루지 않아서 개념만 알고 있으면 된다. 

3. 운영체제는 무엇이며, 왜 알아야 하나???
 : 여러 프로그램이 서로 안 부딪히게, 자원(CPU,메모리)을 나눠쓰도록 관리하는 소프트웨어이다.
 : 중요한 이유??
  - 백엔드 서버는 "운영체제 위에서 동작"한다.
  - 스레드, 프로세스, 포트, 리눅스 명령어 등 전부 운영체제 개념과 연결되어 있음.

4. 운영체제
 개념 쉽게 설명 왜 중요한가??
 - 프로세스 : 실행중인 프로그램 하나이며, 서버에서 여러 백엔드 애플리케이션 동작을 한다.

  --> 실무 예시

   : Java Spring 웹 서버도 내부적으로 멀티 스레드 기반으로 동작한다. --동시에 여러 요청을 처리

   : Redis, Nginx, Tomcat 모두 프로세스/스레드 구조에 기반

   : 로그 보면 "PID(프로세스 ID)"가 찍혀 있는 경우가 많다
 - 스레드 : 프로세스 안의 작업 단위이며, 동시에 처리(멀티스레드)할 때 사용한다.

  --> 실무 예시

   : Java Spring 웹 서버도 내부적으로 멀티 스레드 기반으로 동작한다. --동시에 여러 요청을 처리

   : Redis, Nginx, Tomcat 모두 프로세스/스레드 구조에 기반

   : 로그 보면 "PID(프로세스 ID)"가 찍혀 있는 경우가 많다


 - CPU 스케줄링 : CPU를 누가 먼저 사용할 지 정하며, 서버 성능, 응답 속도에 영향을 준다!

  --> 실무 예시

   : 컨테이터(CPU 제한 걸린 환경)에서 너무 많은 연산 작업을 돌리면 느려진다. 

    - OS가 프로세스에 CPU를 안 준다.

   : 백그라운드 작업 예약시 (cron + 리소스 폭주 방지) 고려한다.


 - 동기화 : 여러 스레드가 하나의 데이터 접근하는 것을 뜻하며, 멀티스레드 프로그램에서 중요하다.

  --> 실무 예시

   : 게시글 좋아요, 조회수 증가 -> 여러 요청이 동시에 들어오면 race condition 발생 가능

   : synchronized, Lock, AtomicInteger, Redis의 분산락 활용한다. 

  [ (ex)게시글 좋아요 수 ] 충돌을 방지해준다. 
 

 - 인터럽트 : 예외/특별한 상황시 CPU 처리를 요청하며, 서버가 이벤트 처리하는 흐름과 관련이 있다.

  --> 실무 예시

   : 자바에서 Thread.interrupt() 쓰면, 긴 작업 중단이 가능하다.

   : 리눅스에서 Ctrl+C로 중단할 때도 인터럽트 신호(SIGINT)가 들어간다.


 - 메모리 관리 : 메모리를 효율적으로 분배한다.(프로세스마다.) 메모리 누수 방지, GC(Garbage Collection) 이해할 때 필요하다.
 - 가상 메모리 : 실제보다 더 큰 메모리처럼 사용하는 방식이며, 메모리 부족 문제를 해결해준다.

 --> 실무 예시(메모리 관리/가상 메모리)

   : JVM Heap 설정(-Xmx)은 가상 메모리를 얼마나 JVM이 쓰게 할지 정하는 것이다.

   : 가비지컬렉션(GC) 튜닝이나 Memory Leak 조사할 때 VisualVM, jmap, jstat 사용한다. 


 - 파일 시스템 : OS가 파일을 관리하는 구조이며, 로그파일, 설정 파일 등 백엔드에서 다룬다.

 --> 실무 예시

   : 로그 파일 자동 저장 경로, 권한 문제, 로그 로테이션 설정을 할 때

   : 배포 시 read-only 파일 시스템이면 파일 저장 안 된다. --> 장애 원인!!


 - 시스템 콜 : 사용자 프로그램<->운영체제 요청 인터페이스 : 파일 읽기/쓰기, 네트워크 사용 등 핵심 기능을 연결한다.

  --> 실무 예시

   : Java에서 FileReader, Socket, Thread.start() 전부 내부적으로 시스템 콜로 동작한다.

   : 보안 위협 대응시, strace로 시스템 콜을 추적해서 무슨 행동을 했는지 확인할 수 있다. 


**GC(Garbage Collection) = "쓰레기 수거기"
 : 자바 같은 언어에서는 우리가 new로 만든 객체(메모리)를 직접 지우지 않아도 GC가 대신 "안 쓰는 메모리"를 찾아서 
  정리해주 기능이다.
 : 필요한 이유 ?
  - 메모리는 한정되어 있어, 안 쓰는 메모리를 계속 올려놓으면 필요로 할 때 사용할 수 없게 된다. 
  - 우리가 객체를 만들면 메모리에 올라간다.
  - 그 객체를 더 이상 사용하지 않으면 쓸데없이 메모리만 차지하기 때문에 
    자바는 C처럼 free() 같은 걸로 직접 지우지 않으니 GC가 자동으로 지워줘야 한다!

**시스템 콜(System Call) = 운영체제에게 "요청하기"
 : 유저 프로그램(개발자가 짠 프로그램) -> 운영체제(OS)에 작업을 부탁하는 "요청 통로로"
 우리가 자바나 파이썬으로 코딩한다고 해도, 파일을 읽거나, 네트워크를 쓰거나, 메모리를 요청하거나 하려면
 운영체제의 도움이 필요하다.
 : ex) FileReader reader = new FileReader("text.txt");
 : 사실 이건 운영체제한테 "야! 이 파일 좀 열어줘" 라고 요청
 : 이게 바로 시스템 콜이 호출되는 순간이다!
 : 필요한 이유 ?
  - 운영체제는 핵심 자원들을 사용자 코드가 막 만지지 못하게 보호한다.
  - 파일 열기, 메모리 요청, 소켓 연결, 프로세스 만들기 등은 OS 한테 정식으로 요청해야한다.
시스템 콜 설명
read() / write() 파일, 소켓 등에서 읽고 쓰기
open() / close() 파일 열고 닫기
fork() 새 프로세스 만들기
exec() 프로그램 실행
kill() 프로세스 종료
socket() 네트워크 연결


예를 들어서 이렇게 떠올리면 돼:
✅ CPU
역할: 컴퓨터의 두뇌, 명령어 처리

왜 필요해? → 코드가 실제로 실행되는 핵심 부품!

✅ GC
역할: 안 쓰는 메모리 자동 청소

왜 필요해? → 메모리 낭비를 막고 서버가 안정적으로 돌아가게!

✅ 시스템 콜
역할: 유저 프로그램 ↔ 운영체제 요청 통로

왜 필요해? → 자바 코드도 결국 OS한테 "파일 열어줘!" 요청해야 함!

이렇게 “딱 두 줄”로 생각하는 연습을 하면:
복습할 때 빠르게 정리됨

면접 질문에도 말문이 막히지 않고 자연스럽게 대답 가능