201229 개발일지(22일차) - 컴퓨터 시스템 정리 : 1장 컴퓨터 시스템으로의 여행(3)

고재개발·2020년 12월 29일
0

Computer System

목록 보기
3/13

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

프로세스(Process)

어떤 프로그램이 시스템에서 실행될 때, 운영체제는 이 시스템에서 1개의 프로그램만 실행되는 것 같은 착각에 빠지도록 한다. 이렇게 보이는 것은 프로세스라는 개념 덕분이다. 프로세스는 실행중인 프로그램에 대한 운영체제의 추상화다.
대부분의 시스템에서 CPU수보다 실행 가능한 프로세스 수가 많은데, 이를 Context switching을 활용하여 여러 프로세스를 실행(동시성)한다. 요즘에는 여러 CPU가 존재하여 실제로 동시에 작업들이 일어나곤(병렬성) 한다.

스레드(Thread)

어떤 프로그램 내에서, 특히 프로세스에서 실행되는 흐름의 단위(유닛)를 말한다. 한 프로그램이 하나의 스레드를 가지고 있으면 단일 스레드 프로세스라고 하며, 둘 이상의 스레드를 동시에 실행하는 방식을 멀티스레드(multi-thread)라고 한다. 스레드의 진정한 의미는 멀티 스레드 프로세스에서 확인할 수 있다.

※ 멀티스레드 프로세스 : 하나의 프로세스를 다수의 실행 단위(멀티스레드)로 구분하여, 하나의 프로그램이 동시에 여러 일(각 스레드)을 수행할 수 있도록 해준다. 멀티스레드의 장단점, 멀티프로세스 방식과의 비교는 https://goodgid.github.io/What-is-Multi-Thread/ 여기서 참조하고 추후에 심화해서 학습 및 정리해보도록 하자.

가상메모리(Virtual Memory)

각 프로세스들이 메인 메모리 전체를 독점적으로 사용하고 있는 것 같은 환상을 제공하는 추상화다. 각 프로세스는 아래처럼 가상주소공간이라는 균일한 메모리 모습을 갖는다.

먼저, 책에 나오는 메모리 구조를 보기 전에, 가상메모리가 무엇인지 짚고 넘어가자.
가상메모리는 실제 메인메모리(=RAM) 용량+ 하드디스크의 일부 용량을 활용하여, 사용자에게 메인메모리 역할을 하는 것처럼 보이게 한다. 예를 들면, 내 RAM이 8GB인데 10GB 크기의 프로그램을 실행하도록 해주는 것이다.(그러나 실제 프로그램이 실행될 때는 메인메모리에서 작동돼야 한다.)
즉, 캐시-RAM 관계를 RAM-HDD 관계에 적용했다고 볼 수 있다.
여기서 가상메모리에 프로그램이 실행될 때, 메인메모리(실제메모리)로 위치를 옮겨주는 것을 맵핑(mapping)이라고 한다.

맵핑(mapping)

가상메모리와 메인메모리(실제메모리) 사이의 재빠른 중계를 위해 페이징(paging), 세그먼테이션(segmentation) 활용한다.
먼저, segmentation은 아래 그림과 같이 서로 다른 크기를 갖는 논리적인 블록을 나누는 작업이라고 생각하면 된다. 반면, paging은 일정크기(1KB, 4MB 등)로 나누는 작업이라고 생각하면 된다. 이 둘을 순서대로 활용하여 mapping을 효율적으로 수행하는 것이다. 이 때, 페이지 테이블이 필요하다.
※ 페이지 테이블 : 가상메모리의 페이지(paging으로 나뉘어진 공간)와 메인메모리(실제메모리)의 페이지프레임(메인메모리에서 paging으로 나뉘어진 공간)이 순서쌍으로 저장된 표다. 메모리 안에 존재하는데, 이는 성능 저하의 원인이므로 MMU칩을 사용해서 개선한다.
※ 여기서 paging을 무조건 작게한다고 좋을까? 그렇지 않다. 그만큼 페이지 수가 많아져서 입출력이 너무 자주 일어나 시스템 처리성능이 저하된다.

이제 가상메모리의 구조를 가장 아래서부터(최하위 영역) 살펴보자.

1. Read-Only code and data 영역

이 영역은 Code Segment 영역으로, 프로그램의 명령어들이 들어가는 영역이다. 즉, 정해진 명령어만 사용 가능하다는 뜻이다.

2. Read/wirte data 영역

Data Segment 영역으로, 변수가 들어가는 영역이라고 생각하면 된다.

3. Run-time heap 영역

heap 영역으로, C표준함수인 malloc() 이나 free() 함수를 통해 동적으로 크기가 줄었다 늘었다 한다.

4. Memory-mapped region for shared libraries

공유 라이브러리 공간으로, C표준 라이브러리 등의 코드와 데이터를 저장하는 영역이다.

5. User stack 영역

사용자 가상메모리 맨 위에 컴파일러가 함수 호출을 구현하기 위해 사용하는 사용자 스택이 위치한다. 힙과 마찬가지로 사용자 스택은 프로그램이 실행되는 동안에 동적으로 늘어났다 줄어들었다 한다. 함수를 호출할 때마다 스택이 커지며, 함수에서 리턴될 때에는 줄어든다.
스택영역은 주소값이 위에서부터 아래로 내려오는 구조인데, 이는 커널 영역을 침범하지 않기 위함이다.

6. Kernel virtual memory

커널 가상메모리로, 사용자 가상메모리로 치지도 않는다. 주소공간 맨 윗 부분은 커널을 위한 자리이며, 응용프로그램들은 이 영역의 내용을 읽거나 쓰는 것이 금지 돼있다. 커널 코드 내 정의된 함수를 직접 호출하는 것도 금지돼있다.

파일

파일은 그저 연속된 바이트들이라고 할 수 있다.
디스크, 키보드, 디스플레이, 네트워크까지 포함하는 모든 입출력장치는 파일로 모델링한다. 시스템의 모든 입출력은 유닉스 I/O라는 시스템 콜들을 이용하여 파일을 읽고 쓰는 형태로 이루어진다. 이 파일 개념은 매우 강력해서 응용프로그램에 시스템에 들어있는 다양한 입출력장치들의 통일된 관점을 제공한다. 예를 들어 동일한 프로그램이 다른 디스크 기술을 사용하는 다른 시스템에서도 실행될 수 있다.

오늘의 용어 정리

  • 커널(kernel) : 하나의 프로세스를 다른 프로세스로 전환하는 데 사용되는 개념으로 별도의 프로세스가 아니라, 모든 프로세스를 관리하기 위해 시스템이 이용하는 코드와 자료구조의 집합이다.
    → 운영체제 코드의 일부분으로 메모리에 상주하며, 응용프로그램이 운영체제에 어떤 작업을 요청하면 특정 시스템 콜을 실행해서 커널에 제어를 넘겨준다. 그러면 커널이 요청된 작업을 수행하고 다시 응용프로그램으로 리턴한다.
출처 : https://velog.io/@emplam27
  • 추상화 : 구체적이지 않고, 복잡한 것을 단순하게 표현하는 것

  • MMU(Memory Management Unit) : 일반적으로 CPU와 메인메모리 중간에 위치하여 프로그램에서 사용되는 가상주소를 메모리에 해당하는 물리적 주소로 변환하는 작업을 수행한다. 메모리를 효율적으로 관리할 수 있도록 여러 기능을 하드웨어로 구현한 반도체 칩이다.

profile
고재개발

2개의 댓글

comment-user-thumbnail
2020년 12월 30일

컴퓨터로의 여행이 다와가~

1개의 답글