malloc한 상태에서 exec하면.....

익명 사용자의 이미지

어떻게 되나요?

지금 학교 숙제로 일반적이 쉘 기능하는 것을 하고 있는데요.
소스 코드를 보니까 malloc한 상태에서 fork하고 exec하고 하는게 많은데.
윈도우는 모르겠는데 유닉스나 리눅스에서는 malloc으로 할당한 것을 프로그
램 종료시 알아서 해제 해 준다고 하던데요.

malloc하고 난 후에 exec를 하면 알아서 해재해 주나요?
그리고 링크드 리스트 같이 줄줄이 붙어 있는 것도 알아서 해주나요?

그리고 signal 처리 함수(CALLBACK 함수?)를 보통 static으로 선언하던데 그
냥 선언하는 것하고 어떤 차이가 있습니까?

익명 사용자의 이미지

정확히 말하면 프로그램 종료시가 아니라, 프로세스 종료시 '프로세스가 할당한'
메모리들을 커널이 해제(커널에 반납) 합니다. 윈도우즈 NT 계열이라면,
윈도우즈도 그걸 제대로 하는 걸로 알고 있습니다.

> malloc하고 난 후에 exec를 하면 알아서 해재해 주나요?

라고 하셨는데, 말씀 드렸듯이 프로세스가 할당한 메모리는 그 프로세스가
종료될 때 커널에 반납되므로, 위에서 말씀하신 malloc 이 어떤 프로세스에서
호출되었는지가 관건일 겁니다.

> 그리고 링크드 리스트 같이 줄줄이 붙어 있는 것도 알아서 해주나요

그렇습니다. 단, 커널이 그 자료 구조를 알고 있는 게 아니라, 단순히
사용된 메모리를 반납하는 겁니다.

프로세스 종료시 메모리가 커널에 자동으로 반납된다 해도, free 를
제대로 해주지 않으면, 프로세스 종료전까지 불필요한 메모리가
잔류하게 되므로, 적극적으로 free 를 사용해야 합니다. 일반적으로
프로세스가 살아있는 동안에 계속 존재하는 메모리 블럭이라도,
프로세스 종료시 free 를 호출해서 메모리 누수를 막는 게 올바른
프로그램 방법이라고 생각합니다.

static 변수나 함수는 전역 심볼이 다른 모듈에 존재하는 지 여부에
관계없이 중복된 심볼 ( duplicated symbol ) 오류를 피하기 위해
사용하는 것일 뿐, signal 함수와는 관련이 없습니다.

익명 사용자의 이미지

답변 감사합니다. 답변이 참 빠르시네요^^;

static 함수 사용에서요. 중복된 심볼(duplicate symbol)이 잘 이해가 가지
않는데요..... 자세히 설명해 주셨으면 합니다.

그리고, 프로세스 종료시 free를 하지 않으면 메모리 누수가 생길수 있다고
하셨는데, kernel이 완벽하게 반납하지 못할 경우가 있다는 말씀이신가요?

자꾸 질문이 길어지는데요...... 이건 다른 질문인데요, 프로세스가 코드,데이
터, 스택, 힙 이렇게 구성되어 있는 것 맞죠?...
학교에서 OS 수업을 듣는데, 힙에 대한 언급이 없더라구요.

그리고

코드 ...........
데이터 전역변수(?) static 변수(?) 상수(???)
스택 .........
힙 ........

전역변수, static 변수, 상수가 데이터 영역에 들어가나요?
프로그램하고 별 상관은 없는데 계속 궁금했거든요.

익명 사용자의 이미지

프로세스 종료시 free 를 안해도 제대로 된 운영체제 커널이라면,
완벽하게 프로세스가 사용한 메모리를 반납해야 합니다.
하지만, 커널이 좋든 나쁘든, 응용 프로그램 수준에서 완벽하게
사용한 메모리를 해제하도록 만드는 게 좋다고 생각합니다.

MSDN에는 process 를 이렇게 정의하고 있군요.
An executing application that consists of a private virtual address
space, code, data, and other operating-system resources, such as files,
pipes, and synchronization objects that are visible to the process. A
process also contains one or more threads that run in the context of the
process.
여기서 중요한 키워드는 virtual address space 입니다.

프로그램이 메모리를 어떻게 사용하는가는 어셈블리어를 해보시면
잘 알게 되실 것 같네요.

말씀하신 상수가 어떤 상수인지는 모르겠지만, 데이터 영역에 들어간다고
보긴 어려울 것 같은데요.
C storage class 를 보면, extern, static, auto, register 네가지이고,
이중 extern 및 static 이 데이터 세그먼트를, auto 는 스택 세그먼트,
register 는 CPU 레지스터를 사용하는 것을 의미합니다. 상수(const) 는
storage class 에 없지요.

어셈블리 수준에서 보면 extern 이나 static 모두 데이터 세그먼트에 위치하는,
전역적으로 참조 가능한 데이터일 뿐입니다. C 에서 그것을 구분지은 것은
때로 두 모듈에 같은 이름의 전역 심볼이 존재할 가능성이 있기 때문에,
임의 모듈을 작성할 때 다른 모듈에 같은 이름의 심볼이 존재하는 것에 영향
받지 않는 심볼 이름(변수나 함수)들을 사용하고 싶은 경우를 위해서 입니다.
그때 static 을 쓰게 되죠. 예를 들어

file1.c int value;
file2.c static int value;
두 모듈의 value 는 모두 데이터 세그먼트에 위치하지만, file2.c 의 value
는 static 이므로, file1.c 와 file2.c 를 함께 컴파일,링크해도 중복된
심볼 오류가 발생하지 않는 겁니다. C 수준에서 프로그래머에게 선택의
기회를 준거죠.

댓글 달기

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