전체 글 269

(5) 프로세스 관리

프로세스 실행 중인 프로그램을 지칭. 메모리에 적재된 바이너리 이미지, 가상화된 메모리 인스턴스, 열린 파일, 커널 리소스, 사용자 정보, 하나 이상의 스레드를 포함한다. 프로세스 ID 프로세스 ID(pid)는 유일한 식별자로 구분된다. 커널이 실행하는 idle 프로세스의 pid는 0이다. 시스템 부팅이 끝나면 커널이 실행하는 최초의 프로세스 init 프로세스의 pid는 1이다. init 프로세스 init 프로세스는 다음 순서대로 경로에서 찾아 먼저 찾은 프로세스를 실행한다. /sbin/init : 가장 먼저 찾는 init 프로세스 /etc/init : 두번째로 찾는 init 프로세스 /bin/init : 우선 탐색에 실패했을 때 찾는 init 프로세스 /bin/sh : 커널이 앞의 순서댈 init 프로..

C++/linux 2022.05.11

(4) 고급 입출력 readv/writev/epoll/mmap

벡터 입출력 한 번의 호출로 배열 형태의 입출력용 자료구조에 데이터를 한 번에 읽고 쓰는 것이 가능하다. 벡터 입출력 readv(), writev() #include ssize_t readv (int fd, const struct iovec *iov, int count); ssize_t writev (int fd, const struct iovec *iov, int count); 파일 디스크립터 fd로 부터 입출력용 자료구조 iovec에 데이터를 읽어드리는 readv() 그리고 iovec의 데이터를 한 번에 쓰는 writev 함수가 있다. 호출이 성공했을 시 읽거나 쓴 바이트 수를 반환한다. 에러가 발생했을 시 -1을 반환. 벡터 입출력용 자료구조 iovec iovec* 은 결국 여러 버퍼의 시작 주소와..

C++/linux 2022.05.10

(3) 버퍼 입출력

파일 포인터 FILE* (파일 스트림)로 표준 입출력 하기 파일 열기 fopen() FILE* fopen(const char* path, const char* mode); 모드 mode "r" : 읽기 모드 "w" : 쓰기 모드 "a" : 덧붙이기 모드 "r+", "w+", "a+": 읽기/쓰기 모드 모두 지원 성공 시 유효한 파일 포인터 반환, 실패 시 NULL을 반환. 파일 디스크립터를 통해 스트림 만들기 fdopen() FILE* fdopen (int fd, const char* mode); 반환된 파일 스트림은 파일 디스크립터와 연결된 입출력을 제공한다. 파일 스트림을 닫으면 파일 디스크립터도 닫힌다. 스트림 닫기 fclose() int fclose (FILE* stream); 성공 시 0, 실패..

C++/linux 2022.05.10

(2) 다중 입출력 select와 poll

다중화된 입출력 파일 디스크립터에서 발생하는 입출력 이벤트를 확인하는 방법에 대해 알아본다. 동기화된 다중 입출력 메커니즘 select() #include int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); n : 감시하는 파일 디스크립터 중 가장 큰 것에 +1을 한 값 readfds : 읽기를 감시하는 파일 디스크립터 집합 writefds : 쓰기를 감시하는 파일 디스크립터 집합 exceptfds : 예외가 발생하는 지 감시하는 파일 디스크립터 집합 (주로 소켓) timeout : 타임 아웃 시간 성공 시 입출력이 준비된 fd 개수를 반환한다. 타임 아웃시 0을 반환, 에러 시 ..

C++/linux 2022.05.10

(1) errno와 파일 입출력

리눅스 운영체제에서 사용되는 시스템 함수는 에러가 발생했을 시 헤더에 정의된 전역 변수에 에러코드가 저장된다. extern int errno; 에러 코드에 대한 에러 메시지를 편하게 출력하기 위한 방법은 다음과 같다. #include void perror (const char* str); // ex if (open("file.txt", O_RDONLY) == -1) { perror("open failed."); } 파일 열기 open() #include #include #include int open (const char* name, int flags); int open (const char* name, int flags, mode_t mode); flags 인자 : O_RDONLY, O_WRONLY, ..

C++/linux 2022.05.10

VirtualBox에서 인터넷 사이트 DNS 접속 오류

버츄얼 박스에서 Ubuntu를 설치한 뒤 인터넷을 사용할 때, 일부 사이트 접속이 되지 않는 문제 파이어 폭스 혹은 크롬을 통해 인터넷 연결 및 검색은 되지만 사이트의 url 연결시 접속이 안되는 문제가 있다. resolvconf 설치 sudo apt-get install resolvconf /etc/resolvconf/resolv.conf.d/head 파일 수정 // cd /etc/resolvconf/resolv.conf.d -> head 파일을 수정 sudo nano /etc/resolvconf/resolv.conf.d/head 맨 아래에 nameserver "참조할 dns 서버 주소" 추가하고 저장 내 dns 서버 주소는 윈도우 cmd창에서 nslookup으로 확인 버츄얼 박스 재부팅후 사이트 접속

MySQL 옵티마이저와 힌트

옵티마이저 쿼리를 실행하기전 어떻게 실행할 것인지, 최적의 실행 계획을 만들기 위한 논리를 만드는 역할 쿼리 실행 절차 1. 사용자의 SQL 문장를 MySQL 서버가 이해할 수 있는 수준으로 분리한다. 2. 분리된 파스 트리 정보를 보고 어떤 테이블, 인덱스를 읽을 것인지 확인한다. 3. 결정된 테이블 읽기 순서나 대상 인덱스를 사용하여 데이터를 읽는다. - 파스 트리 정보으로부터 결정하는 것 불필요한 조건 제거, 복잡한 연산 단순화, 읽는 테이블 순서 결정, 인덱스 통계 정보를 이용하여 인덱스 결정, 레코드를 임시 테이블을 만들어 다시 가공해야하는 지 결정 등. 기본 데이터 처리 - 풀 테이블 스캔 인덱스를 사용하지 않고 전체 데이터를 처음부터 끝까지 읽어 요청된 작업을 처리하는 것 1. 레코드 건 수..

DB/MySQL 2022.05.08

RDBMS vs NoSQL

Relational DBMS 관계형 데이터 베이스로 객체를 나타내는 각 테이블의 관계로 정의되는 데이터 모델링 기법을 사용한다. RDBMS에서 사용하는 테이블은 고정된 스키마가 존재하며 SQL 언어를 사용하여 데이터를 조작하고 ACID 특성을 보자한다. NoSQL 고성능의 비관계적 데이터를 지향하기 위해 고안되었다. 빅데이터 등으로 저장해야하는 데이터 양이 늘어나자 수평적 확장에 대한 유연함이 요구 되었고 기존 관계형 데이터 베이스에서 고정된 스키마의 변경의 어려움을 극복하고자 하였다. 관계형 테이블을 만들지 않고 모든 데이터를 한 형식, Key-Value Pair 혹은 JSON document 등으로 저장하는 방식을 택한다. 따라서 테이블 JOIN이 필요없게 되었다. 대신 기존 관계형 테이블에서 무결성..

DB/이론 2022.05.02

무결성 제약 조건

무결성 제약 조건 (Intergrity Constraint) 관계형 데이터 베이스에서 데이터 무결성을 지키기 위한 제한된 조건을 의미한다. 입력, 삭제, 갱신하는 경우 항상 무결성 제약 조건을 만족할 때만 실행하도록 허용한다. 종류 설명 도메인 제약조건 속성의 자료 값은 항상 도메인의 원자값을 가져야한다. 개체 무결성 제약조건 속성은 null이 아니고 중복이 불가능하다. 키 제약조건 키 값은 유일하게 튜플을 식별해야한다. 참조 무결성 제약조건 외부키 값은 반드시 기본키의 도메인 값이어야 한다. 의미 무결성 제약 조건 조건을 명시한 제약조건은 지켜야한다. MySQL 에서 제공하는 제약조건 기본 키 제약 조건 PRIMARY KEY 기본 키 제약 조건에 해당하는 경우 해당 속성의 값은 중복을 허용하지않고 NU..

DB/이론 2022.05.02

MySQL MVCC - 멀티 버전 동시성 제어

MVCC (Multi Version Concurreny Control) 목적 잠금없이 동시성을 높이면서 일관된 읽기를 제공하기 위해 사용한다. Mutli Version 다중 버전의 레코드가 읽게 된. 격리 수준에 따라 레코드가 어떻게 읽힐 지가 결정된다. 예시 CREATE TABLE memberTbl( member_id INT NOT NULL AUTOINCREMENT PRIMARY KEY, member_name VARCHAR(24) NOT NULL, join_date DATE NOT NULL ); INERT INTO memberTbl(member_id, member_name, join_date) VALUES(1, 'John', '2022-05-01'); COMMIT; 위 연산의 실행 결과는 다음과 같다...

DB/MySQL 2022.05.01