본문 바로가기
Things I was curious about

[CS] 컴퓨터 시스템으로의 여행

by 갈릭 deep잉 소스좋아 2024. 3. 27.

1. 정보는 비트와 컨텍스트로 이루어진다.

//hello 프로그램

#include <stdio.h>

int main()
{
	printf("hello, world\n")
	return 0
}
  • hello 프로그램은 에디터로 작성한 소스파일로 생명을 시작하며, hello.c라는 ‘텍스트 파일 ’로 저장된다. (그저 텍스트가 담긴 파일에 불과하다.)
  • 소스파일은 0 또는 1로 이루어진 비트들의 연속이며, 1바이트(8비트) 단위로 구성된다.
  • hello.c 프로그램은 연속된 바이트들로 파일에 저장되며, 각 바이트는 특정 문자에 대응되는 정수 값을 가지는 아스키코드로 이루어진다.
  • hello.c 파일처럼 아스키 코드로만 이루어진 파일을 ‘텍스트 파일 ’이라 부르며 그 외에는 모두
  • 바이너리 파일 ’이라고 부른다.
  • 모든 시스템 내부의 정보(디스크 파일, 메모리상의 프로그램, 데이터, 네트워크를 통해 전송되는 데이터)는 비트들로 표시되는데, 서로 다른 객체들을 구분하는 유일한 방법은 이들을 바라보는 컨텍스트이다.
    • 컨텍스트(Context) : 실행되는 프로그램 또는 작업에 대한 정보와 관련된 것
      • 컨텍스트 정보는 프로그램이 실행되는 동안 사용되는 메모리, 레지스터 값, 파일 및 디렉토리 경로, 네트워크 연결 정보, 시스템 설정 등을 포함한다.
      • 이러한 정보들은 프로그램의 실행 상태를 유지하고, 다른 프로그램과 상호작용하며, 운영 체제와 상호작용하는 데 사용된다.

 

2. 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다.

  • hello.c파일을 시스템에서 실행시키기 위해서는 각 C 문장들을 다른 프로그램들에 의해 저급 기계어 인스트럭션들로 번역되어야 한다.
    • 인스트럭션(Instruction) : 컴퓨터에서 실행할 작업을 나타내는 명령어.
      • 기본적으로 0과 1로 이루어진 이진수(binary) 형태로 저장되며, 이진수 형태의 명령어를 이해하고 실행할 수 있는 기계어(machine language)로 변환된다.
      • 인스트럭션은 프로그래밍 언어에서 작성된 코드가 컴파일러(compiler)를 통해 기계어로 변환될 때 생성된다.
      • 컴퓨터 아키텍처에 따라 인스트럭션 세트(instruction set)가 정의되어 있으며, 이에 따라 사용 가능한 인스트럭션의 종류와 구조가 결정된다.
  • 번역된 인스트럭션들은 실행가능 목적 파일로 합쳐져서 바이너리 디스크 파일로 저장된다.
  • 번역 단계는 위의 그림과 같은 총 4단계(전처리, 컴파일, 어셈블리, 링크)로 이루어지며
    이것을 컴파일 시스템이라고 부른다.
    • 전처리 단계 : ‘#’으로 시작하는 지시어(directive)에 의해 헤더파일을 소스파일로 삽입하라고 지시한다. 이후 일반적으로 ’. i ’로 끝나는 새로운 C 프로그램이 생성된다.
      이 파일은 텍스트 파일이다.
    • 컴파일 단계 : 넘겨받은 소스파일을 ‘ .i ’로 끝나는 파일로 수정하면 확장자는 “소스파일이 전처리가 완료되었다”라고 알려주고 컴파일러에게 해당파일을 넘겨주게 된다. 이후, 컴파일러는 해당 파일을 작성된 코드에 맞게 어셈블리어로 번역하고 ‘ .s ’로 끝나는 어셈블리 파일로 바꾸게 된다.
      이 파일 또한 아직 텍스트 파일이다.
      • 여기서 잠깐! 왜 컴파일 단계에서 바로 기계어로 변경하지 않고 굳이 어셈블리어로 변경을 할까??
        컴파일러 또한 사람이 제작한 프로그램이기 때문에 프로그래밍 언어로 작성한 파일을 바로 기계어로 번역하기는 쉽지 않고 컴파일러는 최적화와 같은 일도 진행하기 때문이다.
        → 어셈블리어로 번역이 되면 다른 고급언어들과의 호환이 가능해진다. 예를 들면, C언어로 작성된 코드와 Fortran으로 작성된 파일은 동일한 어셈블리어로 번역된다.
    • 어셈블리 단계 : 넘겨받은 ‘ .s ’파일을 어셈블러를 통해 기계어 인스트럭션으로 번역하고 이들을 재배치가능 목적 파일로 묶어서 ‘ .o ’파일로 바꾸게 된다.
      이 파일은 기계어로 번역된 파일이다.
    • 링크 단계 : 해당 파일은 소스파일과 이미 컴파일된 별도의 목적파일인 printf.o(외부 라이브러리)와 결합이 되어야 한다. 링커 프로그램(ld)이 결합작업을 수행하고 이 과정을 거치고 나면 비로소 C 프로그램은 실행파일로 메모리에 적재되어 시스템에 의해 실행된다.

 

3. 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다.

  1. 예를 들어 hello.c 소스파일은 컴파일 시스템에 의해 hello라는 실행가능한 목적파일로 번역되어 디스크에 저장된다.
  2. ‘ 쉘 ‘이라는 응용 프로그램에 그 이름을 입력하면 쉘은 CLI로 프롬프트를 출력하고 명령어 라인을 입력받아 그 명령을 실행한다.
  3. 만약, 명령어 라인이 내장 쉘 명령어가 아니라면 쉘은 실행파일의 이름으로 판단하고 그 파일을 로딩해서 실행시켜 준다.
  4. 이후, 쉘은 해당 파일을 실행하고 hello파일은 메시지를 화면에 출력하고 종료한다.

  • 버스(Buses)
    : 시스템 내를 관통하는 전기적 배선군을 버스라고 한다. 컴포넌트들 간에 바이트 정보들을 전송하며 일반적으로 워드라고 하는 고정 크기의 바이트 단위로 데이터를 전송하도록 설계된다.
  • 입출력 장치
    : 시스템과 외부세계와의 연결을 담당한다. 위의 그림에서는 마우스, 키보드, 모니터, 디스크 드라이브가 I/O버스에 연결되어 정보를 주고받는다.
    • 여기서 잠깐! 각 입출력 장치는 컨트롤러나 어댑터를 통해 연결되는데 공통의 목적은 입출력 버스와 입출력 장치들 간에 정보를 주고받도록 하는데에 있지만 차이점은 패키징에 있다.
      → 컨트롤러는 디바이스 자체가 칩셋이거나 마더보드에 장착된다.
      → 어댑터는 마더보드의 슬롯에 장착되는 카드이다.
  • 메인 메모리
    : CPU가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장소이다. 물리적으로 메인 메모리는 DRAM으로 구성되어 있는데 연속적인 바이트들의 배열로, 각각 0부터 시작하는 고유의 주소를 가지고 있다.
  • CPU(프로세서)
    : 메인 메모리에 저장된 인스트럭션들을 해독하는 엔진이다. CPU의 중심에는 워드 크기의 저장장치(레지스터)인 PC(프로그램 카운터)가 있는데, 시스템의 전원이 끊어질 때까지 CPU는 PC가 가리키는 메모리로부터 인스트럭션을 읽어오고, 이 인스트럭션에서 비트들을 해석하여 인스트럭션이 지정하는 간단한 동작을 실행한다. 이후, PC를 다음 인스트럭션 위치로 업데이트한다. 단, 이 새로운 위치는 방금 수행한 인스트럭션과 메모리 상에서 연속적일 수도 있고 아닐 수도 있다.
인스트럭션 요청에 의해 CPU가 실행하는 작업의 순서

적재 → 저장 → 작업 → 점프

적재(Load)  
:  메인 메모리→레지스터, 한 바이트 또는 워드를 이전 값에 덮어쓰는 방식으로 복사.

저장(Store)
:  레지스터 → 메인 메모리, 한 바이트 또는 워드를 이전 값으로 덮어쓰는 방식으로 복사.

작업(Operate)
:  두 레지스터의 값을 ALU(수식/논리 처리기)로 복사. 
   두 개의 워드로 수식연산을 수행한 뒤 결과를 덮어쓰는 방식으로 레지스터에 저장.

점프(Jump)
:  인스트럭션 자신으로부터 한 개의 워드를 추출하고 이것을 프로그램 카운터에 덮어쓰는 방식으로 복사.

 

명령을 키보드에서 읽어 들이는 과정

  • 사용자가 “ .\hello “ 를 입력하면 쉘 프로그램은 각각의 문자를 레지스터에서 읽어 들인 후 메인 메모리에 저장한다.

 

실행파일을 디크스→메인메모리로 로딩하는 과정

  • 쉘은 파일 내의 코드와 데이터를 복사하는 일련의 인스트럭션을 실행하여 실행파일 hello를 디스크에서 메인 메모리로 로딩한다.
  • 직접 메모리 접근(DMA)라고 알려진 기법을 이용해서 데이터는 CPU를 거치지 않고 디스크에서 메인 메모리로 직접 이동한다.

 

출력 문자를 메모리→화면으로 기록하는 과정

  • hello목적파일의 코드와 데이터가 메모리에 적재되었으면 CPU는 hello파일의 main 루틴의 기계어 인스트럭션을 실행한다.
  • 이 인스트럭션은 출력한 문자열을 메모리에서 레지스터 파일로 복사하고 디스플레이 장치로 전송하여 화면에 글자들이 표시되게 한다.

 

4. 캐시가 중요하다

  • 시스템이 정보를 한 곳에서 다른 곳으로 이동시키면서 프로그램의 “실제 작업”속도를 늦추는 오버헤드의 발생을 막기 위해 캐시 메모리가 등장했다.
  • CPU와 메모리 간 격차에 대응하기 위해 작고 빠른 캐시 메모리라는 저장장치를 고안하여 CPU가 단기간에 필요로 할 가능성이 높은 정보를 임시로 저장한다.
    • 프로그램이 지엽적인 영역의 코드와 데이터를 액세스 하는 경향(지역성)을 활용하여 시스템이 매우 크고 빠른 메모리 효과를 얻을 수 있다.  
      • L1 캐시 : 대략 수천 바이트의 데이터를 저장. 레지스터 파일만큼 빠른 속도로 액세스가 가능하다.
      • L2 캐시 : 수백 KB ~ 수 MB의 용량을 가짐. CPU와 전용 버스를 통해 연결된다. L1 캐시보다는 5배 정도 느리지만 그래도 메인 메모리에 접근할 때보다는 5~10배 정도 빠르다.
      • L3 캐시 : L1, L2캐시보다 크지만 그만큼 데이터를 찾아오는 데에 걸리는 시간이 오래 걸리기 때문에 우선순위는 떨어진다.
  • 메모리 계층구조

L0 : 레지스터

L1~L3 : 캐시 메모리(SRAM) in CPU.

L4 : 메인 메모리(DRAM)

L5~L6 : 디스크

 

※ 한 레벨의 저장장치 == 다음 하위레벨 저장장치의 캐시

ex) L1의 캐시 == L2의 캐시, L3의 캐시 == 메인메모리의 캐시

 

5. 운영체제는 하드웨어를 관리한다.

운영체제( Operating System)
: 하드웨어와 소프트웨어 사이에 위치한 소프트웨어 계층. 응용프로그램이 하드웨어를 제어하려면 언제나 운영체제를 통해서 해야만 한다.

  • 운영체제의 주요 목적
    1. 제멋대로 동작하는 응용프로그램들이 하드웨어를 잘못 사용하는 것을 막기 위해.
    2. 단순하고 균일한 메커니즘을 사용하여 응용프로그램들이 복잡하고 매우 다른 로우레벨의 하드웨어 장치들을 조작할 수 있게 하기 위해

파일 : 입출력 장치의 추상화

가상 메모리 : 메인 메모리와 디스크 입출력 장치의 추상화

프로세스 : CPU, 메인 메모리, 입출력 장치 모두의 추상화

 

프로세스
: 운영체제에서 실행 중인 하나의 프로그램. 프로세스는 동시에(concurrently) 실행될 수 있으며, 한 프로세스의 인스트럭션들이 다른 프로세스의 인스트럭션들과 섞일 수 있다. 프로세스는 독립적인 실행 단위이며, 서로 다른 프로세스끼리는 자원을 공유하지 않습니다.


이는 한 개의 CPU가 다수의 프로세스를 동시에 실행하는 것처럼 보이게 해 준다.
운영체제는 문맥 전환(context switching)을 사용해서 이러한 교차실행을 수행한다.
운영체제는 프로세스가 실행하는 데 필요한 모든 상태정보의 변화를 추적하고, 현재 프로세스에서 다른 새로운 프로세스로 제어를 옮기려고 할 때 현재 프로세스의 컨텍스트를 저장하고 새 프로세스의 컨텍스트를 복원시키는 문맥 전환을 실행하여 제어권을 새 프로세스로 넘겨준다.
※ 컨텍스트는 PC, 레지스터 파일, 메인 메모리의 현재 값을 포함하고 있는 상태정보를 뜻한다.

리눅스 환경에서 쉘( bash.sh )이 실행되고 있을 때, 응용 프로그램(hello.bin)이 실행됐을 때의 예시

  • 응용 프로그램이 운영체제에 의한 어떤 작업을 요청하면, 컴퓨터는 파일 읽기나 쓰기와 같은 특정 시스템 콜(system call)을 실행해서 커널에 제어를 넘겨준다. 그러면 커널은 요청된 작업을 수행하고 응용프로그램으로 리턴한다.
  • 단, 커널은 별도의 프로세스가 아니다. 모든 프로세스를 관리하기 위해 시스템이 이용하는 코드와 자료구조의 집합이다. 이처럼 하나의 프로세스에서 다른 프로세스로의 전환은 커널(Kernel)에 의해 관리된다. 커널은 운영체제 코드의 일부분으로 메모리에 상주한다.

쓰레드
: 프로세스 내에서 실행되는 작은 실행 단위. 다수의 실행 유닛으로 구성되어 있으며, 같은 프로세스 내부에 있는 다른 스레드와는 자원(메모리, 파일 등)을 공유한다. 이러한 공유 자원은 동기화를 통해 서로 충돌하지 않도록 보호된다. 
다수의 프로세스들에서보다 데이터의 공유가 더 쉽고, 프로세스보다 더 효율적이라는 장점을 가지고 있다.

프로세스와 쓰레드의 차이

프로세스 
: 운영체제로부터 독립적인 자원을 할당받아 실행되는 실행 단위. 
  최소 하나의 쓰레드를 보유하고 있다. 
  프로세스를 생성할 때 많은 시간이 소요되고, 문맥 전환의 비효율성과 프로세스 끼리의 통신이 어렵다는 단점을 가지고 있다.

쓰레드
: 프로세스 내부에서 프로세스가 할당받은 자원을 공유하면서 동시에 실행되는 실행 단위. 
  쓰레드를 사용하면 프로그램의 성능을 향상시킬 수 있으며, 멀티쓰레드를 사용하면 여러 작업을 동시에 처리할 수 있다. 
  프로세스의 단점을 해결하기 위해 나왔다.

 

 

가상 메모리
: 각 프로세스들이 메인 메모리 전체를 독점으로 사용하는 것 같은 착시를 제공하는 추상화.

  • 주소공간의 최상위 영역은 모든 프로세스들이 공통으로 사용하는 운영체제의 코드와 데이터를 위한 공간이다. 주소공간의 하위 영역은 사용자의 프로세스의 코드와 데이터를 저장한다. (그림에서 위쪽으로 갈수록 주소가 증가한다.)
    • 프로그램 코드와 데이터 : 코드는 모든 프로세스들이 같은 고정 주소에서 시작하며, 다음에 C 전역변수에 대응되는 데이터 위치들이 따라온다.
    • 힙(Heap) : 힙은 프로세스가 실행되면서 C 표준함수인 malloc이나 free를 호출하면서 런타임에 동적으로 그 크기가 늘었다 줄었다 한다.
    • 공유 라이브러리 : 주소공간의 중간 부근에 위치하며 공유 라이브러리의 코드와 데이터를 저장하는 영역이다.
    • 스택(Stack) : 사용자가 가상메모리 공간의 맨 위에 컴파일러 함수 호출을 구현하기 위해 사용하며, 힙처럼 프로그램이 실행되는 동안에 동적으로 늘어났다 줄어들었다 한다. 특히, 함수를 호출할 때마다 스택이 커지며, 함수에서 리턴될 때는 줄어든다.
    • 커널 가상메모리 : 주소공간의 맨 윗부분은 커널을 위해 예약되어 있다. 이 영역의 내용을 읽거나 쓰는 것이 금지되어 있다. 대신, 커널을 호출하면 된다.

파일
: 그저 연속된 바이트들. 시스템의 모든 입출력은 유닉스 I/O라는 시스템 콜들을 이용하여 파일을 읽고 쓰는 형태로 이루어진다.

 

6. 시스템은 네트워크를 사용하여 다른 시스템과 통신한다.

개별 시스템의 관점에서 볼 때, 네트워크는 단지 또 다른 입출력장치로 볼 수 있다. 메인 메모리로부터 네트워크 어댑터로 일련의 바이트를 복사할 때, 데이터는 로컬디스크 드라이브 대신에 네트워크를 통해서 다른 컴퓨터로 이동된다. 마찬가지로 시스템은 다른 컴퓨터로부터 받은 데이터를 읽어서 메인 메모리에 복사할 수 있다.

 

※ hello 프로그램을 네트워크 상에서 원격으로 실행하는 절차.

1. "hello" 스트링을 telnet 클라이언트에 입력하고 엔터를 누른 후, 클라이언트 프로그램은 이 스트링을 telnet 서버로 전송.

2. telnet 서버가 네트워크에서 스트링을 받은 후, 원격 쉘 프로그램에 이들을 전달.

3. 원격 쉘은 hello 프로그램을 실행하고 출력을 다시 telnet 서버로 전달.

4. telnet 서버는 네트워크를 거쳐 출력 스트링을 telnet 클라이언트로 전달하고, 클라이언트 프로그램은 출력 스트링을 자신의 로컬 터미널에 표시.

 

 

7. Amdahl’s Law

초창기 계산학 개척자 진 암달(Gene Amdahl)이 한 시스템의 일부 성능 개선의 효율성에 대해 관찰을 하다가 발견한 법칙

핵심은 다음과 같다.

우리가 어떤 시스템의 한 부분의 성능을 개선할 때, 전체 시스템 성능에 대한 효과는 그 부분이 얼마나 중요한가 와 이 부분이 얼마나 빨라졌는가에 관계된다.

 

비록 시스템의 주요 부분에 대해 실질적인 개선을 하였지만, 총 속도향상은 매우 적다. 이것이 이 법칙의 주요 통찰이다. 
전체 시스템을 상당히 빠르게 하기 위해서는 전체 시스템의 매우 큰 부분의 성능을 개선해야 한다.

암달의 법칙의 특별한 경우는 k를 infinity로 설정하는 효과에 대해 생각해 보는 것이다. 즉, 시스템의 일부를 택해서 그 성능을 무시할 수 있을 정도의 시간이 걸리는 지점까지 속도를 올릴 수 있다. 그러면 우리는 다음과 같은 결과를 얻는다.

암달의 법칙은 모든 작업을 개선하기 위한 일반적인 원칙을 설명한다. 컴퓨터 시스템에서의 속도개선에 적용하는 것뿐만 아니라, 면도날을 생산하는 비용을 줄이려는 회사를 안내하거나 평점을 올리려는 학생을 안내할 수 있다.

 

8. 동시성과 병렬성

  • 동시성
    : 다수의 동시에 벌어지는 일을 가지는 시스템에 관한 일반적인 개념
  • 병렬성
    : 동시성을 사용해서 시스템을 보다 빠르게 동작하도록 하는 것으로, 컴퓨터 시스템의 다양한 수준의 추상화에서 활용

쓰레드 수준 동시성

  • 쓰레드를 이용하면 한 개의 프로세스 내에서 실행되는 다수의 제어흐름을 가질 수도 있다.
    • 시간공유(time-sharing) : 한 개의 컴퓨터가 실행하는 프로세스를 빠르게 전환하는 방법으로, 한 명의 사용자가 다수의 태스크에 동시에 연관될 수 있게 해 준다.
    • 단일 프로세서 시스템 : 실질적인 계산을 한 개의 프로세서에서 이루어지는 시스템
    • 멀티 프로세서 시스템 : 여러 개의 프로세서를 가지고 하나의 운영체제 커널의 제어 하에 동작하는 시스템으로, 멀티코어 프로세서하이퍼쓰레딩(Hyperthreading) 기법이 해당된다.

  • 하이퍼쓰레딩(멀티쓰레딩) : 하나의 CPU가 여러 개의 제어 흐름을 실행할 수 있게 해주는 기술
  • 멀티코어 프로세서 : 여러 개의 CPU를 하나의 집적화된 칩에 내장.

※ 멀티 프로세싱의 이용은 시스템 성능을 두 가지 방법으로 개선가능하다.

1. 다수의 태스크를 실행할 때, 동시성을 시뮬레이션할 필요를 줄여준다.

2. 멀티프로세싱으로 한 개의 응용프로그램을 빠르게 실행할 수 있지만, 프로그램이 병렬로 효율적으로 실행할 수 있는 멀티쓰레드의 형태로 표현되었을 때에만 가능하다.

 

인스트럭션 수준 병렬성

최근의 프로세서들은 훨씬 낮은 수준에서의 추상화로 여러 개의 인스트럭션을 한 번에 실행할 수 있다.

이러한 특성을 인스트럭션 수준 병렬성이라고 한다.

인스트럭션들은 시작부터 종료까지 훨씬 긴 시간이(아마도 20사이클 이상)이 필요하지만, 프로세서는 여러 가지 교묘한 기법을 이용해서 한 번에 100개의 인스트럭션까지 처리할 수 있다.

슈퍼스케일러(superscalar) : 사이클당 한 개 이상의 인스트럭션을 실행할 수 있는 프로세서

 

싱글 인스트럭션, 다중 데이터 병렬성(SIMD)

많은 최신 프로세서들은 최하위 수준에서 싱글 인스트럭션, 다중 데이터, 즉 SIMD 병렬성이라는 모드로 한 개의 인스트럭션이 병렬로 다수의 연산을 수행할 수 있는 특수 하드웨어를 가지고 있다.

 

컴퓨터 시스템에서 추상화의 중요성

  • 추상화의 사용은 전산학에서 가장 중요한 개념이다.
    • 함수들을 간단한 응용프로그램 인터페이스 API로 정형화하는 것
    • 프로그래머가 그 내부의 동작을 고려하지 않으면서 코드를 사용할 수 있도록 해주는 것
    • JAVA의 클래스 선언
    • C 언어의 함수 프로토타입

  • 프로세서 측면에서의 추상화
    • 인스트럭션 집합 구조는 실제 프로세서 하드웨어의 추상화를 제공.
    • 이것으로 인해 기계어 코드 프로그램은 마치 한 번에 하나의 인스트럭션을 실행하는 프로세서에서 실행되는 것처럼 동작.
  • 운영체제 측면에서의 추상화
    • 파일 : 입출력 장치의 추상화
    • 가상 메모리 : 프로그램 메모리의 추상화
    • 프로세스 : 실행 중인 프로그램의 추상화
    • 가상 머신 : 운영체제, CPU, 프로그램 모두를 포함하는 컴퓨터 전체의 추상화

 

9. 마무리 요약

  • 컴퓨터 시스템은 응용 프로그램을 실행하기 위해 함께 동작하는 하드웨어시스템 소프트웨어로 구성.
  • 컴퓨터 내의 정보는 상황에 따라 다르게 해석되는 비트들의 그룹으로 표시.
  • 프로그램은 아스키 문자로 시작해서 컴파일러와 링커에 의해 바이너리 실행파일들로 번역.
    다른 프로그램들에 의해 다른 형태로 번역 된다.
  • CPU는 메인 메모리에 저장된 바이너리 인스트럭션을 읽고 해석.
    컴퓨터가 대부분의 시간을 각 컴포넌트들 간에서 데이터를 복사하는데 쓰고 있으므로 메모리 계층구조를 이용하여 CPU 레지스터가 최상단, 아래로 캐시메모리, 메인 메모리, 디스크가 차례로 위치한다. 상위레벨의 저장장치들은 하위레벨의 장치들을 위한 캐시 역할을 수행.
  • 운영체제 커널은 응용프로그램과 하드웨어 사이에서 중간자 역할을 수행.
    운영체제는 세 가지 근본적인 추상화를 제공.
    • 파일 : 입출력 장치의 추상화
    • 가상 메모리 : 메인 메모리 + 디스크의 추상화
    • 프로세스 : CPU + 메인 메모리 + 입출력 장치의 추상화
  • 네트워크는 컴퓨터 시스템이 서로 통신할 수 있는 방법을 제공.
    특정 시스템 관점에서 볼 때, 네트워크는 단지 또 하나의 입출력 장치이다.

 

 

사실 cs나 os부분은 주기적으로 봐주지 않으면 지식이 빈약해지는 느낌이 없지 않아 있다.(나만 그런가...?)

이 글은 컴퓨터가 동작하는 전체적인 그림만 그려보았을 뿐 프로세서, 가상 메모리, 파일 입출력 등등 더 깊게 다루진 않았다. 왜냐하면, 리마인드 할 겸 작성한 것이고 이 글은 마치 우리가 책을 읽기 전에 무슨 내용이 있는지 목차를 들여다보는 것과 같다. 더 깊은 주제는 시간이 나면 작성해야지...

 

Reference

Bryant O'Hallaron 컴퓨터 시스템(제 3판)

댓글