독서기록장9 9. 운영체제 9장 메모리 (4) 페이징 페이징페이징은 연속된 물리 메모리 공간 없이도 프로세스가 실행될 수 있도록 하는 메모리 관리 기법이다.물리 메모리는 프레임이라는 고정 크기 블록으로, 논리 메모리는 페이지라는 동일 크기 블록으로 나눠지고, 이 둘은 일대일로 매핑된다.프로그램이 메모리에 올라갈 때 페이지 테이블을 통해 논리 주소의 페이지 번호를 물리 주소의 프레임 번호로 바꾸고, 거기에 페이지 오프셋을 더해 실제 주소를 계산한다. 이 작업을 MMU가 자동으로 해주고, 덕분에 물리 주소가 연속되지 않아도 된다. 그래서 외부 단편화가 원천적으로 사라진다.하지만 페이지 단위로만 할당하기 때문에 프로세스 크기와 페이지 크기가 안 맞으면 마지막 페이지에서 내부 단편화가 생긴다.예를 들어 2048B짜리 페이지를 썼는데, 마지막 페이지에 1000B만 .. 2025. 3. 31. 8. 운영체제 9장 메모리 (3) 연속 메모리 할당 가변 파티션 방식연속 메모리 할당은 메모리를 나눠주는 방식 중 하나이다.그 중에서도 가변 파티션 방식은 프로세스 크기에 맞춰 딱 맞게 메모리 덩어리를 나눠주는 것이다.처음엔 메모리 전체가 하나의 큰 hole로 비어있고, 요청이 들어온다면 그 크기만큼 잘라서 주고, 남은 공간은 hole로 남긴다.시간이 지나면서 프로세스가 종료되면 메모리 여기저기 작은 hole들이 생기고, 이 hole들을 다시 잘 활용하지 못하면 조각처럼 되어서 공간 낭비가 생긴다.이 모든 문제를 통틀어서 동적 메모리 할당 문제라고 하고, 그래서 운영체제는 어떤 hole에 새로운 프로세스를 배치해야 할지 결정해야 한다.이걸 메모리 할당 전략이라고 한다. 대표적인 전략은 3가지가 있다.1. 최초 적합: 앞에서부터 순차적으로 찾다가 딱 들어맞.. 2025. 3. 30. 7. 운영체제 9장 메모리 (2) with java spring.. 논리 주소 vs 물리 주소CPU가 주소를 생성하면 그건 진짜 주소가 아니라 "논리 주소" 이다. 반면 진짜 RAM에서의 위치를 "물리 주소" 라고 한다.프로그램이 메모리를 사용하려 할 때, CPU는 논리 주소를 생성하고 이걸 실제 물리 주소로 바꾸는 작업이 필요한데, 이 작업을 해주는 게 MMU(Memory Management Unit)이라는 하드웨어다. 논리 주소와 물리 주소는 보통 다르고 매핑을 통해 연결된다. 예를 들어, CPU가 346번지를 접근하려 할 때 운영체제가 "너는 14000부터 써" 라고 했다면 실제 접근 위치는 14346이 된다. 이 때 14000이라는 값을 재배치 레지스터라고 한다. 동적 적재지금까지의 설명은 모두 프로세스가 실행되려면 메모리에 전부 올라와 있어야 한다는 전제였다... 2025. 3. 29. 6. 운영체제 9장 메모리 (1) with redis.. 기본 하드웨어CPU는 계산을 담당하는 놈이고, 계산하려면 데이터가 필요하다.근데 이 데이터는 항상 CPU 내부에 있지는 않고, 보통 RAM에 있다. CPU는 자기 내부에 Register라는 아주 빠른 공간에서만 직접 데이터를 꺼내 쓸 수 있다.그래서 뭔가를 계산하려면 일단 메모리에 있는 데이터를 레지스터로 가져와야 하는데, 메모리에서 레지스터까지 데이터를 가져오는 건 시간이 꽤 걸린다. CPU는 명령 하나를 1-3 Clock cycle에 처리 가능하다. 나노초 단위로 움직이며 굉장히 빠르다.하지만 CPU가 연산하려면 데이터가 필요하고, 그 데이터는 RAM에 있고, CPU가 메모리에게 값을 요청한 사이 지연시간이 생긴다.이 시간 동안 CPU는 계산을 못 하고 가만히 기다려야 하고, 이걸 Stall(지연) .. 2025. 3. 28. 5. Real MySQL 8장 인덱스를 잘 걸자 디스크 I/O와 인덱스DB성능 튜닝에서 가장 신경써야 할 병목 중 하나는 디스크 I/O 이다. SSD가 HDD보다 수 배 이상 빠른 처리량을 보여주기 때문에, DB서버에는 주로 SSD를 사용한다.디스크 I/O는 다시 랜덤 I/O와 순차 I/O로 나뉘는데,순차 I/O:디스크에서 연속된 위치를 읽는 경우, 한 번 헤더가 움직여서 쭉 읽으면 되니까 비교적 빠르다.랜덤 I/O:디스크 여러 곳을 이리저리 읽어야 해서, 매번 헤더를 옮겨야 하므로 비교적 느리다. DB쿼리가 랜덤 I/O를 많이 일으키면 속도가 크게 떨어진다.(HDD에서는 둘의 차이가 크지만, SSD에서는 크지 않다.) 따라서 순차 I/O와 랜덤 I/O는 또 쿼리 튜닝의 포인트가 된다. 그런데 쿼리 튜닝으로 랜덤 I/O를 단순히 순차 I/O로 변경할 .. 2025. 3. 20. 4. 운영체제 4장 스레드 동기, 비동기, 스레드풀 동기 스레딩 vs 비동기 스레딩동기 스레딩:부모가 자식 스레드를 생성하고 실행하는데, 자식이 끝날 때까지 기다려야 한다.데이터를 공유하면서 실행되고, 스레드 간 자원 공유가 가능하다.하나의 흐름이 끝나야 다음 작업이 가능해서 효율이 낮아질 수 있고 속도가 비동기에 비해 느리다. 비동기 스레딩:부모가 자식 스레드를 생성하지만, 기다리지 않고 바로 다음 작업을 수행한다.자식 스레드도 독립적으로 실행되며 서로 영향을 주지 않는다. 각각 따로 실행되므로 레이스컨디션을 방지 가능하다.멀티스레드 환경에서 동시 처리가 가능해 성능이 향상된다.의문1: 동기 스레딩은 병행성과, 비동기 스레딩은 병렬성과 매칭되나?이벤트 기반 비동기 방식은 병행성도 제공한다! 1. 동기 방식public class SyncThreadExam.. 2025. 2. 10. 3. 운영체제 3장 프로세스 간 통신 부모 프로세스와 자식 프로세스pid가 1인 프로세스(systemd)가 루트 부모 프로세스 역할을 하고, 새로 생성되는 프로세스들을 자식 프로세스라 한다.이 자식 프로세스들은 또다시 부모가 될 수 있으며 그 결과 트리를 형성한다. 부모 프로세스가 자식 프로세스를 생성할 때,1. 부모의 메모리 공간을 복사해 줄 수 있다. 전역변수, 힙, 스택 영역이 자식에게 그대로 전달된다. 하지만 복사된 후에는 부모와 자식이 독립적인 메모리 공간을 가진다.(변경해도 서로 영향 x)2. 자식 프로세스는 부모가 갖고 있던 환경변수를 그대로 상속받는다.3. file descriptor를 공유할 수 있다. 부모가 열린 파일을 자식도 동일하게 사용할 수 있다.4. IPC(파이프, 메세지 큐, 공유 메모리, 소켓)를 사용하면 부모가.. 2025. 1. 30. 2. 운영체제 3장 프로세스 기초, 컨텍스트 스위칭 프로세스 메모리 배치운영체제에서 프로세스가 실행될 때 메모리는 여러 영역으로 나뉘어 있다.코드와 전역 변수는 고정된 크기의 영역에 저장되고, 실행 중 생성되는 데이터는 동적으로 할당되는 힙과 스택에 저장된다.스택은 함수 호출과 관련된 정보가 저장되는 곳으로, 호출될 때 데이터를 push하고 끝나면 pop하면서 제거된다.이 때의 데이터를 "activation record"라고 하며, 함수 매개변수, 지역변수, 복귀 주소가 포함된다.마찬가지로 메모리가 동적 할당됨에 따라 힙이 커지고, 메모리가 시스템에 반환되면 축소된다. 정말 유명한 사이트 stack overflow이름의 유래가 이곳이다. 스택 메모리가 과도하게 커지는 것을 스택 오버플로우라고 하는데, 스택 오버플로우의 대표 예시로 순환 참조를 들 수 있다.. 2025. 1. 29. 1. 객체지향의 사실과 오해 초보자의 객체지향에 대한 관점은 이 책을 읽기 전과 후로 나뉜다 -이채영, 1999 ㅋㅋ 있어보이게 좀 써봤다. 명언같나? 튜터님이 추천해주셔서 읽었는데, 왜 나에게 이 책을 추천했는지 이제야 알 것 같다.나는 지금껏 디자인 패턴을 사용하거나 구조를 설계할 때 명확한 이유가 없었다. 그냥 멋있어 보였고, 하고 싶어서 썼을 뿐이다. 하지만 이제야 깨달았다. 내가 객체지향을 너무 쉽게 생각했음을.. 나는 단순히 클래스를 잘 나누고, 화려한 디자인 패턴을 적용하면 그것이 곧 SOLID를 준수한 코드이고 객체지향적인 코드라고 생각했다.틀린 말은 아니겠지만, 근본이 잘못되었다. 내 코드를 비유하자면, 상체는 비대하고 하체는 앙상한 모습이었다. 기본기도 없이 이것저것 덧붙인 결과, 몸뚱이만 커진 꼴이었다. 그렇다면.. 2024. 12. 23. 이전 1 다음