운영체제 & 컴퓨터구조 17

[ARCH]#Cache Memory, Meltdown & Spectre

지난 단락에서 CPU 내부 구성을 이루는 ALU, Control Unit, Register 에 대해서 알아보았다. 이번 단락에서는 캐시 메모리와 CPU 의 특성, 그에 따라 발생할 수 있는 위험을 알아보려한다. 먼저 캐시 메모리에 대해서 알아보자. * 캐시 메모리 ( Cache ) 캐시 메모리 ( 나무위키 ) 캐시 메모리는 보통 RAM 보다 CPU 가까운 곳에 위치한다. RAM 이 기억장치로서의 역할을 하고 있는데 굳이 옆에 따로 캐시 메모리를 놓아야하는 이유는 무엇일까 ?? RAM 에서 데이터를 가져오는 속도가 CPU 클럭를 못 따라가기 때문이다. 그렇다면 RAM 에서 데이터를 가져오는 속도를 높일 필요가 있는데 이는 비용과 다른 문제를 야기한다. 일반적으로 RAM 내부에서 bit 를 저장하는데 사용되..

[ARCH]#CPU ( Central Processing Unit )

* CPU ( 중앙 처리 장치, Central Processing Unit ) CPU 링크 ( 나무위키 ) CPU 구조와 원리 ( 나무위키 ) 컴퓨터의 두뇌라고 많이 불리는 CPU 는 실리콘으로 이루어진 반도체, 트랜지스터의 집합체이다. 머리카락보다 작은 트랜지스터들이 모여 만들어진다. CPU 를 이루는 주요 부품은 ALU, Control Unit, Ragister 가 있다. 대략적으로 CPU 가 하는 일을 살펴보면 메모리에 있는 실행될 프로그램의 코드를 읽어와 명령어를 해석하고 그에 필요한 계산이나 메모리에 적재하는 등의 일을 수행한다. 보통 이러한 작업이 한 번 수행되는 시간을 'CPU 클럭' 이라고 말하고 빠를수록 좋다. 더불어 'IPC ( Instruction Per Cycle )' 란 개념도 존..

[ARCH]#트랜지스터

* 트랜지스터 트랜지스터 링크 ( 위키 ) CPU 를 알아보기에 앞서서 CPU 를 이루고 있는 수억개의 부품, 트랜지스터의 원리에 대해서 알아보고자 한다. 트랜지스터가 하는 가장 중요한 역할은 '전류를 흐르거나 흐르지 않게 할 수 있는 기능' 이다. 이 기능이 어떻게 수행되는지 간단하게 알아보자. 트랜지스터에는 BJT, MOSFET 등 다양한 종류가 있다. 그 중에서 우리는 먼저 간단하게 'BJT ( Bipolar junction Transistor )' 종류인 NPN, PNP 트랜지스터를 알아볼 것이다. 우선, 트랜지스터는 반도체 3개를 결합해 만들어진 요소이다. 반도체를 이루는 실리콘은 14족 원소로 최외각 전자가 4개라고 한다. 이것이 중요한 이유는 원자핵과의 결합력이 가장 약하기 때문에 원자핵의 ..

[OS] #13. RPCs ( Remote Procedure Calls )

이전 프로세스간의 통신 부분 ( 링크 ) 에서 직렬화와 마샬링을 살펴봤고 마샬링을 사용해서 해당 프로세스에서 네트워크 통신으로 원격으로 데이터를 상대방의 프로세스에게 정보를 보내 함수를 원격으로 실행하는 RPC 에 대해서 자세히 알아보려고 한다. * Function ( 함수 ) / Procedure ( 과정 ) RPC 를 살펴보기 전에 Function 과 Procedure 의 개념을 살펴보자. Function : 어떤 매개변수를 통해 어떤 결과 값을 반환하는 기능. Procedure : 어떤 작업이 동작되는 과정. 두 개념의 근본적인 차이는 '결과 값' 이다. 함수의 경우, 우리가 일반적으로 사용하는 프로세스에서 사용하는 함수인 반면 Procedure 의 경우, 어떤 일련의 과정이란 의미인데 RPC 는 ..

[OS] #12. 가상 메모리 ( Virtual Memory )

* 가상 메모리 가상 메모리 링크 ( 위키 ) => 가상 메모리는 '각각의 프로세스마다 주어지는 선형 메모리' 이다. => 보통 운영체제가 관리하고 할당해주며 32bit 환경에서의 가상 메모리 크기는 '4GB' 64bit 환경에서는 이론상 엄청큰 가상 메모리 영역을 할당할 수 있지만, '8TB' 정도로 제한하고 있다. 물리 주소 ( Physical Address ) : 실제 하드웨어 RAM 에 존재하는 주소. 가상 주소 ( Virtual Address ) : 프로세스마다 존재하는 가상 메모리의 주소. => 물리 주소와 가상 주소를 분류해놓은 이유는 프로세스마다 어떤 주소를 저장해야할 필요가 생기는데 프로그램이 메모리에 올려지게 될 때, 어느 위치에 올려질지 모르는 상황에서 물리 주소는 알 수 없다. 따라..

[OS] #11. 세마 포어 ( Semaphore )

* 세마포어 ( Semaphore ) 세마포어 링크 ( 위키 ) => Wait( ) , Signal( ) 신호 방식을 통해서 하나 이상의 프로세스 / 쓰레드가 임계 구역에 접근 가능하도록 하는 장치. 이진 세마포어 ( Binary semaphore ) : 세마포어 변수 값이 0 or 1 을 가진다. 계수 세마포어 ( Counting semaphore ) : 초기값은 가능한 자원의 수로 정해지며 범위는 정해져있지 않다. => 여기서 말하는 자원이라함은 컴퓨터에서의 자원 이다. 예를 들면, H/W 인 CPU, 프린터, 혹은 쓰레드가 함께 접근할 수 있는 데이터 등이 되겠다. => 쓰레드가 사용할 수 있는 자원의 개수 ( R ) 가 없다면 대기 큐에 삽입해 Sleep 시키고 다른 쓰레드의 작업이 끝났을 때, ..

[OS] #10. mutex lock & 스핀락 ( Spinlock ) & CAS ( Compare-And-Swap )

* 동기화 ( Synchronization ) 동기화 링크 ( 위키 ) => 원자성, 가시성, 코드 재배치 문제 등을 해결하기 위한 방법. => 데이터의 일관성을 맞추는 것. 순서를 맞추거나 어느 구역을 통제함으로써 데이터를 수정하고 모든 곳에서 같은 값으로 읽을 수 있도록 함. => 멀티 쓰레드 환경에서 동기화를 하지 않는다면 우리가 기대한 결과가 다를 수 있기 때문에 짜여진 프로그램이 정상적으로 동작하기 힘듬. => 대신, 동기화를 위한 알고리즘 등이 필요하고 이를 행하기 위해 비용이 들고 속도가 느려진다. => 반대의 개념을 '비동기 ( Asynchronous )' 라고 부르는데 순서에 상관 없이 여러 쓰레드가 돌 수 있도록 허가해주는 상태 이다. 통제하지 않음으로써 최대의 효율을 낼 수 있지만 데..

[OS] #9. 원자성 ( atomic ) & 가시성 ( visibility ) & 코드 재배치

* 원자성 ( Atomic ) 원자성 링크 ( 위키 ) => 더 이상 쪼개지지 않는 연산. 예를 들어, int a = 0; ++a; ++a; 부분을 디스 어셈블리로 보게 되면 총 3줄에 걸쳐 나온다. eax 에 값을 가져와서 inc 증가시키고 다시 eax 값을 [a] 에다 넣는다. => 이 때, 위 3단계 사이로 다른 쓰레드들이 접근해 값을 수정할 수 있는 여지가 생긴다는 말. 이 경우, '원자성을 보장하지 못한다' 라고 말하고 위 3단계를 하나의 연산으로 취급해 실행하는 것을 '원자성을 보장한다.' 라고 한다. => 원자성을 보장 받기 위해서 atomic 에 관한 명령이나 변수를 선언한다. atomic 명령들은 내부적으로 CPU 의 도움을 받아 실행 중간에 간섭 받거나 중단되지 않는다. 또, 같은 메모..

[OS] #8. 공유 자원 & 임계 구역 ( Critical Section )

* 공유 자원 => 쓰레드는 자신의 Stack 영역을 제외한 프로세스 영역을 프로세스 내의 쓰레드들끼리 공유한다. ( 메모리 공유. ) => 공유 자원을 서로 앞다투어 접근하는 행위를 '경쟁 조건 ( Race Condition )' 이라고 한다. * 원자성 ( Atomic ) 원자성 링크 ( 위키 ) => 더 이상 쪼개지지 않는 연산. => 다음 장에 자세히 다룬다. * 임계 구역 ( Critical Section ) 임계 구역 링크 ( 위키 ) => 둘 이상의 쓰레드가 동시에 접근해서는 안되는 코드를 말함. => 둘 이상의 쓰레드가 값을 '수정' 할 수 있는 구역. * 임계 구역 문제를 해결하기 위한 조건 1. 상호배제 ( Mutual Exclusion ) => 한 프로세스가 임계 구역에 들어가면 다른..

[OS] #7. 프로세스간 통신 ( IPC, Inter-Process Communication )

* 프로세스간 통신 ( IPC, Inter-Process Communication ) IPC 링크 ( 위키 ) => 프로세스들끼리 데이터를 주고 받는 방식. * 통신 방법 1. Message Passing ( 메시지 큐 ) 이용. => 커널에서 메시키 큐를 관리. => 시스템 콜이 빈번할 수 있기에 비용이 크다. => 양방향 통신을 위해서 총 2개가 필요하다. 2. RAM 을 이용하는 방식 ( Shared Memory ) 공유 메모리 링크 ( 위키 ) => 메모리 부분은 굉장히 민감하므로 OS 가 강하게 확인한다. ( 정확하고 엄격함. ) => 할당 시, 크기를 고정해야한다. => 'Shared Memory 기법' 을 쓸 때 크기는 '고정 길이' 라는 사실을 주목해야함. 3. Socket 을 이용하는 방..