09
09

우분투를 계속 쓰다 보니 운영체제는 잘 알게 되었습니다. 좋은...거죠...?

1. 문제의 발단

  • 우리는 일어나서 컴퓨터를 켜고, 잠들기 5분 전까지 휴대폰을 본다. (그러지 마세요. 수면 건강에 나쁩니다)
  • 그렇다면, 우리를 위해서 이렇게 열심히 일 해주는 기기들이 어떻게 일을 하는지 조금은 알고 이해해줄 필요가 있을 것이다.
  • 사실, 그것보다는 확실히 알고 더 잘 부려먹기 위함이 아닐까...?

2. 프로그램, 프로세스 그리고 스레드

  • 프로그램 : 평소에 많이 접하던. exe로 확장자명이 된 파일들이다. 파일들의 정보로 특정한 작업들을 할 수 있다.
  • 프로세스 : 프로그램이 실행되어서 컴퓨터에서 작업 중인 그 상태. 이때 작업하는 방식에 따라 동시성, 병렬성으로 나눌 수 있다.
  • 스레드 : 프로세스 안에서도 동시에 여러 가지 작업들이 동시에 진행되어야 할 때, 그 각각의 일들이 스레드로 진행되는 것이다.
    • 멀티 스레드?: 여러 가지 스레드가 동시에 진행된다. 이때는 전역 변수의 공간이나 동적으로 따로 할당된 Heap의 공간을 이용하여 작업을 진행하게 된다. 자연스럽게 프로세스 간의 통신보다 여러 스레드로 나눠 작업을 했을 때 처리량도 높고, 응답 시간도 줄어든다. 그래서 프로세스를 여러 개 만들어서 사용할 때 보다 스레드를 나눠 작업하는 것이 더 유리하다.
    • 물론 단점도 있다. Heap영역을 여러 스레드들이 공유하기 때문에, 동시에 스레드들이 같은 데이터에 접근을 하려고 하는 등의 상황이 있으면 결과에 영향을 미칠 수 있다. 그래서 작업의 순서를 정확히 해주는 '동기화' 작업이 필요하다.

3. 동시성과 병렬성

  • 동시성 : 하나의 프로세스의 코어에 스레드가 각각의 작업을 한 번에 하나씩 조금씩 하면서 각각의 작업을 넘어 다니면서 하게 된다. 이때, 각각의 작업들을 뛰어넘는 것을 'Context Switching'이라고 한다. 이는 몹시 빠르게 여러 작업들을 처리하기 때문에 여러 가지 작업들이 동시에 처리되는 것처럼 보인다.
  • 병렬성 : 하나의 프로세스에 코어가 여러 개 있어서 그 각각의 코어들이 스레드가 되고, 그들이 한꺼번에 각각의 작업들을 하게 된다. 컴퓨터의 CPU가 물리적인 문제로(발열 등) 발전에 한계치가 있으니까 그것을 넘어서 더 빠르게 작업들을 처리하려고 하다 보니 여러 개의  코어를 달아 버린 것이다.

4. 자바스크립트(v8) 엔진의 특징

  • v8 엔진? : 구글에서 개발한 오픈소스. 크롬이나 Node.js에서 사용하는 엔진이며, 자바스크립트 코드를 컴퓨터의 CPU가(정확히 말하면 마이크로 프로세서. 이들이 모여서 CPU가 된다) 알아들을 수 있도록 더 간단하게 만들어 주는 일을 하는 것이다.
  • 어떤 원리로 작동하길래 v8엔진이 좋다고 하나요?
    • 인터프리터 : 코드를 한 줄 한 줄 바로바로 기계어로 변환한다.
      • 장점: 속도가 빠르다. 바로 바로 나오니까 사용자 경험이 좋다.
      • 단점: 코드가 복잡해지면 점점 느려진다.
    • 컴파일러 : 코드의 전체를 읽고 기계어로 변환한다.
      • 장점: 최적화로 인해서 코드가 복잡해도 괜찮다.
      • 단점: 바로바로 결과가 나오지 않기 때문에 초기에 속도가 느리다.
    • 이때, v8엔진은 JIT(Just In Time) 컴파일러로 이 둘을 같이 사용한다.
      • 처음 코드를 보면 인터프리터에 전달해 코드를 한 줄씩 읽는다.
      • 읽으면서 최적화가 가능한 부분이 있으면 컴파일러로 넘겨 바로 최적화하며 읽는다.
    • 이렇게 둘의 장점을 동시에 사용하여 효율적으로 작업하게 된다.

5. 유니코드

  • 컴퓨터가 문자열을 읽는 원리
    1. 특정 문자를 누르면 전압의 차이로 0과 1로 표현된다. 즉, 2진수이다.
    2. 이때 하나의 0과 1이 1bit 씩 8개가 모여 8 bits가 되면 이를 1byte라고 한다.
    3. 이 1byte가 컴퓨터가 문자열을 받아들이는 최소 단위가 된다.
    4. 2의 8승인 255개 즉, 0부터 255이니까 총 256개의 데이터를 표현할 수 있게 된다.
  • 아스키코드
    • American Standard Code for Information Interchange의 줄임말이다.
    • 말 그대로 영어를 위한 문자 인코딩이다.
    • 컴퓨터가 문자열을 읽는 원리를 생각해보면, 특정 문자가 눌러졌을 때, bit로 표현된 숫자를 컴퓨터가 읽어서 아스키코드 표에서 찾아서 우리에게 문자로 보여주게 된다. 물론, 숫자 그대로도 보여줄 수 있다.
    • 아스키코드표에는 영어권 사람들을 위한 언어만 들어 있다. 만약, 영어 말고 다른 문자를 컴퓨터가 읽게 하기 위해서는 어떻게 해야 할까?
  • 그래서, 전 세계 모든 언어들을 다 표현할 수 있도록 만든 표를 '유니코드'라고 하는 것이다.
  • 하지만 언제 어떤 상황에 몇 byte로 맞게 읽어야 할까? 를 약속해 놓는 것이 '인코딩'이다. 이 방법을 문자를 저장해 줄 때 같이 보내줘야 똑바로 컴퓨터가 헷갈리지 않고 읽을 수 있게 된다.
  • UTF-8 vs UTF-16
    • UTF는 Universal Coded Character Srt + Transformation을 줄인 것으로 뒤에 오는 숫자는 bit를 말한다.
    • 이것도 역시나 문자 인코딩 방법 중 하나이다.
    • 웹에서는 대부분 UTF-8을 이용한다.

6. 비트맵과 백터

  • 갑자기 웬 이미지...?라고 생각할 수 있지만 이것도 컴퓨터가 이미지를 읽는 방식이므로 알아 두면 또 좋다.
  • 비트맵 : 픽셀 기반 즉, 아주 작은 점들이 모여 만든 이미지이다. 파일 크기가 크며, jpg, gif, png 등의 형식을 가진다.
    • 장점: 사진처럼 다양한 색깔의 표현이 가능하다.
    • 단점: 확대나 축소에 매우 취약하다.
  • 백터 : 점과 선으로 이루어진 이미지이다. 파일의 크기가 작고, 비트맵 형식으로 변환도 자유로운 편이다. 그래서 로고와 일러스트의 재작에 많이 쓰인다. svg 등의 형식을 가진다.
    • 장점: 확대 축소에 영향을 받지 않는다. 
    • 단점: 사진과 같은 정교한 색들의 표현은 한계가 있다.

7. 운영체제

이런식으로 유저와 컴퓨터가 상호작용을 하게 된다.

  • 컴퓨터 즉, 하드웨어들과 사용자 사이에 중계를 해주는 역할을 한다.
  • 운영체제가 없는 상황, 가끔 컴퓨터에 고장 나서 운영체제 선택이 안 되는 경우가 있다. 그럴 경우를 생각해 보자. 운영체제 없이 컴퓨터를 사용하려고 할 수도 있기는 하지만(현실적으로는 거의 불가능) 직접 선을 갈아 끼우는 등 하드웨어를 조종하여 사용을 할 수는 있겠지만 너무 힘들 것이다.
  • 이때, 직접 하드웨어를 조종하지 않아도 운영체제가 중간에서 둘의 대화를 물리적이지 않은 방법으로 도와줄 수 있다.
  • 컴퓨터 시스템의 처리 구조
    1. 유저가 필요한 작업을 요청한다.
    2. 응용프로그램이 작동하여 유저의 작업을 받아들이고 처리하려고 한다.
    3. 운영체제를 거쳐서
    4. 하드웨어가 직접 작업을 실행한다.
    5. 나온 결과들을 반대로 전달하면서 상호작용한다.

8. 가비지 컬렉션

  • 메모리에 필요 없는 자료들을 알아서 지워줘서 메모리 공간을 확보해 준다.
  • C언어와 같이 옛날에 쓰던 언어들에서는 가비지 컬렉션이 없다. 그럴 때는 메모리 누수가 생긴다.
    • 메모리 누수(memory leak): 코드를 짤 때, 비워줘야 할 공간을 실수로 안 비워줬을 때, 계속 쌓이게 되는 상황. 이는 피할 수 없다. 아무리 완벽하게 짠다고 해도 인간이 짠 코드이기 때문에 누수가 생길 수밖에 없다.
  • 하지만 상대적으로 최신의 언어들은 가비지 컬렉션이 이를 돕는다.

9. 가비지 컬렉션의 동작 원리

  • Mark-and-sweep : root와 연결되어 있는 변수들을 체크하고 나머지 체크되지 않은 변수를 다 지운다.
  • Reference counting: 각 변수들이 다른 변수들과 참조가 몇 번이 되는지를 계산해서 그 참조 횟수가 0이라면 지운다.
  • 하지만 그래도 완벽하게 메모리를 관리하지는 못 한다. 계발 환경에 따라 작동하는 방식이나 필요 없는 데이터들이 달라지기 때문이다.
  • 그래도 최대한 가비지 컬렉션이 잘 작동하게 하려면? 
    • 순환 참조 금지: 각각의 변수들이 서로를 참조하고 있다면 참조 횟수는 0이 될 수가 없게 된다.
    • 언어들 마다 각각의 누수 잡는 방법 알아 놓기: 언어들마다 누수를 잡는 방법이 존재한다. 이를 알고 알맞은 상황에 맞게 사용하여 누수를 막을 수 있다.

10. 캐시

  • 가져오는데 비용이 많이드는 사용빈도가 높은 데이터를 비용을 줄이기 위해 사용하기 편한 저장공간을 '캐시'라고 한다.
  • 웹 상황에서는 데이터 베이스에 저장된 정보를 매번 사용자가 요청할 때마다 가지고 올 때 비용이 발생하므로, 자주 방문하는 데이터들을 캐시에 저장해 놓으면 그 비용을 줄 일 수 있다.
  • 로컬 상황에서는 하드디스크에 저장된 정보를 매번 사용자가 요청할 때마다 가지고 올 때 비용이 발생하므로, 자주 사용하는 데이터를 램에 저장해 놓으면 그 비용을 줄일 수 있다. 하지만 램은 용량은 적은데 비싸기도 하다. 그래서 더 비용을 줄이고 더 자주 사용하는 작은 데이터들은 캐시 메모리에 저장해 놓아서 그 비용을 줄 일 수 있다.
  • 결론은 캐시에는 아주 작고, 자주 사용하는 중요한 데이터들을 저장하여 비용을 줄이기 위해 존제한다고 정리할 수 있겠다.

 

COMMENT