RUST

RUST

[RUST] RWLock (Read-Write Lock)

RWLock (Read-Write Lock) 이란? RWLock은 데이터에 대한 읽기와 쓰기 접근을 다르게 관리할 수 있는 동기화 메커니즘이다. RWLock을 사용하면, 여러 스레드가 동시에 데이터를 읽을 수 있지만, 데이터에 쓰기를 할 때는 독점적인 접근이 필요하다.   RWLock의 작동방식 RWLock은 Mutex와 비슷해 보이지만, 공유데이터에 대한 쓰기 알고리즘이 다른 방식으로 작동한다. Mutex는 읽기, 쓰기 모두 배타적 잠금(Exclusive Lock)을 유지한 상태로 공유데이터에 접근하지만, RWLock 은 Read, Write에 따라 각기 다른 잠금 메커니즘이 존재한다.  1) 읽기 접근 (Read Lock) 여러 스레드가 동시에 공유 데이터를 읽을 수 있다. 읽기 작업이 이루어지는 동..

RUST

[RUST] 뮤텍스(Mutex) 란

뮤텍스 (Mutex) 란 무엇인가? Mutex란 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 하나의 Process 혹은 Thread가 접근하는 것을 막아주는(동기화 대상이 하나)  임계구역(Critical Section)을 가진 스레드들의 실행시간(Running Time)이  서로 겹치지 않고 각각 단독으로 실행(Mutual Exclusion) 되도록 하는 기술이다.  뮤텍스는 세마포어의 한 종류로써, 바이너리 세마포어 (binary semaphore) 라고 불리기도 한다.    뮤텍스 (Mutex) 의 작동 방식 1) Locking 스레드가 뮤텍스를 획득하려고 할 때,  뮤텍스가 이미 다른 스레드에 의해 잠겨 있지 않다면,  해당 스레드는 뮤텍스를 잠그고 자원에 접근한다...

RUST

[RUST] Semaphore (세마포어)

Semaphore (세마포어) 란 무엇인가? 세마포어는 주로 동시에 수행될 수 있는 작업의 수를 제한하는 데 사용되는 동기화 도구다.  세마포어는 일종의 카운터로,  이 카운터는 동시에 실행될 수 있는 스레드나 프로세스의 최대 수를 나타낸다.  스레드가 세마포어를 사용하려고 시도할 때마다,  세마포어의 카운트가 감소하고, 스레드가 작업을 완료하면 카운트가 증가한다.  카운트가 0이 되면, 다른 스레드는 세마포어가 다시 사용 가능해질 때까지 대기해야 한다.   Semaphore (세마포어) 의 동작 방식 예를 들어 특정 작업을 멀티스레드를 사용해서 실행시키려고 한다고 가정해 보자. 4개의 스레드를 사용할 것이며, 세마포어 카운트는 2라고 가정해 보자. 그럼 아래와 같은 그림으로 도식화가 가능하다.   각 ..

RUST

[RUST] Rc, Arc 란

Rust에서 Arc와 Rc는 둘 다 참조 카운팅 방식의 스마트 포인터이다. 이들은 메모리 관리를 자동화하여, 동적으로 할당된 데이터의 생명주기를 관리하는 데 사용된다. 그러나 두 스마트 포인터는 사용되는 환경(멀티 스레드  대 단일 스레드)에 따라 구분된다.   Rc (Reference Counted) Rc는 Reference Counted의 약자로, 단일 스레드 환경에서만 사용되도록 설계된 참조 카운팅 스마트 포인터이다. Rc는 여러 부분에서 동일한 데이터에 대한 소유권을 공유할 수 있게 해 준다. 이는 특정 데이터에 대한 여러 소유자를 허용하고, 그 데이터가 더 이상 필요하지 않을 때 자동으로 메모리를 해제한다. Rc는 Thread-safe(스레드-안전) 하지 않으며, 따라서 멀티 스레드 환경에서는 ..

RUST

[RUST] 트레이트 (Traits)

트레이트 (Traits) 란? Rust에서 트레이트(trait)는 특정 타입이 구현해야 하는 동작을 정의하는 방법이다. 즉, 트레이트는 하나 이상의 메서드를 가지고 있으며, 이 메소드들을 구현하는 타입은 해당 트레이트의 기능을 제공하게 된다. 트레이트는 자바의 인터페이스나 C#의 인터페이스에 비슷하며, 다른 언어에서는 프로토콜이라고도 불린다. 트레이트의 목적 추상화 트레이트를 사용하여 다양한 타입에 공통적인 동작을 추상화할 수 있다. 이를 통해 타입에 관계없이 일관된 방식으로 메서드를 호출할 수 있다. 확장성 기존의 타입에 새로운 트레이트를 구현함으로써 해당 타입의 기능을 확장할 수 있다. 이는 기존 코드를 변경하지 않고도 타입에 새로운 기능을 추가할 수 있게 해 준다. 제네릭 프로그래밍 트레이트를 사용..

RUST

[RUST] 제네릭 (Generics)

제네릭 (Generics) 이란? Rust에서 제네릭(generics)은 다양한 데이터 타입에 대해 동작할 수 있는 함수나 구조체, 열거형(enum), 메서드를 작성할 수 있게 해주는 프로그래밍 기능이다. 제네릭을 사용하면 코드 중복을 줄이고, 타입 안전성을 유지하면서도 유연성을 높일 수 있다. 제네릭의 사용 예시 제네릭을 사용하는 가장 기본적인 예는 함수에서 여러 타입을 처리할 수 있도록 하는 것이다. 예를 들어, 특정 리스트 내의 최대값을 반환하는 함수를 작성하고 싶다고 가정 보자. 다음은 제네릭을 사용하여 어떤 타입의 리스트 값에 대해서도 동작할 수 있는 함수를 만드는 방법을 보여준다. 함수에서의 제네릭 사용 아래의 예제는 i32 배열에서 가장 큰 수를 찾는 함수 largest_i32() char ..

RUST

[RUST] Error

RUST의 Error Type Rust에서는 에러를 크게 두 가지 범주로 나누어 다룬다. 복구 가능한 에러(Recoverable Errors)와 복구 불가능한 에러(Unrecoverable Errors). 1. 복구 가능한 에러 (Recoverable Errors) 복구 가능한 에러는 일반적으로 프로그램의 실행을 중단시키지 않고 처리할 수 있는 에러를 말한다. 이러한 에러는 주로 예상 가능하며, 프로그램이 에러 상황을 감지하고 적절히 대응할 수 있다. Rust에서는 Result 타입을 사용하여 복구 가능한 에러를 처리한다. 예를들어 아래는 특정 파일을 열어보는 예제이다. 해당 파일이 없을때는 에러를 반환해준다. use std::fs::File; fn main() { let file = File::open..

RUST

[RUST] ENUM

ENUM 이란? Rust에서 enum은 열거형 타입으로, 여러 개의 다른 값들 중 하나의 값을 가질 수 있는 타입이다. Enumeration (열거) 에서 기원한 키워드이다. 이는 Rust의 강력한 타입 시스템과 패턴 매칭 기능을 활용하여 다양한 종류의 데이터를 안전하고 효율적으로 처리할 수 있게 해준다. ENUM 의 특징 1) 다양한 값 정의가 가능 enum을 사용하여 서로 다른 값들을 정의할 수 있다. 각각의 값은 enum 타입의 '변종(variant)'이라고 불린다. 예를 들어, 트래픽 신호등의 상태를 나타내는 enum을 정의할 수 있다. (Red, Yellow, Green.) #[derive(Debug, PartialEq)] enum Color { Red, Green, Blue } fn mai..

RUST

[RUST] 구조체(structure)

구조체(structure) 란? Rust에서 구조체(structure), 일반적으로 struct라고 줄여 부르는 것은 여러 데이터를 하나의 논리적 단위로 그룹화하는 데 사용되는 사용자 정의 데이터 타입이다. 구조체는 관련된 데이터들을 모아서 이름을 붙이고, 안전하게 구성하여 사용할 수 있게 해 준다. 이는 다른 프로그래밍 언어의 '클래스'와 비슷한 개념이지만, Rust의 구조체는 상속이나 다형성 같은 객체지향 기능을 지원하지 않는다. 구조체 타입 Named Field Structs Named field structs는 가장 일반적인 유형의 구조체로, 각 필드에 이름이 붙어 있다. 이를 통해 데이터에 쉽게 접근하고, 의미 있는 방식으로 데이터를 구성할 수 있다. 구조체는 아래와 같이 사용할 수 있다. #[..

RUST

[RUST] RUST 메모리 관리 규칙 - Slice

Slice 란? Rust에서 슬라이스(slice)는 연속된 데이터의 일부 혹은 전체에 대한 참조를 제공하는 데이터 타입이다. 슬라이스는 컬렉션의 일부를 가리키지만, 소유하지는 않는다. 슬라이스를 사용함으로써 컬렉션의 특정 부분에 대한 접근을 효율적으로 제공할 수 있다. 슬라이스의 기본 특성 1) 참조자 슬라이스는 기본적으로 두 가지 정보를 가진다. 데이터를 가리키는 포인터와 슬라이스의 길이를 가진다. 2) 안전성 슬라이스는 컬렉션의 유효한 부분만을 참조하도록 제한되어 있어, 범위를 벗어난 접근을 방지한다. 3) 동적 크기 슬라이스는 런타임에 크기가 결정된다. 컴파일 타임에는 크기를 알 수 없다. 슬라이스의 사용 1) 배열 슬라이싱 배열이나 벡터에서 일부 범위를 참조하는 데 사용된다. 예를 들어, let ..

ssh9308
'RUST' 카테고리의 글 목록