책에 있는 이 말이 맞는 것인지 확인좀..

shamlock의 이미지

지금 uClinux를 공부중입니다. (아니..걍 이게 몬가 보고 있습니다 )
저는 기본적으로 PC 환경에서만 공부를 했고 임베디드쪽은 첨인데요

책을 보다보니 이런 말이 있네요

Quote:

일반 리눅스와 달리 멀티 프로세스로 인한 시스템의 메모리 부하를 줄이기 위하여 멀티 스레드 방식을 사용한다. 즉 일반 리눅스에서는 페이지 복사 기법을 fork를 통해 copy-on-write 기법으로 구현하지만 메모리가 제한된 uClinux에서는 vfork를 이용하여 구현한다.

대충보면 그냥 넘어갈수도 있었는데요
시스템 메모리 부하를 줄이기 위해 멀티스레드 방식을 사용한다는 것과,,,, vfork를 사용한다는 것과.... 연관성이 있는 것인가요?
"즉" 이라는 단어땜에.. 좀 햇갈리네요..
제가 개념이 부족한거 같기도 하고

제가 알기론 vfork는 fork후 exec 할때까지 부모가 대기하게 하는 시스템콜인걸로 알고 있는데요(그래서 쓸떼 없이 메모리 복사를 방지하려고)

멀티스레드 방식은 vfork 인가요?

무우의 이미지

덕분에 공부하고 갑니다.

Quote:
uClinux runs on systems lacking an MMU; therefore, uClinux application code
cannot use fork() at all. This is because fork tries to implement Copy On
Write (COW) between the two processes, which is impossible without an MMU. To
make boa work (a most excellent web server I must say), you must eliminate all
use of fork or replace it with vfork().

http://www.uclinux.org/pub/uClinux/archive/0772.html

구글의 수학적 알고리즘에 감사, 구글, 영어..

shamlock의 이미지

fork를 하면 모든 변수와 메모리를 부모와 자식이 공유하다가
부모 자식 둘중 어떤 프로세스가 변수의 값을 변경시키면
그때 MMU가 두 프로세스를 위한 변수를 따로 복사해준다.
이게 copy-on-wite개념이고.. 그래서 Copy-on-write를 하려면 MMU가 필요하다

vfork()를 하면 fork()와 마찬가지로 모든 변수와 메모리를 부모와 자식이 공유한다. (vfork()는 자식이 exec() 또는 exit() 호출을 할때까지 부모가 대기한다.)
자식이 변수의 값을 변경하면 부모의 값도 변경된다. 즉 부모자식이 공유하는 개념. 그러므로 MMU가 필요없다.

@.@

코퍼스의 이미지

vfork를 하기 때문에 MMU가 필요없는 것이 아니라..
MMU가 없는 시스템이기에 vfork를 쓰는 것입니다.

A few Good Man

shamlock의 이미지

주객이 전도됬네 ㅜㅜ

MMU라는 것이 Memory Management Unit이라는 약자던데요
학교댕기면서 OS 이론적인 것을 공부하는데 제가 최종적으로 정리한게 아래와
같습니다.

1. 리눅스는 물리 메모리를 페이지단위로 쪼개서 관리한다
2. 쪼개진 페이지 찾을라면 누군가는 전체 페이지 테이블을 알고 있어야 한다.
3. 전체 페이지 테이블은 메모리에 올려 놓는다.
4. 이 메모리 주소는 GDTR에 저장해둔다.
특정 프로세스가 사용중인 페이지 테이블도 메모리에 있는데 LDTR에 저장한다.
5. 프로세스는 연속적인 메모리인것처럼 인식하고 사용하지만,
실제로는 논리적인 주소가 물리주소로 변경되어 접근하게 된다.
이게 가상 메모리 개념이다.
6. MMU는 논리주소를 물리주소로 변경해주는 역할을 한다.
그렇다면 MMU의 입력은 논리주소이고, MMU의 출력은 물리주소이다.
MMU는 여기서 더도 덜도 하는일이 없다?

제가 이해하고 있는 내용이 맞는 것인지 모르겠습니다.
학교다닐때 공부한 것이라.. 졸업하고 자바만 했더니.. OS에 대한 초보적인 궁금증이 생기네요
저는 하드웨어를 몰라서.. MMU가 저런 일을 할 수 있다는게 솔직히 시원스레 이해는 안됩니다.
커널이 MMU에 논리주소를 요청 하고 , MMU는 물리주소로 응답한다. 이게 맞는 말인가요?
MMU라는 것이... 참.. 신기하네요

@.@

익명 사용자의 이미지

mmu있는데 vfork 쓰는 경우는 어떤 경우가 있나요?

shamlock의 이미지

vfork()가 나오기 전에 fork()가 있었는데
fork()가 첨부터 copy-on-write 의 기능이 있지는 않았던거 같습니다.
(언젠지 모르지만 유닉스계열의 초창기 버전일거 같네요. )

유닉스에서 새로운 프로세스를 실행하는 두가지 방법이 아래와 같이 있겠는데
1. fork()를 통한 부모 자식간에 동일한 코드영역 사용
2. fork & exec()를 통해 자식이 새로운 프로그램를 수행

copy on write가 없는 상태로....새로운 프로그램을 실행시키기 위해
fork & exec의 과정을 생각해보면
1. 커널이 fork 하면서 자식프로세스를 위한 메모리를 할당하고
부모프로세스의 메모리를 자식에게 그대로 복사
2. exec 호출에 의해서 방금할당한거 다 갈아치우고
새로운 프로그램을 위해 프로그램을 메모리에 다시 복사

fork 하면서 복사하고, exec하면서 복사하고 두번 복사하게 됩니다.

근데 fork 한담에 exec를 하는 프로세스들이 훨씬 많다는 생각을
커널 개발자분들이 하셨겠죠
특히나 쉘의 경우, 거의 대부분 fork & exec니깐... CPU자원좀 아껴보려는
차원에서 vfork를 생각하게된거 같아요

그래서 fork 할려면 하고, vfork 할려면 하라고 개발자들이 선택할수 있게 vfork()시스템콜을 추가한거죠

그러다가 커널들이 더 발전과 연구를 거듭해서
fork와 copy-on-write의 개념이 생겨났고, 더 이상 vfork를 사용할 필요가 (적어도... MMU가 있는 시스템에서는..) 없게 되었습니다.

사실 vfork는 자식 프로세스를 생성 직후
자식이 exec 또는 exit를 호출할때까지
부모는 대기상태가 된다는 것이 단점이 될수도 있는 거라고 하드라구요
왜냐하면 자식놈이 부모가 소유하고 있는 락을 얻기를 시도한다면 영원히
데드락상태가 될것이고, 또는 자식이 exec나 exit를 안하면
부모는 메모리에 있는 상태에서 영원히 블럭킹상태가된다..
물론 이런 실수는 초보 개발자의 얘기겠지만... 이런 위험요소가 있는
vfork에 비해..... fork와 copy-on-write가 부족한점이 없다
(스티븐스 Advanced 유닉스 프로그래밍인가 하는 책에 나왔던거 같습니다.)

머 이런 시나리오가 있는거 같습니다.

( 친구들앞에서 니는 fork만 알지..나는 vfork도 안다~~
잘난척할려고 vfork를 읽어두었었던 기억이... ㅡ,.ㅡ)
어쨌든 사용하지 않을 줄 알았는데 MMU가 없는 시스템에서 vfork가 필요한가 봅니다.

스티븐스 아저씨 책읽고 혼자 시나리오 만들어서 착각하고 있을 가능성이..농후합니다. ㅠㅠ

@.@

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.