컴퓨터의 개론적인 부분이 궁금합니다. 한 것 같습니다?

HDNua의 이미지

안녕하세요. 오랜만입니다.
예전엔 자주 들르기도 하고 나름 명확한 질문만 했던 것 같은데
요새는 뜸하게 오면서 매번 애매한 질문만 드리고 있어 안타깝습니다.
(그런데 앞으로도 거의 이런 질문을 드릴 것 같네요.)

-----
1. 운영 체제, 파일 시스템, 메모리, 컴파일러를 이해하기 위해 다음과 같은 책을 샀습니다.
- 개발자를 위한 나만의 운영체제 만들기 - 노재현 저
- 컴파일러 구조와 원리 (컴파일러로 배우는 언어 처리 시스템) - 아오키 미네로우 저
하지만 컴퓨터를 제대로 쓰기 힘든 환경에서 책만으로 공부하기는 너무 힘들더군요.

2. 궁금한 건 메모리와 파일 시스템, 그리고 프로그램 자체에 대한 것입니다.
ㄱ. 파일 시스템.
파일 시스템이 뭘까 하고 책을 뒤져도 답을 얻지 못하던 도중에, 문득 든 생각이 있습니다.
텍스트 파일 하나를 만들고 abcde를 입력한 다음 test.txt로 파일을 저장하면, test.txt 파일의 크기는 5바이트입니다.
그렇다면 test.txt 문자열의 정보는 어디 있을까를 생각해봤습니다. 파일 크기가 5바이트이니 파일 내는 아닙니다.
즉 파일 시스템은 파일과 그 위치가 별개로, 파일을 관리하는 리스트 같은 체계일 것이라는 생각이 들었습니다.
- 질문. 파일 시스템은 어디에 있는 것입니까? RAM입니까, HDD입니까?
- 질문. 파일을 관리하는 체계도 FAT, NTFS, exFAT, ext와 같이 여러 종류가 있다고 알고 있습니다.
접근하기 쉬운 관리 체계는 어떤 것인지에 대해 알고 싶습니다. (단서를 주시면 직접 찾겠습니다.)
- 질문. 파일의 이름은 어떻게 관리됩니까? 힙처럼 쌓아놓는 방식이라면 test1.txt 파일을 만들고 test2.txt 파일을 만든 다음
test1.txt 파일의 이름을 test13.txt로 바꾸면 원래 문자열인 test1.txt는 해제하고 test13.txt를 test2.txt 뒤에 붙이는 방식으로
해야 할 것 같은데, 실제로 이렇게 성능 낭비가 심할 것 같은 방법을 씁니까? 다른 방법이 있나요?

ㄴ. 파일.
파일은 0과 1이 반복된 것으로, 0과 1을 직접 쳐주는 것으로도 파일을 작성하는 것이 가능하다는 생각이 들었습니다.
- 질문. 응용 프로그램의 시작과 끝은 어떻게 판정합니까? 애초에, 어떤 것이 코드 영역이고, 어떤 것이 데이터 영역이라는 것을
어떤 방식으로 판정합니까? 그냥 원래 어떤 방식으로든 실행할 수 있는 파일을 운영체제가 일부러 종류를 나눠 실행 가능 여부를
제한하는 것뿐인가요?
- 질문. 'mov eax, 0'을 실행하는 응용 프로그램을 작성하고 싶습니다. 'mov eax, 0'이 '01101101'이라면 파일에 '01101101'을 기록하는 것으로
응용 프로그램의 작성이 끝이 난다는 소리입니까? 어셈블리로 코드를 작성하면 일반적으로 다음의 꼴이 되는 것으로 알고 있는데,
어셈블리는 기계어와 일대일 대응되므로 .data도 임의의 기계어, .data 안의 내용도 임의의 기계어로 바뀌는 것입니까?

.data                 | 00101001
    ; ............... | 01001010
    ; ............... | 01010101
.code                 | 00110101
    mov eax, 0        | 01101101
.data                 | 00101001
    ; ............... | 10111001
    ; ............... | 11101011

이 부분은 저도 뭐라는지 못 알아듣겠네요. 죄송합니다.
- 질문. 문득 떠올랐는데, 응용 프로그램의 실행은 코드와 데이터 영역을 전부 읽은 다음에 진행되는 것입니까?
그러니까 위의 프로그램에서 .data의 내용을 프로그램이 할당받은 메모리의 data 영역에, .code를 code 영역에 기록을 먼저 해놓고
code 영역에서부터 시작해서 진행하는 뭐 이런 식이라고 받아들이면 되나요?

ㄷ. 메모리.
물리 메모리와 가상 메모리의 매핑, 일렬로 나열해야만 할 것 같은 메모리를 어떻게 쓰고 싶을 때마다 가져오는지가 궁금합니다.
- 질문. 메모리 관리 유닛이 하는 일이 무엇입니까? 메모리를 관리한다는 정의적인 느낌보다, 실제 어떤 방식으로 메모리를 관리해주는지가 궁금합니다.
- 질문. 프레임, 페이지의 개념으로 물리 메모리와 가상 메모리는 서로 매핑되는 것으로 알고 있는데,
그렇다면 가상 메모리에서 4바이트만큼 차이가 나도 물리 메모리에선 4바이트의 차이가 나지 않을 수도 있는 것입니까?
매번 프레임에 맞는 페이지를 갖다 주는 방식으로 메모리에 접근해야 하나요? 성능 낭비가 심할 것 같습니다.
- 질문. 스택 메모리의 구현은 간단한 것이었지만, 힙은 제가 배운 자료구조 개념으로 어떻게 응용해야 할 지 감조차 안 잡힙니다.
이 부분은 떠오르시면 말씀해주시면 감사하겠지만, 알아서 찾아보도록 노력은 하겠습니다.
- 질문. 프로그램이 실행될 때 운영체제는 메모리를 어떻게 배분합니까?

-----

코멘트를 주시면 질문에 대해 더 자세하게 궁금한 내용을 적겠습니다.

쓰다 보니, 저는 제대로 된 공부를 하고 있는 게 아니라
탈선을 하고 있는 느낌이 드네요.
아예 처음부터 다시 배워야할 지도 모르겠습니다.
C, C++ 등의 고수준 프로그래밍이 가능하면서
이런 저수준의 개념은 제대로 이해하지 못하는 것도 참 민망합니다.
머릿속이 복잡해 무엇을 검색해야 뭐가 나올지도 감이 안 잡힙니다.

다시 한 번 죄송합니다. KLDP 여러분의 도움을 청합니다.

goforit의 이미지

쓰신 질문들을 저도 예전에 가지고 있었구요, 이해하는 데 오래 걸렸습니다. ^^
예를 들어 Dynamic Linker와 Kernel 관계는 실제 print 문을 넣고 직접 동작을 확인했던 기억이 납니다.

>- 질문. 파일 시스템은 어디에 있는 것입니까? RAM입니까, HDD입니까?

대부분 HDD 입니다. 그러나 RAM 에만 존재하는 파일 시스템도 있습니다. 또한 HDD 존재하는 파일 시스템이라도 구동된 후에 RAM에서 사용 동작하기 위한 추가적인 구조를 가질 수 있습니다. 가령 Superblock 은 HDD와 RAM 동시에 존재하지만, structure 가 다릅니다. 또한 파일 시스템에 따라 메모리에 index tree나 버퍼를 추가적으로 가질 수 있습니다. 파일 시스템 구현마다 다릅니다.

> 접근하기 쉬운 관리 체계는 어떤 것인지에 대해 알고 싶습니다. (단서를 주시면 직접 찾겠습니다.)

VFS (Virtual File System)

>- 질문. 파일의 이름은 어떻게 관리됩니까?
파일 이름 검색 방법과 파일 이름 만들기는 구분할 필요가 있습니다. 파일 찾기 검색은 파일 시스템에 따라 다릅니다.

>- 질문. 응용 프로그램의 시작과 끝은 어떻게 판정합니까? 애초에, 어떤 것이 코드 영역이고, 어떤 것이 데이터 영역이라는 것을
>어떤 방식으로 판정합니까?
>- 질문. 'mov eax, 0'을 실행하는 응용 프로그램을 작성하고 싶습니다. 'mov eax, 0'이 '01101101'이라면 파일에 '01101101'을 기록하는 것으로
>응용 프로그램의 작성이 끝이 난다는 소리입니까?

파일 시스템과 별도 File 자체의 스펙있습니다.
큰 그림을 보기 위해서 파일 시스템과 별도로 파일 자체의 Specification 이해하는 것이 중요합니다.

예를 ELF File Format 있습니다. File format도 HDD에 structure와 in-memory structure가 있습니다.
응용 프로그램도 당연히 file format 따라야합니다. 파일 포맷에서 데이타, 코드 영역 정의가 있습니다.

>그러니까 위의 프로그램에서 .data의 내용을 프로그램이 할당받은 메모리의 data 영역에, .code를 code 영역에 기록을 먼저 해놓고
>code 영역에서부터 시작해서 진행하는 뭐 이런 식이라고 받아들이면 되나요?

이 것이 Dynamic Linker 역활입니다. 예를 들면 리눅스의 ld-linux.so

> 질문. 메모리 관리 유닛이 하는 일이 무엇입니까? 메모리를 관리한다는 정의적인 느낌보다, 실제 어떤 방식으로 메모리를 관리해주는지가 궁금합니다.

OS 입장에서 메모리 관리는 역활은 두개입니다.
주소관리 (Address management) 와 실제 유한한 RAM 절약해서 사용하기
주소 관리는 virutal address 와 physical address 변화외에도 가상 주소 자체도 관리합니다.

> 그렇다면 가상 메모리에서 4바이트만큼 차이가 나도 물리 메모리에선 4바이트의 차이가 나지 않을 수도 있는 것입니까?

상황(하드웨어, 메모리 파편화 상태, 메모리 종류[DMA ..]) 에 따라 그럴 수 있고 아닐 수 도 있습니다

> - 질문. 프로그램이 실행될 때 운영체제는 메모리를 어떻게 배분합니까?

키워드를 드리겠습니다. Dynamic Loading

HDNua의 이미지

일단 검색해볼 만한 키워드는 VFS, File Format, Dynamic Linker, Dynamic Loading 정도네요. 더 찾아보고 질문드리겠습니다.
소중한 답변 감사합니다.

저는 이렇게 생각했습니다.

bong90의 이미지

저는 컴퓨터공학과 학부생입니다만,

OS 과목을 수강하고 나니 모든 질문에 답변할 수 있을것 같습니다.
위에 열거하신 책들도 좋은 책이지만, 보통 대학에서 교재로 쓰이는 오래되고 매우 좋다고 평가받은 교과서 위주로
보시는건 어떨까 합니다. 저는 OS를 흔히들 얘기하는 공룡책으로 배웠습니다.
정말 이 책에 질문하신 내용들에 대한 답변이 다 있습니다.

OS 하나만으로 끝나기 보다 시스템과목들을 다 보시는 걸 추천합니다.
미천한 학부생의 소견으로는 마이크로프로세서->OS->아키텍쳐 순이 좋을 것 같습니다.
여유가 되시면 디지털 디자인을 공부하시고 여기서도 원리가 궁금하시면 좀더 전자과 쪽에 치우친 책을 더 보신다면
궁금증이 많이 해결되실것 같습니다.
그리고 아키텍쳐까지 이해한 뒤 최신 아키텍쳐 기술들에 대한 유명한 논문들을 읽은 뒤에
컴파일러를 공부한 뒤 커널을 만져본다던지 프로그래밍 언어를 설계해본다던지 하면 좋을 것 같습니다.
확실히 아키텍쳐 수업을 들으니 (학부3~4학년수준에서는) 지식이 완성된 것 같은 느낌이 듭니다.

물론 여기서 부터가 시작입니다만.. ㅠㅠ kldp의 고수님들을 따라가려면 ㅠㅠ

HDNua의 이미지

'Operating System Concepts 8판' 번역서가 있군요.
좋은 책과 힌트 알려주셔서 감사합니다.

다시 한 번 소중한 답변 감사합니다.

저는 이렇게 생각했습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.