2024/12 12

[운영체제] 동시성 이슈 해결 방법 - Semaphore/Mutex

지난 포스팅에서 동시성 문제인 '레이스 컨디션'과 '데이터 레이스'에 대해 알아보았다.이번 포스팅에서는 그 해결 방법인 Semaphore과 Mutex에 대해 알아보자.동시성 이슈주요 원인 :data race데이터 접근 절차는 atomic하지 않음 (읽기->연산->쓰기)단일 코어 : 하나의 instructor 실행 중 cpu 사용 권한을 뺏기는 경우 동시에 같은 memory address 읽을 가능성 존재멀티 코어 : 여러 cpu에서 동시에 같은 memory address 읽을 가능성 존재race condition멀티 스레드 : 프로세스의 공유 데이터 사용 중 발생멀티 프로세스 : 커널 내부의 공유 데이터 사용 중 발생해결 방법 :단일 코어 : 공유 자원에 접근한 경우 계속해서 그 프로세스가 cpu를 점유..

CS 2024.12.31

[JAVA] String Constant Pool

String constant poolJava에서 문자열 리터럴을 저장하는 독립된 공간 String 객체에 값을 할당하는 방법은 두 가지가 있습니다.리터럴 대입new 키워드 사용하여 대입 String str1 = "hello"; String str2 = new String("hello"); String str3 = "hello"; String str4 = new String("hello"); System.out.println(str1==str2); //false System.out.println(str1==str3); //true System.out.println(str2==str4); //falsestr1, str3은 리터럴을 바로 대입했고 str2, str4는 new 키워드를 사용해 문자열을 대입했습니..

Java 2024.12.31

[JAVA] static 메서드에서 non-static 멤버에 접근

static 메서드는 같은 클래스의 non-static 멤버에 접근할 수 없다. 그 이유는 뭘까?non-static vs staticnon-static 멤버는 인스턴스 변수이다. 객체가 생성될 때마다 각기 다른 값을 갖는다.static 멤버는 클래스 변수이다. 클래스가 메모리에 로드될 때 단 한 번만 수행되고 모든 객체가 이 값을 공유한다.왜 static 메서드에서 non-static 접근이 안 되는가import java.io.*;class Person{ private String name; public Person(String name){ this.name = name; } static String get(){ return name; //static 함수는..

Java 2024.12.24

[운영체제] 동시성 이슈란 - Race Condition/Data Race

멀티 스레드 환경의 동시성 문제멀티 스레드 환경에서는 공유 자원에 여러 스레드가 동시에 접근하려고 경쟁하게 되는데, 이를 '동시성 문제'라고 한다. 동시성 문제의 예시로는 레이스 컨디션, 데이터 레이스가 있다. 1. 레이스 컨디션 (race condition)스레드가 실행되는 순서가 항상 보장되지 않아서 발생하는 문제. 여러 스레드가 공유 자원을 병행적으로(concurrently) 읽거나 쓸 때 자원에 접근한 순서에 따라 그 실행 결과가 바뀌는 상황이다.  (예제 1)아래 코드를 보면 main() 고루틴과 func() 고루틴이 멀티 스레드로 실행된다.그런데 만약 (1) -> (2) 순으로 수행되었다면 아무것도 출력되지 않을 것이고, (2) -> (1) 순으로 수행되었다면 'the value is 1'이라..

CS 2024.12.23

[운영체제] 프로세스 - 메모리 공간/상태(state)/문맥 교환(context-switching)/pcb/프로세스 vs 스레드

1. 운영체제운영체제는 여러 프로그램이 동시에 실행될 때, 하드웨어 자원(cpu, memory, disk, i/o devices)을 각 프로그램에게 최대한 효율적으로 분배해주는 역할을 한다. 프로세스가 연산을 하기 위해서는 cpu와 memory를 사용해야 하는데, 자원은 한정적이므로 모든 프로세스가 동시에 사용할 수 없다. 따라서 운영체제가 일정 시간마다 자원을 사용할 프로세스를 지정해준다. -오늘날 cpu는 보통 시분할 방식(time sharing)을 따른다.운영체제는 사용자가 하드웨어 자원에 접근하기 위한 인터페이스를 제공해주기도 한다. 사용자는 GUI 또는 CLI를 통해서 os에게 명령을 내릴 수 있다. 운영체제는 하드웨어의 device driver를 사용해서 프로세스가 하드웨어 장치를 사용할 수 ..

CS 2024.12.20

[운영체제] 하드웨어 - 불 논리/불 연산/가산기(adder)

1부 하드웨어이 책을 앞에서부터 읽으면 컴퓨터 시스템을 bottom-up으로 설명한다. 그러나 각 장을 순서대로 읽지 않아도 된다. 컴퓨터 시스템을 구현할 때 가장 기본적인 원리는 '추상화, 모듈화'이다. 컴퓨터를 설계하는 사람은 ram 내부의 칩 하나하나에 있는 레지스터들이 '어떻게' 동작하는지 몰라도 된다. 그저 ram이라는 모듈이 '무엇을' 하는지 설명되어 있는 인터페이스를 보고 사용하면 된다. 사용해서 컴퓨터를 설계하면 된다. 하드웨어, 소프트웨어 개발자는 이 추상화-구현 패러다임을 통해 매우 크고 복잡한 컴퓨터 시스템을 모듈 단위로 잘 설계해서 구현과 오류 해결이 쉽고 복잡도가 낮은 시스템을 만들 수 있다.  고수준 프로그래밍 언어가 컴파일러에 의해 저수준 기계어로 번역되고, 기계어가 어셈블러에..

CS 2024.12.20

[Java] 예외 처리

오류(Error)의 종류오류는 세 가지 종류로 나뉘어진다.구문 오류(컴파일 에러)문법에 맞지 않거나, 오타가 발생했을 때 컴파일러가 알려주는 오류이다. 치명적인 오류는 아니다.논리 오류컴파일/실행은 되지만 프로그램이 잘못 동작하고 있는 오류이다.프로그램이 작동하는데는 아무 문제가 없지만, 실행 결과가 개발자가 의도한 바와 다른 경우이다.예를 들어 점수의 평균을 계산하는 메서드에서 총 과목의 수가 3인데 4로 나누도록 만들었다면 논리적 오류에 해당한다. 이 경우 로직이 틀린 것이기 때문에 개발자가 코드를 짰지만 의도한 대로 프로그램이 동작하지 않게 되며, 컴파일/실행했을 때는 정상 동작하므로 쉽게 찾기가 힘들다.실행 오류(런타임 에러)프로그램 실행(런타임) 도중에 어떤 특정 컴퓨터에만, 특정한 상황에만 발..

Java 2024.12.18

[JAVA] Comparable로 객체 정렬하기

객체 정렬은 Kruskal로 MST를 구할 때 자주 쓰이는 문법이다.엣지의 가중치를 오름차순으로 정렬한 후 엣지를 앞에서부터 선택하면 MST를 만들 수 있기 때문이다. 그런데 compareTo의 리턴값을 어떻게 설정해야 객체가 오름차순 또는 내림차순으로 정렬되는지 매번 헷갈려서 간단히 정리하고 넘어가려고 한다. 객체를 정렬하는 방법?정렬하고자하는 객체들을 리스트에 넣어 Arrays.sort()를 호출하면 된다. Arrays.sort() 호출 시 Comparable 인터페이스의 compareTo() 메서드가 호출된다. compareTo() 메서드는 두 객체를 특정 기준으로 비교하여 int값을 리턴하는 함수인데, compareTo()에 의해 양수가 리턴되면 두 객체의 자리를 바꾸는 식으로 정렬이 이루어진다...

Java 2024.12.17

[JAVA] 다형성이란? 다형성이 필요한 이유 | 오버라이딩, 오버로딩, 타입 변환(업캐스팅)

다형성은 무엇이고, 왜 필요할까요? 다형성은 객체 지향적 설계를 위한 4가지 원리 중 하나입니다.여기서 알 수 있듯이 다형성의 목적은 객체 지향의 실현입니다. 다형성이 어떻게 객체 지향을 실현하는지 살펴봅시다. 다형성이란?다형성은 어떤 객체의 속성이나 기능이 상황에 따라 다른 역할을 수행할 수 있는 것을 의미합니다.다형성은 오버라이딩, 오버로딩, 타입 변환 등에서 다양하게 나타날 수 있는데요, 하나씩 설명해보겠습니다. (1) 오버라이딩상위 클래스 메서드를 하위클래스에서 재정의하여 사용public interface Vehicle { //Vehicle 인터페이스 void start(); void moveForward(); void moveBackward();}public class Car i..

Java 2024.12.17

[DB/JPA] 엔티티 매핑(@Entity) / 데이터베이스 스키마 자동 생성 기능 (ddl-auto)

JPA는 엔티티 객체와 DB 테이블을 연결해서 개발자가 직접 쿼리를 쓰지 않고 메서드로 간단하게 데이터베이스에 접근할 수 있게 해줍니다. 그런데 어떤 엔티티 객체와 DB 테이블이 대응되는지는 개발자가 직접 어노테이션을 붙여서 JPA에게 알려줘야 합니다. 이번 포스팅에서는 JPA에서 엔티티를 매핑할 때 자주 쓰이는 어노테이션에 대해 알아보겠습니다. @Entity@Table(name="MEMBER")public class Member { ...@Entity테이블과 매칭될 클래스실제로 DB 테이블과 연결되기 때문에, 내용이 DB 테이블과 다르면 안 됨.name : jpa에서 사용할 엔티티 이름 지정. 디폴트값은 클래스 이름인데, 보통 클래스 이름을 사용함. 다른 패키지에 이름이 같은 엔티티 클래스가 있다..

DB 2024.12.16