Gachon-CS-Study / CS-Study

가천대학교 24-2 CS 스터디 공부
1 stars 2 forks source link

스터디 #31

Open hyper-cloud10 opened 1 week ago

hyper-cloud10 commented 1 week ago

운영체제란, 컴퓨터 리소스를 관리하는 소프트웨어를 말한다.

운영 체제는 서로 다른 응용 프로그램 간에 리소스를 할당하여 중앙 처리 장치 (CPU) 시간 또는 메모리 공간을 각각의 프로그램이 언제 받을지 결정한다 . 현대의 컴퓨터에서는 사용자가 종종 여러 응용 프로그램을 동시에 실행하려고 하는데,

(같은 시간에 한 가지의 프로그램만 실행하는 경우는 드물 것이다.) 특정 프로그램이 컴퓨터의 제한된 하드웨어 리소스를 독점하지 못하도록 하기 위해 운영 체제는 각 응용 프로그램에 시간(CPU) 또는 공간(메모리) 리소스를 공유한다.

뿐만 아니라, 운영 체제는 오류와 보안 취약성으로부터 응용 프로그램을 보호하기 위해 응용 프로그램을 서로 분리해야 하지만, 그와 동시에 서로 다른 응용 프로그램의 코드끼리 통신이 가능하도록 해야 한다.

프로그래머가 작업을 더 쉽게 수행할 수 있도록 하기 위해, 운영체제는 하드웨어 세부 정보(예: 물리적 메모리) 에 액세스하는 세부 정보를 추상화하는 인터페이스를 제공한다 .

  1. 그래서 프로세스 주소 공간이 뭔데?

이미지 출처: Anatomy of Program in Memory | Many but finite

프로세스 주소 공간은 코드(텍스트), 데이터, 스택, 힙 영역으로 이루어져 있다. (추가로 BSS 영역이라는 것도 있다.)

Code(Text) 영역

프로그램을 실행시키는 실행 파일 내의 명령어들이 위치하는 공간으로, 컴파일 시에 그 크기가 결정된다. 프로그램의 코드는 수정되면 안 되므로, Read-Only 로 지정되어 있다. 같은 프로그램으로 실행된 여러 프로세스는 동일한 코드를 가진다. 동일한 내용을 중복 할당하지 않고 특정 공간에 할당하여 메모리 사용량을 절약할 수 있다.

Stack 영역

함수의 실행을 마치고 복귀할 주소, 데이터(지역 변수, 매개 변수, 반환값)를 임시로 저장하는 공간이다. 각 함수는 LIFO 구조로 실행되며 (스택이라는 자료구조의 특징이다.) 컴파일 시 크기가 결정된다. 재귀 함수가 여러 번 호출되거나 지역변수가 많아지면 Stack Overflow가 발생할 수 있다. 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다. (자세한 내용은 후술하겠다.) 실행 중에 변수가 수정될 수 있기에 Read-Write 로 지정되어있으며, 함수의 호출과 함께 할당되고, 함수 호출 완료 시 소멸된다.

Heap 영역

동적 할당(malloc(), new 등)을 위한 메모리 영역으로, 런타임(동적 할당의 경우)에 크기가 정해진다. 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다. 주로 객체가 저장되고 Garbage Collector 에 의해 정리된다.

"근데 Garbage Collector가 모든 언어에 있는 건 아니지 않나? 그러면 그런 언어로는 운영체제 못 만드나?" 라는 질문이 생겼고 이에 대한 내용은 후술한다.

Data 영역

전역 변수나 Static 변수 등 프로그램이 사용할 수 있는 데이터를 저장하는 영역이다. 어떤 프로그램에 전역변수나 Static 변수를 참조하는 코드가 존재한다면, 이 프로그램은 컴파일 된 후에 data 영역을 참조하게 된다.

Data 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. (해당 영역이라는 대명사를 써서 단락을 합칠까 했는데, 최대한 간단하게 쓰려고 굳이 단락을 분리했다.) 혹시 초기화 되지 않은 변수가 존재한다면, 이는 BSS 영역에 저장된다.

  1. 스레드 이야기

이미지 출처: Inpa Dev

스레드란, 프로세스 내에서 실행되는 코드의 흐름을 의미한다.

프로세스와 스레드의 차이점은, 프로세스는 자신만의 공간을 할당받지만 스레드는 다른 스레드들과 공간을 공유한다는 점이다.

이러한 이유로 멀티 스레드가 멀티 프로세스보다 유리하다. 스레드 자체가 프로세스에 내장되어 있어 용량이 작고, 독립적인 공간을 가지는 프로세스와 달리 스레드는 서로 메모리 공간을 공유하기 때문이다. 프로세스 간 통신 (IPC)를 사용하지 않아도 되기 때문에 리소스의 효율적인 공유가 가능하다.

웹 서버는 대표적인 멀티 스레드 응용 프로그램이다. 사용자가 서버 데이터베이스에 자료를 요청하는 동안 브라우저의 다른 기능을 이용할 수 있는 이유도 바로 멀티 스레드 기능 덕분인 것이다. 즉, 하나의 스레드가 지연되더라도, 다른 스레드는 작업을 지속할 수 있게 된다.

물론 멀티스레드 방식도 단점이 있다. 멀티 스레드를 사용하면, 하나의 스레드에서만 문제가 발생해도 다른 스레드들까지 영향을 받아 프로그램이 종료될 수 있다. 여러 개의 스레드가 같은 데이터에 동시에 접근해 동기화 문제가 일어날 수도 있다. (데드락이랑 비슷한 느낌이지 않을까?)

  1. QnA

첫 번째 질문에 대답해보자. 왜 스택은 메모리를 높은 주소에서 낮은 주소로 할당하는 걸까?

낮은 주소는 말 그대로 0x00000000부터 들어가는 주소 값이고, 높은 주소는 0xFFFFFFFF로 들어가는 주소 값이라고

한다.

그 이유는 메모리 레이아웃을 단순화하기 위함인데, 꼭 높은 주소에서 낮은 주소로 할당해야 하는 건 아니고, 반대로 낮은 주소에서 높은 주소로 할당하는 경우도 있다고 한다. 중요한 건 '스택과 힙은 주소의 할당 방향이 반대여야 한다.' 라는 것이다. overlap을 방지하기 위함이다.


두 번째 질문에 대답해보자. 쓰레기 수집을 사용하지 않는 운영체제가 존재할 수 있을까?

내가 알고 있는 언어 중 쓰레기 수집을 사용하지 않는 언어가 Rust 뿐이어서 Rust에 대해 조사해 보았다.

그 과정에서 알게 된 게 하나 있는데, 스택이 힙보다 빠르다는 게 Rust만의 특징인 줄 알았는데 그냥 대부분의 언어가 공통적으로 가지는 특성이었다. (CS 노베가 하이레벨의 내용을 배우면 이런 일이 발생할 수 있다)

러스트의 소유권 개념은, 힙에 메모리를 할당하기 위해 고안된 개념이다.

힙에 저장된 값들은 포인터를 통해서만 접근할 수 있다. 이 값에 접근하려면 역참조를 해야 하며, 이는 힙에 있는 변수는 포인터로 접근하는 반면, 스택에 있는 변수에 접근할 때는 포인터가 필요하지 않다는 차이를 보여준다.

러스트는, 변수가 원래 소속된 스코프를 벗어나는 순간 자동으로 메모리 할당을 해제한다.

라는 걸 알게 되었다. 근데 이건 러스트라는 언어가 독특한 부분이고, 일반적인 건 아닌 것 같다.

  1. 후기와 계획

교보문고에 들러서 운영체제 책을 몇 권 찾아봤으나, 프로세스 주소 공간에 대한 내용은 없는 거 같았고

블로그들이 출처로 언급하는, '공룡책' 이라 불리는 책은 비닐에 싸여 있어 볼 수 없었다. 그래서 다른 블로그에 있는 내용을 가져왔다. 당연하지만 교차검증 및 내용의 풍부함을 위해 여러 블로그와 문서의 내용을 참조했다.

(다만, 내가 교보문고에서 봤던 책 중 표지에 게임기가 그려진 운영체제 책은 리뷰가 좋지 않았다. 이로 미루어 짐작해볼 때, 내가 봤던 책들은 내용의 질이 좋지 않은 책들일 것이다. 온갖 운영체제 서적들이 난립하니 교수들이 FM으로 대학 수업에 쓰기 시작한 게 통칭 '공룡책'. 그리고 모두가 운영체제를 그 좋은 책으로 배웠기에 그게 기초가 된 것이다. 많이 팔리는 책이라 내용을 볼 수 없게 비닐로 포장해 두었을 것이다. 물론 두껍고 가격이 비싼 것도 맞다.)

나는 비전공자, 심지어 학부 1학년이다. 평소에 CS에 관심이 많았기에 (알고리즘이 취미기도 했고) 처음으로 CS 스터디를 해보았다. 자료 조사를 하면서 시간을 상당히 많이 썼다. 본업에 충실하기 위해 당분간 CS 스터디는 쉴 예정이다.

운영체제 그 자체에 대해 더 알고 싶다는 생각은 딱히 안 들지만, 운영체제 보안이나 네트워크 운영체제, Whonix 등에 대해서는 나중에 다뤄볼 것 같기도 하다.

5.출처

inpa.tistory.com (원래는 링크를 거는 게 맞지만 공간을 너무 잡아먹어서 간단하게 쓰겠다.)

https://velog.io/@manx/OS-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%A3%BC%EC%86%8C%EA%B3%B5%EA%B0%84

https://stackoverflow.com/questions/4560720/why-does-the-stack-address-grow-towards-decreasing-memory-addresses