728x90
반응형
SMALL

낙관적 락

낙관적 락은 트랜잭션이 데이터에 대한 변경을 실제로 커밋하려고 할 때만 데이터 충돌이 발생할 것으로 가정한다.
이 방법은 데이터의 동시 액세스 충돌이 거의 발생하지 않는 시스템에서 잘 작동한다.
이는 각 트랜잭션이 충돌 없이 진행될 수 있다는 "낙관적" 가정에 기반을 두고 있다.

낙관적 락에서는 버전 번호, 타임스탬프, 또는 두 가지 모두를 사용하여 각 데이터 행이나 항목을 추적할 수 있다.
트랜잭션이 항목을 읽을 때, 그 항목의 버전 정보도 함께 읽힌다.
트랜잭션이 데이터를 업데이트하려고 할 때, 시스템은 해당 데이터 항목의 현재 버전이 트랜잭션 시작시 읽은 버전과 동일한지 확인한다.
만약 버전이 다르면, 다른 트랜잭션이 데이터를 변경했다는 것을 의미하며, 이 경우 충돌이 발생했다고 판단하고 업데이트를 거부한다.

이러한 방식은 병렬 처리를 최대화하고 잠금으로 인한 대기 시간을 최소화하는 데 있어 매우 유용하지만, 충돌이 자주 발생하는 시스템에서는 낙관적 락이 아닌 다른 방법을 고려해야 할 수 있다.
이런 경우엔 "비관적 락"이라는 다른 접근 방식을 사용하는 것이 더 효과적일 수 있다. 비관적 락은 트랜잭션이 데이터를 읽는 즉시 데이터를 잠그는 방법으로, 다른 트랜잭션들이 동일한 데이터를 변경하지 못하도록 한다. 이 방식은 충돌 가능성이 높은 시스템에서 유용하다.


비관적 락

비관적 락(Pessimistic Locking)은 동시성 제어를 위한 데이터베이스 잠금 메커니즘의 한 가지로, 다중 사용자가 동시에 데이터베이스의 동일한 데이터를 엑세스하려는 경우 데이터 무결성을 보호하는 방법이다.

비관적 잠금은 이름에서 알 수 있듯이, 충돌이 발생할 가능성이 높다고 "비관적으로" 가정한다.
따라서 이 메커니즘은 트랜잭션이 해당 데이터를 처음 읽는 시점에서 잠금을 설정한다.
이렇게 하면 해당 트랜잭션이 종료되어 잠금이 해제될 때까지 다른 트랜잭션에서는 해당 데이터에 대한 변경을 시도할 수 없다.

예를 들어, 데이터베이스에서 특정 레코드를 읽고 변경하려는 트랜잭션이 있다고 가정할때,
비관적 잠금을 사용하는 경우, 이 트랜잭션이 해당 레코드를 읽는 즉시 해당 레코드는 잠긴다.
그 결과, 다른 트랜잭션들은 그 레코드를 수정하거나 삭제할 수 없게 된다.
이 트랜잭션이 작업을 마치고 레코드의 잠금을 해제하면, 그제서야 다른 트랜잭션들이 해당 레코드에 접근할 수 있게 된다.

비관적 락의 주요 단점은 데이터에 대한 접근이 제한되므로, 대기 시간이 길어질 수 있다는 것이다.
이는 특히 공유 데이터에 대해 많은 사용자가 거의 동시에 작업을 시도하는 경우에 문제가 될 수 있다.
그러나 이 방법은 데이터 무결성을 보장하며, 충돌이 예상되는 환경에서는 매우 유용하다.

728x90
반응형
LIST

'개발 > Datebase' 카테고리의 다른 글

JOIN (INNER JOIN)과 LEFT JOIN (LEFT OUTER JOIN)  (0) 2024.10.29
SQL 오류 노트: 오류 코드 1064  (0) 2024.10.29
JPA를 nativeQuery로 변경! (UNION 사용!)  (0) 2024.01.01
Database 확인/생성/삭제/변경  (0) 2023.04.08
트랜잭션  (0) 2023.02.08
728x90
반응형
SMALL

리눅스 명령어

쉘 프롬프트 상에서 입력 토큰의 종류

  • 명령어
  • 옵션: -기호로 시작되는 토큰
  • 인자: -기호로 시작되지 않는 토큰

기본 명령어

sudo : super user(root)인 관리자 권한(root 계정)으로 실행

pwd : 현재 자신이 위치한 디렉토리 출력

cd : 디렉토리 이동

ls : 현재 자신이 속해있는 디렉토리 내용 확인(-a 모든 파일 보기, -l 더 자세한 정보 출력, -t 시간 순 정렬, -S 크기 순 정렬)

mkdir : 디렉토리 생성

rmdir : 디렉토리 삭제

help : 내장 명령어에 대한 도움말 출력 (명령어 뒤에 --help 붙이는 것과 동일)

echo : 화면에 문자열 출력

touch : 파일 생성 (크기 0)

cp : 파일 및 디렉토리 복사 (-r 디렉토리 안의 모든 내용을 재귀적으로 복사)

mv : 파일 이동

rm : 파일 및 디렉토리 삭제 (-r 디렉토리 안의 모든 파일을 재귀적으로 삭제하는 옵션, -f 존재하지 않는 파일이나 엑세스 권한이 없는 파일에 대하여 확인 메시지를 무시하라는 옵션)

rmdir : 비어있는 디렉토리 삭제

cat : 파일의 내용을 화면에 출력

more : 텍스트 파일을 화면 단위로 출력(space/f 다음 페이지로 이동, b 이전 페이지로 이동, enter 라인 단위 이동, q: 종료)

less : more보다 조금 더 보기 편함

find : 특정한 파일을 찾는 명령어

grep : 특정 패턴으로 파일을 찾는 명령어

>> : 리다이렉션 (파일 끼워넣기 등)

file : 파일 종류 확인

ping : 네트워크 상태 점검 및 도메인 IP 확인

ifconfig : 리눅스 IP 확인 및 설정

netstat : 네트워크의 상태 정보 출력

wget : 비대화식 네트워크 다운로더로 뒤에 다운로드할 주소를 인자로 적음

vi 편집기

visual editor의 줄임말인 vi는 리눅스에 기본 편집기이다. vi가 오래됐기 때문에 vi를 보완한 vim(visual editor improved)이 있는데 이 편집기는 apt-get install vim의 명령어를 통해 설치하여 사용할 수 있다.

vi를 통해 편집기를 실행하거나 vi 파일명로 파일과 함께 편집기를 실행한다.

vi는 모드가 3개 존재한다.

  1. 명령모드: 문서 복사, 이동 등의 작업(명령모드 집입은 ESC)
  2. 편집모드: 문서 작성 및 편집(편집모드 진입은 i, a, o)
  3. 실행모드: 파일 저장, 종료 등 수행(실행모드 진입은 명령모드에서 가능하며 :를 누름)

명령모드

h j k l : ← ↓ ↑ → 커서 이동

x : 커서 뒤 위치한 문자 1개 삭제

yy : 현재 행을 복사

p : 현재 행에 붙여넣기

dd, :d : 현재 행 잘라내기

u : 바로 이전 명령 취소

:set nu : 행 번호 표시

:set nonu : 행 번호 표시 제거

편집모드

i : 현재 커서 앞쪽에 입력

I : 현재 라인 처음에 입력

a : 현재 커서 뒤쪽에 입력

A : 현재 라인 마지막에 입력

o : 현재 라인 아랫줄에 입력

O : 현재 라인 윗줄에 입력

실행모드

:w : 저장

:w FILENAME : FILENAME에 저장

:q : 종료

:wq : 저장하고 종료

:q! : 저장하지 않고 종료

:! : 외부 명령어 실행


 

sudo rm -rf /

sudo는 관리자의 권한으로 명령어를 실행한다는 의미이고, rm은 파일을 삭제하는 명령어인데 -r는 재귀적으로 디렉토리와 그 안의 모든 것을 삭제하는 옵션이고,-f는 존재하지 않거나 액세스 권한이 없는 파일도 확인 메세지 없이 강제로 삭제하는 옵션이다. 그리고 /는 리눅스의 최상위 디렉토리인 root이다.

‘진정 새로운 무언가를 창조하려 한다면 처음부터 다시 시작해야 합니다..’

즉, 최상위 디렉토리와 그 밑에 있는 모든 파일과 디렉토리를 한꺼번에 포맷하는 무시무시한 명령어이다..

따라서 디렉토리를 안전하게 삭제하는 방법으로 아래 방법을 추천한다.

  1. rmdir 명령어를 사용하여 빈 디렉토리를 삭제하기
  2. ls 명령어를 사용하여 디렉토리 내용 확인하며 테스트하기
728x90
반응형
LIST
728x90
반응형
SMALL

리눅스란

리눅스의 마스코트인 펭귄 이미지

**리눅스(Linux)**는 **유닉스(Unix)를 기반으로 만들어진 운영체제(Operating System)**의 커널, 혹은 리눅스 커널을 사용하는 운영체제를 의미한다. 그렇다면 이게 무엇을 의미하는지 하나씩 살펴본다.

유닉스

먼저 유닉스(Unix)란 무엇인가. 유닉스는 동시 다중 사용자 및 다중 작업의 실행을 지원하는 대화식 운영체제이다. 1970년대 초반 AT&T Bell Lab에서 Ken Thompson, Dennis Ritche, Douglas McIlroy등이 주축이 되어 개발했다. (Tmi. Ken Thompson, Dennis Ritche는 C언어를 만든 사람이기도 하다. Ken Thompson는 아직도 구글에서 개발 중이며 Dennis Ritche는 스티브잡스가 타개하던 해에 돌아가셨다.) 주로 서버용 컴퓨터에 사용되는 운영체제이며 보안성이 매우 뛰어난 특징을 가지고 있다.

유닉스가 다양한 변종으로 발전하면서, 표준화의 필요성으로 나타난게 POSIX(Portable Operating System Interface)이다. 이는 IEEE에서 제안하였으며 유닉스도 이를 따르고 있다. (Tmi. 약자에는 X가 있는데 뜻에는 X가 없다. 이는 POSI라고 하면 발음하기도, 모양도 좀 그래서 추가한 알파벳이라고 한다.)

리눅스의 역사


위 그림처럼 리눅스는 유닉스의 계보를 따라 나온 운영체제이다. 1991년 핀란드 헬싱키 대학의 Linus Tovalds가 개발한 오픈소스 OS로 유닉스를 경량화한 미닉스(Minix)를 만든 교수님 지도 아래 대학원에 있을 때, 미닉스를 보며 이렇게 저렇게 기능을 추가하다가 혼자 리눅스를 만들었다고 한다. (Tmi. 이 사람은 Git을 만든 천재이다. 리눅스 버전 관리 시스템의 필요성으로 혼자 만들었다고 한다.) 그의 이름 Linus에 Unix의 ix를 합성한 Linux의 최초 모습을 만들었다.

Copyright과는 반대로 지식과 정보는 소수에게 독점되어서는 안된다는 Copyleft를 주장하는 Richard Stallman이라는 사람이 있는데, 이 분은 GCC 등을 개발했으며 자유 소프트웨어 재단에서 진행하는 GNU 프로젝트를 주도하고 있다. Linus Tovalds가 이 분을 만나 GNU 프로젝트에 참여하면서 리눅스를 오픈소스로 공개하였고 수많은 개발자들이 개발에 동참하여 빠르게 발전하였다. (Tmi. GNU 프로젝트 덕분에 리눅스가 발전하게 되었으므로 Linus Tovalds는 원형만 제시했을 뿐 현대의 Linux는 GNU/Linux로 불리길 바라는 세력이 있다고 한다.)

즉, 리눅스가 짧은 역사를 가지고 있는 운영체제임에도 많은 인기를 얻게 된 이유는 오픈소스였기 때문이라 할 수 있다. 역사상 가장 많은 참여자가 관여하고 있는 오픈소스 프로젝트이다.리눅스 커널을 사용하여 다양한 배포판이 파생되었으며, 데스크톱, 웹 서버, 클라우드, 모바일 운영체제인 안드로이드, 게임, 수퍼컴퓨터 등 각종 임베디드 기기를 구동하는 운영체제로 다양한 곳에서 높은 점유율을 보이며 발전하고 있다.

리눅스의 특징

  • 유닉스와 마찬가지로 다중 동시 사용자 시스템이다.
  • 유닉스가 통신 네트워크를 지향해 설계된 것 처럼 리눅스 역시 서버로 작동하는데 최적화 되어있다. 따라서 서버 및 임베디드 시스템 분야에서 많은 발전을 하고 있다.
  • 안정적이며 안전한 운영체제이다.
  • 리눅스는 오픈소스로 누구나 소스 코드를 활용하여 수정 및 재배포가 가능하기 때문에 지속적인 업그레이드가 이루어진다.
  • 리눅스를 기반으로 300가지가 넘는 배포판이 개발되었는데 대표적으로 RedHat, Ubuntu, Debian, Fedora 등이 있다.
  • 리눅스는 명령어 라인(Command Line Interface)을 통해 컴퓨터에 직접 액세스한다. 따라서 운영체제의 학습을 위해서 사용할 수 있다.

리눅스의 구조

커널

커널(kernel)이란 운영체제의 핵심으로 소프트웨어와 하드웨어 간의 커뮤니케이션을 관리하는 컴퓨터 프로그램이다. 시스템의 모든 것을 완전히 통제하고 메모리 관리, 프로세스 관리, 장치 관리 등 컴퓨터의 모든 자원을 제어하는 기능을 한다.

쉘(shell)이란 커널과 사용자가 대화하는 공간으로 키보드로 입력한 명령어를 운영체제에 전달하여 그 명령어를 실행하고, 수행 결과를 전송해주는 프로그램을 말한다. 즉, 커널과 사용자 간의 중간 다리 역할을 하는 프로그램이다. 의미는 껍데기라는 뜻인데, 사용자와 운영체제의 내부(커널) 사이의 인터페이스를 감싸는 층이기 때문에 그러한 이름이 붙여졌다.

최초 유닉스 쉘 프로그램인 sh의 확장판인 Bash 쉘을 리눅스 운영체제에 기본 쉘로 사용한다. macOS의 경우 터미널을 실행시키면 보이는 모습이 Bash였으나 최근 기본 쉘이 Zsh로 변경되었다.

디렉토리

디렉토리는 파일을 가지고 있는 그룹을 의미하며 이는 파일 시스템에 의해 관리된다. 리눅스에서 파일 시스템을 아는 것이 굉장히 중요한데, 왜냐하면 리눅스는 모든 것을 파일로 보기 때문이다. 파일 시스템이란 컴퓨터에서 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제를 의미한다. 리눅스에서 일반적으로 사용되는 파일 시스템은 ext(extended file system, 확장 파일 시스템)이다.

리눅스는 위와 같은 계층적인 디렉토리 구조로 파일을 구성한다. 최상위 디렉토리를 루트(root)디렉토리라고 하며 / 로 표현한다. 드라이브를 여러 개로 분할하여 사용할 수 있는 윈도우즈와 달리 리눅스는 단일 파일 시스템으로 관리한다.

현대의 운영체제는 다중 사용자 개념을 제공한다. 이 때, 운영체제는 각 사용자에게 개별적으로 부여된 고유한 디렉토리를 제공하는데 이를 **사용자 디렉토리(user directory)**라고 하며 이는 일반 사용자를 위하여 읽고 쓰기 권한이 부여된 유일한 공간이다. Linux의 홈 디렉터리(home directory) 아래에 위치하며 경로는 /home/User_name으로 표현한다.

참고로 **경로(path)**란 파일 시스템 상에서 디렉터리나 파일의 위치를 표현 또는 표기하는 방법이다. 리눅스는 /(슬래시)로 계층을 구분하며 윈도우즈는 \\(백슬래시)로 구분한다.

728x90
반응형
LIST

+ Recent posts