반응형

au-mallocdebug.zip


AIX에서 메모리 릭을 디텍팅 하기 위해서는 다양한 툴들을 사용할 수 있지만 아래의 방법도 있으니 참고.


출처 : http://ieggstory.blogspot.kr/2007/12/aix-memory-leak.html




환경변수를 이용하여 malloc, free 를 추적할 수 있다.


MALLOCDEBUG=report_allocations,output:/tmp/alloc_output.txt

ex)
export MALLOCTYPE=debug
export MALLOCDEBUG=report_allocations,stack_depth:5,output:/tmp/alloc_output.txt

프로그램이 실행되는 동안 위의 환경변수가 설정되어 있는 경우 /tmp/alloc_output.txt
파일로 alloc, free 되는 정보가 출력된다. 프로그램이 실행되는 동안은 alloc,
free 할때마다 그 기록을 메모리상에 가지고 있다가 종료가 되면 해제되지
않은 alloc 정보만 /tmp/alloc_output.txt 로 출력된다.

더 자세한 사항은 AIX 5L Version 5.3 General Programming Concepts: Writing
and Debugging Programs 에 나와 있다. 





출처 : http://www.ibm.com/developerworks/aix/library/au-mallocdebug.html#list3


useage : format_mallocdebug_op.sh alloc_output.txt


위에서 출력된 출력 파일을 사용하여 memory leak에 대해서 일반 사용자가 보기 편하게 변경해주는 쉘 스크립트가 있다(다운로드 가능)

또한 OS 환경 변수 뿐만 아니라 관련 옵션들에 대해서도 위의 출처에 자세히 나와있음.


사용해보도록 하자.

반응형
반응형



출처 : http://blog.naver.com/PostView.nhn?blogId=bumsukoh&logNo=110114643995






안녕하세요!  이번에는 IBM AIX의 내부적인 Memory 관리 방법(Not human but machine doing that)과 모니터링 방법(Not machine but human doing that)에 대해 설명드리도록 하겠습니다.

 

저의 경우 매번 시스템 튜닝이나 모니터링하면서도 항상 헤갈리게 하는 Memory Management 부분입니다. 아마 모니터링 툴마다 보여주는 수치들의 의미때문에 그런것 같은데요.

전혀 모르것도 아닌것이 그렇다고 아는것도 아닌것이 아무 애매모호한 경우가 너무 많아서 이번에 쫑찍어 볼려고 합니다.

위에서 제가 설명드린 "모니터링 툴마다 보여주는 수치들의 의미가 다른부분"의 대표적인 예가 이런 경우일 것 같은데요.

vmstat의 page in, page out과 topas의 page in, page out  부분일텐데요. 잘 아실지 모르지만 이 두개가 의미하는 내용은 완전히 다릅니다. 모르셨던 분들은 황당하실텐데요.

 vmstat의 page in, page out은 말그대로 paging space(swap이라 보시면 되겠네요)로의 page in, page out 입니다. 즉 프로세스의 메모리 정보가 file system으로 내려가거나, 다시 메모리로 로딩하거나 하는 것이지요.

그런데 topas의 page in, page out은 file system과 매핑된 즉 file과 매핑된 page들에 대한 page in, page out에 대한 부분입니다. 이 중에는 paging space로의 page in, page out은 제외됩니다.

즉 Memory segment중 Persistent segment와 Client segment에 대한 page들이 in, out 되는 것이죠.

이렇게 다른 내용을 같은 내용으로 이해 한다면 잘못된 판단을 할 수 있겠죠.

이러한 이유로 AIX 내부적으로 Memory를 관리하는 방법과 모니터링에 대한 정확한 방법을 한번 정리하는 것이 이번 포스트의 목적입니다.

 

자, 그럼 AIX 내부적인 Memory 관리 방법에 설명하도록 하겠습니다.

 

AIX 뿐 아니라 모든 Unix 시스템은 가용한 Physical memory 보다 더 많은 양의 메모리 address를 효율적으로 할당할 수 있도록 하기 위해 Virtual memory를 사용합니다. 이건 Unix 시스템에 대해 아시는 분들은 모두 아시는 부분입니다. 문제의 발단은 여기서 부터 시작됩니다.

Virtual Memory를 사용함으로써 이를 효과적으로 관리하기 위한 각종 효율적인 방법들이 필요하게 됩니다. 그러면서 굉장히 복잡한 Memory management mechanism이 생겨나게 됩니다.

 

AIX 내부적인 Memory를 관리하는 방법을 알기 위해서는 다음의 기능들에 대해 숙지하고 있어야 합니다.

- Paging space 란 ?

paging space는 현재 Virtual memory상에는 존재하지만 현재 access 되고 있지 않는 데이터를 저장하기 위해 disk 공간으로 할당된 logical volume입니다.

이러한 logical volume을 일반적으로 우리는 paging space또는 swap space라고 부릅니다.

paging space라는 용어의 개념을 잘 알고 있어야 뒤에 나오는 각종 내용들에 대해 혼란이 없게됩니다.

System의 Physical memory(RAM)의 여유공간의 양이 적으면, 현재 사용하고 있지 않은 프로그램(프로세스)이나 데이터는 다른 activity 작업에게 메모리를 할당하기 위해 paging space로 이동되게 됩니다. 뭐.. 이 내용은 우리가 잘 알고 있는 swap에 대한 내용이라 할 수 있습니다. 그래서 paging space가 작게되면 프로세스들이 유실되게 되고, 이렇게 되면 paging space가 고갈되게 되면 System panic이 발생할 수 있습니다.

 

이러한 문제를 감지하게 되면 새로운 volume을 생성하여 paging space로 할당하거나 기존의 volume의 크기를 증가시켜 문제를 해결 할 수 있습니다.

 

이러한 paging space에는 paging space를 할당하기 위한 다양한 정책(Late, Early, Deferred등)과 paging space의 부족 시 paging space회수를 위한 다양한 방법(npswarn, npskill,nokilluid등)등이 있습니다. 해당 부분들은 필요 시 설명하도록 하겠습니다.

 

예전에는 작은 Physical memory 시스템에 과중한 업무들을 구동하다 보니 paging space에 대한 page in, page out이 지속적으로 발생하여 성능상의 문제가 빈번히 있었지만,

 

요즘은 Physical memory의 가격보다 안정적인 시스템 운영을 위해 충분한 Physical memory를 처음부터 확보하고 시스템을 운영하기 때문에 Paging space가 부족하여 System에 크게 문제되는 경우는 별로 없는것 같습니다. 

 

- Memory Segments 란 ?

AIX는 다양한 memory segment간에 기능들이 구분됩니다.

AIX의 VMM을 이해하기 위해 persistent,working 그리고 client segment들간의 차이점을 이해하는 것이 중요합니다.

 

Persistent segment는 disk상의 permanent storage location을 가집니다. Data나 execution programe의 file은 persistent segment에 매핑됩니다.

 

Working segment는 프로세스가 사용하는 동알 존재하는 일시적인 것입니다. 따라서 permanent disk storage에 위치를 가지지 않습니다.

프로세스 stack, data 영역이 working segment와 shared library text segment에 매핑됩니다.

 

Client segment는 remote file system에 위치한 permanent location을 네트워크를 통해 저장됩니다. CD-ROM과 JFS2 page들은 client segment 입니다.

 

Memory segment는 private으로 유지되거나 processor간 공유될 수 있습니다.

 

- VMM(Virtual memory manager) 란 ?

VMM은 System과 application에서 요청하는 메모리를 할당하는 역할을 담당합니다.

VMM을 통해 할당되는 segment들의 단위를 page라고 부릅니다. 이러한 page는 Physical memory나 필요 시까지 disk(paging space)에 위치됩니다.

이렇게 Physical memory와 disk(paging space)에 저장된 page들을 VMM이 관리하게 됩니다. 그래서 virtual memory의 양은 system의 실제 physical 메모리의 크기를 넘어 사용될 수 있습니다.

VMM의 기능 측면에서는 다음과 같은 성능 향상을 위한 기능을 가지고 있습니다.

- paging으로 인한 processor의 사용과 disk bandwidth를 최소화함

- 프로세스의 paging으로 인한 응답속도 저하를 최소화홤

 

AIX에서는 virtual memory segment는 4kb(4096byte) 단위로 page로 나뉘어집니다.

VMM은 이러한 page들에 대해 사용가능한 free list를 유지 관리합니다.

VMM은 현재 Physical memory상의 page들에 대해 free list로 재할당해야 할 page들을 찾기 위해 page-replacement algorithm을 사용합니다.

이 page-replacement algorithm은 virtual memory segment인 working segment와 비교하여 persistent 존재 비율 및 repaging등을 고려해야 합니다.

 

VMM은 할당되지 않은 page들의 최소양을 유지하기 위해 free 공간을 늘리고 이 공간을 free list에 할당하기 위한 page out과 page steal을 사용합니다.

 

- Paging mechanism 에 대해

Paging mechanism은 VMM이 page들의 free list를 관리하기 위한 방법입니다. 위에서 VMM이 page-replacement algorithm을 사용한다고 말씀드렸는데요. 이러한 것들이 Paging mechanism에 대한 하나의 방법입니다.

 

VMM은 안정적인 page fault를 가능하게 하기 위해 free memory page frame의 리스트를 유지합니다. 이러한 list가 바로 우리가 알고 있는 free list입니다.

 

여기서 page fault는 virtual memory address는 가지고 있으나 현재 physical memory에 해당 page가 없을 경우 발생합니다.

이러한 page fault는 보통 다음과 같이 두가지 유형이 있습니다.

new page fault로써 가장 처음 참조되어 physical memory가 없는 경우와 이미 page out된 page인 경우입니다. 즉 page fault가 발생하면 free list가 있는 경우 자동으로 해당 page에 대한 메모리를 바로 할당하게 됩니다.

 

메모리의 free list page의 수가 작게되면 page stealer가 발생하게 됩니다.

이 page stealer는 steal 대상 page들을 찾기 위해 Page Frame Table(이하 PFT) entry들을 평가하는 mechanism입니다.

PFT는 참고되고 있는 page와 수정된 page들을 표시하는 flag들을 가지고 있습니다.

Page stealer가 참고되고 있는 PFT내의 page를 찾게되면 해당 page를 steal하지 않습니다.

오히려 참조 flag를 reset 하게 됩니다. 다음번에 page stealer가 PFT에서 해당 page를 검사할때 해당 page가 참조되고 있지 않다면 해당 page는 steal 됩니다.

그리고 page stealer가 처음부터 참조되지 않은 page들 만나게 되면 바로 해당 page들을 steal됩니다.

 

PFT의 page가 참조되지 않고 modify flag가 설정되어있으면 해당 page가 memory에 위치한 후 변경되었다는것을 page stealer에게 표시하게 됩니다. 이러한 경우는 page steal 전에 page out이 호출됩니다. Page들이 working segment의 부분이라면 pageing space에 기록될것이며, 반면에 persistent segment의 부분이라면 disk의 permanent 위치에 기록될것입니다.

 

프로세스가 종료하게 되면 해당 프로세스의 working storage는 해제되며 메모리의 page들도 free가 되어 free list로 반환됩니다.  반면 프로세스에 의해 open된 file들은 메모리에 남아 있을수 있습니다.

 

- Memory load control mechanism 에 대해

Active virtual memory page들의 수가 Physical memory page들을 초과할 경우, Physical memory page내에 위치할 수 없는 page들을 위해 paging space를 사용하게 됩니다.

Application이 page out된 page들에 접근하게 되면 VMM은 paging space로 부터 해당 page들을 physical memory page로 로드하게 됩니다.

이때, free physical memory page의 수가 작게되면 paging space에서 page로 로딩하기 전에 physical memory내의 다른 또 다른 free page가 필요하게 됩니다.

VMM이 free 대상의 page를 찾게되면, 강제로 해당 page들은 paging space로 page out됩니다.

심각한 경우 VMM은 paging space로 부터 physical memory로 다른 page를 로딩하기 전에 항상 paging space로 page를 page out 해야 할 필요가 생길 수 있습니다.

이러한 경우는 thrashing이라 부릅니다. 이러한 thrashing 상황에서는 프로세스들은 dispatche(run queue에서 cpu 할당받음)되자 마자 page fault에 직면하게 됩니다. 그러면 프로세스들은 어떠한 중요 절차도 수행하지 못하게 될뿐 아니라 system의 성능은 떨어지게 됩니다.

 

OS들은 이러한 thrashing 상황이 시작되는지에 대한 감지하기 위한 memory load control mechanism을 가지고 있습니다.

thrashing이 감지되면 system은 active process들을 suspend 시키기 시작하고 새로운 process의 시작을 지연시키게 되며 이러한 작용이 thrashing으로 빠지는 것을 방지합니다.

 

- Page replacement algorithm 에 대해

free list 상의 page 수가 설정한 값(minfree)보다 낮을 경우 page replacement algorithm은 physical memory page를 free 시키기를 시도하게 됩니다. 이러한 page replacement algorithm은 free list상의 page수의 최대값(maxfree+8)보다 free list의 page가 확보될때까지 지속됩니다.

이러한 page replacement algorithm 수행의 기준이 되는 minfree, maxfree값을 적정하게 설정하는 것을 중요한 부분입니다.

보통 minfree값의 기본은 maxfree보다 8 작은 값이거나 memory pool(보통 CPU당 메모리 SUBPOOL이 있음)만큼 작은 값입니다.

maxfree는 VMM의 page steal을 중지시키게 하는 기준을 결정합니다. maxfree값은 다음과 같이 결정될 수 있습니다.

maxfree = lesser of (number of memory pages / 128) --> IBM 가이드 문서 내용입니다.

이러한 값들은 system의 memory를 모니터링하여 필요 시 재설정을 통해 성능을 튜닝할 필요가 있습니다.

 

 

그럼 AIX 내부적인 Memory 관리 방법이 이해되었다면, 이제는 모니터링 하는 방법에 대해 알아보겠습니다.

주요하게 사용하는 Memory 모니터링 툴에 대해 설명하겠습니다.

 

- vmstat

가장 효과적으로 사용할 수 있는 툴입니다.

vmstat에 나오는 메모리 항목을 위주로 설명드리도록 하겠습니다.

vmstat은 크게 kthr, memory, page, faults, cpu 이렇게 5개 대항목으로 정보를 출력합니다.

이 중 Memory 관리와 관련된 부분은 memory, page 부분이 되겠습니다.

 


 

각 항목에 대해 알아보겠습니다.

- avm

Active Virtual Memory를 말하며, access되는 virtual page의 수를 표시합니다. 때로 이것을 available memory로 잘못알고 있는 경우가 있습니다.

- fre

free list의 크기를 표시합니다. 실제 physical memory의 많은 영역이 file system data를 cache로 활용되기도 합니다. 따라서 해당 크기가 작다고 해서 꼭 비정상적인 것은 아닙니다.

- re

초당 reclaime한 page수입니다. 해당 page가 free list에 있고, 재할당되지 않았을때 해당 page에 page fault는 초기화를 위한 신규 I/O request가 없으므로 reclaim이 고려됩니다.

- pi

page in request의 수입니다. page fault에 의해 paging space에 paging되어 있는 page가 physical memory로 page되는 수입니다.

초당 지속적으로 5 page 보다 많은 값이 보이면 문제가 있는 것으로 볼 수 있습니다.

- po

page out 처리된 page 수입니다. 초당 paging space로 이동한 page들의 수를 말합니다. 해당 page는 더 많은 memory가 요청될때 VMM에 의해 paging space로 page out됩니다. page out된 page는 필요 시 page in 될 수 있습니다.

page out이 높으면 minfree와 maxfree 값과 paging allocation policy값인 PSALLOC값을 확인할 필요가 있습니다.

- fr

free 된 page의 수입니다. VMM이 메모리를 필요로 할때 VMM의 page-replacement algorithm이 steal 대상 page들을 결정하기 위해 PFT(Page Frame Table)을 scan하도록 합니다. page들이 마지막 scan이후에 참조되지 않았다면 해당 page는 steal될 수 있습니다.

- sr

page-replacement algorithm에 의해 scan이 이루어진 page를 표시합니다. page steal이 발생하면 physical memory내의 page들은 page steal 대상인지를 확인하기 위해 scan됩니다.

메모리의 과대사용을 확인하기 위해 fr에 비해 sr의 비율이 높은지 확인해야함 높은 비율은 page stealer가 steal하기 위한 메모리를 찾기위해 작업 부하가 발생하는 것을 의미합니다.

- cy

page-replacement algorithm이 steal할 page를 찾기위해 PFT(Page Frame Table) 전체를 scan한 횟수를 나타냅니다.

이 값이 0 보다 크면 심각한 memory부족을 의미합니다.

page-replacement algorithm은 maxfree+8 값 만큼 free list page를 확보하기 위해 PFT를 scan하게 되는데 이때 PFT를 한번 모두 scan한 후에도 free list page의 수가 maxfree+8 보다 작으면 계속적으로 page steal을 위한 scan이 발생하며 이미 scan한 page들을 만나게 되면 cy값은 1씩 증가하게 됩니다.

이렇게 scan하다 maxfree+8 값만큼 steal이 발생하여 free list가 증가하면 그때 비로서 cy값이 0으로 설정됩니다.

 

- topas

topas도 시스템 모니터링을 위해 유용한 툴입니다. 처음에 말씀드렸듯이 memory에 관련해서는 그 항목이 vmstat과 조금 달라 확실히 의미하는 바를 알고 있어야 혼선이 없습니다.

 


 

항목 중 paging, memory, paging space 부분이 memory와 관련된 항목입니다.

- Faults

faults 수입니다.

- Steals

초당 VMM에 의해 steal된 page수입니다.

- PgspIn

Paging space로 부터 읽어들인 page 수입니다. (일반적인 page in 입니다.)

- PgspOut

Paging space로 write된 page 수입니다. (일반적인 page out 입니다.)

- PageIn

초당 읽어들인 page 수입니다. (paging space로부터의 page in을 제외한 모든 page in, persistent segment에 대한 page in이 포함됩니다.)

- PageOut

초당 write 된 page 수입니다. (paging space로 page out을 제외한 모든 page out, ㅔpersistent segment에 대한 page out이 포함됩니다.)

- Sios

VMM에 의해 발생된(page stealer) 초당 input/output page의 요청 수입니다.

- Real

Megabyte 단위의 실제 physical memory의 크기를 보여줍니다.

- %Comp

Computational page에 할당된 real memory 량입니다.

- %Noncomp

Non-computational page에 할당된 real memory 량입니다.

- %Client

Remotely mounted file들에 대해 cache로 사용되는 메모리의 량입니다.

 

- svmon

svmon은 현재 시스템의 메모리 사용량에 대한 정보를 상세하게 확인할 수 있습니다.



 

위와 같이 전체 시스템의 memory 사용율이 나오게 됩니다.

 

- memory
     real memory의 사용율에 대한 정보 출력됩니다.
     - size : real memory frame의 수입니다.
     - inuse : page들을 포함하고 있는 frame의 수입니다.
     - free : 모든 memory pool의 free frame의 수입니다.
     - pin : pinned page를 포함하고 있는 frame의 수입니다.
     - virtual : working segment를 위한 system virtual space에 할당된 page 수입니다.
   - pg space
     쉽게 swap 대한 정보 출력합니다.
     - size : 전체 paging 공간 크기입니다.
     - inuse : 사용중인 paging 공간입니다.
   - pin
     고정 영역에 대한 상세 정보입니다.
     - work : 작업 세그먼트 페이지를 포함하는 page 수입니다.
     - pers : 영구 세그먼트 페이지를 포함하는 page 수입니다.
     - clnt : 클라이언트 세그먼트 페이지를 포함하는 page 수입니다.

- vmo

vmo는 memory관련된 튜닝을 위해 VMM setting을 위한 툴입니다.

vmo 에는 다양한 tuning parameter가 있으며, 이러한 parameter를 활용하여 시스템에서 메모리 관리에 관련된 효과적인 방법을 제시할 수 있습니다.

 

 

굉장히 다양한 parameter들이 있습니다. 흔히 접하게 되는 값들로는 maxclient%, maxfree, maxperm%, maxpin%, minfree, minperm%등이 있습니다.

vmo의 값 parameter에 대해서는 따로 포스팅하기로 하겠습니다.

 

이렇게 기본적으로 AIX에서 내부적인 memory관리를 이해하기 위한 내용과 모니터링 부분에 대해 알아보았습니다.

위의 내용을 기본으로 좀더 세부적인 메카니즘을 알아가 보시는 것도 재미있을것 같습니다.

반응형
반응형


참조    : http://ssambback.tistory.com/entry/Unix-or-Linux-%EB%B3%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%97%90%EB%9F%AC%EB%93%A4


프로그램 에러 시그널들 (SIGFPE, SIGILL, SIGSEGV, SIGBUS, SIGABRT) - 매우 중요 ★★★★★

다음의 시그널들은 심각한 프로그램의 에러가 운영체제나 컴퓨터 자체에 의해 검출되었을 때 발생 된다. 
일반적으로, 이들 시그널 모두는 당신의 프로그램이 심각하게 깨져있고, 에러가 포함된 그 실행을 계속할 아무런 방법이 없음을 지적한다.


어 떤 프로그램들은 프로그램의 에러 시그널로 인해서 종료되기전에 그들을 깨끗하게 처리한다. 예를 들어, 터미널 입력의 반향을 끈(tnun off) 프로그램들은 다시 반향을 켤 목적으로 프로그램 에러 시그널들을 처리할 것이다. 핸들러는 시그널을 위한 디폴트 동작을 정하고 그 동작을 함으로써 끝날 것이다. 만일 프로그램이 시그널 핸들러를 가지지 않았다면, 프로그램은 그 시그널로 인해서 종료될 것이다.

SIGFPE 시그널은 심각한 산술적 에러를 보고한다. 그 이름이 "floating-point exception"에서 유래된것이라 할지라도, 이 시그널은 실제로는 모든 산술적 에러들에 작용한다. 만일 어떤 프로그램이 어떤 위치에 정수 데이터를 저장하고 그 데이터에 플로팅-포인트 명령을 사용한다면, 이것은 그 프로세서가 데이터를 플로팅-포인트 수로써 인식할 수 없기 때문에 종종 "유용하지 않은 연산"의 원인이 된다.

SIGILL 시그널의 이름은 "비합법적인 명령(illegal instruction)"에서 유래되었다
그것은 쓸모없거나 특권이 부여된 명령어를 실행하려 했다는 의미이다. 
오직 유용한 명령어만이 발생된 C 컴파일러에서, SIGILL은 전형적으로 실행 가능 파일이 훼손되었거나, 당신이 데이터를 실행하려 시도했다는 것을 지적한다. 

후자의 상황이 발생되는 일반적 상황으로는 함수를 위한 포인터가 있을 것이라고 예상된 곳에서 유용하지 않은 오브젝트를 파싱하거나, 자동 배열의 끝을 넘어서 기록을 하고( 또는 자동 변수를 위한 포인터와 유사한 문제들) 스택 프레임의 반환 어드레스 처럼 스택에서 
다른 데이터의 훼손과 같은 문제들이 있다.

SIGSEGV 시그널은 할당된 메모리의 범위를 벗어나는곳에서 읽거나, 쓰기를 시도할 때 발생 된다. 
(실제로, 그 시그널들은 프로그램이 충분한 영역을 할당받지 못할 때 시스템 메모리 보호 메커니즘에 의해서 발생한다.) 

그 이름은 "segmentation violation"의 약자이다. 
SIGSEGV 상황이 발생되는 가장 일반적인 방법은 비참조 되는 널( defeferencing a null) 이나 초기화되지 않은 포인터에 의한 것이다. 

널 포인터는 주소 0으로 참조되고, 대부분의 운영체제는 이 주소가 정확하게 유용하지 않음을 확실히 
하기 때문에 
비참조 널 포인터는 SIGSEGV가 발생될 것이다. 
(어떤 운영체제는 주소가 0인 메모리도 유용하고, 비참조 널 포인터는 그들 시스템상에서는 시그널을 발생하지 않는다.) 
비초기화된 포인터에서는, 유용하지 않거나, 유용하더라도 임의의 주소들을 갖게된다. 
SIGSEGV 상황이 얻어지는 다른 일반적 방법은 배열에 포인터를 사용했을 때 그 배열의 끝을 체크하기를 실패했을 때이다. 

SIGBUS 시그널은 유용하지 않은 포인터가 비참조되었을 때 발생 된다. 
SIGSEGV 처럼, 이 시그널은 초기화되지 않은 포인터를 비참조 한 것의 결과이다. 
두 시그널의 차이점은 SIGSEGV는 유용한 메모리에서 유용하지못한 억세스를 지적하고, 
SIGBUS는 유용하지못한 주소를 억세스 하는 것을 지적한다. 
특별하게, SIGBUS 시그널은 4개로 나누어지지 않은 주소에 4-단어 정수로 참조하는것처럼, 
부적당한 포인터가 비참조 됨으로써 발생한다. 
(각종 시스템은 주소 정렬은 위한 자신만의 필요조건을 갖는다.) 이 시그널의 이름은 "bus error"의 약자이다.

SIGABRT 시그널은 프로그램 그 자체와 abort가 호출되었음을 보고함으로써 발생되는 에러를 지적한다.

2. 종료 시그널 (SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGKILL) - 중요 ★★★★

이들 시그널들은 이런 저런 방법으로 프로세스를 종료함을 알리기위해 사용된다. 
그들은 완전히 다른 목적을 위해 사용되기 때문에 다른 이름을 가졌고, 프로그램은 그들은 다르게 취급하기를 원할 것이다.
이들 시그널들은 처리하기 위한 이유는 보통 당신의 프로그램이 실제로 종료되기전에 적당하게 처리할 수 있도록 하기 위한 것이다. 
예를 들어, 당신은 상황정보를 저장하고, 임시 파일들을 지우고, 이전의 터미널 모드를 반환하기를 원할수도 있다. 
그와 같이 핸들러(handler)는 발생된 시그널을 위한 디폴트 동작을 지정하고 그리고 그 시그널을 다시 발생시킴으로써 종료할 것이다. 
이것은 만일 프로그램이 핸들러를 가지지 않았더라도, 그 시그널로 인해서 프로그램이 종료될 것이다.

SIGHUP ("hang-up") 시그널은 사용자 터미널의 단절을 보고하기 위해 사용되어지는데, 
아마도 네트웍이나 전화선 연결이 끊어졌기 때문이다. 

SIGINT("program interrupt") 시그널은 사용자가 INTR 문자를 (보통 C-c)을 입력했을 때 보내어진다. 

SIGQUIT 시 그널은 다른 키_QUIT 문자, 보통 C-\_에 의해서 제어된다는 것을 제외하고는 SIGINT와 유사하고, 그 프로세스가 종료 될 때 프로그램 에러 시그널처럼 코어 파일을 작성한다. 당신은 사용자에 의해 "검출된" 프로그램 에러 상황으로 이들을 생각할 수 있다. 

SIGTERM 시그널은 프로그램을 종료하는데 사용하는 포괄적인 시그널이다. SIGKILL과 달리, 이 신호는 블록되어진고, 처리되어지고 무시되어질 수 있다.

SIGKILL 시그널은 즉각적인 프로그램 종료를 일으키기 위해서 사용되어진다. 이 시그널은 처리되거나, 무시되거나 할 수 없고, 그 결과는 항상 치명적이 된다. 이 시그널은 블록하는것도 불가능하다. 

3. 알람 시그널 (SIGALRM, SIGVTALRM, SIGPROF) - 알아도 그만.. 몰라도 그만..  ^^;;

그들 시그널은 타이머의 경과를 지적하는데 사용되어진다. 
그들 시그널을 위한 디폴트 동작은 프로그램을 종료를 일으키는 것이다. 
이 디폴트 동작은 거의 유용하지 않다. 
그 들 시그널을 사용하는 대부분의 방법은 어느 경우에 맞는 핸들러 함수들을 요구하는 것이다.

SIGALRM 시그널은 전형적으로 실제또는 클럭 시간을 계산한 타이머의 경과를 지적한다. 
예를 들어 alarm 함수에의해 사용되어진다. 

SIGVTALRM 시그널은 전형적으로 현재 프로세스에 의해 사용된 CPU시간을 계산하는 타이머의 경과를 지적한다. 
그 이름은 "virtual time alarm"의 약자이다.

SIGPROF 시그널은 현재의 프로세스에 의해 사용된 CPU 시간과, 
프로세스를 대신하여 시스템에의해 사용된 CPU시간의 둘을 계산한 타이머의 경과를 지적하는데 사용된다. 
타이머가 자원의 프로파일링을 위한 도구로써 사용되어지므로, 시그널의 이름이 SIGPROF이다.

4. 비동기 입/출력 시그널 (SIGIO, SIGURG)

이 절에 설명된 시그널들은 비동기 입/출력 도구들과 함께 사용되어진다. 
당신은 어떤 특정한 파일 기술자가 그들 시그널을 발생시키도록 하기 위해서 fcntl을 호출함으로써 명백한 동작을 취하도록 해야한다.

SIGIO 시그널은 파일기술자가 입력 또는 출력을 수행할 준비가 되어있을 때 보내어진다. 
대부분의 운영체제에서, 터미널과 소켓만이 SIGIO를 발생시킬 수 있다. 
보통의 파일들을 포함한 다른 종류들은 당신이 그들에게 요청했을지라도 SIGIO신호를 발생시키지 않는다.

SIGURG 시그널은 소켓에 도착한 데이터가 "긴급"하거나 범위를 벗어 났을 때 보내어진다.

5. 작업 제어 시그널 (SIGCHLD, SIGCONT, SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU) - 중요 ★★★★

이들 시그널은 작업 제어를 지원하기 위해서 사용되어진다. 
만일 당신의 시스템이 작업 제어를 지원하지 않는다면 시그널들은 발생되어지거나, 처리될 수는 없지만 매크로들은 정의되어있다. 
당신이 실제로 작업이 어떻게 제어되는지를 이해할 수 없다면 그들 시그널을 그대로 방치할 것이다.

SIGCHLD 시그널은 자식 프로세스들중의 하나라도 종료되거나 멈출 때마다 부모 프로세스에게 보내어진다. 
이 시그널을 위한 디폴트 동작은 그것을 무시하는 것이다. 

당신은 프로세스가 계속되도록 하기 위해서 SIGCONT 신호를 보낼 것이다.
SIGCONT 시그널을 위한 디폴트 동작은 만일 그 프로세스가 멈추었다면 그 프로세스를 계속하도록 만드는 것이고 
그렇지 않다면 그것을 무시하는 것이다. 
대부분의 프로그램에서는 SIGCONT를 처리할 아무런 이유가 없다. 
그들은 전에 멈추었었음을 인식함이 없이 계속 실행되고 있다고 가정한다. 

SIGSTOP 시그널은 프로세스를 멈춘다. 그것은 처리되거나, 무시되거나 블록될 수 없다.

SIGTSTP 시그널은 상호 작용하는 멈춤 신호이다. SIGSTOP와는 달리 이 신호는 처리되거나 무시되어질 수 있다. 
당신의 프로그램에서 프로세스가 멈추었을 때 파일이나 시스템 테이블을 안전한 상황으로 만들어놓을 특별한 필요가 있다면 
이 신호를 처리할 수 있다.

한 프로세스가 배경 작업으로써 실행되고 있는 동안 사용자의 터미널로부터 읽을 수 없다. 
배경 작업에 속한 어느 프로세스가 터미널로부터 읽으려 시도할 때, 그 작업에 속한 모든 프로세스는 SIGTTIN 신호를 받는다. 
이 시그널을 위한 디폴트 동작은 그 프로세스를 멈추는 것이다. 

SIGTTOU 시그널은 배경 작업에 속한 프로세스가 터미널에 출력하려 시도하거나 그 터미널 모드를 설정하려 시도할 때 발생 된다. 
다시 말하면 디폴트 동작은 그 프로세스를 멈추는 것이다. 
프로세스가 멈추어있을 동안, SIGKILL 시그널과 SIGCONT시그널을 제외하고는 어느 다른 시그널들은 배달되어질 수 없다.

SIGKILL 시그널은 항상 프로세스의 종료를 유발하고 블록되거나 무시될 수 없다. 
당신이 SIGCONT 시그널을 무시하거나 블록할 수 있지만, 그것은 만일 그 프로세스가 멈추어져있다면 프로세스가 계속되도록 한다. 
프로세스에게 보낸 SIGCONT 시그널은 아직 미해결인채로 남아있는 멈춤 시그널을 프로세스가 버리도록 한다. 
이와 비슷하게, 어떤 프로세스에서 아직 미해결인채로 남아있는 SIGCONT 시그널은 멈춤 시그널이 도착했을 때 버려진다. 
고아가 되어버린 프로세스 그룹에 있는 한 프로세스에게 SIGTSTP, SIGTTIN, 또는 SIGTTOU 시그널을 보내면 그것은 처리되지도 않고, 
그 프로세스는 멈추어 지지도 않는다. 
그것을 계속할 아무런 방법이 없는 부당하게 되어버린 프로세스를 멈추게 하라. 
운영체제에 의존하지 말고당신이 무언가를 사용해서 멈추게 하라. 어떤 시스템은 아무런 일도 하지 않을 것이다. 
다른 시스템들은 대신에 SIGKILL 또는 SIGHUP와 같은 시그널들을 배달할 것이다. 

6. 잡다한 시그널 (SIGUSR1 ~ SIGUSR22)

그들 시그널은 다양한 다른 상활들을 보고하기 위해서 사용되어진다. 이들의 디폴트 동작은 프로세스가 종료되도록 하는 것이다.

SIGPIPE 시그널은 읽는 프로세스가 없는 상황에서의 PIPE에 대한 쓰기시 발생한다.

SIGUSR1 과 SIGUSR22 시그널들은 당신이 원하는 어떤 방법을 사용하지 못하도록 한다. 그들은 프로세스간 통신을 위해서 유용하다. 

그들 시그널을 보통 심각하기 때문에 당신은 그 시그널을 받은 프로그램에서 그들은 위한 시그널 처리를 해야할 것이다.



출처: http://ssambback.tistory.com/entry/Unix-or-Linux-별-프로그램-에러들 [Rehoboth.. 이곳에서 부터]

반응형

+ Recent posts