컴퓨터의 발전과 성능

컴퓨터의 세대별 발전

반도체의 획기적인 발전에 따라 컴퓨터 환경은 크게 진화함.

컴퓨터 : 전자회로를 이용해 다양한 종류의 데이터를 처리하는 장비.

그렇다면 각 컴퓨터의 세대별 특징을 살펴보도록 하자.

컴퓨터의 세대주요 소자기억장치특징
0세대 컴퓨터기계적 릴레이금속 기어, 카드-
1세대 컴퓨터 (~1950년대 후반)진공관자기드럼하드웨어 개발 중점. 부피 크고 전력 소모 많음.
2세대 컴퓨터 (~1960년대 초반)트랜지스터자기코어고급언어 등장
3세대 컴퓨터 (~1070년대 중반)SSI,MSIRAN, ROM운영체제 개발, 다중 프로그래밍, 고급언어 활용
4세대 컴퓨터 (~2000년대)LSI, VLSISRAM, DRAM객체지향언어 사용, 개인용 컴퓨터 등장, 병렬 처리 기능 강화
5세대 컴퓨터 (2000년대 중반 ~)VLSI, ULSI, GLSI, SoCSDRAM, DRAM, flash비노이만 구조 추구, 멀티코어 사용, 유비쿼터스 컴퓨팅 환경 조성

3세대 이휴부터 하나의 프로세서에 포함된 논리소자의 수를 기준으로 분류하는데, 다수의 트랜지스터를 하나의 칩으로 집약한 집적회로를 기반으로 한다. 아래의 표를 참고하면서 보자.

집적회로트랜지스터의 수
SSI~ 100기본적인 게이트 기능과 플립플롭
MSI~ 1,000인코더, 디코더, 카운터, 레지스터, 멀티플렉서, 디멀티플렉서
LSI~ 10,000기억장치
VLSI~ 100,000대규모 기억장치, 마이크로프로세서
ULSI1,000,000대규모 기억장치, 마이크로프로세서

현대 컴퓨터 발전의 지표

해당 챕터에서는 폰노이만 모델, 무어의 법칙 등을 살펴본다.

폰노이만 아키텍처

폰노이만 아키텍처란 프로그램을 저장하고 변경할 수 있는 프로그램 내장식 컴퓨터 모델이다. 즉, 컴퓨터 내부에 프로그램과 데이터를 저장하여 컴퓨터가 필요한 내용을 순서에 따라 인출하고 해독하도록 할 수 있다.

폰노이만 아키텍처는 이 이후에 개발된 모든 범용 컴퓨터의 기본 모델이다.

폰노이만 아키텍처 이전에는 고정결선식 프로그램 컴퓨터 방식을 사용했다. 간단하게 이야기하자면 미리 정의된 기능을 물리적, 하드웨어적으로 설계한 기계이다. 그래서 저장, 변경할 수 없고 주어진 기능만 처리 가능하다. 또한, 기능을 수정하거나 확대하려면 기계 내부를 수정해야 한다.

폰노이만 아키텍처로 개발된 프로그램 내장식 컴퓨터 방식은 프로그램 자체와 프로그램에서 사용하는 데이터를 동일한 형태로 메모리에 저장할 수 있는 구조이다.

그렇기 때문에 하드웨어에 대한 전문적 지식이 없어도 원하는 작업을 프로그래밍 할 수 있다.

폰노이만 아키텍처는 다음과 같이 구성된다.

  • CPU : 명령어를 해석하고 데이터를 처리한다.
  • 메모리 : 명령어와 데이터를 저장한다.
    • 순차적인 주소를 가진 워드로 구성
    • 명령어와 데이터를 구분 없이 저장
    • 워드는 인출될 때 컴퓨터 상태에 따라 명령어나 데이터로 해석
  • 입출력장치

이 때 CPU 와 메모리 사이에 발생하는 트래픽이 성능에 큰 영향을 미쳐 지연 현상을 발생하는 것을 폰노이만 병복 이라고 한다.

추가적으로 폰노이만 모델의 성능을 개선하기 위해 수정한 구조를 하버드 아키텍처 라고 한다. 메모리를 2개로 분할해 명령어와 데이터를 별도의 메모리에 저장. CPU 의 제어장치, 연산장치를 별로의 버스로 각각 연결해 병렬로 인출

무어의 법칙

무어의 법칙 : 단일 마이크로칩에 포함된 트랜지스터의 수가 18개월마다 약 2배씩 증가한다는 것을 의미.


컴퓨터의 성능

컴퓨터의 속도나 효율성 등을 컴퓨터의 성능 이라고 한다.

성능의 정의

보통 프로그램 응답 시간과 처리율은 완전히 별개의 요소가 아니라, 하나를 향상하면 다른 것도 성능이 향상된다. 여기서 프로그램 응답 시간 은 하나의 프로그램을 처리하는데 소요되는 시간을 의미한다.

이 응답 시간에는 여러가지 응답 시간이 포함 돼 있다. (운영체제, 시분할 시스템의 경우 다른 프로그램 실행 시간도 포함 될 수 있음.) 이 때 순수하게, 입출력이나 다른 프로그램의 실행 시간이 포함되지 않는 것을 CPU 실행 시간 이라고 한다.

컴퓨터의 성능이 좋다는 것은 CPU 실행 시간이 짧다는 의미이기 때문에 성능을 높인다, 향상한다라는 말은 CPU 실행 시간을 줄인다는 의미이다.

그래서 다음과 같은 식이 성립된다.

             1
성능 =   ----------- 
        CPU 실행 시간

성능 비율은 다음과 같은 식으로 나타낼 수 있다.

                                     B의 성능
컴퓨터 A 에 대한 B 의 성능 비율 = n = ----------
                                     A의 성능

성능은 실행 시간에 반비례하므로 다음과 같이도 정리할 수 있다.

                                   A의 실행 시간
컴퓨터 A에 대한 B의 성능 비율 = n =  ------------
                                   B의 실행 시간

암달의 법칙

암달의 법칙 : 시스템의 일부분을 개선하는 경우 전체 시스템에서 얻을 수 있는 최대 성능 향상을 구할 때 사용한다. 또한, 주로 병렬화에 의한 시스템 성능 향상의 한계를 지적하는데 사용된다.

다음의 예를 보자.

 - 하나의 프로그램이 싱글코어 프로세서를 사용하면 20시간 소요.
 - 해당 프로그램에서 1시간 소요되는 부분은 병렬화 할 수 없음. 나머지 19시간은 병렬화 가능
 - 병렬화된 부분을 처리하는데 사용되는 프로세서의 수 제한 없음.

무한대의 프로세서를 사용하면 병렬로 처리할 수 있는 시간은 0으로 줄일 수 있음. 하지만 병렬화하지 못하는 곳은 1시간이 무조건 걸림. 즉, 병렬화에 의한 최대 성능 향상은 20배가 됨.

그렇다면 식으로 통해 알아보자.

시스템의 일부분 f 는 병렬화 혹은 하드웨어의 개선으로 성능을 n배 향상하고 나머지 부분(1 - f)는 그대로 두었다고 가정.
성능 향상 전의 기계를 M1, 성능을 일부 향상한 기계 M2 라고 하고 전체 성능 향상 s

     M2 의 성능
s = -------------
     M1 의 성능

M1 의 실행 시간 = m 이라고 할 시,

                         영향을 받는 부분                                   f
M2 의 실행 시간 = m x {  ----------------- + 영향을 받지 않는 부분 }  =  m { -- + (1 - f) }
                          성능 향상 크기                                    n

따라서 M1 에 비해 M2의 시스템 전체 속도 향상 s 는 다음과 같다.
     
     M2 의 성능        M1 의 실행 시간            m                     1
s = ------------  =  ----------------- = ------------------  =  ---------------
                                               f                  f
     M1 의 성능        M2 의 실행 시간     m { -- + (1 - f)}       -- + (1 - f)
                                               n                  n

여기서 개선될 수 있는 부분에 대해 무한정으로 병렬화 하거나 하드웨어를 무한정으로 투자한다면 시스템의 전체 속도 향상은 다음과 같다.

          1          1
s = -------------- < -------
      f
     -- + (1 - f)     1 - f
      n

이는 아무리 개선하더라도 개선되지 않는 부분의 역수인  `1 / 1 - f` 보다 전체 시스템의 성능은 더 큰 속도 향상을 이룰 수 없다는 의미이다.

CPU 성능 분석

컴퓨터는 일정한 주기를 가진 클록 사이크(clock cycle) 이 존재한다. 하나의 프로그램은 다수의 명령어를 포함하며, 컴퓨터는 명령어를 실행하기 위해 클록 사이클을 사용하기 때문이다.

성능에 영향을 미치는 요소

클록 속도 1.0GHz 는 1초당 1.0 x 10의 9승 사이클을 말하며, 클록 사이클은 10의 -9 승 sec, 즉 1ns 이다. 그렇다고 클록 속도가 높다고 해서 꼭 더 성능이 좋다는 것은 아니다. 그 예로 세발 자전거와 두발 자전거를 들 수 있다.

CPU 성능은 프로그램 실행 시간으로 나타낼 수 있다. 하나의 프로그램에 대한 CPU 실행 시간, 즉 프로그램 실행 시간은 다음과 같이 3개의 요소로 나타낼 수 있다.

 CPU 실행 시간       명령어 개수       사이클 개수        시간
--------------  =  ------------  =  -------------  =  -------
   프로그램           프로그램           명령어          사이클

첫 번째 요소는 하나의 프로그램에 포함된 명령어 개수 (프로그램의 크기) 를 의미한다. 두 번째 요소는 하나의 명령어를 실행하는데 필요한 클록 사이클의 수를 의미한다. 이를 CPI (cycles per instruction) 이라고 한다. 보통 평균 CPI 를 사용함 세 번째 요소는 한 클록 사이클에 소요되는 시간 (클록 사이클 시간)을 의미한다 (사이클). 사이클 시간의 역수를 클록률 또는 크록속도 라고 한다.

그렇다면 CPU 실행 시간을 다시 정리하면 다음과 같다.

                                                               명령어 개수 X 평균 CPI
프로그램의 CPU 실행 시간 = 명령어 개수 X 평균 CPI X 사이클 시간 = -----------------------
                                                                      클록속도

명령어 개수는 아키텍처나 알고리즘에 결정이 된다.

평균 CPI 를 구하는 법은 다음의 예제를 참고하자.

명령어 종류사용 빈도사이클
산술, 논리연산 명령어50%1
적재, 저장연산 명령어30%2
분기연산 명령어20%3

그렇다면 평균 CPI 는 다음과 같다.

평균 CPI = 0.5 X 1 + 0.3 X 2 + 0.2 X 3 = 1.7 (사이클 / 명령어)

그렇다면 이제 두 컴퓨터에서 동일한 개수의 동일한 명령어를 포함하는 특정 프로그램을 수행할 때 어느 컴퓨터가 더 빨리 실행하는가에 대해서 알아보자.

컴퓨터 M1(3GHz) 과 M2(4GHz) 가 있고 각각 세 가지 유형의 명령어 그룹이 있다.

M1 의 명렁어 유형별 사용 빈도와 CPI :

명령어 종류사용 빈도사이클
산술, 논리50%1
적재, 저장30%2
분기20%3

M2 의 명렁어 유형별 사용 빈도와 CPI :

명령어 종류사용 빈도사이클
산술, 논리40%1
적재, 저장30%1
분기30%4

이제 성능을 비교하기 위해 실행 시간을 구할 것이다. 이 때 프로그램의 크기평균 CPI클록 속도가 필요하다. 각각의 컴퓨터에서 수행할 프로그램의 포함된 명령어 개수를 n 이라고 하자.

M1 의 평균 CPI : 0.5 X 1 + 0.3 X 2 + 0.2 X 3 = 1.7

M2 의 평균 CPI : 0.4 X 1 + 0.3 X 1 + 0.3 X 4 = 1.9

그렇다면 각 컴퓨터의 실행 시간은 다음과 같다.

                    n X 1.7
M1 의 실행 시간 = -------------
                  3 X 10의 9승
              
                    n X 1.9
M2 의 실행 시간 = -------------
                  4 X 10의 9승

따라서 컴퓨터 M1 에 대한 M2 의 성능 향상은 다음과 같다.

     M1 의 실행 시간       n X 1.7 X 4        6.8
s = ----------------  =  --------------  =  ----- = 1.19
     M2 의 실행 시간       n X 1.9 x 3        5.7

따라서 컴퓨터 M1 보다 컴퓨터 M2 가 약 1.19 배 빠르다.

성능에 영향을 미치는 요소 분석

시스템의 성능은 하나의 프로그램에 포함된 명령어 개수평균 CPI프로세서 클록 사이클 시간 의 영향을 받는다. 하지만, 각 요소가 독립적으로 성능을 결정 할 수 없음을 유의해야 한다.

명령어 개수

실행된 명령어 개수는 알고리즘과 아키텍처에 의해 결정된다. 하나의 프로그램을 구성하는 명령어 개수는 간결한 알고리즘을 사용하면 줄어들고, 또한 하나의 명령어가 수행하는 일이 많으면 프로그램의 크기를 줄일 수 있음.

그래서 명령어 개수를 줄이려면 좋은 알고리즘을 사용하거나 강력하고 복잡한 명령어를 가진 CISC(complex instruction set computer) 아키텍처 구조를 사용한다.

평균 CPI

평균 CPI 는 아키텍처와 컴퓨터 구현에 의해 결정된다. 복잡하고 강력한 명령어는 단순한 명령어보다 더 많은 사이클을 필요로 한다.

따라서 평균 CPI 는 단순한 명령어로 구성된 RISC(reduced instruction set computer) 아키텍처를 사용하면 낮출 수 있다.

클록 사이클 시간

사이클 시간은 주로 컴퓨터 구현과 실현 수준에 의해 결정된다.

컴퓨터 구현 수준에서는 데이터 경로가 짧으면 일반적으로 지연 시간이 짧아져 사이클 시간도 짧아진다. 또한 파이프라이닝 기술을 사용하면 한 사이클 동안에 수행할 작업의 양이 작아지므로 클록 속도가 빨라진다.

이제 반대로 아키텍처, 컴퓨터 구현, 컴퓨터 실현이 컴퓨터의 성능을 결정하는 요소인 명령어 개수, 평균 CPI, 클록 사이클 시간에 어떤 영향을 미치는지를 살펴보자.

  • 아키텍처 수준 : CISC 를 사용하면 프로그램 크기가 줄어듦. 하지만 명령어가 복잡하고 강력하기 때문에 평균 CPI 와 사이클 시간이 커짐. RISC 를 사용하면 명령어 개수는 늘어나지만 명령어가 단순해 평균 CPI 와 사이클 시간이 줄어듦.

  • 컴퓨터 구현 수준 : 시스템을 병렬화하면 평균 CPI 가 줄어듦. 하지만 병렬화에 따른 부담으로 사이클 시간이 늘어날 수 있음.

  • 컴퓨터 실현 수준 : 더 빠른 회로 기술을 사용하거나 패키징 밀도를 높이면 사이클 시간이 줄어듦. 하지만 비용이 높아짐.

따라서 시스템의 성능 향상하기 위해 아키텍처, 컴퓨터 구현, 컴퓨터 실현 사이의 적절한 절충이 필요함.


벤치마크와 성능 척도

성능 평가에 일반적으로 자주 이용되는 프로그램을 쓰는데, 이 때 작업 부하로 선택된 프로그램의 집합을 벤치마크라고 한다.

밴치마크

워크스테이션이나 서버등의 성능을 평가하는데 널리 사용되는 SPEC(Standard Performance Evaluation Corporation)에서 개발한 SPEC 벤치마크 모음이 있다.

벤치마크 프로그램을 사용하면 시스템의 각종 성능을 평가할 수 있다. 쉽게 사용할 수 있는 척도로 CPI클록속도MIPSMFLOPS 가 있다. 그 외로 CPU 와 메모리 시스템의 성능을 종합적으로 평가할 수 있는 SPECratio, 기호 조작 및 논리 추론 능력에 중점을 둔 KLIPS 등이 있다.

하지만 어떤 성능 척도도 컴퓨터 시스템의 공급자에 의해 왜곡되어 사용될 수 있음을 유의하자.ㄴ

MIPS 와 MFLOPS

  • IPS(instructions per second) : 컴퓨터의 프로세서 속도를 가늠하기 위한 척도. 1초 동안 실행한 명령어 개수를 의미.

  • MIPS(million instructions per second) : 1초에 수행한 명령어 개수를 100만으로 나눈 값.

  • MFLOPS(million floating point opertaions per second) : 실행한 명령어 개수 대신 부동 소수점 연산의 수를 이용하는 것.

그렇다고 MIPS, MFLOPS 값이 높다고 해서 성능이 더 좋다고 할 수 없다.


블로그 이미지

hojak99

2017.08.01 취직~~~

컴퓨터와 시스템

컴퓨터 시스템의 개념적 구성

컴퓨터는 일반적으로 하드웨어(hardware)소프트웨어(software) 로 구성됨.

하드웨어 : 시스템을 구성하는 물리적 부붐으로 이루어진 전자적, 기계적 장치 소프트웨어 : 하드웨어에 작업을 수행할 순서와 방법을 지시하는 명령어로 구성된 프로그램 및 프로그램 수행에 필요한 절차, 규칙, 관련 문서 등을 총칭

쉽게 말해서 하드웨어는 컴퓨터 부품을 생각하면 되고, 소프트웨어는 어떠한 명령어를 통해 하드웨어를 사용할 수 있게 만들 수 있게 하는 것이라고 생각하면 될 것 같다.

컴퓨터 시스템의 4대 기능

컴퓨터 시스템은 입력처리저장출력을 수행한다.

입력 : 입력장치를 통해 외부 세계에서 내부 세계로 정보를 받아들이는 기능. (ex. 키보드) 처리 : 입력된 정보를 중앙처리장치를 통해 연산을 수행한 후 정보를 가공 및 변화하는 기능 저장(보관) : 입력 및 처리된 정보를 어떠한 저장장치에 저장(보관) 하는 기능 출력 : 입력, 처리, 저장된 정보를 모니터와 같은 출력장치를 통해 외부 세계로 내보내는 기능

입력처리저장출력 이라는 단어의 뜻을 생각하면 될 것 같다.

비트, 바이트, 워드

컴퓨터는 onoff 와 같이 두 가지 상태의 신호 및 기호만을 이해할 수 있음. 이러한 신호를 2진수로 표현함

비트(bit) : 정보를 구성하는 최소 단위. 0, 1로만 이루어져 있다. 바이트(bite) : 연속적인 8개 비트의 조합을 바이트라고 함. 정보 표현의 기본 단위. (256 종류의 정보 밖에 표현 못함) 워드(word) : 중앙처리장치에서 한 번에 처리할 수 있는 비트의 집합. (바이트보다 더 큰 정보 처리 단위를 취급하기 위함)

비트와 달리 바이트와 워드는 의미를 가진 정보이다.


컴퓨터 하드웨어

하드웨어는 컴퓨터 기능을 수행하기 위해 전기적 신호 로 구성된 정보를 이동, 처리하는 물리적인 실체. 그 기능에 따라 중앙처리장치기억장치주변장치로 구분됨.

중앙처리장치(Central Processing Unit : CPU)

중앙처리장치(CPU) : 컴퓨터 시스템에 부착된 모든 장치의 동자을 제어, 명령을 실행하는 장치. 마이크로프로세서라고도 부름. 제어장치, 연산장치, 레지스터 CPU 내부 버스 등으로 구성됨.

제어장치 : 메인 메모리부터 명령어를 인출 및 해독해 연결된 장치에 제어 신호를 보냄. (명령어장치라고도 함) 연산장치 : 제어 신호에 따라 명령어가 의도하는 대로 데이터를 실행하기 위해 CPU 내부에서 처리하는 장치. (실행장치, 산술논리장치라고도 부름) 레지스터 : 데이터 처리하는 동안 사용할 값, 연산의 중간 결과를 일시적으로 기억하는 고속처리장치. (누산기, 명령어 레지스터 등이 존재) CPU 내부 버스 : 제어 및 연산장치, 레지스터 등과 같은 CPU 내부 구성요소를 연결하는 배선(wire)의 집합. 데이터 신호, 주소 신호, 제어 신호 전송

기억장치

기억장치 : 컴퓨터 시스템에 의해 처리될 프로그램, 데이터를 저장하기 위한 장치. 저비용, 고효율로 이용하기 위해 계층적 기억 장치 로 구성 돼 사용. 계층적 기억 장치 : CPU 내부의 기억 장치인 레즈지스터, 캐시 메모리, 메이 메모리, 보조기억장치로 구분. (고속일수록 고가, 저속일 수록 저가 및 대용량)

여기서 계속 메인 메모리 라는 말이 나오는데 메인 메모리는 그냥 메모리라고도 함. CPU 에서 수행할 프로그램과 필요한 데이터를 기억하기 위한 장치. DRAM 을 주로 사용. 보조기장치 는 프로그램과 데이터를 저장하는 장치.

기타 하드웨어

컴퓨터 시스템은 CPU, 기억장치, 주변장치 외에 이런 구성 요소를 서로 연결하기 위한 버스 와 각 구성 요소를 탑재하는 메인보드 등이 있음. 이 구성 요소들은 버스를 통해 각종 신호를 전달 및 교환 함.

시스템 버스는 아래와 같이 구분할 수 있다.

  • 데이터 버스 : CPU, 메인 메모리, 주변장치 사이에 데이터르 전송하는 배선의 집합. 배선의 수는 한 번에 전송할 수 있는 비트 수를 결정.
  • 주소 버스 : CPU 가 시스템 구성 요소를 식별하기 위한 주소 정보를 전송하는 배선의 집합. 배선의 수는 CPU 와 접속할 수 있는 최대 메모리의 용량을 결정.
  • 제어 버스 : CPU 가 시스템 구성 요소의 동작을 제어하는데 사용되는 배선의 집합.

메인보드 : CPU, 메모리, BIOS 등과 같은 시스템의 중요 기능장치 대부분 부착 가능. (기능장치 사이의 호환성이나 확장의 범위 결정함)


컴퓨터 소프트웨어

소프트웨어 : 명령어의 집합으로 구성됨. 데이터의 이동 방향과 데이터 처리의 종류를 지정, 이벤트 발생 시간을 지정하는 명령의 집합 자체. 소프트웨어의 품질은 컴퓨터 하드웨어의 사용 효율과 사용 환경을 결정.

소프트웨어는 크게 시스템 소프트웨어응용 소프트웨어 로 구분한다.

소프트웨어

  • 시스템 소프트웨어 : 하드웨어를 제어, 관리
  • 응용 소프트웨어 : 사용자가 하려는 작업을 수행

즉, 다음과 같이 동작을 한다.

사용자 <-> 응용 프로그램 <-> 시스템 소프트웨어 <-> 하드웨어

시스템 소프트웨어

시스템 소프트웨어 : 하드웨어의 기능을 실행하기 위한 필수적인 명령어 해석, 하드에 데이터 저장, 주변장치와 통신을 하거나 응용 소프트웨어의 실행을 지원하는 소프트웨어 그 예로 운영체제장치 드라이버컴파일러인터프리터번역기링커로더등이 있음.

운영체제(operating system) : 컴퓨터 자원을 관리, 응용 프로그램의 실행 환경을 제공 장치 드라이버(device driver) : 컴퓨터에 온라인으로 연결된 주변 기기를 제어하는 운영체제 모듈 컴파일러(compiler)와 인터프리터(interpreter) : 고급언어로 작성된 원시 프로그램(source program)을 컴퓨터가 이해하는 저급언어로 변환하는 일종의 번역기 링커(linker) : 분할하여 작성된 프로그램에 의해 생성된 목적 프로그램(object program) 또는 라이브러리 루틴을 결합해 실행 가능한 하나의 프로그램으로 연결 로더(loader) : 저장장치에 보관된 프로그램을 읽어 메인 메모리에 적재한 후 실행 가능 상태로 만듦

즉, 다음과 같은 과정으로 동작한다.

고급 언어 프로그램 -> 번역기(컴파일러, 어셈블러) -> 목적 프로그램(기계어 모듈) -> 링커 -> 실행 프로그램 -> 로더 -> 메모리

응용 소프트웨어

응용 프로그램 : 컴퓨터 시스템을 특정 분야에 사용하기 위해 제작된 소프트웨어. 애플리케이션, 앱, 어플이라고도 함.


운영체제와 부팅

하드웨어를 동작시키는데 가장 중요한 시스템 소프트웨어는 운영체제 이다.

운영체제

운영체제 : 하드웨어 자원을 효율적으로 관리, 응용 프로그램의 공통된 서비스를 제공하는 소프트웨어의 모음

  • 컴퓨터 시스템의 하드웨어 자원 관리
  • 사용자와 하드웨어 사이의 인터페이스 역할
  • 하드웨어의 고장 탐색, 오류 처리, 보안 유지

부팅 (booting)

부팅 : 운영체제과 컴퓨터 하드웨어를 관리, 응용 소프트웨어를 싱핼 수 있도록 컴퓨터에 시동을 거는 것. 보조기억 장치에 저장된 운영체제를 메인 메모리에 불러돌이는 과정. (부트스트랩(bootstrap), IPL(inital program load 라고도 함))

운영체제는 항상 컴퓨터 전원을 켤 때 반드시 실행이 되고 있어야 한다.

그래서 이를 위해 부트로더(bootloader)ROM 을 사용한다.

부트로더 : 보조기억장치에 저장된 운영체제를 메인 메모리에 단계적으로 적재. ROM : 메인 메모리에 사영되는 RAM 처럼 CPU 가 프로그램을 수행할 수 있는 기억 공간.

여기서 ROM 은 RAM 과 달리 기본적으로 저장된 내용을 수정할 수 없으며, 비휘발성 메모리이다.

운영체제는 보조기억장치의 고정된 위치에 존재해 부트로더는 이 위치를 알고 있기에 RAM 에 적재할 수 있음.

즉, 다음과 같은 과정을 통해 운영체제가 실행이 된다.

ROM[부트로더] : 컴퓨터 전원 킬 시 ROM 에 저장된 부트로더 실행
-> HDD(운영체제) : 부트로더가 하드디스크에 있는 운영체제 커널을 찾아 RAM 에 적재
-> RAM(운영체제) : 부트로더는 제어권을 운영체제에 전달

데스크탑 컴퓨터에서 사용하는 두 단계 부팅과정을 다음과 같이 진행한다.

1. 컴퓨터 전원 켤 시 ROM 에 저장된 BIOS 가 실행
2. BIOS 는 각종 하드웨어의 상태 검사 후 이상 있으면 오류 통지 후 동작을 멈춤
3. BIOS 는 부팅 매체인 하드디스크에 저장된 부트로더를 메인 메모리로 옮김.
4. 부트로더는 BIOS 를 종료 후 운영체제를 메인 메모리에 적재 후 운영체제에 제어권을 넘김
5. 운영체제는 응용 소프트웨어의 실행 환경 조성

이 후에 사용자가 애플리케이션을 실행하면 운영체제는 로더를 통해 하드에 있는 애플리케이션을 메모리에 적재 후 실행함.


컴파일러와 인터프리터

하드웨어는 기계어만을 인식하기 때문에 고급 언어로 작성된 원시 프로그램을 목적 프로그램으로 변환하는 소프트웨어가 필요하다.

컴파일러

컴파일러 : 고급언어로 작성된 원시 프로그램을 저급언어로 구성된 목적 프로그램으로 변환하는 소프트웨어.

여기서 중요한 점은 컴파일러 는 원시 프로그램을 전체적으로 분석하지만 변환 과정을 한 번만 거치면 항상 실행 파일을 수행할 수 있으며 프로그램을 최적화 할 수 있음.

그리고 컴파일러는 정적 바인딩 방식을 사용하므로 데이터 형식이 고정된 프로그램에서 사용될 수 있다. 윈도우에서 사용하는 컴파일러는 리눅스 컴파일러와 다르다.

인터프리터

인터프리터 : 고급언어에서 하나의 명령어를 분석해 저급 언어 명령어로 변환 후 실행시키는 과정을 반복함.

인터프리터는 컴파일러와 다르게 원시 프로그램을 명령어 단위로 변환한다. 그래서 프로그램 전체에 대해 분석하지 않아 변환 시간이 짧음. 하지만 프로그래을 실행할 때마다 변환 과정이 필요하다.

그리고 인터프리터는 동적 바인딩을 사용하기 때문에 데이터 형식이나 구조가 동적으로 결정되는 프로그램에서 사용할 수 있다.


컴퓨터의 구조, 구성 실현

컴퓨터 시스템의 설계나 사양은 세 단계의 설계 수준인 구조, 구성, 실현으로 구분할 수 있음.

컴퓨터 구조

컴퓨터는 하드웨어, 소프트웨어, 그리고 하드웨어와 소프트웨어 사이의 완충 역할을 수행하는 명령어 집합 구조(ISA) 로 구성되어 있음.

컴퓨터 구조 : 하드웨어와 소프트웨어의 인터페이스에 대한 설명을 의미하는 명령어 집합 구조. (컴퓨터 아키텍처, CPU 아키텍처라고도 함)

그리고 컴퓨터 구조는 프로그래머에게 보이는 시스템 속성이다.

  • 명령어 집합
  • 비트의 수
  • 레지스터의 개수나 형식
  • 메로리 주소 지정 방식

컴퓨터 구성

컴퓨터 구성 : 아키텍처 사양에 대한 형체를 제공하는 논리적인 골격. CPU 와 각종 구성 요소, 관련 회로의 인터페이스에 대한 세부 사항 등 프로그래머에게 투명한 하드웨어 내역. (컴퓨터 구현이라고도 함)

어떻게 와 관련이 있다

컴퓨터 실현

컴퓨터 실현 : 컴퓨터 구현의 구체적인 버전. 어떤 부품이 사용되며 그 부품들이 어떻게 서로 연결되고 배치되는지 결정.


블로그 이미지

hojak99

2017.08.01 취직~~~

잘못된 자격증명 이 뜨는 경우가 많으나 그 중 한 가지 경우에 대해 이야기를 해보려고 한다.


사진과 같이 토큰을 요청했다.

현재 DB에는 다음과 같은 정보가 들어있다.

username : robin.kwon@opensurvey.co.kr
password : (passwordEncoder.encode("pasword") 를 한 값)

이 때 사진과 같이 정상적으로 요청을 했을 때도 잘못된 자격증명 이라는 오류를 뱉는다.

생각을 해보니 DB 에 있는 `robin.kwon@opensurvey.co.kr` 이란 데이터의 encoding 된 password 값이 일치하지 않아 발생하는 것 같다고 생각했다.

즉, 토큰 요청 시 다음과 같이 동작되야 토큰 요청이 정상적으로 수행이 될 것이다.

passwordEncorder.match(user.password, "password");

그래야 encoding 된 password 가 일치하는지 알 수 있을 것 같다.

이럴 땐 DaoAuthenticationProvider 를 return 메소드를 @Bean 으로 등록하면 된다. 아래의 코드를 보자.

    /**
     * POST '/oauth/token' 요청 시 PasswordEncoder 로 패스워드 일치하는지 확인하도록 하기 위해 Bean 등록.
     * An 'AuthenticationProvider' implementation that retrieves user details from a 'UserDetailsService'.
     *
     * @return DaoAuthenticationProvider
     */
    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        provider.setPasswordEncoder(passwordEncoder);
        provider.setUserDetailsService(userService);
        return provider;
    }

친철하게 주석까지 달아놓았다. DaoAuthenticationProvider 클래스를 살펴보면 주석에 잘 설명을 해주었다. 위의 코드에도 똑같은 주석을 달아놓았다.

즉, DaoAuthenticationProvider 객체에 각각 PasswordEncoder, UserDetailsSerivce 를 set 해주면 된다.

그러면 이제 토큰 요청 시 PasswordEncoder 를 통해 password 가 매칭되는지 확인하고 정상적으로 토큰을 발급해줄 것이다.


코드는 다음의 링크에서 확인하도록 하자. 아직 미완성이나 정상적으로 토큰 발급은 해준다.

https://github.com/hojak99/one-hudred-million-plan/tree/e4130a5d89808d60efe846119bdaff326afbd0f0

블로그 이미지

hojak99

2017.08.01 취직~~~

어떤 과목을 들을지 고민하다가 사진처럼 정했다. 디폴트로 존재하던 사진의 이해 란 과목과 데이터처리입문? 과목은 나에게 도움이 되지 않을 것 같아서 취소하고 운영체제, Java 프로그래밍 과목을 추가했다.

Java 프로그래밍 은 따로 배우고 싶지는 않은데 그래도 익숙하니 추가했다. 운영체제는 지금 컴퓨터 구조 스터디를 하는데 같이 들으면 좋을 것 같아서 추가를 했다.

올 A 는 무리더라도 최소 B는 맞도록 해야지 ㅠㅠ

블로그 이미지

hojak99

2017.08.01 취직~~~