'Linux API/linux'에 해당되는 글 55건

  1. 2023.11.17 mmap() 과 munmap() 예제
  2. 2023.11.13 mmap와 malloc
  3. 2023.10.24 /proc/uptime
  4. 2023.10.23 /proc/pid/statm
  5. 2023.10.19 malloc() 으로 할당된 메모리 리스트?
  6. 2023.06.21 inotify
  7. 2023.01.09 system v shmget size
  8. 2022.11.28 segfault시 calltree 출력하기
  9. 2022.11.24 pthread 테스트
  10. 2022.11.23 pthread
Linux API/linux2023. 11. 17. 16:54

munmap은 주소와 길이만 있으면 되는데

mmap은 fd가 있어야 한다.

#include <sys/mman.h>
void *mmap(void *addr, size_t lengthint " prot ", int " flags , int fd, off_t offset);
int munmap(void *addr, size_t length);

[링크 : https://linux.die.net/man/2/mmap]

 

그래서 직접 구현하려니 먼가 복잡하고 귀찮아서 찾아보니 실행되는 녀석 발견.

테스트 소스를 긁어와서 빌드하고 실행하면 되는데, 아래와 같이 두개의 인자를 주어야 한다.

일종의 cp 명령을 코드로 짠 느낌.

$ ./a.out in_filename out_filename 

#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char *argv[]){
        int srcfd, dstfd; //src 파일 서술자, dst 파일 서술자
        void *src, *dst;  //src 메모리 주소, dst 메모리 주소
        size_t copysz; //다음 copy할  메모리 내용 size
        struct stat sbuf;
        off_t fsz = 0; //다음 읽기, 쓰기를 기록할 위치(offset)
        long page_size; //시스템의 PAGE SIZE

        if((srcfd = open(argv[1], O_RDONLY)) < 0) {
                fprintf(stderr, "can't open %s for reading \n",argv[1]);
                exit(1);
        }

        if((dstfd = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0777)) < 0){
                fprintf(stderr, "can't open %s for writing\n", argv[2]);
                exit(1);
        }


        //file 사이즈 얻기 위한 용도
        if(fstat(srcfd, &sbuf) < 0){
                fprintf(stderr, "fstat error\n");
                exit(1);
        }

        if(ftruncate(dstfd, sbuf.st_size) < 0){
                fprintf(stderr, "ftruncate error\n");
                exit(1);
        }

        page_size = sysconf(_SC_PAGESIZE);
        printf("page_size : %ld\n", page_size);

        while(fsz < sbuf.st_size){

                if((sbuf.st_size - fsz ) > page_size)
                        copysz = page_size;
                else
                        copysz = sbuf.st_size - fsz;

                //src 주소 설정
                if((src = mmap(0, copysz, PROT_READ, MAP_SHARED, srcfd, fsz))
                                == MAP_FAILED){
                        fprintf(stderr, "mmap error for input \n");
                        printf("error : %s\n",strerror(errno));
                        exit(1);
                }

                //dst 주소 설정 , 여기서 MAP_SHARED를 MAP_RPIVATE로 바꾸면? dst파일에 저장되지 않는다.
                if((dst = mmap(0, copysz, PROT_READ|PROT_WRITE, MAP_SHARED, dstfd, fsz)) == MAP_FAILED){
                        fprintf(stderr, "mmap error for output\n");
                        exit(1);
                }

                //src -> dst로 내용 복사
                memcpy(dst, src, copysz);

                //메모리 해제
                munmap(src, copysz);
                munmap(dst, copysz);
                //복사한 내용만큼 다음 메모리 위치를 이동시킬 offset 증가
                fsz += copysz;

        }

        exit(0);
}

[링크 : https://reakwon.tistory.com/225]

 

특이한건 munmap() 에서 copysz를 /2로 해서 넣어도 return 값이 0 으로 나온다.

                int ret = munmap(src, copysz / 2);
printf("ret[%d]\n",ret);
                ret = munmap(dst, copysz / 2);
printf("ret[%d]\n",ret);

그러면.. 예상한것과 좀 다른데..

나중에 프로그램을 천천히 실행하도록 해서 메모리 누수가 발생하는지 찾아봐야 할 듯..

'Linux API > linux' 카테고리의 다른 글

mmap와 malloc  (0) 2023.11.13
/proc/uptime  (0) 2023.10.24
/proc/pid/statm  (0) 2023.10.23
malloc() 으로 할당된 메모리 리스트?  (0) 2023.10.19
inotify  (0) 2023.06.21
Posted by 구차니
Linux API/linux2023. 11. 13. 17:35

무지성으로 mmap이니 반대 짝이 먼지 찾아서 munmap 하고 쓰고 있었는데

mmap과 malloc의 차이 그리고 malloc이 어떻게 구현되어있는지 문득 궁금해졌다.

 

munmap 서브루틴은 맵핑된 파일이나 공유 메모리 영역 또는 익명 메모리 영역을 맵핑 해제합니다. munmap 서브루틴은 호출에서 작성된 영역을 mmap 서브루틴으로만 맵핑 해제합니다.

주소가 munmap 서브루틴에 의해 맵핑되지 않은 리젼에 있고 해당 리젼이 이후에 다시 맵핑되지 않는 경우, 해당 주소에 대한 모든 참조로 인해 프로세스에 SIGSEGV 신호가 전달됩니다.

[링크 : https://www.ibm.com/docs/ko/aix/7.3?topic=m-munmap-subroutine]

 

mmap()에서는 할당 메모리의 크기가 최소 4KB(mmap()은 페이지 크기의 배수로 할당).
malloc()은 큰 메모리 블록 요청이 들어오면 내부적으로 mmap()을 써서 메모리를 할당한다. 
mmap()이 malloc()을 포함하는 개념이라기보다 mmap()은 시스템에서 제공하는 저수준 시스템 콜이며 특별한 조건일 때 메모리를 할당하는 효과를 볼 수 있다. malloc()은 메모리를 할당하는 C library 함수이며 내부적으로 mmap(), brk() 등 시스템 콜을 써서 구현.

[링크 : https://woonys.tistory.com/entry/정글사관학교-51일차-TIL-mmap과-malloc-차이-정리]

[링크 : https://mintnlatte.tistory.com/357]

 

직접 mmap()을 쓸 경우, valgrind/efence/duma 등 메모리 디버깅 툴의 도움을 받을 수도 없습니다.

[링크 : https://kldp.org/node/101737]

 

malloc.c 에서 함수를 찾는데 mmap을 먼저 찾고 역으로 올라가면서 찾아보는 중

static void *
sysmalloc (INTERNAL_SIZE_T nb, mstate av)
{
      if ((unsigned long) (size) > (unsigned long) (nb))
        {
          mm = (char *) (MMAP (0, size, PROT_READ | PROT_WRITE, 0));
        }
}


static void *
_int_malloc (mstate av, size_t bytes)
{
  if (__glibc_unlikely (av == NULL))
    {
      void *p = sysmalloc (nb, av);
      if (p != NULL)
alloc_perturb (p, bytes);
      return p;
    }
}


void *
__libc_malloc (size_t bytes)
{
  if (SINGLE_THREAD_P)
    {
      victim = _int_malloc (&main_arena, bytes);
      assert (!victim || chunk_is_mmapped (mem2chunk (victim)) ||
      &main_arena == arena_for_chunk (mem2chunk (victim)));
      return victim;
    }

  arena_get (ar_ptr, bytes);

  victim = _int_malloc (ar_ptr, bytes);
}

[링크 : https://elixir.bootlin.com/glibc/glibc-2.26/source/malloc/malloc.c]

 

위의 함수들에 대한 자세한 설명은 아래 참조

[링크 : https://m.blog.naver.com/yjw_sz/221549666704]

'Linux API > linux' 카테고리의 다른 글

mmap() 과 munmap() 예제  (0) 2023.11.17
/proc/uptime  (0) 2023.10.24
/proc/pid/statm  (0) 2023.10.23
malloc() 으로 할당된 메모리 리스트?  (0) 2023.10.19
inotify  (0) 2023.06.21
Posted by 구차니
Linux API/linux2023. 10. 24. 16:00

proc fs의 uptime의

첫번째는 uptime(시스템 레벨)

두번째는 uptime * core * idle time (코어 idle 타임 합산)

이라고 하는데 두번째가 어떤 의미를 지닐진..

이론상 시스템이 100% 사용중이면

uptime은 증가하지만 두번째는 시스템 기동되고 cpu 100% 쓰기 전까지의 시간만으로 기록되려나?

 

$ cat /proc/uptime
624319.95 1141902.92

$ top

top - 15:57:56 up 7 days,  5:25,  1 user,  load average: 0.68, 0.57, 0.54

[링크 : https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-uptime]

'Linux API > linux' 카테고리의 다른 글

mmap() 과 munmap() 예제  (0) 2023.11.17
mmap와 malloc  (0) 2023.11.13
/proc/pid/statm  (0) 2023.10.23
malloc() 으로 할당된 메모리 리스트?  (0) 2023.10.19
inotify  (0) 2023.06.21
Posted by 구차니
Linux API/linux2023. 10. 23. 12:21

top 에서 출력되는 메모리 사용량이 어디서 나오나 찾아보는 중인데

일단 proc fs에서 statm 이라는 것을 발견

 

proc/77145$ cat statm
3178 1312 896 223 0 467 0

 

다만 page 단위라서, top 처럼 byte 단위로 보는건 어디인지 아직 못 찾음.

Table 1-3: Contents of the statm files (as of 2.6.8-rc3)
..............................................................................
 Field    Content
 size     total program size (pages)        (same as VmSize in status)
 resident size of memory portions (pages)   (same as VmRSS in status)
 shared   number of pages that are shared   (i.e. backed by a file, same
                                             as RssFile+RssShmem in status)
 trs      number of pages that are 'code'   (not including libs; broken,
                                             includes data segment)
 lrs      number of pages of library        (always 0 on 2.6)
 drs      number of pages of data/stack     (including libs; broken,
                                             includes library text)
 dt       number of dirty pages             (always 0 on 2.6)

[링크 : https://stackoverflow.com/questions/60644373/how-do-i-decode-the-output-of-proc-statm]

'Linux API > linux' 카테고리의 다른 글

mmap와 malloc  (0) 2023.11.13
/proc/uptime  (0) 2023.10.24
malloc() 으로 할당된 메모리 리스트?  (0) 2023.10.19
inotify  (0) 2023.06.21
system v shmget size  (0) 2023.01.09
Posted by 구차니
Linux API/linux2023. 10. 19. 16:21

관용적으로 malloc() 해서 받은 인자가 0인지 확인하고(fail)

그 값을 포인터에 넣고 썼을 뿐이고, free() 하면서 null 값을 넣어주곤 했는데

반대로 system call이나 라이브러리를 이용하여

현재 사용중인 프로그램에서 malloc()을 요청해서 관리중인 리스트 이런건 구할 수 없는건가?

조사가 필요한 듯..

 

[링크 : https://www.gnu.org/software/libc/manual/html_node/Memory-Allocation-Probes.html]

[링크 : https://www.reddit.com/r/cpp_questions/comments/pi8lhg/how_do_i_check_if_a_pointer_is_valid/]

[링크 : https://stackoverflow.com/questions/993324/how-to-check-if-a-pointer-is-valid]

[링크 : https://stackoverflow.com/questions/5716100/what-happens-in-the-kernel-during-malloc]

'Linux API > linux' 카테고리의 다른 글

/proc/uptime  (0) 2023.10.24
/proc/pid/statm  (0) 2023.10.23
inotify  (0) 2023.06.21
system v shmget size  (0) 2023.01.09
segfault시 calltree 출력하기  (0) 2022.11.28
Posted by 구차니
Linux API/linux2023. 6. 21. 10:37

파일 이벤트를 감시하는 API

 

그런데 내용만 봐서는 디렉토리 레벨로는 어떻게 감시가 되는데

파일시스템 오류로 파티션 전체가 read only로 바뀌면

해당 이벤트가 모니터링 되는진 좀 더 봐야 할 듯.

[링크 : https://man7.org/linux/man-pages/man7/inotify.7.html]

[링크 : https://sonseungha.tistory.com/436]

[링크 : https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?mod=document&uid=236732]

'Linux API > linux' 카테고리의 다른 글

/proc/pid/statm  (0) 2023.10.23
malloc() 으로 할당된 메모리 리스트?  (0) 2023.10.19
system v shmget size  (0) 2023.01.09
segfault시 calltree 출력하기  (0) 2022.11.28
pthread 테스트  (0) 2022.11.24
Posted by 구차니
Linux API/linux2023. 1. 9. 19:05

ipcs -m 하면 키, id, size가 나오는데

어떻게 size를 받아내나 싶어서 찾아보니 먼가 나오긴 한다.

 

struct shmid_ds buf;
shmctl(shm, IPC_STAT, &buf);
int length = (int) buf.shm_segsz / sizeof(int);

[링크 : http:// https://stackoverflow.com/questions/60219469/find-size-of-shared-memory-in-c-shmget]

'Linux API > linux' 카테고리의 다른 글

malloc() 으로 할당된 메모리 리스트?  (0) 2023.10.19
inotify  (0) 2023.06.21
segfault시 calltree 출력하기  (0) 2022.11.28
pthread 테스트  (0) 2022.11.24
pthread  (0) 2022.11.23
Posted by 구차니
Linux API/linux2022. 11. 28. 21:29

arm64(i.mx8) 에서는 

caller_address = (void *) uc->uc_mcontext.arm_pc;

대신

caller_address = (void *) uc->uc_mcontext.pc; 로 하니 빌드가 된다.

 

[링크 : https://snowdeer.github.io/c++/2017/08/30/segmentation-fault-call-stack/]

'Linux API > linux' 카테고리의 다른 글

inotify  (0) 2023.06.21
system v shmget size  (0) 2023.01.09
pthread 테스트  (0) 2022.11.24
pthread  (0) 2022.11.23
iio(industrial io) 문서  (0) 2022.11.11
Posted by 구차니
Linux API/linux2022. 11. 24. 10:23

심심(?)해서 pthread를 1회성으로 구동하고 죽게 냅두면 어떻게 되나 궁금해서 해봤는데

메모리 16GB 시스템에서 32753개 정도까지 밖에 구동 못하고 메모리를 할당할 수 없다고 죽는다.

user space 메모리는 문제가 없는 것 같은데 커널 메모리를 다 먹어 버린건가?

$ cat main.c
#include <stdio.h>
#include <pthread.h>

void *func(int *val)
{
        printf("hello %d\n", *val);
}

void main()
{
        pthread_t pt;
        int pid = 0;
        int i = 0;
        for(i = 0; i < 100000; i++)
        {
                pid = pthread_create(&pt, NULL, func, &i);
                if (pid > 0 )
                {
                        perror("thread create error");
                        exit(0);
                }
        }
}
$ gcc main.c -lpthread
$ ./a.out
hello 32753
thread create error: Cannot allocate memory
$ top
top - 10:16:37 up 8 days, 23:07,  3 users,  load average: 0.39, 0.24, 0.09
Tasks: 363 total,   3 running, 293 sleeping,   0 stopped,   0 zombie
%Cpu(s):  6.2 us, 25.0 sy,  0.0 ni, 66.2 id,  0.0 wa,  0.0 hi,  2.5 si,  0.0 st
KiB Mem : 16169232 total,   808336 free,  2131900 used, 13228996 buff/cache
KiB Swap:  2097148 total,  2095356 free,     1792 used. 13436824 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
25250 minimonk   20   0  0.107t 117784   1584 R 131.8  0.7   0:00.29 a.out
22599 minimonk   20   0  110440   6228   4996 R  81.8  0.0   0:17.60 sshd
21729 root      20   0       0      0      0 I   9.1  0.0   0:00.11 kworker/u16:3-e
22764 root      20   0       0      0      0 I   9.1  0.0   0:01.27 kworker/u16:2-e
17413 root      20   0       0      0      0 I   4.5  0.0   0:02.40 kworker/4:0-eve
18086 root      20   0       0      0      0 I   4.5  0.0   0:02.63 kworker/5:0-eve
21979 root      20   0       0      0      0 I   4.5  0.0   0:01.56 kworker/1:1-eve
22094 root      20   0       0      0      0 I   4.5  0.0   0:00.80 kworker/3:1-eve
22446 root      20   0       0      0      0 I   4.5  0.0   0:00.61 kworker/2:0-eve
27802 minimonk   20   0   45652   4232   3476 R   4.5  0.0   0:00.97 top

[링크 : https://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch07_Thread]

 

 

+

pthread_join()으로 쓰레드가 끝나길 기다리는데 안 끝난다.

return이 없어서인가.. 쓰레드도 종료를 하는 다른 함수가 있는건가?

 

+

다시 해보니 pthread_join에 포인터로 pthread_t 변수를 넘겨서 그랬던 듯. 잘 돈다.

#include <stdio.h>
#include <pthread.h>

void *func(int *val)
{
    printf("hello %d\n", *val);

//  return ((void*)0);
}

void main()
{
    pthread_t pt;
    int pid = 0;
    int i = 0;
    int status = 0;
    for(i = 0; i < 100000; i++)
    {
        pid = pthread_create(&pt, NULL, func, &i);
        if (pid > 0 )
        {
            perror("thread create error");
            exit(0);
        }
        pthread_join(pt, (void**)&status);
    }
}

[링크 : https://www.joinc.co.kr/w/Site/Thread/Advanced/ThreadCancle]

 

좀.. 비슷한 타입으로 하게 하라고 -_-

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
int pthread_join(pthread_t thread, void **retval);

 

+

pthread_join 안하니 다시 메모리 할당 오류. 쓰레드 에서 return 0 하는거랑은 상관없다.

#include <stdio.h>
#include <pthread.h>

void *func(int *val)
{
        printf("hello %d\n", *val);

//      return ((void*)0);
}

void main()
{
        pthread_t pt;
        int pid = 0;
        int i = 0;
        int status = 0;
        for(i = 0; i < 100000; i++)
        {
                pid = pthread_create(&pt, NULL, func, &i);
                if (pid > 0 )
                {
                        perror("thread create error");
                        exit(0);
                }
//              pthread_join(pt, (void**)&status);
        }
}

 

detach 하면 종료시 자동으로 자원 반납이 된다고 한다.

테스트 해보니 return도 필요없이 쓰레드에서 실행될 함수가 종료되면 그냥 종료된다.

랜덤하게 안되긴 한데, printf가 중첩되서 버퍼가 쌓이며 문제가 생기는거 같기도 하고? (쓰레드를 5만개 넘기는 시점이니)

기본적으로 스레드의 종료 코드는 스레드가 종료되더라도 pthread_join이 호출될 때까지 유지됩니다. 하지만, detatch 상태의 스레드는 종료되는 즉시 자원이 회수됩니다

[링크 : http://xucxo.blogspot.com/2011/03/linux-programming-thread.html]

 

'Linux API > linux' 카테고리의 다른 글

system v shmget size  (0) 2023.01.09
segfault시 calltree 출력하기  (0) 2022.11.28
pthread  (0) 2022.11.23
iio(industrial io) 문서  (0) 2022.11.11
mkpipe 와 poll  (0) 2022.10.26
Posted by 구차니
Linux API/linux2022. 11. 23. 19:03

'Linux API > linux' 카테고리의 다른 글

segfault시 calltree 출력하기  (0) 2022.11.28
pthread 테스트  (0) 2022.11.24
iio(industrial io) 문서  (0) 2022.11.11
mkpipe 와 poll  (0) 2022.10.26
‘F_SETPIPE_SZ’ undeclared  (0) 2022.10.20
Posted by 구차니