Destructuring Assignment

구조 분해 할당, 또는 비구조화 할당.
배열이나 객체의 속성을 해체하여 그 값을 개별 변수로 담을수 있게 하는 표현식.

객체 비구조화 할당

01.js

  const batMan = {
    name: '브루스 웨인',
    actor: '크리스챤 베일',
    alias: '배트맨'
  };

  const catWoman = {
    name: '셀리나 카일',
    actor: '앤 헤서웨이',
    alias: '켓 우먼'
  };

  function print(hero) {
    const { alias, name, actor } = hero;
    const text = `${alias}(${name}) 역할을 맡은 배우는 ${actor} 입니다.`;
    console.log(text);
  }

  print(batMan);
  print(catWoman);
  const { alias, name, actor } = hero;

이 코드가 객체에서 값들을 추출해서 새로운 변수로 선언해 주는 것.
여기서 파라미터 단에서 객체 비구조화 할당을 하면 더 심플한 코드를 작성할 수 있음.
02.js

  const batMan = {
    name: '브루스 웨인',
    actor: '크리스챤 베일',
    alias: '배트맨'
  };

  const catWoman = {
    name: '셀리나 카일',
    actor: '앤 헤서웨이',
    alias: '켓 우먼'
  };

  function print({ alias, name, actor }) {
    const text = `${alias}(${name}) 역할을 맡은 배우는 ${actor} 입니다.`;
    console.log(text);
  }

  print(batMan);
  print(catWoman);

배열 비구조화 할당.

03.js

  const arr = [1, 2];
  const [one, two, three = 3] = arr;

  console.log( one );
  console.log( two );
  console.log( three );

깊은 비구조화 할당.

  const deepObject = {
    state: {
      information: {
        name: 'jeaha',
        languages: ['javascript', 'java', 'sql']
      }
    },
    value: 5
  };

  const { name, languages } = deepObject.state.information;
  const { value } = deepObject;

  const extracted = {
    name,
    languages,
    value
  };

  console.log(extracted);
728x90
반응형

'Language > JavaScript' 카테고리의 다른 글

[Modern JS] Promise  (0) 2020.06.14
[Modern JS] spread 와 rest  (0) 2020.06.14
[Modern JS] 화살표 함수 (Arrow Function)  (0) 2020.06.05
[Modern JS] Template Literal  (0) 2020.05.29
[Modern JS] keyword ? var : ( let || const )  (0) 2020.05.29

Arrow Function

화살표 함수는 function 키워드 대신 => 를 사용하여 보다 간락한 방법으로 함수를 선언할 수 있다.

Arrow Function의 선언

  // 매개변수 지정 방법
  // 매개변수가 없을 경우
      () => { ... }
  // 매개변수가 한 개인 경우, 소괄호를 생략할 수 있다.
      x => { ... }
  // 매개변수가 여러 개인 경우, 소괄호를 생략할 수 없다.
  (x, y) => { ... }

  // 함수 몸체 지정 방법
  // single line block
  // 함수 몸체가 한줄의 구문이라면 중괄호를 생략할 수 있으며 암묵적으로 return된다.
  x => { return x * x }
  x => x * x

  //  객체를 반환하는 경우. 소괄호를 사용한다.
  () => { return { a: 1 }; }
  () => ({ a: 1 })

  // multi line block.
  () => {
    const x = 10;
    return x * x;
  };

Arrow Function과 callback

화살표 함수가 기존의 function키워드를 완전히 대신할 수는 없지만, callback 함수에서 사용하면 간결하게 사용 가능하다.

02.js

  const nums = [1, 2, 3, 4, 5,];

  const oddNums = nums.filter(n => n % 2);

  console.log(oddNums);

Arrow Function과 this

Arrow Function은 자신을 포함하는 외부 scope에서 this를 계승 받는다.

  function That() {
    this.name = 'ASDF';

    setTimeout(function () {
      console.log(this.name);
    }, 1000);

    setTimeout(() => {
      console.log(this.name);
    }, 1000);
  }

  That();
728x90
반응형

Template Literal

Template Literal, Template String이라고 불림.
백틱 `을 사용하고 내장된 표현식 ${} 을 허용하는 문자열임.
여러 줄로 이루어진 문자열과 보간기능을 사용할 수 있음.
01.js

  const t = function (str) {
    // `을 사용해야 함.
    return `Hi ${str}!,
  Welcome to test world.
  Let's do the HellJS
  `;
  }

  const result = t('ASDF');
  console.log(result);
728x90
반응형

var의 문제점.

헷갈리는 함수 레벨 스코프.

if 문 안에서 선언 했지만 if 문 밖에서 사용 가능.
var는 코드 블럭을 무시하기 때문에 전역 변수가 됨.
01.js

  (function() {
    if( true ) {
      var variable = 'function scope';
    }
    console.log( variable );
  })();

중복 선언이 가능.

전역 변수가 된 var가 중복 선언 까지 됨.
02.js

  (function() {
    var variable = 'function scope';
    var variable = 'duplicated';
    console.log( variable );
  })();

var keyword 생략 가능

var keyword 를 생략해도 변수가 선언됨.
03.js

  (function () {
    variable = 'no keyword';
    console.log(variable);
  })();

Hoisting 문제

Hoisting?
선언은 코드 처음에 실행되지만, 변수에 값을 할당한 곳에서 값이 할당하는 문제.
04.js

  (function() {
    console.log( variable );
    var variable = 'hoisted';
  })();

  //  -> 위 코드는 호이스팅에 의해 아래와 같다.

  (function() {
    var variable;
    console.log( variable );
    variable = 'hoisted';
  })();

let keyword

let keyword를 사용하면, 문제가 해결됨.
05.js

//  1. 블록 레벨 스코프
{
  let variable = 'block scope';
  console.log( variable );
}

//  2. 중복 선언 => syntax error
{
  let variable = 'block scope';
  let variable = 'duplicated';
  console.log( variable );
}

//  3. 호이스팅   => syntax error
{
  console.log( variable );
  let variable = 'hoisted';
}

const keyword

상수 선언 키워드로 재 할당이 불가능하고, 선언과 동시에 할당이 이루어 져야 한다.
06.js

  //  Privitive
  let a = 'a';
  a = 'b';
  console.log( a );

  const c = 'c';
  c = 'd'; // ->  TypeError

const 는 call by value로 주로 Object나 Array를 선언하는데 사용되며,
내부의 요소는 재할당 가능하다.
07.js

  //  Reference
  let e = {
    foo : 'foo',
  };
  e = {
    bar : 'bar'
  };

  console.log( e );

  const f = {
    foo : 'foo',
  };
  /*
  f = {
    foo : 'bar'
  };  //  -> TypeError
  */
  f.foo = 'bar'

  console.log( f );
  /**
  * const c = { c : 'c' };
  * c    -> call by ref
  * c.c  -> call by value
  */
728x90
반응형

회사에서 ES5 이상의 문법을 팀 내부 교육을 진행하게 됐음.
부담스럽긴 하지만 하라고 하면 해야 하니, 내용을 정리했고.
정리하다 블로그에 올리면 좋을 거 같아서 포스팅하기로 함.

모오오던 JS

일반적으로 사용하는 JS 문법은 ES5 문법으로 2009년 12월에 출판되었음.
2015년 ES6가 출판되었고, ES6 이후의 문법을 Modern JavaScript라고 부르는 추세임.
(과연 언제까지 이 문법이 모던하다고 할진 모르겠지만)
그 후로 매년 새로운 업데이트가 있었고.
IE 같은 구형 브라우져는 최신 문법을 지원하지 않지만, babel과 같은 도구를 이용하면 구형 브라우져에서도 작동하게 변환할 수 있음.

목차

아랫부분은 더 포스팅 하고 싶지만, 일하면서 여기까지 정리 할 수 있을지 모르겠으므로 보류.

  • truthy and falsy
  • 단축 평가 논리 연산
  • 함수의 기본 파라미터
  • 조건문 더 스마트하게 쓰기

그외 버전별 주요 문법

버전별로 발행된 문법이나 함수들은 많지만, 주로 알아야 하는 것들은 다음과 같음.
한번씩 찾아 보기를 권장함.

  • ES6
    • let, const
    • module (import, export)
    • Promise
    • template literal
    • arrow function
    • class
    • generater
    • default parameters
    • for...of
    • map, set, weakMap, weakSet
  • ES7
    • 구조 분해 할당. (비구조화 할당 ||Destructuring Assignment)
    • 비동기를 위한 await, async
    • 변수와 함수의 블록 스코프
  • ES8
    • Generator와 Promise를 위한 await, async 구조체
  • ES9
    • rest, spread 문법
    • 비동기 이터레이션
    • Promise.prototype.finally()
  • ES10
    • Object와 Array
728x90
반응형

Java ArrayList Sort

개요

한동안 JS 만 만지다 Java ArrayList를 sort 해야 하는 일이 생김.
DB 에서 이미 ORDER BY 해서 꺼내온 두 개의 List를 merge 한 List 였는데,
요소들은 항적 데이터 { 선박 ID(ship_id), 위치정보(geom), 항적 시간(date(초)) } 로 이루어 져 있고, 시간으로 정렬 해야 했음.

  public class Record {
    String  tbship_id;
    String  geom;
    int     sec;
  }

하도 JS 만 만졌더니 간단한 로직인데 1시간 정도 삽질 했고 블로그에 남기기로 함.

방법 1

Record 객체를 Comparable 상속 받게 한 뒤, compareTo 메소드를 오버라이드, 필요한 곳에서 정렬 메소드를 호출.
compareTo 메소드는 int를 반환해야 하며 오름차순 정렬일 경우, 다음을 반환해야 함.

  • 기준점이 비교대상보다 크다면 양수.
  • 기준점이 비교대상과 같다면 0.
  • 기준점이 비교대상보다 작다면 음수.

Record.java

  public class Record implements Comparable<Record> {
    String  tbship_id;
    String  geom;
    int     sec;

    /* ... */

    @Override
    public int compareTo(Record o) {
      if( this.cal < o.cal ) return -1;
      else if (this.cal == o.cal ) return 0;
      else return 1;
    }
  }

TrackDAOImpl.java

  /* ... */
  Collections.sort(mergedList);

방법 2

정렬이 필요한 곳에서 Comparator 객체를 생성한 뒤, compare 메소드를 오버라이드 후, 정렬 메소드를 호출.
compare 메소드는 int를 반환하며, 앞의 방법과 같이 기준점 대비 비교점으로 짜야함.

  • 기준점이 비교대상보다 크다면 양수.
  • 기준점이 비교대상과 같다면 0.
  • 기준점이 비교대상보다 작다면 음수.
  Comparator<Record> compare = new Comparator<Record>() {

  @Override
  public int compare(Record prev, Record curr) {
    if( prev.getCal() < curr.getCal() ) return -1;
    else if (prev.getCal() == curr.getCal() ) return 0;
    else return 1;
    }
  };

  Collections.sort(mergedList, compare);

방법 3

Collection.sort() 메소드의 두번째 인자로 익명 객체를 넣어 줌..
방법 1, 2를 보면 쉽게 이해할 수 있음.

  Collections.sort(mergedList, (Comparator<Record>) (Record prv, Record cur) -> {
    if( prv.getCal() < cur.getCal() ) return -1;
    else if (prv.getCal() == cur.getCal() ) return 0;
    else return 1;
  });

그 외

개인적으로는 세번째 방법이 낫겠다 싶은데 이유는 객체의 compareTo 메소드에 다른 필드 값 대한 비교가 필요할 경우가 있기 때문.
메소드를 구현 할때, 다른 비교 구분이 필요할 경우가 있기 때문.

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] 문자열이 날짜 형식인지 확인하기  (0) 2021.10.18
[Java] 성능을 고려한 try-catch 문  (0) 2020.12.16
[Java] Map 반복문  (0) 2020.12.08
[JAVA] 구 버젼 설치  (0) 2020.11.02

MongoDB 설치하기

NoSQL 을 사용 해보려고 했는데 구글링으로 나오는 방법으론 MacOS Catalina 버전부터는 root 디렉토리가 Read Only 로 바뀌면서 설치 할 수 없게 됬음.
MongoDB의 공식 설명으로 Catalina에서 MongoDB를 설치하려면 다음과 같은 순서로 Terminal 명령을 내리면 됨.
(선수 조건으로 brew가 설치되어 있어야 함.)

Install

    sudo chown -R $(whoami) $(brew --prefix)/*
    brew tap mongodb/brew
    brew install mongodb-community@4.2

세 줄이면 설치가 되는데.. 한참 헤매고 있었음.
뭔가 설치가 안될 땐 공식 문서를 확인 하도록 하자.

구성 파일

설정 파일 /usr/local/etc/mongod.conf
log 파일 /usr/local/var/log/mongodb
저장 경로 /usr/local/var/monogb

(추가) Run MongoDB Community Edition

Run

    brew services start mongodb-community@4.2

Stop

    brew serveced stop mongodb-community@4.2

컴퓨터 실행시 MongoDB 자동 실행 설정

    mongod --config /usr/local/etc/mongd.conf --fork

자동 실행을 중지 시키려면 mongod 에 연결해서 shutdown을 실행하라는데 한두번 테스트 하고 지울거니 패스.
설치하면서 생성된 /usr/local/etc/mongod.conf 파일로 구성 옵션을 설정할 수 있다고 함.

MongoDB가 실행중인지 확인 하려면

    PS AUX | grep -v grep | grep mongod

실행중인 MongoDB에 접속, Mongo Shell을 실행하려면

    mongo
728x90
반응형

'Database' 카테고리의 다른 글

[DBeaver - cubrid] DBeaver Cubrid UTF-8 문제  (1) 2020.12.07
[SQL] 계층 쿼리  (0) 2020.10.19
[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09
[PostgreSQL] 랜섬웨어  (0) 2020.03.03
[PostgreSQL] sysdate 쓰는법  (0) 2020.02.14

OS 프로세스

  • 학습 개요

    • 프로그램을 실행시키면 운영체제로부터 프로그램이 동작하는 데 필요한 자원을 할당받아 동작을 시작한다.
      이처럼 실행 상태에 들어간 프로그램을 프로세스라고 한다.
      프로세스의 동작은 CPU가 그 프로세스의 명령들을 실행하는 것이다.
      이때 CPU도 기억장치나 입출력장치와 마찬가지로 프로세스가 동작하는 데 필요한 자원이다.
      운영체제는 실행할 준비가 된 프로세스들이 적절히 CPU를 배정받아 효율적으로 작업을 처리할 수 있도록 관리해야 한다.
      운영체제의 핵심적인 구성 요소 중 하나인 프로세스에 대한 기본적인 이해와 함께 쓰레드의 개념을 학습하고, 스케줄링의 정책에 대하여 살펴보자.
  • 학습 목표

    1. 프로세스의 개념을 설명할 수 있다.
    2. 프로세스와 쓰레드의 관계를 설명할 수 있다.
    3. 스케줄링의 필요성과 정책을 설명할 수 있다.
  • 요약

    • 프로세스는 실행 중인 프로그램을 의미하며, CPU, 메모리, 입출력장치, 파일 등 실행에 필요한 자원이 할당된다.
    • 프로세스는 생성, 준비, 실행, 대기, 종료의 다섯 상태 중 하나로 존재하며, CPU의 스케줄링, I/O 대기 등에 따라 준비, 실행, 대기 등으로 상태가 변화되며 동작한다.
    • 프로세스 제어 블록(PCB)은 프로세스를 명시해 주는 다양한 내용을 포함하고 있다.
    • 쓰레드란 하나의 프로그램 내에서 제어의 단일 순차적 흐름으로 정의되며, 하나의 쓰레드 내에서는 하나의 실행점만이 존재하며, 각 쓰레드는 수행에 필요한 최소한의 정보만으로 구성된다.
    • 하나의 프로세스 내에는 하나 이상의 쓰레드가 있을 수 있어 쓰레드를 생성하여 프로세스 내에서 다중처리를 할 수 있다.
    • 프로세스의 스케줄링을 위해 상위단계, 하위단계 및 중간단계 스케줄러가 사용된다.
    • 스케줄링 기법 중 어떤 프로세스도 CPU를 빼앗길 수 없는 경우를 비선점이라 하며, 그렇지 않으면 선점이라고 한다.

프로세스 개요

프로세스

  1. 프로세스는 실행 중인 프로그램을 의미
    • 프로그램 : 동작을 하지 않는 정적이며 수정적인 개체.
    • 프로세스 : 동작을 하는 능동적인 개체.
  2. 프로세스에는 실행을 위해 필요한 컴퓨터의 자원이 할당됨.
    • CPU, 주기억장치, 파일, 입출력 장치 등.
  3. 프로세스의 동작은 CPU가 그 프로세스의 명령들을 실행하는 것.
  4. 운영체제는 프로세스들을 생성시키고 종료시키기 위한 다양한 작업과 프로세스들을 실행시키기 위한 스케쥴링 작업을 처리.

프로세스의 상태 변화

  1. 프로세스의 5-상태
    • 생성 : 처름 프로세스 생성 상태
    • 준비 : CPU 할당을 기자리는 상태
    • 실행 : 프로세스가 처리되는 상태
    • 대기 : 특정 자원의 할당이나 입출력 작업의 종료 때까지 보류되는 상태
    • 종료 : 모든 처리가 완료된 상태
  2. 프로세스의 상태 전이
    • 생성 -> 준비 : 프로세스 생성이 완료된 경우.
    • 준비 -> 실행 : 스케쥴러에 의해 선택된 경우, (Dispatch)
    • 실행 -> 준비 : 할당시간 만료 또는 보다 높은 우선순위의 프로세스가 오는 경우.
    • 실행 -> 대기 : 페이지 교환, 입출력 등의 작업이 필요한 경우.
    • 대기 -> 준비 : 페이지 교환, 입풀력 등의 작업이 완료된 경우.
    • 실행 -> 종료 : 프로세스를 성공적으로 긑마친 경우.

프로세스 제어 블록

  1. 프로세스 제어 플록 (PCB)
    • 프로세스 관리를 위해 해당 프로세스의 정보를 보관.
    • 프로세스 진행에 따라 정보의 변경도 발생.
  2. 프로세스 제어 블록 내 주요 정보
    • 프로세스 상태 : 프로세스의 현재 상태.
    • 프로세스 번호 (PID) : 프로세스의 구분 기준.
    • 프로그램 카운터 : 프로세스 수행을 위한 다음 명령의 주소.
    • 레지스터 : 실행상태에서 다른 상태로 전이되는 경우 CPU의 레지스터 정보를 이곳에 저장.
    • 메모리 : 프로세스 저장 주소, 가상주소와 실주소의 사상 정보, 메모리 경계 정보 등.

프로세스 생성과 종료

  1. 부모 프로세스와 자식 프로세스
    • 부모 프로세스 : 프로세스 생성 시스템 호출을 이용하여 다른 프로세스를 생성한 프로세스.
    • 자식 프로세스 : 부모 프로세스가 생성한 새로운 프로세스.
  2. 프로세스 생성
    • 프로세스의 이름(PID)이 지정되고 프로세스 제어블록이 만들어지며, 준비 큐에 삽입.
    • 부모 프로세스와 자식 프로세스 사이의 상호작용을 위해 자원을 공유할 수 있음.
  3. 프로세스의 종료
    • 처리할 작업을 마치면 실행 결과를 부모 프로세스에 되돌려 주며 종료.
    • 연속적 종료 : 부모 프로세스가 종료되면 그 자식 프로세스들도 모두 종료.

프로세스 간의 관계

  1. 독립적 프로세스
    • 실행 중인 다른 프로세스의 영향을 받지도 않고 주지도 않는 프로세스.
    • 프로세스의 상태는 다른 프로세스와 공유되지 않음.
    • 프로세스의 실행은 결정적 : 실행 결과는 입력에 의해서만 결정됨.
    • 프로세스의 실행은 재생 가능 : 실행 결과는 같은 입력에 대해 항상 동일함.
    • 타 프로세스와 무관하게 중단되거나 재시작될 수 있음
  2. 유기적 프로세스
    • 실행 중인 다른 프로세스와 영향을 주고 받으며 동작하는 프로세스
    • 프로세스의 상태는 다른 프로세스와 공유됨.
    • 프로세스의 실행은 비결정적 : 실행 결과는 실행 순서에 좌우됨.
    • 프로세스의 실행은 재생 불가능 : 실행결과는 같은 입력에 대해 항상 동일하지는 않음.

쓰레드

  1. 전통적인 프로세스
    • 처리의 기본 단위.
    • 자원 소유의 단위 + 디스패칭의 단위.
    • 단일 프로세스 내에서는 동시 처리 불가능.
  2. 스레드
    • 프로세스 내에서의 다중처리를 위해 제안된 개념.
    • 프로세스는 자원 소유의 단위로, 쓰레드는 디스패칭의 단위로 구분.
    • 하나의 프로세스 내에는 하나 이상의 쓰레드가 존재.
    • 하나의 쓰레드 내에서는 하나의 실행점만 존재
    • 쓰레드는 실행에 필요한 최소한의 정보만을 가지며, 자신이 속해 있는 프로세스의 실행환경을 공유함.
    • 다중 쓰레드
      • 멀티 CPU 혹은 멀티 코어 시스템에서는 병렬 처리 가능.
      • 처리 속도 별로 쓰레드가 나워진 경우 효율적인 처리 가능.

스케쥴링

스케쥴링의 단계

  1. 상위단계 스케쥴링
    • 시스템에 들어오는 작업들을 선택하여 프로세스를 생성한 후 프로세스 준비 큐에 전달하는 역할.
    • 선택 기준 : 시스템의 자원을 효율적으로 이용할 수 있도록 하는 것.
    • 입출력 중심 작업과 연산 중심 작업을 균형있게 선택
  2. 하위단계 스케쥴링
    • 사용 가능한 CPU를 준비상태의 어느 프로세스에 배당할지를 결정.
    • 이 결정을 통하여 CPU를 배당 받은 프로세스는 결국 실행상태가 되어 프로세스가 처리됨.
    • 수행 주체 : Dispatcher
  3. 중간단계 스케쥴링
    • 프로세스를 일시적으로 메모리에서 제거하여 중지 시키거나 다시 활성화 시켜서 시스템에 대한 단기적인 부하를 조절.

스케쥴링 정책

  1. 스케쥴링의 기본 목표
    • 공정성 : 모든 프로세스가 적정 수준에서 CPU 작업을 할 수 있게 함.
    • 균형 : 시스템의 자원들이 충분히 활용될 수 있게 함.
  2. 일괄처리 운영체제의 스케쥴링 목표
    • 처리량의 극대화.
    • 반환시간의 최소화.
    • CPU 활용의 극대화.
  3. 대화형 운영체제의 스케쥴링 목표
    • 빠른 응답 시간.
    • 과대한 대기 방지.
  4. 실시간 운영체제의 스케쥴링 목표
    • 처리 기한을 맞춤.
  5. 선점 스케쥴링(Preemptive) 정책
    • 진행 중인 프로세스에 인터럽트를 걸고 다른 프로세스에 CPU를 할당하는 스케쥴링 전략.
    • 높은 우선순위의 프로세스를 긴급하게 처리하는 경우 유용.
    • 대화식 시분할 시스템에서 빠른 응답시간을 유지하는데 유용.
    • 문맥 교환에 따른 오버헤드 발생.
      • 문맥(Context) :
        CPU의 모든 레지스터와 기타 운영체제에 따라 요구되는 프로세스의 상태.
      • 문맥 교환 (Context Switching)
        • CPU가 현재 샐행하고 있는 프로세스의 문맥을 PCB에 저장하고, 다음 프로세스의 PCB로부터 문맥을 복원하는 작업.
        • 운영체제는 문맥 교환이 매우 빠르게 실행되도록 만들어져야 함.
  6. 비선점 스케쥴링(Nonpreemptive) 정책
    • 프로세스가 CPU를 할당받아 실행이 시작되면 작업 자체가 I/O 인터럽트를 걸거나 작업을 종료할 때까지 실행상태에 있게 됨.
    • 모든 프로세스가 공정하게 순서에 따라 실행되도록 관리됨(응답 시간 예측 가능)
    • 짧은 프로세스가 긴 프로세스를 기다리게 되는 경우가 발생할 수 있음.
728x90
반응형

'OS' 카테고리의 다른 글

[OS] 운영체제  (0) 2020.04.24

OS 운영체제

  • 학습 개요
    • 운영체제는 컴퓨터를 사용하기 위해 반드시 필요한 소프트웨어 중 하나이다.
      컴퓨터가 사용자에게 제공하는 서비스가 다양해지고 편리해지는 만큼 사용자를 위해 컴퓨터 내에서 이루어져야 하는 자원의 관리나 활용이 효율적으로 동작해야하는데, 운영체제는 그 근간을 이루는 핵심적인 시스템 소프트웨어이다.
      운영체제에 대한 기본적인 이해와 운영체제를 구성하는 기본적인 요소인 프로세스 관리자, 메모리 관리자, 장치 관리자, 파일 관리자의 역할에 대하여 개략적으로 학습하고, 운영체제의 유형과 발전 과정을 살펴보자.
  • 학습 목표
    1. 운영체제가 사용자에게 제공하는 서비스를 설명할 수 있다.
    2. 운영체제의 기본적인 구성요소들의 역할을 설명할 수 있다.
    3. 운영체제의 운영 방식 및 커널의 형태에 따른 유형을 분류할 수 있다.
    4. 운영체제가 ICT 환경 변화에 따라 어떻게 발전하고 있는지 설명할 수 있다.
  • 요약
    • 운영체제는 컴퓨터 시스템의 자원을 관리하고 컴퓨터 프로그램이 동작하기 위한 서비스를 제공하는 시스템 소프트웨어이다.
    • 응용 프로그램은 하드웨어 자원을 직접 액세스할 수 없으며, 시스템 호출이라는 절차를 통해 필요한 서비스를 운영체제에게 요청하여야 한다.
    • 커널은 응용 프로그램과 하드웨어 수준의 처리 사이의 가교 역할을 하는 운영체제의 핵심 요소로, 대표적인 두 가지로 일체형 커널과 마이크로 커널이 있다.
    • 운영체제의 주요 구성 요소에는 프로세스 관리자, 메모리 관리자, 장치 관리자, 파일 관리자가 있다.
    • 운영체제의 유형은 크게 일괄처리 운영체제, 대화형 운영체제, 실시간 운영체제, 그리고 하이브리드 운영체제로 분류된다.

운영체제의 개요

운영체제의 역할

  1. 컴퓨터 시스템의 운영
    • 컴퓨터 시스템의 자원의 제어 및 관리.
    • 응용 프로그램들의 실행을 도와주는 소프트웨어.
  2. 사용자 지원
    • 사용자의 명령을 해석하여 실행.
    • 사용자와 하드웨어 사이의 매개체 역할 수행.

컴퓨터 시스템과 운영체제

  1. 하드웨어와 응용프로그램 사이에 위치.
    • 하드웨어에 대한 제어는 운영체제만 함.
    • 응용 프로그램은 운영체제를 통해서만 하드웨어를 제어.
  2. 슈퍼바이저 모드 (커널 모드)
    • 운영체제의 커널이 동작되는 모드.
    • 하드웨어를 직접 제어할 수 있는 CPU 명령어 사용 가능.
  3. 보호모드 (사용자 모드)
    • 응용 프로그램이 종작되는 모드
    • 하드웨어를 직접 제어할 수 있는 CPU 명령어 사용 불가능.
  4. 시스템 호출
    • 응용 프로그램이 운영체제에 서비스를 요 청하는 메커니즘.

커널

  1. kernel
    • 운영체지의 핵심 요소
    • 응용프로그램과 하드웨어 수준의 처리 사이의 가교 역할
  2. 일체형 커널 (monolithic kernel)
    • 운영체제의 모든 서비스가 커널 내에 포함됨.
    • 커널 내부요소들이 서로 효율적으로 상호작용을 할 수 있음.
    • 한 요소에 있는 오류로 인해 시스템 전체에 장애가 발생할 수 있음.
    • UNIX와 LINUX 운영체제들이 일체형 커널.
  3. 마이크로 커널 (micro kernel)
    • 운영체제의 대부분의 요소들을 커널 외부로 분리.
    • 커널 내부에는 메모리 관리, 멀티 태스킹, 프로세스 간 통신 (IPC) 등 최소한의 요소들만 남겨 놓음.
    • 새로운 서비스를 추가하여 운영체제를 확장하기 쉬움.
    • 커널 외부 요소의 문제는 커널 자체에 영향을 주지 않으므로 유지보수가 용이, 안정성이 우수.
    • 커널 외부 요소들 사이는 프로세스 간 통신을 통해야 하므로 성능 저하가 발생함.

운영체제의 구성

  1. 프로세스 관리자
    • 프로세스를 생성, 삭제, CPU 할당을 위한 스케쥴 결정.
    • 프로세스의 상태를 관리하며 상태 전이를 처리.
  2. 메모리 관리자
    • 메모리 (주기억장치) 공간에 대한 요구의 유효성 체크.
    • 메모리 할장 및 회수.
    • 메모리 공간 보호.
  3. 장치 관리자
    • 컴퓨터 시스템의 모든 장치를 관리.
    • 파일 접근 제한 관리.
    • 파일을 열어 자원을 할당하거나 파일을 닫아 자원을 회수.
  4. 파일 관리자
    • 컴퓨터 시스템의 모든 파일 관리.
    • 파일의 접근 제한 관리.
    • 파일을 열어 자원을 할당하거나 파일을 닫아 자원 회수.

운영체제의 유형

응답시간의 속도, 데이터 입력의 방식에 따라 분류함.

  1. 일괄처리 (batch processing) 운영체제
    • 작업을 모아서 처리.
    • 사용자와 상호작용 없이 순차적으로 실행.
    • 주어진 시간 안에 처리된 작업의 수(처리량)와 반환시간으로 효율성 평가.
      • 효율성 평가 : 처리량, 반환시간.
        • 처리량 : 주어진 시간 안에 처리된 작업의 수.
        • 반환 시간 : 작업의 생성 시점부터 종료 시점까지의 소요시간.
    • EX: OMR card reader.
  2. 대화형 (interactive) 운영체제
    • 시분할 운영체제라고도 함.
    • 일괄처리 운영체제보다 빠르지만 실시간 운영체제보다 느린 응답시간.
    • 이용자에게 즉각적인 피드백 제공.
      • 응답시간 : 요청한 시점부터 반응이 시작되는 시점까지의 소요시간.
  3. 실시간 (real-time) 운영체제.
    • 가장 빠른 응답시간
    • 처리의 결과가 현재의 결정에 영향을 주는 환경에서 사용.
    • 우주선 비행 시스쳄, 미사일 제어, 증권 관리 시스템, 은행 출입금 시스템 등.
  4. 하이브리드 운영체제
    • 일괄처리 운영체제와 대화형 운영체제의 결함.
    • 이용자는 터미널을 통해 접속하고 빠른 응답시간을 얻음.
    • 대화형 작업이 많지 않을 경우 백그라운드에서 배치 프로그램 실행.
    • 현재 사용되고 있는 대부분의 대형 컴퓨터 시스템은 하이브리드 운영체제.

운영체제의 역사

  • 1940 : 초기 전자식 디지털 컴퓨터
  • 1950 : 단순 순차처리 및 단일 흐름 일괄처리
  • 1960 : 멀티프로그래밍
  • 1970 : 멀티모드 시분할
  • 1980 : 분산 네트워크
  • 1990 : 병렬처리 및 분산처리
  • 2000 : 모바일 및 임베디드
728x90
반응형

'OS' 카테고리의 다른 글

[OS] 프로세스  (0) 2020.04.24

SQL에서 Timestamp 값을 꺼내 와서 시간 값 계산을 해야 할 경우 초나 밀리초로 연산을 하는게 편하다.

다음 쿼리는 Timestamp 형의 값을 초로 변환하여 꺼내오는 쿼리이다.

    SELECT EXTRACT(EPOCH FROM 컬럼명 AT TIME ZONE 'UTC') FROM 테이블;

만약 밀리세컨드로 시간 비교를 해야한다면 1000을 곱해주면 된다.

    SELECT EXTRACT(EPOCH FROM 컬럼명 AT TIME ZONE 'UTC') * 1000 FROM 테이블;

SQL에서 시간 조건을 걸어야 할 경우,
다음과 같이 타임스탬프로 비교 조건을 걸어주면 Query의 속도가 빠르게 나온다.

    AND
          Timestamp컬럼
            BETWEEN TO_TIMESTAMP( '2020-04-08 00:00', 'YYYY-MM-DD HH24:MI' )
            AND     TO_TIMESTAMP( '2020-04-08 23:59', 'YYYY-MM-DD HH24:MI' )
728x90
반응형

'Database' 카테고리의 다른 글

[SQL] 계층 쿼리  (0) 2020.10.19
[MongoDB] 설치하기 (MacOS)  (0) 2020.05.18
[PostgreSQL] 랜섬웨어  (0) 2020.03.03
[PostgreSQL] sysdate 쓰는법  (0) 2020.02.14
[PostgreSQL] Windows에서 Data Directory 변경하기  (0) 2020.01.09

+ Recent posts