[CSAPP] 1. 컴퓨터 시스템으로의 여행 2

이도윤·2022년 11월 22일
0

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

//
#include <stdin.h>

int main()
{
	printf("hello, world\n");
    return 0;
}

앞에서 보았던 hello.c 코드이다. 쉘 프로그램이 hello 프로그램을 로드하고 실행했을 때와 hello 프로그램이 메시지를 출력할 때, 프로그램이 키보드나 디스플레이, 디스크나 메인 메모리를 직접 엑세스하지 않았다. 오히려 운영체제가 제공하는 서비스를 활용한다.

응용프로그램이 하드웨어를 제어하려면 언제나 운영체제를 통해서 해야 한다.




1.7.1 Processes

hello 프로그램이 현대 시스템에서 작동하면, 운영체제는 프로그램이 실행되는 유일한 프로그램이라는 착각을 불러 일으킨다.

프로그램의 코드와 데이터는 시스템 메모리에 유일한 오브젝트가 있는 것처럼 보인다.

이러한 착각은 프로세스의 개념에서 제공되며, 컴퓨터 과학(computer science)에서 가장 중요하고 성공적인 개념이다.

프로세스는 프로그램을 실행하는 운영체제의 추상화이다.

다중 프로세스는 같은 시스템에서 동시에 실행할 수 있고, 각각의 프로세스는 하드웨어를 독점적으로 사용하는 것처럼 보인다.

전통적인 운영체제는 한 프로그램만 실행할 수 있었지만, 새로운 멀티 코어(multi-core) 프로세서는 동시에 많은 프로그램을 실행시킬 수 있다.

단일 CPU는 프로세서가 각 프로세스들을 교환하여 다중 프로세스를 실행하는 것처럼 보인다.

운영체제가 이러한 인터리빙(interleaving) 메카니즘을 수행하는 것을 문맥 교환(context switching)이라고 한다.

운영체제는 실행하려고 하는 프로세스에 대한 상태 정보를 추적하는데, 이 상태를 문맥이라고 한다.

이 문맥에는 PC의 현재 값, 레지스터 파일, 메인 메모리의 내용을 포함한다.


문맥 교환(context switching)
운영체제가 현재 프로세스에서 새로운 프로세스로 제어권을 이동시키기로 하면,

현재 프로세스의 문맥을 저장하고, 새로운 프로세스의 문맥을 복원하고 제어권을 이동시켜 문맥교환을 수행한다.

시스템 호출(system call)을 통해 제어를 운영체제에게 넘겨 프로그램을 실행한다.

하나의 프로세스에서 새로운 프로세스로 전환하는 것은 운영체제 커널(kernel)에 의해 관리된다.

커널은 메모리에 늘 있는 운영체제의 한 부분이다.


1.7.2 Threads

현대 시스템에서 프로세스는 스레드(thread)라고 불리는 다중 실행 단위로 구성되어 있다.

각각의 스레드는 프로세스의 문맥에서 실행되고 있으며, 같은 코드와 전역 데이터를 공유한다.

스레드는 네트워크 서버에서의 동시성 요구사항와 다중 프로세스보다 다중 스레드 간 데이터 공유가 쉽고, 프로세스보다 효율적이기 때문에 매우 중요한 프로그래밍 모델이다.

멀티 스레딩은 다중 프로세서가 가능할 때 프로그램을 빠르게 해주는 유일한 방법이다.


1.7.3 Virtual Memory

가상 메모리는 각 프로세스들이 메인 메모리를 독점적으로 사용할 수 있는 착각을 불러일으키는 추상화를 제공한다.

각 프로세스들은 가상 주소 공간으로 알려진 같은 메모리 통합 뷰를 가지고 있다.

낮은 주소부터:

- Program code and data
코드는 모든 프로세스들의 같은 고정 주소로 시작한다.
코드와 데이터 영역은 실행 가능한 오브젝트 파일의 내용으로부터 초기화된다.

- Heap
코드와 데이터 영역 뒤에는 런타임 힙 바로 나온다.
힙은 코드와 데이터 영역과는 다르게 malloc이나 free와 같은 C 표준 라이브러리 루틴에 대한 호출의 결과로 동적으로 확장하고 축소한다.

- Shared Libraries
C 표준 라이브러리나 수학 라이브러리와 같은 공유된 라이브러리에 대한 코드와 데이터를 가지고 있는 공간

- Stack
사용자의 가상 주소 공간 위에는 함수 호출 구현을 사용하는 컴파일러인 사용자 스택이 있다.
힙과 같이, 스택도 동적으로 확장 및 축소가 가능하다.

- Kernel Virtual memory
주소 공간 가장 위에는 커널용으로 예약되어 있다.
응용 프로그램은 이 영역의 내용을 읽고 쓸 수 없으며, 커널 코드에 정의된 함수를 직접적으로호출할 수 없다.


가상 메모리가 일을 하려면, 하드웨어와 운영체제 사이에 정교한 상호작용이 요구된다.
디스크에 프로세스의 가상 메모리의 내용을 저장하고 메인 메모리를 캐시로 사용하는 것이 기본적인 아이디어다.


1.7.4 Files

파일은 그저 연속된 바이트들이다.

모든 I/O 장치들(디스크, 키보드, 화면, 네트워크 등)은 파일로 모델링된다.

시스템에 모든 입/출력은 파일을 읽고 쓰면서 수행된다.




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

현대 시스템에서는 네트워크에 의해 다른 시스템과 자주 연결된다.

네트워크는 하나의 I/O 장치로 바라볼 수 있다.

시스템이 바이트 시퀀스를 메인 메모리에서 네트워크 어댑터로 복사하면, 데이터는 네트워크에서 로컬 디스크말고 다른 기계로 넘어간다.

정보를 다른 기계로 복사하는 것은 컴퓨터 시스템에서 가장 중요해졌다.

이메일, 메시징, WWW, FTP 등이 네트워크를 통해 정보를 복사하는 것이다.




1.9 중요한 주제들


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


1.9.2 동시성과 병렬성
동시성 : 다수의 동시에 벌어지는 일을 갖는 시스템에 관한 일반적인 개념

병렬성 : 동시성을 사용해서 시스템을 보다 더 빠르게 동작하도록 하는 것

쓰레드 수준 동시성 :
쓰레드를 이용하면 한 개의 프로세스 내에서 실행되는 다수의 제어흐름을 가질 수 있다.

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

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


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




1.10 요약

컴퓨터 내의 정보는 비트들의 그룹으로 표시
컴파일러와 링커에 의해 바이너리 실행파일들로 번역
프로세서는 메인 메모리에 저장된 바이너리 인스트럭션을 읽고 해석
컴퓨터는 대부분의 시간을 메모리, 입출력장치, CPU 레지스터 간에 데이터를 복사하고 쓰는 데 사용

위와 같은 이유로 시스템의 저장장치들은 계층구조 형성

운영체제 커널은 응용프로그램과 하드웨어 사이에서 중간자 역할 수행

네트워크는 컴퓨터 시스템이 서로 통신할 수 있는 방법 제공




profile
Java 백엔드 개발자

0개의 댓글