코드스테이츠 37일차 - 4 [컴퓨터 공학 기초 ]

Lumi·2021년 10월 26일
0
post-thumbnail

오늘따라 유별나게 많이 글을 작성하는 것 같다..

내가 공부한 것을 좀 체계적으로 정리하려고 하다보니 글 작성이 많아 지는 것같으며 요근방에 공부량을 좀더 늘렸다

그러다 보니 자연스럽게 글을 많이 작성하게 된다

이 글에서는 주로 이론적인 내용을 다루게 될것 같다.

말그대로 컴퓨터, 운영체에 대한 글이 될 것 이기 때문이다.

컴퓨터 공학 기초

문자열

2010년 이후로 우리는 유니코드라고 불리우는 인코딩 방식이 통일된 시대를 살아가고 있다.

문자열을 다루는 디테일한 방식에 대해 전부 알 필요는 없지만, 프로그래밍 언어마다 문자열을 다루는 자료형의 차이를 이해를 하는 것이 좋다.

문자열 하나는 몇 바이트일까?

프로그래밍 언어마다 문자열을 저장하는 자료형이 다 다르기 떄문에 이에 대한 답은 자료형이 차지하고 있는 바이트를 이해할떄 알수 있을 것이다.

유니코드

전 세계의 모든 문자를 컴퓨터에 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다.

기본적으로 현존하는 문자 인코딩 방법을 모두 유니코드로 교체하는 것이 목적이다.

인코딩

어떤 문자나 기호를 컴퓨터가 이용할 수 있는 신호로 만드는 것

우리는 값을 인코딩하고 반대로 디코딩 할떄 기준이 필요한데 이 기준을 유니코드 라고 한다.

ASCII문자

영문 알파벳을 사용하는 대표적인 문자 인코딩

  • 7비트로 모든 영어 알파벳을 표현 할수 있다.

UTF-8 vs UTF-16

아마 자주 들어보고 익숙한 용어 일 것이다.
구체적으로 어떤 것인지 알아보자

두개의 차이점은 인코딩 방식의 차이를 의미한다.

utf-8같은 경우에는 8비트, utf-16같은 경우에는 16비트로 표현을 한다.

utf-8같은 경우에는 한 문자를 위해서 1byte(8비트) ~ 4byte(32비트)까지 사용을 한다.

utf-16같은 경우에는 대부분 2바이트로 표현을 한다.

두개의 차이점은 단순히 몇 바이트로 글자를 표현한다 일 뿐이지 큰 차이는 없다.

  • 모두가 알다시피 주로 UTF-8로 인코딩 된다

운영체제

컴퓨터나 스마트폰의 기기 그 자체(하드웨어)는 별다른 조작을 하지 않으면 그냥 깡통 덩어리에 불과 하다.

하드웨어가 일을 해야 저 깡통이 기계가 되는 것이고 하드웨어에게 일을 주는 주체가 바로 운영체제 이다.

앞서 말했듯이 운영체제가 없다면 우리가 알고 있는 기계는 단순히 깡통에 불과하다.

하드웨어는 대표적으로 CPU, RAM, 디스크 등이 있고 이를 운영체제가 관리를 하게 된다.

모든 응용 프로그램이 자원을 마음대로 사용하게 된다면 난장판이 될것이다.

  • 아무떄나 갑자기 카메라가 실행된다거나, 인터넷이 열린다거나 하면 개판일 것이다.

따라서 관리가 반드시 필요하며 여러 사람이 하나의 기기를 다루는 경우에도 관리해주어야 한다.

이러한 역할을 운영체제가 할수가 있다.

그냥 쉽게 말해 운영체제가 모든 것을 관리 한다고 생각하면 될것같다.

  • 그냥 짱이다 운영체제가;;

응용 프로그램이 특정 작동을 하려고 하면 권한을 운영체제로부터 받아야 작동이 가능하며 운영체제가 제공하는 기능만을 사용 할 수 있다.

응용 프로그램이 운영체제와 소통하기 위해서 인터페이스(API)가 제공이 되어야 하며 시스템 자원을 사용할수 있또록 운영체제 차원에서 다양한 함수를 제공 해야 하는데 이를 시스템 콜이라고 한다.

프로세스

실행 중인 하나의 애플리케이션을 말한다.

사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 받아 코드를 실행하게 된다.

예를들어 Chrome브라우저를 두 개 실행하면 두개의 프로세스가 생성이 되는 것이다.

  • 이렇게 하나의 애플리케이션이 두개의 프로세스를 만들기도 한다.

스레드

한 가지 작업을 위해서 순차적으로 실행한 코드를 말한다.

일종의 코드가 실행되는 하나의 흐름이기 때문에

프로세스 내에서 스레드가 두개라는 것은 코드가 실행되는 흐름이 두 개 라는 소리이다.

멀티 스레드

멀티 태스킹과 같다.

두 가지 이상의 작업을 동시에 처리하는 것을 의미한다.

  • 비동기와 비슷하다고 생각하면 될 것 같다.

우리가 멀티 태스킹이라는 것을 말할떄에는 동시에 두가지 작업을 처리하는 것을 말한다.

  • 예를들면 음악을 들으며 나처럼 블로깅을 하는 행위

단지 멀티 스레드가 이러한 것을 의미하는 것은 아니다.

  • 멀티 태스킹과 헷갈릴수가 있다.

왜냐하면 하나의 프로세스에서 멀티 태스킹을 할수 있도록 만들어 지기도 하기 떄문이다.

  • 예를 들면 특정 사이트에 들어갔는데 음악이 재생되고 블로깅도 할수 있는??
  • 싸이월드...??같은 것을 말한다...(아는사람 있나?? ㅋㅋㅋ)

이렇게 작동을 하기 위해서는 멀티 스레드가 필요하다.

쉽게 말해 두가지 프로세스를 다루는 것이 멀티 태스킹이라면 멀티 스레드는 프로세스 내부에서의 멀티 태스킹이라고 보면 된다.

데이터를 분할하여 병렬로 처리해 처리시간을 줄이기 위해,
UI를 가지고 있는 애플리케이션에서 통신을 하기 위해,
여러 클라이언트의 요청을 처리하는 서버를 개발할떄

주로 사용이 된다.

멀티 스레드의 장점

일단 스레드마다 call stack가 존재한다.

  • 실행중인 서브루틴을 저장하는 자료 구조

또한 스레드는 다른 스레드와 독립적으로 동작을 한다.

일단 작업을 나눠서 하는 것이기 때문에 메모리공간, 자원의 소모가줄어들고 자연스럽게 응답속도도 빨라지게 된다.

또한 별도의 공간인 Heap를 이용하기 떄문에 별도의 자원을 소모 하지 않는다.
- 프로세스 간 통신 방법(IPC)에 비해 간단하다.

**
그러기 떄문에 여러개의 프로세스보다 하나의 프로세스에서 멀티 스레드를 활용한다.
**

멀티 스레드의 단점

프로세스간 공유하는 자원이 없기 떄문에 공유하는 자원에 대한 고민을 해야 한다.

서로 다른 스레드가 같은 데이터에 접근, 힙 영역을 공유하기 떄문에 엉뚱한 값이나 이미 수정된 값을 가져오는 경우가 발생하기도 한다.

그러기 떄문에 멀티스레드 환경에서는 동기화 작업이 필요하다.

동시성과 병렬성의 차이

일단 동시에 작동시킬수 있는 스레드의 수는 컴퓨터의 성능에 따라 달라진다.

또한 운영체제는 각 스레드를 시간에 따라 분할하여 여러 스레드가 일정 시간마다 돌아가면서 실행되도록 한다.

  • 이 방식을 시분할 이라고 한다.
 Context Switching 
 - 다른 프로세스, 스레드가 실행되게 실행중인 프로세스,스레드를 멈추는 것

캐시

많은 시간이나 연산이 필요한 작업의 결과를 저장해 두는 것을 말한다.

일반적으로 일시적인 데이터를 저장하기 위해 존재하고 고속의 데이터 저장공간이다.

  • 즉 반복적으로 사용되는 값을 저장하는 곳이라고 생각하면 된다.

일반적으로 하드웨어에 저장되며 기본 스토리지 계층(SSD, HDD)에 액섹스 하여 성능을 높인다.

일시적으로 저장하는 공간이기 떄문에 DB와는 대조적이다.

클라이언트 : HTTP캐시 헤더, 브라우저
네트워크 : DNS서버, HTTP캐시 헤더, CDN, 리버스 프록시
서버 및 데이터베이스 : 키-값 데이터 스토어, 로컬 캐시(인-메모리,디스크)

후기

어... 정말 이론적인 내용만 많았어 가지고 별로 재미는 없엇다...ㅠㅠ

후에 면접등에서 활용될수도 있기 때문에 내 뇌를 컴퓨터화 하기 위해서는 좋은 자료라고 생각한다!!

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글