부트 매니저 (Boot Manager)

부팅을 도와주는 역할을 하는 프로그램으로 특히 시스템에 여러 운영체제가 설치되어 있으면 선택하여 부팅할 수 있도록 해준다. 부트 매니저 프로그램은 부트로더라고도 부르며, 디스크의 가장 앞 영역 MBR(Master Boot Record)에 설치된다.
MBR은 부트섹터로 디스크의 첫 번째 섹터(0번)에 해당하고 크기는 512 Byte이다. 부트로더와 파티션 정보가 기록된다.
부트로더에는 LILO, GRUB이 있는데 최신 리눅스 배포판에는 GRUB을 사용한다.


GRUB (Grand Unified BootLoader)

GNU 프로젝트에서 만든 부트로더로 LILO에 비하여 다양한 파일 시스템을 지원하고, 부팅 시에 커널 인자를 조정하여 동적 부팅을 지원한다. 메뉴 인터페이스 방식을 기본으로 사용하지만, Bash와 같은 CLI를 추가로 제공한다.


GRUB 부팅 모드

부트 화면에서 a, e, c를 누르면 커널 인자 조정을 통해 여러 부팅 모드를 제공한다.

[a]: grub.conf에서 kernel과 관련된 부분의 파라미터를 추가할 수 있게 해준다. 싱글 모드 부팅시 1또는 single 추가
[e]: grub.conf에 등록된 부팅 목록의 모든 항목을 직접 편집할 수 있도록 해준다. 현재 부팅 시에만 일시적으로 편집이 적용된다.
[c]: Bash Shell과 유사. 상호대화식 직접 입력 모드로 순차적 명령어 입력 후 boot라고 입력하면 부팅이 된다.


GRUB 환경 설정 파일

멀티 부팅 환경 시스템을 구축했을 경우 환경 설정파일 /boot/grub/grub.conf의 항목 title 값이 분리되어 나타나며, title 영역 바깥은 grub 실행과 연관이 있다.

#boot=/dev/sda 부팅 되는 디스크를 지정한다. 시스템에 장착된 디스크가 하나인 경우 주석처리

default=0부터 전원을 켰을 때 기본적으로 부팅되는 OS를 설정한다. grub.conf에 나열된 title의 순서로 0부터 시작한다.

timeout=숫자 GRUB 메뉴 화면에서의 대기 시간으로 단위는 초이다. 시간내에 선택이 없으면 default된 값으로 부팅된다.

splashimage=이미지경로

인자값에서 디스크를 칭하는 방법

(hd0) : S-ATA, SCSI 등 첫 번째 디스크를 의미하는 것 /dev/sda 또는 /dev/hda가 선택된다. ex) hd0 디스크의 0번파티션 3번파티션

(hd0,0) : /dev/sda1 또는 /dev/hda1

(hd0,3) : /dev/sda4 또는 /dev/hda4

title 이름 GRUB 부팅 메뉴에서 표시되는 이름이다. 원래 OS가 이름으로 들어가지만, 사용자가 알아보기 위한 것으로 바꿀 수 있다.

root (hd0,3) root에는 (디스크 파일명,부트 파티션명)을 설정한다.

kernel 경로 커널의 위치와 커널 매개 변수가 설정된다. 파티션 분할을 하지 않았을 경우 /boot 없이 경로가 시작한다.

initrd 경로 초기화에 필요한 이미지 경로

윈도우 OS가 설치되어 있는 경우

title DOS
   rootnoverify (hd,0)
   chainloader +1

윈도우 os의 기본 형태로 rootnoverify는 특정 파일을 로드할때 사용하는데 위의 경우 파티션의 첫 번째 섹터 파일을 로드한다.

윈도우 파티션 영역을 지정하였기 때문에 윈도우의 부트로더에 제어 권한을 넘긴다.

반응형

LVM

Logical Volume Manager 새로운 디스크 장치를 연결 시 파티션을 분할하고 공간을 할당한다. 이때 설정한 크기는 고정되어 변경이 힘들다. 이 문제를 극복하기 위한 방법이 LVM이다. 여러 개의 디스크를 뭉쳐 하나인 것처럼 만들거나 2개를 3개로 만들 수 있다. 사용 중인 파티션의 크기를 줄이거나 늘릴 수도 있다.


LVM 관련 용어

물리적 볼륨(PV: Physical Volume)

실제 디스크가 물리적으로 분할 된 것

볼륨 그룹(VG: Volume Group)

물리적 볼륨이 모여서 생성되는 덩어리를 VG라 한다.

논리적 볼륨(LV: Logical Volume)

VG에서 사용자가 필요한 만큼 할당하여 만드는 분할 공간을 말한다. == 파티션

물리적 확장(VE: Physical Extent)

PV에서 나누어 사용하는 일종의 블록 같은 영역 보통 1PE == 4MB 정도 할당

 

 
반응형

RAID의 개요

RAID 란? 위키에 따르면 아래와 같다.

복수 배열 독립 디스크(Redundant Array of Independent[Inexpensive] Disks)는 여러 개의 하드 디스크에 일부 중복된 데이터를 나눠서 저장하는 기술이다. 디스크 어레이(disk array)라고도 한다.

이 방법을 사용할 시 데이터를 여러 개의 디스크에 저장하여 입출력 작업이 균형을 이루게 되어 전체적인 성능을 상향시킨다. 하나의 RAID는 논리적으로 하나의 디스크로 인식하며, 하드웨어 수준의 RAID에서 주목할 기능은 전원이 켜있는 상태에서 드라이브를 교체할 수 있는 핫스왑 베이가 있다.


RAID에서 사용하는 기술

  1. 스트라이핑 (Striping)
    연속된 데이터를 여러 개의 디스크에 라운드로빈 방식으로 기록하는 기술로 프로세서가 하나의 디스크에서 R/W 하는 것보다 더 빠르고 유용하다. 하나의 섹터를 읽는 시간에 여러 개 동시 읽기
  2. 미러링 (Mirroring)
    디스크에 에러 발생 시 손실을 막기 위해 다른 장치에 추가로 중복 저장하는 기술 HW/SW 적으로 구현할 수 있다.

RAID 종류

Linear RAID

두 개 이상의 하드를 사용하는 가장 단순한 RAID, 순차적인 디스크 사용을 말한다. A+B+C 디스크가 있다면 A부터 사용하는 방법이다.

RAID-0

스트라이핑 기술을 사용하여 빠른 I/O 속도를 제공한다. 데이터를 중복이나 패리티 없이 분산 기록한다. 구성 디스크 중 하나라도 오류 발생 시 복구할 수 없다. 1TB 파일을 저장한다면 A+B+C에 1/3+1/3+1/3씩 저장하는 방법

RAID-1

미러링 기술을 사용하여 두 개의 디스크에 같이 기록한다. 각 드라이브를 동시에 읽을 수 있어서 Read 성능이 좋다. Write는 약간 저하된다. 디스크 오류 발생 시 복구가 가능하지만, 디스크 공간 소모가 2배이다.

RAID-2

스트라이핑 기술을 사용하여 구성한다. 에러를 감지하고 수정하기 위해 ECC(Error Check& Correction) 정보를 사용한다.

RAID-3

스트라이핑 구성으로 패리티 정보를 저장하기 위해 별도의 디스크를 사용한다. I/O 작업이 동시에 모든 디스크에 이루어지므로 겹칠 수 없다. 대형 레코드 시스템에서 사용한다.

RAID-4

블록 형태의 스트라이핑 구성으로 단일 디스크로부터 레코드를 읽을 수 있어 속도가 빠르다. 쓰기 시엔 병목 현상 가능성 있다. 균등하게 나누어 저장

RAID-5

RAID 3, 4에서 별도의 패리티 정보 디스크를 사용하는 문제를 보완하여 스트라이핑으로 구성된 디스크 내에서 처리하게 하였다. 1개의 디스크가 고장 나더라도 남은 디스크로 데이터 복구 진행이 가능하다. 작고 랜덤한 I/O가 많을수록 성능이 좋다. 최소 3개의 디스크로 구성된다. 균등하지 않음

RAID-6

RAID 5와 같은 개념이지만, 다른 드라이브들 간에 분포되어있는 2차 패리티 정보를 넣어 2개의 하드에 문제가 생긴다 하여도 복구할 수 있도록 설계한것으로 RAID 5보다 안정성 시스템에 사용된다. 최소 4개의 디스크로 구성된다. 균등하지 않음

RAID-7

하드웨어 컨트롤러에 내장된 실시간 OS를 사용하여 구성하는 방식으로 속도가 빠른 버스를 이용한다. 하나의 업체만 이 구성을 제공한다.

RAID 0+1

디스크 2개를 RAID-0과 같이 구성하고, 다시 RAID-1의 방식으로 구성한다. 최소 4개의 디스크로 구성된다.

RAID-10

RAID 0+1의 반대 개념이다.

RAID-53

RAID-3 방식에 별도로 스트라이프 어레이를 구성하는 방식이다.

반응형

인터네트워킹 장비


네트워크간 연결을 인터네트워킹이라 하는데 이 기능을 수행하는 장치를 게이트웨이라고 한다. 일반적으로 서로 다른 통신망과 프로토콜을 사용하는 네트워크 간에 통신을 가능케 하는 장치를 뜻한다. 대표적으로 리피터, 브리지, 라우터가 있다.

리피터(Repeater)

물리적 신호는 실제 거리가 멀어질수록 약해진다. 이 신호를 증폭해주는 장치를 리피터라고 한다. OSI 모델의 첫 번째 물리 계층에서 동작한다.

브리지(Bridge)

데이터 링크 계층의 여러 개의 네트워크 세그먼트를 연결해주는 장치로 리피터나 허브의 기능을 하면서, 통신량을 조정하여 트래픽 관리가 가능하다.

라우터(Router)

물리 계층, 데이터 링크 계층, 네트워크 계층의 기능을 지원하는 장치로 브리지 기능에 네트워크 계층에 대한 경로 선택 기능을 추가로 제공한다. 이를 위한 라우팅 테이블이 존재하는데 자신과 연결된 네트워크 및 호스트 정보를 관리한다.

반응형

프로세스와 스레드의 차이 

프로세스는 운영체제로부터 자원을 할당받아 실행되고, 스레드는 프로세스로부터 자원을 할당받아 실행된다.

하나의 프로세스 안에서 여러 스레드를 생성 가능하다. 각 스레드는 개별 스택을 가지고, 프로세스의 전역 메모리 공간을 공유하며, 프로그램을 실행한다.( 프로세스는 코드, 데이터, 스택, 힙 메모리 영역을 기반으로 실행하며, 스레드는 프로세스 안에서 개별적 스택을 가지고, 코드, 데이터, 힙 영역을 공유하며 실행된다.)

스크립트언어와 컴파일 언어의 차이점

스크립트 언어는 python, ruby, php 등 인터프리터 언어이며, 컴파일 언어는 java, c, c++ 등이 있다.

컴파일 언어는 컴파일러를 통해 컴파일되어, 기계어 상태로 실행된다. 속도가 빠르며 기계어 번역시 최적화를 통해 속도 향상이 가능하다. 스크립트 언어는 실행 단계에서 한줄씩 기계어로 변환 후 실행된다. 속도가 느리며 최적화가 어렵다.

동기비동기 차이점

동기식은 요청에 대한 응답을 기다린 후 응답이 오면 다음 요청을 하는 방식이고 비동기식 일처리는 요청에 대한 응답을 기다리지 않고 일처리를 진행하는것

동기비동기의 장단점

동기식 구성은 단순하고 순서가 보장되는 실행이 가능하다. 여러일 동시 수행 멀티태스킹이 불가능하다.

비동기식은 동시에 여러 일을 수행할 수 있지만, 일정 시간당 요청량이 많은 경우 부하가 발생할 수 있다.

DB인덱스 사용 이유와 장단점

데이터의 양이 많아 인덱스를 사용한다. 인덱스는 데이터를 논리적으로 정렬해서 검색과 정렬 속도를 높이기 위해 사용한다. 단, 데이터 삽입, 변경이 수시로 일어나면 매번 인덱스를 변경해야하는 단점이 존재한다. 성능 저하를 막기 위한 고려 필요.

Redis와 mongoDB

둘다 Nosql 방식을 사용하는 것으로 몽고디비가 document 형식으로 데이터를 저장하는데 반해, Redis는 key-value 형식으로 데이터를 저장한다. Redis는 인메모리 DB로 데이터를 메모리에 저장하고 관리하여 성능이 좋지만 데이터가 유한저장되어 캐시와 같이 저장 기한이 있고 성능위주 기기에 사용된다. 몽고디비는 mysql 처럼 서버-클라이언트 방식으로 가변데이터 구조를 다루는데 유용하다.

JVM과 JAVA 프로그램 실행과정

JVM은 자바가상머신의 약자로 자바프로그램을 자바 API를 기반으로 실행하는 역할을 한다. 프로그램이 실행되면 JVM이 OS로부터 메모리를 할당받고 자바 바이트코드로 변환된 class 파일을 class 로더를 통해 jvm으로 로딩시킨다. 로딩된 class 파일은 execution engine을 통해 해석되고, 실행된다. 필요시 garbage collection을 수행해서 불길한 메모리를 해제한다.

JVM은 OS로 부터 할당 받은 메모리를 세영역으로 분리

메소드 영역, JVM 스택, 힙 영역
힙 영역에 생성된 객체가 저장되고 힙영역은 Young, Old, Permanent generation으로 나뉘고 young영역에 eden, S0, S1로 세분화 된다. 이때 eden이 가득차면 Minor GC가 실행되고 Old가 가득차면 Major GC 가 작동한다. (큰 문제)

GC의 필요이유

메모리를 명시적으로 지정해서 해제하지 않기 때문에 필요하다. 경우에 따라 더이상 필요없는 객체를 찾아 지우는것이 필요하다.

Overwriting 과 Overloading

둘다 oop에서 중요한 다형성에 해당하는 내용으로 함수 재정의는 상속받은 경우 부모함수와 다른 작업을 위해 내용을 바꾸는 것이며 오버로딩은 파라미터의 자료형이나 개수가 다른 형태이다.

interface 와 abstract의 차이

두 경우 모두 new가 불가능하며 상속시 interface와 abstract 로 나뉜다.

abstract : 추상 클래스는 추상 메소드를 1개 이상 가지고 있는 클래스를 의미한다.

기존 메소드 이외에 추상 메소드를 상속시켜서 반드시 구현이 필요한 추성 메서드를 상속받은 클래스에서 구현시키는것이 주 목적이다.

interface : 상수와 메서드의 선언 집합으로 implements를 받은곳에서 구현을 강제시킨다. 인터페이스를 이용한 다중 상속이 가능하다.

디자인패턴 : 공통적인 소프트웨어 코드 작성 문제를 해결하는데 도움이 될 수 있는 패턴 소프트웨어 라이브러리를 쉽게 사용할 수 있게 해준다. 또한, 쉽게 이해하기 위한 공통 작업에 대해 간편한 메소드를 제공한다.

싱글톤패턴 : 전체 프로그램에서 단 1개의 객체만 생성하여 공유할 수 있는 코드 패턴

퍼사드패턴 : 클래스 라이브러리 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화 된 인터페이스를 제공하는 객체를 만드는 코드 패턴 라이브러리 밖 코드가 라이브러리 안 코드에 의존을 줄여준다.

예) class Cpu, class Memory, class HardDrive 를 class Computer에서 구현해서 밖에서는  class Computer만 이용한다.
이때, class Computer가 facade가 되는것이다.

파이썬 generator란?

제너레이터는 Iterator를 생성해주는 함수로, 함수 안에 yield 키워드를 사용한다.

Iterator는 next() 메소드를 이용해 데이터를 순차적으로 접근할 수 있는 함수이다. Generator는 한번에 모든 데이터를 메모리에 적재할 필요가 없어서 메모리 효율이 높고 계산 결과가 필요할 때까지 계산을 늦출 수 있으므로 수행 시간이 긴 연산을 필요한 순간까지 늦출 수 있다는 장점을 가지고 있다.

파이썬 GIL

한번에 하나의 쓰레드만 수행할 수 있도록 인터프리터에 lock을 거는 기능

파이썬 객체는 GC를 위해 reference count를 가지고 있는데, 해당 객체를 참조할 때마다 이 count를 변경해야 한다. 멀티 쓰레드를 실행하게 되면, 각 스레드가 공유하는 객체들에 대해 각각 lock을 거는경우 성능상 이슈와 dead lock 발생 위험이 존재하기 때문에 인터프리터 레벨에서 한 시점에 실행되는 스레드는 1개로 제한한다.

이를 해결하기 위해 Multiprocessing 라이브러리를 사용하면 개별 프로세스가 생성되고 프로세스별 인터프리터 락이걸려 동시 실행이 가능해진다.

클래스와 객체의 차이점

클래스는 객체를 만들기 위한 하나의 틀이라고 생각할 수 있으며, 클래스를 구현화 하면 객체가 된다.

JAVA 접근제한자

public : 동일클래스, 동일패키지, 다른 패키지의 자식클래스, 다른패키지

protected : 동일클래스, 동일패키지, 다른 패키지의 자식클래스

default : 동일클래스, 동일패키지

private 동일 클래스

객체지향 5대 원칙

1. Single Responsiblity Principle (단일 책임 원칙)

 - 소프트웨어의 설계 부품(클래스, 함수 등)은 단 하나의 책임만을 가져야 한다. 여기서 책임이란, '기능' 정도의 의미로 해석하면 된다.

설계를 잘한 프로그램은 기본적으로 새로운 요구사항과 프로그램 변경에 영향을 받는 부분이 적다. 다시말해, 응집도는 높고 결합도는 낮은 프로그램을 뜻한다. 만약 한 클래스가 수행할 수 있는 기능, 즉 책임이 많아진다. 책임이 많아지면 클래스 내부의 함수끼리 강한 결합을 발생할 가능성이 높아진다. 이는 유지보수에 비용이 증가하게 되므로 따라서 책임을 분리시킬 필요가 있다.

2. Open-Closed Principle (개방-패쇄 원칙)

 - 기존의 코드를 변경하지 않고(Closed) 기능을 수정하거나 추가할 수 있도록(Open) 설계해야 한다.

OCP에 만족하는 설계를 할 때 변경되는 것이 무엇인지에 초점을 맞춘다. 자주 변경되는 내용은 수정하기 쉽게 설계 하고, 변경되지 않아야 하는 것은 수정되는 내용에 영향을 받지 않게 하는 것이 포인트다. 이를 위해 자주 사용되는 문법이 인터페이스(Interface)이다. 다음 예제를 함께 보자.

class SoundPlayer{
	void play(){
    sysout("play wav");
    }
}

public class Client {
	public static void main(String[] args) {
    	SoundPlayer sp = new SoundPlayer();
        sp.play();
        }
    }
}

SoundPlayer 클래스는 음악을 재생해주는 클래스이다. 이 클래스는 기본적으로 wav파일을 재생할 수 있다. 그러나 SoundPlayer가 다른 포맷의 파일, 예를 들어 Mp3 파일을 재생하도록 요구사항이 변경 되었다고 하자. 요구사항을 만족 시키기 위해서는 SoundPlayer의 play() 메소드를 수정하여야 한다. 그러나 이러한 소스코드 변경은 OCP 원칙에 위배된다. 

그렇다면 어떻게 해야 OCP 원칙을 만족시킬 수 있을까? 다양한 방법이 있지만 여기선 앞에서 언급한 인터페이스를 이용하여 OCP를 만족시켜 보자. 먼저 변해야 하는것은 무엇인지 정의한다. 위 클래스에서는 play() 메소드가 변해야 하는 것이다. 따라서 play() 메소드를 인터페이스로 분리한다.

interface playAlgorithm{
	public void play();
}

class Wav implements playAlgorithm{
	@override
    public void play() {
    	sysout("play Wav");
	}
}

class Mp3 implements playAlgorithm{
	@Override
    public void play() {
    	sysout("play Mp3");
	}
 }

 

일단 재생하고자 하는 파일 클래스(Wav, Mp3)를 만들어 PlayAlgorithm 인터페이스의 play() 메소드를 재정의하도록 설계한다.

class SoundPlayer{
	private playAlgorithm file;
    
    public void setFile(playAlgorithm file) {
    	this.file = file;
	}
    
    public void play(){
    	file.play();
    }
}

public class Client {

	public static void main(String[] args) {
    	
        SoundPlayer sp = new SoundPlayer();
        sp.setFile(new Wav()); // 또는
        sp.setFile(new Mp3()); // 선택
        
        sp.play();

 

SoundPlayer 클래스에서는 playAlgorithm 인터페이스를 멤버 변수로 만든다. 그 후 SoundPlyaer의 play() 함수는 인터페이스를 상속받아 구현된 클래스의 play()함수를 실행시키게 한다. 마지막으로 메인함수에서 setter를 이용하여 우리가 플레이하고자 하는 파일의 객체를 지정해주면 된다.

앞에서 언급하진 않았지만 이와 같은 설계를 디자인 패턴에서는 Strategy Pattern(전략 패턴)이라고 한다.

결과적으로 우리는 SoundPlayer 클래스의 변경 없이 재생되는 파일을 바꿀 수 있으므로 위 코드는 OCP를 만족한다. 앞서 말했듯이 OCP를 만족한 설계는 변경에 유연하므로 유지보수 비용을 줄여주고 코드의 가독성 또한 높아지는 효과를 얻을 수 있다.

3. Liskov Substitution Principle (리스코프 치환 원칙)

 - 자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다.

리스코프 치환 원칙은 MIT 컴퓨터 사이언스 교수인 리스코프가 제안한 설계 원칙이다. 부모 클래스와 자식 클래스 사이의 행위에는 일관성이 있어야 한다는 원칙이며, 이는 객체 지향 프로그래밍에서 부모 클래스의 인스턴스 대신 자식 클래스의 인스터스를 사용해도 문제가 없어야 한다는 것을 의미한다.

상속 관계에서는 일반화 관계(IS-A)가 성립해야 한다. 일반화 관계에 있다는 것은 일관성이 있다는 것이다. 따라서 리스코프 치환 원칙은 일반화 관계에 대해 묻는 것이라 할 수 있다.

이해를 돕기위해 도형을 예시를 들어보자. 도형 클래스와 사각형 클래스가 있고, 사각형 클래스는 도형 클래스의 상속을 받는다고 가정하자. 

(1) 도형은 둘레를 가지고 있다. 
(2) 도형은 넓이를 가지고 있다. 
(3) 도형은 각을 가지고 있다. 

일반화 관계(일관성인지 확인하는 방법은 단어를 교체해 보면 알 수 있다.  (1) ~ (3)의 도형이란 단어 대신 사각형을 넣어보자. 

(1) 사각형은 둘레를 가지고 있다. 
(2) 사각형은 넓이를 가지고 있다. 
(3) 사각형은 각을 가지고 있다. 

(1) ~ (3) 모두 딱히 이상한 부분이 보이지 않는다. 따라서 도형과 사각형 사이에는 일관성이 있다고 할 수 있다. 

여기서 원(Circle) 이라는 도형에 대해 생각해보자. 원 클래스 역시 도형 클래스의 상속을 받는다고 가정하자. 앞에서 언급한 (1) ~ (3)의 도형 단어 대신 원을 대입해보자. 

(1) 원은 둘레를 가지고 있다. 
(2) 원은 넓이를 가지고 있다. 
(3) 원은 각을 가지고 있다. 

문장을 읽어보면 (3)번 문장이 어색하다는 것을 알 수 있다. 따라서 도형 클래스는 LSP을 만족하지 않은 설계라 할 수 있다. 따라서 (3)문장에 대해서는 일반화 관계가 성립하도록 수정되어야 한다. 

4. Dependency Inversion Principle (의존 역전 원칙)

- 의존 관계를 맺을 때, 변화하기 쉬운것 보단 변화하기 어려운 것에 의존해야 한다는 원칙이다.

여기서 말하는 변화하기 쉬운것이란 구체적인 것을 말하고, 변화하기 어려운 것이란 추상적인 것을 말한다. 객체지향적인 관점에서 보자면 변화하기 쉬운것이란 구체화 된 클래스를 의미하고, 변화하기 어려운 것은 추상클래스나 인터페이스를 의미한다. 따라서 DIP를 만족한다는 것은 의존관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는다는 것을 의미한다.

DIP를 만족하면 '의존성 주입' 이라는 기술로 변화에 유연한 설계를 할 수 있다.  앞에 언급한 SoundPlayer 클래스 다시 보자.

우리는 setFile 클래스를 이용하여 실행하고자 하는 파일을 쉽게 바꿀 수 있다. 마찬가지로 새로운 오디오 파일 포맷(예를들면 FLAC)을 실행시키고자 한다면, 새로운 클래스(FLAC)를 만든 후 play 인터페이스를 상속받아 구현한 후 setFile 메소드를 이용하여 file 멤버 변수에 주입시키면 된다. 이와같은 기술을 '의존성 주입' 이라 한다.

5. Interface Segregation Principle (인터페이스 분리 원칙)

- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다. 하나의 일반적인 인터페이스보다는, 여러 개의 구체적인 인터페이스가 낫다. 이는 다시 말해서, 자신이 사용하지 않는 기능(인터페이스)에는 영향을 받지 말아야 한다는 의미이다.

한가지 예를 들어보자. 우리는 스마트폰으로 전화, 웹서핑, 사진 촬영 등 다양한 기능을 사용할 수 있다. 그런데 전화를 할 때에는 웹서핑, 사진촬영 등 다른 기능은 사용하지 않는다. 따라서 전화기능과 웹서핑 기능 사진 촬영 기능은 각각 독립된 인터페이스로 구현하여, 서로에게 영향을 받지 않도록 설계해야 한다. 이렇게 설계된 소프트웨어는 인터페이스 분리 원칙을 통해 시스템의 내부 의존성을 약화시켜 리팩토링, 수정, 재배포를 쉽게 할 수 있다. 

MVC 패턴

Model View Controller의 약자로 에플리케이션을 세가지의 역할로 구분한 개발 방법론이다. 아래의 그림처럼 사용자가 Controller를 조작하면 Controller는 Model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 된다.

위의 모델을 웹에 적용하면

1. 사용자가 웹사이트에 접속한다. (Uses)

2. Controller는 사용자가 요청한 웹페이지를 서비스 하기 위해서 모델을 호출한다. (Manipulates)

3. 모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후에 그 결과를 리턴한다.

4. Controller는 Model이 리턴한 결과를 View에 반영한다. (Updates)

5. 데이터가 반영된 VIew는 사용자에게 보여진다. (Sees)

Controller
사용자가 접근 한 URL에 따라서 사용자의 요청사항을 파악한 후에 그 요청에 맞는 데이터를 Model에 의뢰하고, 데이터를 View에 반영해서 사용자에게 알려준다. 

Model
일반적으로 CI의 모델은 데이터베이스 테이블에 대응된다. 이를테면 Topic이라는 테이블은 topic_model이라는 Model을 만든다. 그런데 이 관계가 강제적이지 않기 때문에 규칙을 일관성 있게 정의하는 것이 필요하다.

View
View는 클라이언트 측 기술인 html/css/javascript들을 모아둔 컨테이너이다. 

브라우저는 어떻게 렌더링 되는가? https://d2.naver.com/helloworld/59361

가상DOM과 DOM의 차이점

하나의 큰 HTML 문서를 DOM으로 가지는 상태에서 부품 컴포넌트를 조립하는 듯 다루는 개념이다.

부품들이 Virtual DOM에 해당한다. 리액트에서 뜯어서 모듈화로 불러오듯 말이다.

const VirtualDOM = () => {
	return
    	<div>
        	<p>Virtual DOM</p>
        </div>
};

위의 코드와 같이 함수를 불러 HTML 내용을 가져다 쓰는것을 말한다. 여기서 함수 VirtualDOM 가상돔 역할을 한다.

HTML에서 부분만 수정하는것을 가능하게 해준 방법이다.

컨텍스트 스위칭

프로세스 p0과 p1이 존재할때, p0이 cpu를 점유중이었고, p1이 대기중 상태에서 잠시후 p1이 실행되고 p0가 대기가 되는 상태가 찾아온다. 이때, p0이 실행중에 대기로 변하게 될 때는 작업해오던 내용을 PCB라는 곳에 저장하게 된다.

p0은 PCB에 저장해야하고 p1은 PCB에서 데이터를 가져와야한다. 이러한 과정을 컨텍스트 스위칭이라 한다.

컨텍스트 스위칭을 통해 멀티 프로세싱과 멀티 스레딩의 운영이 가능해진다.

PCB는 프로세스 생성시 메모리에 할당되는 공간이다.

컨텍스트 스위칭의 단점

위의 그림처럼 p0의 실행 상태에서 대기 상태가 될 때 바로 p1이 실행 상태가 되는것이 아니다. 그 사이에 cpu가 아무 작업을 하지 않는 공백상태가 존재하는데 이러한 문제로 컨텍스트 스위칭이 잦으면 오버헤드가 쌓여 성능이 떨어지게 되는 단점이 있다.

컨텍스트 스위칭 인터럽트

I/O interrupt, cpu 사용시간, 만료 자식 프로세스 fork 가 일어날때 인터럽트가 발생한다. 이러한것은 프로세스 스케줄러가 결정한다.

스레드가 프로세스보다 빠른 이유도 이것이 작용한다. 스레드는 스택을 제외한 영역을 프로세스에서 공유하고, PCB 스레드 고유의 것인 스택 영역만 저장하기 때문에 빠르다.

가상 메모리

RAM을 관리하는 방법의 하나로, 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식을 말한다.

멀티태스킹 운영 체제에서 흔히 사용되며, 실제 주기억장치보다 큰 메모리 영역을 제공하는 방법으로도 사용된다.

가상 주소 공간은 메모리 관리 장치(MMU)에 의해서 물리 주소로 변환된다. 이 덕분에 프로그래머는 가상 주소 공간상에서 프로그램을 짜게 되어 프로그램이나 데이터가 주메모리상에 어떻게 존재하는지를 의식할 필요가 없어진다. 대부분의 현대적 아키텍처와 운영 체제는 가상 메모리 기능을 제공한다.

가상 메모리는 크게 나누어 세그먼트(segment) 방식과 페이징 방식의 2종류가 있다. 

페이징 기법은 컴퓨터가 메인 메모리에서 사용하기 위해 2차 기억 장치로부터 데이터를 저장하고 검색하는 메모리 관리 기법이다. 즉, 가상기억장치를 모두 같은 크기의 블록으로 편성하여 운용하는 기법이다. 이때의 일정한 크기를 가진 블록을 페이지라고 한다. 주소공간을 페이지 단위로 나누고 실제기억공간은 페이지 크기와 같은 프레임으로 나누어 사용한다.

페이징 기법이 적용된 시스템에서 가상주소는 순서쌍 (p,d)로 나타낼 수 있다. p는 가상기억장치 내에서 참조될 항목이 속해 있는 페이지 번호이고, d는 페이지 p 내에서 참조될 항목이 위치하고 있는 곳의 변위이다.

어떤 프로세스가 현재 참조하고 있는 페이지가 주기억장치 내에 있다면 그 프로세스는 수행될 수 있다. 반대로 주기억장치 내에 없다면 그 해당 페이지를 보조기억장치로부터 읽어와서 페이지 프레임의 한 블록에 저장한다.

메모리 세그먼트 방식은 메모리 보호를 수행하는 가장 일반적인 방법 가운데 하나이다. 세그먼트를 사용하는 컴퓨터 시스템에서 메모리 위치를 참조하는 명령어 피연산자는 세그먼트와 그 세그먼트 안의 오프셋을 증명하는 값을 포함하고 있다.

트랜젝션

데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.

1. 트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위이다.

2. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다.

3. 하나의 트랜잭션은 Commit되거나 Rollback된다.

Atomicity(원자성)

1. 트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 한다.

2. 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.

Consistency(일관성)

1. 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다.

2. 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.

Isolation(독립성,격리성)

1. 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션의 연산이 끼어들 수 없다.

2. 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.

Durablility(영속성,지속성)

1. 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.

RDBMS 와 NoSQL 차이점

RDBMS

관계형 데이터베이스 관리 시스템입니다. RDBMS는 정해져있는 데이터 스키마에 따라 데이터베이스 테이블에 저장되며, 관계를 통한 테이블간 연결을 통해 사용됩니다. 이 때문에 RDBMS는 데이터 관리를 효율적으로 하기위해 구조화가 굉장히 중요 
장점으로는 정해진 스키마에 따라 데이터를 저장하여야 하기 때문에 명확한 데이터 구조를 보장. 각 데이터에 맞게 테이블을 나누어 데이터 중복을 피해 데이터 공간을 절약 단점으로 RDBMS 관계로 인한 시스템 복잡도를 고려 복잡 할수록 성능 저하

스키마

스키마는 데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 기술한 메타데이터의 집합이다.
스키마는 데이터베이스를 구성하는 데이터 개체, 속성, 관계 및 데이터 조작 시 데이터 값들이 갖는 제약 조건 등에 관해 전반적으로 정의한다.

NoSQL

스키마와 관계라는 개념이 없다.

장점으로 자유롭게 데이터를 추가가 가능하다. 이는 복잡한 테이블간의 관계를 형성하는 형태의 구조를 신경쓰지 않는다. RDBMS는 조인 등 복잡한 SQL구문으로 인한 문제가 있는데 NOSQL에서는 필요한 데이터가 보통 하나의 컬렉션에 있으며, 이는 자주 변경되지 않는 데이터에 큰 장점이 있다. 그리고 수평적 확장이 쉽다. 분산처리 목적 단점으로 컬렉션에 중복된 데이터가 저장이 가능

해시테이블, 해시 맵, 해시 표

컴퓨팅에서 키를 값에 매핑할 수 있는 구조인, 연관 배열 추가에 사용되는 자료 구조로 해시 테이블은 해시 함수를 사용하여 색인을 버킷이나 슬롯의 배열로 계산한다.

해시 함수 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다.

 

반응형

GPL(General Public License)


FSF의 창시자 리처드 스톨먼은 다섯 가지의 의무를 저작권의 한 부분으로서 강제한다.

1. 컴퓨터 프로그램은 어떠한 목적으로든 사용할 수 있다. 다만, 위법적 행위는 불가하다.
2. 컴퓨터 프로그램의 실행 복사본은 언제나 소스 코드와 함께 판매하거나 소스 코드를 무료로 배포해야 한다.
3. 컴퓨터 프로그램의 소스 코드를 용도에 따라 변경할 수 있다.
4. 변경된 컴퓨터 프로그램 역시 동일한 배포와 라이선스 조건을 따른다.

LGPL(Library/Lesser General Public License)


GPL 이상의 강력한 카피레프트 조건과 단순한 사용 허가를 위해 리처드 스톨먼이 발표한 라이선스이다. 대부분 소프트웨어 라이브러리에 쓰인다. GPL과 다른 점은 GPL이 적용된 라이브러리를 자유 소프트웨어를 만들 때만 사용해야 하지만 LGPL의 경우 독점 소프트웨어에서도 사용 가능하다. 다만, LGPL 라이브러리의 소스 코드를 수정했을 경우 2차 파생 저작물에 해당하므로 소스 코드를 반드시 제공해야 한다.

BSD(Berkeley Software Distribution)


버클리 캘리포니아 대학에서 배포하는 공개소프트웨어 라이선스로 누구나 수정할 수 있고, 수정한 것을 제한 없이 배포할 수 있다.

아파치(Apache)


아파치 소프트웨어 재단에서 만든 소프트웨어에 대한 라이선스 규정으로 누구든 자유롭게 아파치 소프트웨어를 다운 받아 부분 혹은 전체를 개인적 또는 상업적 목적으로 이용할 수 있다. 또한, 재배포 시에도 소스 코드 또는 수정 코드를 공개할 필요가 없다.
다만, 아파치 라이선스를 포함시키고 출처를 아파치 소프트웨어 재단으로 반드시 명시해야 한다.

MPL(Mozilla Public License)


모질라 재단에서 규정한 라이선스로 BSD와 GPL 라이선스의 혼합 성격을 가지고 있다. 코드 수정 시에는 코드 공개가 필수이지만, 다른 코드를 결합하여 만든 경우 MPL에 해당하지 않는 코드의 공개는 의무 하지 않는다.

MIT(Massachusetts Institue of Technology)


미 MIT 대학에서 자대 공대생을 위해 개발한 라이선스로 BSD를 기초로 하였다. 라이선스와 저작권 관련 명시만 지키는 정도로 간단하다. 누구나 수정할 수 있고, 수재배포 시에 소스 코드 비공개가 가능하다.

 

라이선스 이용 배포 소스 코드 수정 2차 저작물
소스 코드 공개
독점 소프트웨어와결합
GPL 무료 허용 가능 공개 불가능
LGPL 무료 허용 가능 공개 가능
BSD 무료 허용 가능 자유 가능
Apache 무료 허용 가능 자유 가능
MPL 무료 허용 가능 공개 가능
MIT 무료 허용 가능 자유 가능
반응형

+ Recent posts