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

참새·2024년 5월 2일
0

컴퓨터 시스템

목록 보기
4/5
post-thumbnail

👨🏻‍💻  개요

이번 시간은 컴퓨터 시스템으로의 여행 네번째 시간으로 운영체제와 네트워크에 대해 알아보고자 한다.


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

hello 예제를 다시 살펴보면, 프로그램을 로드하고 실행했을 때와 메시지를 출력할 때, 프로그램이 키보드나 디스플레이, 디스크나 메인 메모리를 직접 엑세스 하지 않고 운영체제가 제공하는 서비스를 활용한다.

운영체제는 위 그림처럼 하드웨어와 소프트웨어 사이에 위치한 소프트웨어 계층으로 생각할 수 있으며, 응용프로그램이 하드웨어를 제어하려면 언제나 운영체제를 통해서 해야 한다.

운영체제는 아래와 같이 두 가지 목적을 가지고 있다.

  • 제멋대로 동작하는 응용프로그램들이 하드웨어를 잘못 사영하는 것을 막기 위해
  • 응용프로그램들이 단순하고 균일한 메커니즘을 사용하여 복잡하고 매우 다른 저수준 하드웨어 장치들을 조작할 수 있도록 하기 위해

운영체제는 위 두가지 목표를 그림이 보여주는 것 처럼 파일은 입출력장치의 추상화이고, 가상메모리는 메인 메모리와 디스크 입출력 장치의 추상화, 그리고 프로세스는 프로세서, 메인 메모리, 입출력장치 모두의 추상화 결과이다.

프로세스

컴퓨터에서 실행 중인 프로그램을 의미하는 말로, 각 프로세스는 각각의 메모리 공간을 할당받아 독립적으로 실행되며, 각각의 프로세스는 다른 프로세스와 독립적으로 실행되고 서로 영향을 미치지 않는다.

프로세스는 동시에(concurrently) 실행될 수 있으며, 한 프로세스의 인스트럭션들이 다른 프로세스의 인스트럭션들과 섞일 수 있다.

프로세서가 프로세스들을 바꿔주는 방식으로 한 개의 CPU가 다수의 프로세스를 동시에 실해아는 것처럼 보이게 해주는데, 운영체제는 문맥 전환(context switching)이라는 방법을 사용하여 이러한 교차샐행을 수행한다.

운영체제는 프로세스가 실행하는 데 필요한 모든 상태정보의 변화를 추적하여 현재 프로세스에서 다른 새로운 프로세스로 제어를 옮기려고 할 때 현재 프로세스의 컨텍스트를 저장하고, 새 프로세스의 컨텍스트를 복원시키는 문맥 전환을 실행하여 제어권을 새 프로세스로 넘겨준다.

컨텍스트(context)
PC, 레지스터 파일, 메인 메모리의 현재 값을 포함하고 있는 상태정보

위 그림에는 쉘 프로세스와 hello 프로세스 두 개의 동시성(concurrent) 프로세스가 존재한다.

  • 처음에는 쉘 프로세스가 혼자서 동작하고 있다가 명령줄에서 입력을 기다린다.
  • hello 프로그램을 실행하라는 명령을 받으면, 쉘은 시스템 콜(system call)이라는 특수 함수를 호출하여 운영체제로 제어권을 넘겨준다.
  • 운영체제는 쉘 컨텍스트를 저장하고 새로운 hello 프로세스와 컨텍스트를 생성한 뒤 제어권을 hello 프로세스로 넘겨준다.
  • hello가 종료되면 운영체제는 쉘 프로세스의 컨텍스트를 복구시키고 제어권을 넘겨주면서 다음 명령 줄 입력을 기다린다.

위 그림이 나타내듯이, 하나의 프로세스에서 다른 프로세스로의 전환은 운영체제 커널(kernel)에 의해 관리된다.

커널은 운영체제 코드의 이부분으로 메모리에 상주하여 응용프로그램이 운영체제에 의한 어떤 작업을 요청했을 경우, 컴퓨터는 파일 읽기나 쓰기와 같은 특정 시스템 콜(system call)을 실행해서 커널에 제어를 넘겨 요청된 작업을 수행하고 응용프로그램으로 리턴한다.

하지만, 커널은 별도의 프로세스가 아닌 모든 프로세스를 관리하기 위해 시스템이 이용하는 코드와 자료구조의 집합으로 하나의 프로세스에서 다른 프로세스로의 전환은 커널(Kernel)에 의해 관리된다.

쓰레드(Thread)

프로세스 내에서 실행되는 작은 실행 단위로 다수의 실행 유닛으로 구성되어 있으며, 같은 프로세스 내부에 있는 다른 스레드와는 자원(메모리, 파일 등)을 공유한다.

이러한 공유 자원은 동기화를 통해 서로 충돌하지 않도록 보호되며, 다수의 프로세스들에서보다 데이터의 공유가 더 쉽고, 프로세스보다 더 효율적이라는 장점을 가지고 있다.

프로세스와 쓰레드의 차이

프로세스

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

쓰레드

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

가상메모리

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

위 그림은 리눅스 프로세스들의 가상주소 공간을 나타내고 있다.

주소공간의 최상위 영역은 모든 프로세스들이 공통으로 사용하는 운영체제의 코드와 데이터를 위한 공간이다.

주소공간의 하위 영역은 사용자의 프로세스의 코드와 데이터를 저장한다. (그림에서 위쪽으로 갈수록 주소가 증가한다.)

프로그램 코드와 데이터

  • 코드는 모든 프로세스들이 같은 고정 주소에서 시작하며, 다음에 C 전역변수에 대응되는 데이터 위치들이 따라온다.

힙(Heap)

  • 힙은 프로세스가 실행되면서 C 표준함수인 malloc이나 free를 호출하면서 런타임에 동적으로 그 크기가 늘었다 줄었다 한다.

공유 라이브러리

  • 주소공간의 중간 부근에 위치하며 공유 라이브러리의 코드와 데이터를 저장하는 영역이다.

스택(Stack)

  • 사용자가 가상메모리 공간의 맨 위에 컴파일러 함수 호출을 구현하기 위해 사용하며, 힙처럼 프로그램이 실행되는 동안에 동적으로 늘어났다 줄어들었다 한다. 특히, 함수를 호출할 때마다 스택이 커지며, 함수에서 리턴될 때는 줄어든다.

커널 가상메모리

  • 주소공간의 맨 윗부분은 커널을 위해 예약되어 있다. 이 영역의 내용을 읽거나 쓰는 것이 금지되어 있다만, 커널을 호출하면 된다.

파일

더도말고 덜도말고 그저 연속된 바이트들로 디스크, 키보드, 디스플레이, 네트워크까지 포함하는 모든 입출력장치는 파일로 모델링 한다.


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

개별 시스템의 관점에서 볼 때, 네트워크는 아래의 그림처럼 단지 또 다른 입출력 장치로 볼 수 있다.

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

인터넷과 같은 글로벌 네트워크의 출현으로 하나의 컴퓨터에서 다른 컴퓨터로 정보를 복사하는 것이 가장 중요한 컴퓨터의 응용이 되었는데, 일례로 이메일, 메신저, 웹 페이지, FTP, telnet 같은 응용들은 네트워크를 통해 정보를 복하는 기능을 이용한 것이다.

hello 프로그램도 telnet 응용을 사용하여 다른 곳에 위치한 컴퓨터에서 실행할 수 있는데 절차는 다음과 같다.

  • "hello" 스트링을 telnet 클라이언트에 입력하고 엔터를 누른 후, 클라이언트 프로그램은 이 스트링을 telnet 서버로 전송
  • telnet 서버가 네트워크에서 스트링을 받은 후, 원격 쉘 프로그램에 이들을 전달
  • 원격 쉘은 hello 프로그램을 실행하고 출력을 다시 telnet 서버로 전달
  • telnet 서버는 네트워크를 거쳐 출력 스트링을 telnet 클라이언트로 전달하고, 클라이언트 프로그램은 출력 스트링을 자신의 로컬 터미널에 표시


🤔  마치며

이번 시간을 통해 운영체제는 하드웨어와 소프트웨어 사이의 중간 계층으로 작동하며, 프로세스 및 스레드와 같은 핵심 개념을 제공하는 것을 알 수 있었다.

또한, 네트워크는 일반적인 입출력 장치로 볼 수 있으며, 이를 통해 다른 시스템과의 데이터 교환이 가능하다는 것을 알 수 있었다.

다음 시간에는 암달의 법칙 및 동시성과 병렬성에 대해 알아보고자 한다.


📑  참고

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

profile
응애 나 아기 개발자

0개의 댓글

관련 채용 정보