리눅스 업데이트 후 부팅이 필요없는 메카니즘은???

freezm7의 이미지

오늘도 즐거운 마음으로 dselect로 업데이트를 하다가 문득 떠올랐는데요,

어째서 공유라이브러리 등이 업데이트 되는데도 기존에 실행 중인 프로그램은 영향을 받지 않는 거죠???
사용 중인 공유 라이브러리들을 모두 가상 메모리 공간(램 + 스왑) 으로 다 복사해 놓았을 꺼라 추측하고 있긴 합니다만, 잘 아시는 분의 설명 부탁드립니다.
(귀찮으시면 책 추천이라도 ^^)

codebank의 이미지

제가 알기론 freezm7님의 추측이 맞습니다.
MS-Windows의 경우 실행이 되면 파일을 열고 메모리로 올리고 끝나는게 아니라
그 포인터 즉, 파일포인터를 계속잡고 있어서 삭제나 교체가되면 에러를 발생합니다.
제가 추측하기론 MS의 경우 사용하는 함수부분만을 따로 메모리로 옮겨서 재배치를
하고 실행을 시키는 것 같더군요. 이후에 다른 함수가 필요하면 해당 함수를 다시
불러들이고...
하지만 LINUX의 경우에는 MS의 방식과는 조금 다르게 동작하는 것 같습니다.
즉, 실행되어지면 해당 파일을 메모리에 모두 옮겨놓고 재배치를 시켜놓아서 해당
파일이 교체가 되어도 이전 형식으로 동작을 하는 것 같네요.

책이라면 LINUX커널인가하는 책이 있었던 것 같은데...
KLDPwiki에서도 해당 문서를 찾아볼 수가 있을텐데 찾기가 쉽지만은
않네요.
이점에 대해서는 예전에 많은 논의가 있었던 것으로 기억납니다만 정리해놓은
문서가 어디있는지는 잘모르겠네요.

------------------------------
좋은 하루 되세요.

Fe.head의 이미지

으흠 그럼 컴퓨터를 재부팅 하지 않은 상태에서

c 공유 라이브러리 4에서 5로 5에서 6 업데이트 하면

메모리상에 4,5,6 이 모두 떠있다는 뜻인 되는건가요?

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

eungkyu의 이미지

codebank wrote:
제가 알기론 freezm7님의 추측이 맞습니다.
MS-Windows의 경우 실행이 되면 파일을 열고 메모리로 올리고 끝나는게 아니라
그 포인터 즉, 파일포인터를 계속잡고 있어서 삭제나 교체가되면 에러를 발생합니다.
제가 추측하기론 MS의 경우 사용하는 함수부분만을 따로 메모리로 옮겨서 재배치를
하고 실행을 시키는 것 같더군요. 이후에 다른 함수가 필요하면 해당 함수를 다시
불러들이고...
하지만 LINUX의 경우에는 MS의 방식과는 조금 다르게 동작하는 것 같습니다.
즉, 실행되어지면 해당 파일을 메모리에 모두 옮겨놓고 재배치를 시켜놓아서 해당
파일이 교체가 되어도 이전 형식으로 동작을 하는 것 같네요.

책이라면 LINUX커널인가하는 책이 있었던 것 같은데...
KLDPwiki에서도 해당 문서를 찾아볼 수가 있을텐데 찾기가 쉽지만은
않네요.
이점에 대해서는 예전에 많은 논의가 있었던 것으로 기억납니다만 정리해놓은
문서가 어디있는지는 잘모르겠네요.

대강은 맞지만 파일을 열 때 메모리에 모두 옮기는건 아닌 듯 합니다. 단지 파일을 지우더라도 그 파일을 모두 닫을 때까지 디스크에서 실제로 지우지는 않고 목록에서만 안보이게 하기 때문입니다. (이름과의 링크만 끊고 실제 데이터는 남겨두는건지 어떤건지 자세한 매커니즘은 잘 모릅니다.) 이 사실은 파일을 만들고 열고 지우고 닫고 하면서 중간중간에 df로 디스크의 남은 용량을 보면 쉽게 확인할 수 있습니다.

이 방법을 악용하면 아무도 모르게(?) 디스크를 꽉차게 할 수 있습니다.

파일 만들기
그 파일 열기
지우기
만들기
열기
지우기
...

preisner의 이미지

Quote:
대강은 맞지만 파일을 열 때 메모리에 모두 옮기는건 아닌 듯 합니다. 단지 파일을 지우더라도 그 파일을 모두 닫을 때까지 디스크에서 실제로 지우지는 않고 목록에서만 안보이게 하기 때문입니다. (이름과의 링크만 끊고 실제 데이터는 남겨두는건지 어떤건지 자세한 매커니즘은 잘 모릅니다.) 이 사실은 파일을 만들고 열고 지우고 닫고 하면서 중간중간에 df로 디스크의 남은 용량을 보면 쉽게 확인할 수 있습니다.

메모리가 아니고 파일시스템에 남아 있습니다.
파일시스템에서 단지 해당 파일의 inode가 삭제 되었다고 표시해 둡니다.

가령 A 프로그램이 X 파일을 열고 있는 상태에서
B 프로그램이 X 파일을 삭제하고 새로 X 파일을 생성하면
A 는 처음 열때의 X 파일의 inode로 계속 I/O를 합니다.
하지만 A 가 연 X 파일의 inode에는 삭제되었다고 표시되어 있으므로
A 가 파일을 닫으면 파일도 없어 집니다.
A와 B가 동일한 파일을 열었다고 생각 되더라도
inode가 다른, 동일한 이름의 파일을 엑세스 하므로 결과는 다르죠.
공유 라이브러리 역시 마찬가지 입니다.
파일의 식별자가 inode와 연결되므로 라이브러리를 업데이트 하더라도 동일한 inode를 가지는 것이 아니기 때문에 이전에 실행되고 있던 라이브러리는
메모리가 아닌 파일시스템에 아직 남아 있습니다.

파일을 엎어 쓴다고 항상 동일한 inode를 가지는 것이 아니라는 점이죠.
eungkyu님 말씀 처럼 이런식으로 보이지 않는 큰 파일을 만들 수 있습니다.
하지만 lsof 로 보면 나오니까..

댓글 달기

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