Computer Science 기본 지식 91

DB (3) 개체-관계 모델링

현실 세계를 개체와 개체간의 관계를 이용해 개념적 구조로 표현하는 방법이다. 현실 세계를 개체-관계 모델을 이용해 개념적으로 모델링하여 그림으로 표현한 것을 개체-관계 다이어그램 또는 E-R 다이어그램이라 한다. 데이터베이스 생명 주기 요구 조건 분석: 사용자와 응용을 식별하고 요구사항을 분석한다. 설계: 개념적 설계, 논리적 설계 및 물리적 설계로 단계적으로 실행한다. 구현: 설계된 데이터베이스 스키마를 정의하고 빈 데이터베이스 파일을 생성하며 응용 소프트웨어를 목표 DBMS 환경에 맞도록 구현한다. 운영: 데이터베이스 시스템과 응용 시스템을 실제로 운영하고 관리하여 사용자의 요구에 따라 서비스를 제공한다. 감시 및 개선: 시스템을 계속적으로 감시하고 데이터베이스를 변경하여 개선한다. 데이터베이스 설계..

DB (2) 데이터베이스 시스템

데이터베이스 시스템(DBS) 데이터베이스에 데이터를 저장하고 저장된 데이터를 관리하여 조직에 필요한 정보를 생성해주는 컴퓨터 중심의 시스템 데이터베이스 시스템 3단계 구조 데이터 베이스에서 데이터 구조와 제약조건에 대한 명세를 기술한 메타 데이터를 스키마라고 한다. 스키마에는 데이터 구조를 표현하는 데이터 객체(data object or entity)와 특성을 표현하는 속성(Attribute) 그리고 관계에 대한 정의(relationship), 유지해야할 제약조건(constraint)이 포함되어 있다. 스키마는 사용자 관점에 따라 외부 스키마, 개념 스키마, 내부 스키마로 나뉘어진다. 데이터베이스 관리 측면에서 데이터를 이용하는 개인 뷰, 뷰가 종합된 전체 뷰 그리고 시스템, 저장 장치의 뷰 등 세단계로..

DB (1) 기초 용어

데이터 베이스 Database 파일 시스템의 파일은 응용 프로그램에 의해 정의되고 사용되므로 프로그램 의존도가 높다. 또한 데이터가 많은 파일에 저장되어 중복 데이터에 대한 처리가 어렵고 기억 공간이 낭비된다. 데이터베이스 시스템은 파일 시스템이 갖는 문제를 해결하기 위해 제안된 시스템으로 모든 응용프로그램이 데이터베이스를 공용할 수 있도록 관리해준다. DBMS의 필수 기능 1) 정의 기능 Definition 응용 프로그램이 요구하는 데이터 구조를 지원하기 위해 저장될 데이터의 행과 구조에 대한 정의, 이용 방식, 제약 조건등을 명시한다. 2) 조작 기능 Manipulation 데이터 검색, 갱신, 삽입, 삭제 등을 처리하기 위해 사용자와 데이터베이스 사이의 인터페이스 수단을 제공한다. 3) 제어 기능 ..

[C++ Thread] 스핀 락 Spin Lock

다음 글을 참고하였습니다. www.codeproject.com/Articles/184046/Spin-Lock-in-C mutex나 critical section과 같은 원시 동기화 객체를 쓰는 경우, 다음의 일련의 사건들이 두 스레드 사이에서 일어난다. 1) Thead 1이 락 L을 획득하고 실행한다. 2) Thread 2가 락 L을 획득하려 하지만, 이미 소유자가 있기 때문에 차단당하고 문맥 교환을 일으킨다. 3) Thread 1이 락 L을 반납한다. 이 행동은 커널 모드에서 스레드 2에게 알림(Signal)을 주게 된다. 4) Thread 2가 깨어나고 락 L을 획득하고 문맥 교환을 일으킨다. 원시 동기화 객체를 사용하는 경우 최소 두 번의 문맥 교환이 포함된다. 스핀 락을 사용할 경우 이러한 값비싼..

[컴퓨터 구조] 12. 가상 메모리

가상 메모리 기술 2차 저장장치를 메인 메모리를 "캐시"로 사용하는 기술로 여러 프로그램을 동시에 실행하여 메모리를 효과적으로 공유하고 메인 메모리 장치의 크기 한계를 극복하여 더 큰 프로그램을 실행할 수 있게 해 준다. 프로그램 데이터 보호 - 프로그램마다 사용하는 주소 공간을 따로 두고 이를 보호한다 : 각 프로그램들이 자신만의 주소 공간을 가지고 가상 메모리 기술이 가상 주소 공간에 대해 실제 주소로 변환해준다. 페이징 기법 프로세서는 가상 주소를 만들어서 사용하는 반면, 메모리는 실제 주소를 사용하여 데이터에 접근한다. 가상 메모리와 주 메모리는 일정한 크기의 조각으로 나뉜 페이지로 구성되어 있으며 각 가상 페이지 하나는 주 메모리 페이지 하나에 사상된다. RISC-V에서 주소는 64비트를 가지지..

[컴퓨터 구조] 함수 호출 규약

함수 호출 규약이란 함수 호출 시 일어나는 행동에 대한 규칙을 의미하며 함수 인자들에 대해 어떤 순서로 스택에 쌓을 것 인지, 인자를 레지스터로 이용할 것 인지 그리고 함수 종료 후 스택을 누가 정리할 것 인지에 대해 정해놓은 규칙이다. 어떤 함수 규약이 호출되던, 다음과 같은 일이 발생한다. 1. 모든 인자들은 4 바이트(8 바이트)로 확장되고 적절한 메모리 위치로 삽입된다. 이 위치들은 주로 스택 상 메모리이지만 레지스터들을 사용할 수 도 있다. 이는 호출 규약에 따른다. 2. 프로그램 실행은 호출된 함수의 주소로 점프한다. 3. 함수 안에서 보존 레지스터들이 스택에 저장된다. 함수 프롤로그라고도 하며 컴파일러가 작성한다. 4. 함수에 해당하는 코드들이 실행되고 return 반환값이 eax 레지스터에..

[컴퓨터 구조] 스택 포인터와 프레임 포인터

함수 호출과정에서 스택 프레임에 대해 일어나는 일을 알아보도록 한다. 스택 포인터와 프레임 포인터 스택 프레임 (Stack Frame) 기본적으로 함수가 호출될 때마다 전달한 인자와 정의한 지역(자동) 변수가 높은 주소부터 낮은 주소의 방향으로 차례대로 저장되는 구조이다. 이외에도 다른 함수를 호출할 때 복귀할 주소(다음 실행할 명령어의 주소), 프레임 포인터 및 보존되는 레지스터들이 스택에 저장된다. 스택 포인터는 함수 호출 시작부터 피호출 프로그램이 실행되는 단계 차례대로 저장되는 값들을 저장하기 위해 현 시점에서 저장할 메모리의 위치를 가리킨다. 스택 프레임에 저장되는 값 - 복귀 주소 - 호출자 루틴의 프레임 포인터 - 사용하던 보존 레지스터 - 피호출자에 전달하는 인자 - 피호출자에서 사용되는 ..

[C++ Thread] 쓰레드 풀 Thread Pool

다음을 참고하여 작성하였습니다. 모두의 코드, 쓰레드 풀: modoocode.com/285 쓰레드 풀이란 특정 함수를 실행하는 워커(Worker) 쓰레드를 관리하는 객체이다. 다음과 같은 역할을 수행한다. - 요청받은 작업을 작업 큐에 삽입한다. - 대기 중인 워커 쓰레드 중 하나를 wakeup하여 작업을 큐에서 꺼내고 실행한다. - 다수의 쓰레드에서 접근하는 작업 큐는 뮤텍스로 보호한다. 쓰레드 풀 생성 워커 쓰레드를 생성하는 것으로 시작한다. ThreadPool::ThreadPool(size_t num_threads) : num_threads(num_threads), stop_all(false) { worker_threads.reserve(num_threads); for (size_t i = 0; i..

[C++ Thread] 약속과 미래 객체, std::promise / std::future

C++11에 도입된 std::promise와 std::future 객체를 알아본다. 약속 객체 (std::promise) 약속 객체는 주로 비동기적으로 실행되는 다른 쓰레드로 부터 계산된 값이나 예외를 저장할 수 있는 공간을 가지고 있다. 약속 객체가 쓰레드의 완료로 저장한 값을 전달하기 위해 미래 객체가 필요하고 미래 객체는 약속 객체에 의해 생성된다. 또한 약속 객체는 결과 전달을 한번만 하도록 설계되었다. 템플릿 정의 template class promise; // 기본 템플릿 template class promise; // 쓰레드간 객체를 통신하기위해 사용한다. template class promise; // 상태없는 이벤트를 통신하기위해 사용한다. - 템플릿 인수에 전달받을 값의 타입을 명시하여..

[C++ Thread] memory order 와 atomic 객체

메모리 수정 순서와 동기화 방법을 제공하는 atomic 객체 ※ 다음 글들을 참고하였습니다. modoocode.com/271 en.cppreference.com/w/cpp/atomic/memory_order#Relaxed_ordering 메모리가 수정되는 순서에 관하여 - 단일 스레드에서 1) 동적 파이프라인 스케줄링에 의해 다음 함수를 컴파일하여 실행했을 시 a 대입과 b 대입의 순서에 대한 문제 #include int a = 0; int b = 1; int func(int* arr) { a = arr[1] + b; b = 5; return a; } int main() { int arr[5] = { 0,1,2,3,4 }; int result = func(arr); return 0; } 코드 흐름 상으로..