WIFT | 2020. 12. 02

sol ahn·2020년 12월 3일
0

What I Had Fun Today

목록 보기
3/6
post-thumbnail

[SQL]

조건 분기 / 집합 연산 / 윈도우 함수/ 갱신

조건 분기

✔️ CASE식
단순 CASE식 | 검색 CASE식

CASE WHEN [평가식] THEN [식]
     WHEN [평가식] THEN [식]
     WHEN [평가식] THEN [식]
           (생략)
     ELSE [식]
END  

SQL의 조건 분기는 특정한 값(상수)을 리턴함.
CASE식은 SELECT, WHERE, GROUP BY, HAVING, ORDER BY 구와 같이 식 어디에나 적을 수 있으므로 다양한 기법으로 활용 가능!

SQL의 집합 연산

UNION, UNION ALL => 합집합
INTERSECT => 교집합
EXCEPT => 차집합

윈도우 함수

'집약 기능이 없는 GROUP BY 구'
PARTITION BY

SELECT [칼럼명]
       집약함수 OVER (PARTITION BY [칼럼명])
FROM [테이블명]       

RANK ; 숫자가 같으면 같은 순위를 표시
DENSE_RANK ; 건너뛰는 작업 없이 순위를 표시

SELECT [칼럼명], 
        ...
        RANK() OVER(ORDER BY [칼럼명] DESC) AS [별칭]
FROM [테이블명]

ROW_NUMBER

트랜잭션과 갱신

SQL은 데이터 검색을 중심으로 수행하기 위한 언어이므로, 데이터 갱신은 부가적인 기능

✔️ SQL의 갱신 작업

  • 삽입(insert)
  • 제거(delete)
  • 갱신(update)

UNION을 사용한 쓸데없이 긴 표현

UNION을 사용한 조건 분기는 WHERE 구만 조금씩 다른 여러 개의 SELECT 구문을 합쳐 복수의 조건에 일치하는 하나의 결과 집합을 얻고 싶을 때 사용함.
BUT, 성능적인 측면에서 큰 단점을 갖고 있음.
=> 테이블에 접근하는 횟수가 많으져 I/O 비용이 증가

예외적으로 UNION을 사용하는 경우

i) 머지(merge) 대상이 되는 SELECT 구문들에서 사용하는 테이블이 다른 경우 -> 여러 개의 테이블에서 검색한 결과를 merge
ii) 인덱스(index)를 사용하는 경우


[OS]

프로세스 관리

프로세스

프로세스(process): 실행 중인 프로그램(program in execution)

프로세스의 문맥(context): 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규명하기 위해 필요한 정보

프로세스의 문맥은 그 프로세스의 주소 공간(코드+데이터+스택)을 비롯해 레지스터에 어떤 값을 갖고 있었는지, 시스템 콜 등을 통해 거널에서 수행한 일의 상태, 그 프로세스에 관해 커널이 관리하고 있는 각종 정보 등을 포함

1) 하드웨어 문맥: CPU의 수행 상태를 나타내는 것으로 프로그램 카운터값과 각종 레지스터에 저장하고 있는 값
2) 프로세스의 주소공간: 코드, 데이터, 스택으로 구성되는 독자적인 주소공간
3) 커널상의 문맥: PCB, 커널 스택

프로세스의 상태

  • 실행(running)
    프로세스가 CPU를 보유하고 기계어 명령을 실행하고 있는 상태
  • 준비(ready)
    프로세스가 CPU만 보유하면 당장 명령을 실행할 수 있지만 CPU를 할당받지 못한 상태
  • 봉쇄(blocked, wait, sleep)
    CPU를 할당받더라도 당장 명령을 실행할 수 없는 프로세스의 상태
  • 시작(new)
    프로세스가 시작되어 그 프로세스를 위한 각종 자료구조는 생성되었지만 아직 메모리 획득을 승인받지 못한 상태
  • 완료(terminated)
    프로세스가 종료되었으나 운영체제가 그 프로세스와 관련된 자료구조를 완전히 정리하지 못한 상태
  • 중지(suspended, stopped)
    외부적인 이유로 프로세스의 수행이 정지된 상태
    '중지준비(suspended ready)'와 '중지봉쇄(suspended block)'로 세분화

프로세스의 상태는 시간의 흐름에 따라 변함!

프로세스 제어블록(Process Control Block): 운영체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내의 자료구조
✔️ PCB의 구성 요소

  • 프로세스의 상태
  • 프로그램 카운터의 값
  • CPU 레지스터의 값
  • CPU 스케줄링 정보
  • 메모리 관리 정보
  • 자원 사용 정보
  • 입출력 상태 정보

문맥교환(context): 하나의 사용자 프로세스로부터 다른 사용자 프로세스로 CPU의 제어권이 이양되는 과정

문맥교환 중 원래 CPU를 보유하고 있던 프로세스는 프로그램 카운터값 등 프로세스의 문맥을 자신의 PCB에 저장, 새롭게 CPU를 할당받을 프로세스는 예전에 저장했던 자신의 문맥을 PCB로부터 실제 하드웨어로 복원시키는 과정을 거침.

프로세스를 스케줄링하기 위한 큐

준비 큐(ready queue)
장치 큐(device queue)
작업 큐(job queue)

스케줄러

스케줄러(scheduler): 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 코드

✔️ 스케줄러의 종류

  • 장기 스케줄러(=작업 스케줄러)
    어떤 프로세스를 준비 큐에 진입시킬지 결정하는 역할
    degree of multiprogramming을 제어함.
    프로세스에게 메모리를 할당하는 문제에 관여함.
    현대의 시분할 시스템에서 사용되는 운영체제는 일반적으로 장기 스케줄러를 두지 않음.

  • 단기 스케줄러(=CPU 스케줄러)
    준비 상태의 프로세스 중에서 어떤 프로세스를 다음번에 실행 상태로 만들 것인지 결정함.
    밀리초 정도의 시간 단위로 아주 빈번히 호출되므로 수행 속도가 빨라야 함.

  • 중기 스케줄러(=Swapper)
    너무 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하되는 경우, 이를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러
    메모리에 올라와 있는 프로세스 중 일부를 골라 이들로부터 메모리를 통째로 빼앗아 그 내용을 디스크의 스왑 영역에 저장 => 스왑 아웃(swap out)

프로세스의 생성

시스템이 부팅된 이후 최초의 프로세스는 운영체제가 직접 생성하지만, 그 다음부터는 이미 존재하는 프로세스가 다른 프로세스를 복제 생성함.

부모 프로세스: 프로세스를 생성한 프로세스

자식 프로세스: 새롭게 생성된 프로세스

프로세스의 세계에서는 자식이 먼저 죽고, 이에 대한 처리를 부모 프로세스가 담당함.

i) 부모와 자식이 공존하며 수행되는 경우
ii) 자식이 종료될 때까지 부모가 기다리는 경우

fork() 시스템 콜: 프로세스 ID를 제외한 모든 정보(운영체제 커널 내의 정보와 주소공간의 정보)를 그대로 복사

프로세스간의 협력

운영체제는 프로세스 간의 협력 메커니즘을 제공하여 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있게 함.

IPC(Inter-Process Communication): 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신

IPC는 프로세스들 간의 '통신'과 '동기화'를 이루기 위한 메커니즘

✔️ 메시지 전달 방식

  • 직접 통신
    통신하려는 프로세스의 이름을 명시적으로 표시
  • 간접 통신
    메시지를 메일 박스(mail box) 또는 포트(port)로부터 전달받음.

✔️ 공유 메모리 방식
프로세스들이 주소 공간의 일부를 공유

Ref

[강의] KOCW 이화여자대학교 반효경 교수 <운영체제> 강의
[도서] 반효경, ⌜운영체제와 정보기술의 원리⌟ 개정판, 이화여자대학교출판문화원, 2020
[도서] 미크/윤인성, ⌜SQL 레벨업⌟, 한빛미디어, 2016

profile
아는 만큼 재밌는 개발자 🤓

0개의 댓글