본문 바로가기

전체 글90

[OS] 메모리 관리(2) - 페이징 연속 메모리 할당 외부 단편화 문제 프로세스는 메모리의 연속된 공간에 존재해야한다. 그런데 이런 연속 메모리 할당(Contiguous Memory Allocation)은 외부 단편화(external fragmentation) 문제를 낳는다. 외부 단편화란, 메모리의 빈 공간이 불연속적으로 흩어져있어서 빈 공간을 합한 크기가 하나의 프로세스를 할당하기 충분한 크기임에도 프로세스를 할당하지 못하는 것이다. 그림으로 살펴보면 다음과 같다. 메모리에 프로세스 A, B, C가 올라와있다. 아무것도 할당되지 않은 빈 공간을 hole이라고 한다. B가 모든 작업을 마치고 메모리에서 내려간다. 메모리에는 총 1000의 빈 공간이 있지만 그림처럼 500, 500으로 나뉘어있다. 그래서 새로운 프로세스 D는 600의 공간.. 2021. 8. 8.
[OS] 메모리 관리(1) - 동적 로딩,연결,스와핑 CPU 스케줄링과 더불어 OS의 중요한 업무 하나가 바로 메모리 관리(Memory Management)이다. 기술의 발전과 더불어 메모리의 용량이 빠르게 증가했지만 그 발전 속도만큼 메모리 사용량도 빠르게 증가했기 때문에 메모리를 얼마나 효율적으로 사용하는가는 컴퓨터 발전 역사에 있어서 항상 중요한 문제였다. 메모리를 효과적으로 사용하기 위한 방법에 대해 OS는 두 가지 측면에서 접근한다. 메모리 낭비 없애기 가상 메모리(Virtual Memory) 메모리 낭비 없애기 OS가 낭비되는 메모리를 줄이기 위해 어떤 방법을 이용하는지 알아보기 전에 우선 프로그램이 메모리에 적재되는 과정을 살펴보자. 프로그램이 메모리에 올라가는 과정 우선 메모리는 다음과 같이 주소(address)와 데이터(data)로 구성된다.. 2021. 8. 8.
[Java] equals()와 hashcode()는 언제 재정의해야 하나 [이펙티브 자바]의 아이템 10, 아이템 11에서 equals()와 hashcode() 재정의에 대한 내용을 자세하게 다루고 있다. 추후에 해당 내용에 대한 포스팅을 할 예정이고 여기서는 간단하게 요약해 알아보고자 한다. equals() equals()는 두 객체가 논리적으로 같은가를 확인해야하는데 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의되지 않았을 때 재정의한다. 예를들어, 레스토랑의 주문 관리 애플리케이션을 만들고 있고, 식당의 메뉴를 나타내는 Menu 클래스를 정의하고 있다고 해보자. public class Menu { private String name; private int price; ... } Menu 객체의 두 인스턴스가 이름과 가격이 같다면 이 둘은 “논리적으로 같은.. 2021. 8. 8.
[Java] StringBuffer vs StringBuilder 차이 (무엇을 써야할까?) String in Java 자바에서 String을 다룰 때 알아두어야 할 것이 있습니다. String은 참조 자료형이다. 근데 자바에서 좀 특별하게 취급된다. 불변(Immutable)이다. String pool 자바에서 String은 일반 객체와 달리 heap 영역의 String pool에서 관리됩니다. 문자열은 다음과 같이 두 가지 방법으로 생성할 수 있습니다. public static void main(String[] args) { String a = "Hello"; String b = new String("Hello"); } a, b 두 개의 문자열은 JVM 내에서 생성되는 영역이 다릅니다. 출처: https://www.journaldev.com/797/what-is-java-string-pool .. 2021. 8. 2.
[SpringMVC] 스프링 MVC의 구조를 이해해보자 (3/3) V4: 사용하기 쉬운 컨트롤러 지난 포스팅에서 만든 V3는 분명 좋은 설계이지만 컨트롤러 인터페이스를 개발하는 개발자 입장에서 매번 ModelAndView를 생성하고 반환하는 것이 번거로울 수 있다. 그래서 이번에는 개발자가 사용하기 편한 컨트롤러를 만들어본다. 기본적인 구조는 V3와 같다. 하지만 프론트 컨트롤러가 컨트롤러를 호출할 때, paramMap 뿐만 아니라 객체를 담을 model을 추가적으로 전달한다는 것, 그리고 컨트롤러가 ModelAndView를 반환하는 것이 아니라 viewName만 반환한다는 차이가 있다. 프로세스 또한 V3와 크게 다르지 않다. 다만 Controller가 더이상 ModelAndView를 반환하지 않고 String을 반환한다. model 객체는 프론트 컨트롤러에서 파라미.. 2021. 7. 30.
[Java] 메서드 시그니처 vs 메서드 타입 더블 디스패치에 대해 공부하려고 토비님의 유튜브 영상을 보다가 메서드 시그니처(method signature)와 메서드 타입(method type)에 대해 정리해주시는 것을 보고 정리해둘 필요가 있을 것 같아 포스팅해봅니다. 메서드 시그니처(Method Signature) 시그니처, 말 그대로 서로다른 메서드를 구분하는 근거가 되는 요소입니다. 메서드 오버라이딩을 할 때 중요합니다. 메서드 시그니처의 구성 요소 메서드 이름 파라미터 리스트 이 두 가지가 같으면 메서드를 오버라이딩할 수 있으며, 이 두 가지가 같은 메서드가 한 클래스 내에 두 개 이상 정의되어 있으면 메서드 중복으로 컴파일 에러가 발생합니다. 여기서 파라미터 리스트라는 것은 파라미터의 타입, 개수, 순서를 말합니다. 예를 들어 파라미터의 .. 2021. 7. 29.
[그래프] 다익스트라 알고리즘 (Dijkstra algorithm) 다익스트라 알고리즘 에지에 가중치가 있는 그래프(weighted graph)에서 최단 경로를 찾는 알고리즘 에지의 가중치가 양수일때만 사용 가능하다. 시작 노드 S로부터 다른 모든 노드까지의 최단 경로를 찾는다. 기본 원리 필요한 자료구조 노드 사이의 관계를 표현할 그래프: graph 시작 노드로부터 각 정점까지의 거리를 기록할 배열: distance 최단 경로가 확정된 노드를 꺼내올 최소힙: min_heap 우선 시작 노드를 제외한 모든 노드의 비용을 가장 큰 값(이를테면, 무한대)으로 초기화한다. 시작 노드를 최소힙에 넣는다. 최소힙에서 노드를 꺼낸 후 인접한 노드를 확인한다. 이때, 인접한 노드로 이동하는 비용(현재까지의 비용+이동하는데 드는 비용)이 해당 노드에 기록되어있는 값보다 작다면? 값을 .. 2021. 7. 27.
[정렬] 퀵정렬 (Quick Sort) 앞에서 살펴본 선택 정렬, 삽입 정렬, 버블 정렬은 모두 구현은 간단하지만 느린 정렬 알고리즘이었다. 이번 글에서 살펴볼 퀵 정렬은 가장 많이 쓰이는 정렬 알고리즘이며 분할과 정복을 기반으로 하는 알고리즘이다. 평균적인 시간 복잡도는 O(NlogN)이다. 기본 아이디어 우선 배열 안에서 임의의 요소를 고른다. 이 요소를 피벗(pivot)이라고 부른다. 설명을 위해 중간에 위치한 원소를 피벗으로 잡았지만, 아무 원소나 잡아도 상관없다. 이 피벗을 선택하는 방법에도 여러 알고리즘이 있다. 가장 왼쪽의 요소를 피벗으로 삼는 방법도 있고, 랜덤으로 선택하는 방법도 있고, 또 가장 오른쪽의 요소를 피벗으로 삼는 방법도 있는데, 최종적인 성능은 모두 비슷하다. 피벗을 잡았으면, 배열을 순회하면서 피벗보다 작은 쪽과.. 2021. 7. 27.
[JPA] JPA는 왜 사용하나요? JPA란 무엇인가 JPA(Java Persistence API)는 javax.persistence 패키지에 정의되어 있는 자바 진영의 ORM 기술 표준이다. ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매팡한다는 것인데, 쉽게 말하면 객체를 데이터베이스에 저장할 때 마치 자바 컬렉션에 저장하듯이 SQL문을 직접 작성하지 않고도 프로그래밍할 수 있도록 도와주는 기술이다. JPA는 자바 ORM 기술에 대한 API 표준 명세, 즉 인터페이스의 집합이다. 따라서 JPA를 사용하려면 JPA를 구현한 ORM 프레임워크를 사용해야한다. 대표적으로 하이버네이트, EclipseLink, DataNucleus 등이 있다. 출처: 자바 ORM 표준 JPA 프로그래밍 왜 JPA를 사용.. 2021. 7. 13.