😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ 닀쀑 처리] λ¦¬λˆ…μŠ€ λΆ€νŒ… κ³Όμ •κ³Ό ν”„λ‘œμ„ΈμŠ€ λ³Έλ¬Έ

πŸ‘©‍πŸ’» IoT (Embedded)/Raspberry Pi

[ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ 닀쀑 처리] λ¦¬λˆ…μŠ€ λΆ€νŒ… κ³Όμ •κ³Ό ν”„λ‘œμ„ΈμŠ€

μ§•μ§•μ•ŒνŒŒμΉ΄ 2024. 1. 9. 16:47
728x90
λ°˜μ‘ν˜•

<μ„œμ˜μ§„ λ‹˜μ˜ 사물인터넷을 μœ„ν•œ λ¦¬λˆ…μŠ€ ν”„λ‘œκ·Έλž˜λ° with λΌμ¦ˆλ² λ¦¬νŒŒμ΄ μ„œμ μ„ μ°Έκ³ ν•΄μ„œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€ :-)>

 

⭐ λ¦¬λˆ…μŠ€ λΆ€νŒ… κ³Όμ •κ³Ό ν”„λ‘œμ„ΈμŠ€

PC μ—μ„œ 전원이 λ“€μ–΄μ˜€λ©΄ ROM (Read Only Meomry) / ν”Œλž˜μ‹œ (Flash) λ©”λͺ¨λ¦¬μ— λ“€μ–΄ μžˆλŠ” BIOS (Basic Input/Output System) κ°€ λ¨Όμ € μ‹€ν–‰λœλ‹€

BIOS μ—μ„œλŠ” μ‹œμŠ€ν…œμ„ μ κ²€ν•œ ν›„ ν•˜λ“œ λ””μŠ€ν¬μ˜ 첫 번째 섹터에 μžˆλŠ” GRUB λ‚˜ LILO 같은 λΆ€νŠΈλ‘œλ” μ‹€ν–‰

λΆ€νŠΈλ‘œλ”λŠ” λ¦¬λˆ…μŠ€ 컀널을 λ©”λͺ¨λ¦¬λ‘œ 올리고 μ‹œμŠ€ν…œμ„ μ΄ˆκΈ°ν™” ν•˜λŠ” 과정을 진행함

GRUB κ°€ λ¦¬λˆ…μŠ€ 컀널 이미지λ₯Ό λ©”λͺ¨λ¦¬λ‘œ λΆˆλŸ¬μ™€μ„œ μ‹œμŠ€ν…œ μ œμ–΄κΆŒμ„ μ»€λ„μ—κ²Œ λ„˜κ²¨μ€€λ‹€

μ»€λ„μ˜ λ‘œλ”©μ΄ μ‹œμž‘λ˜λ©΄μ„œ λΆ€νŒ…κ³Ό κ΄€λ ¨λœ λ©”μ‹œμ§€λ₯Ό ν„°λ―Έλ„λ‘œ 좜λ ₯ν•œλ‹€

λΆ€νŠΈλ‘œλ”λŠ” λ¦¬λˆ…μŠ€ 컀널 이미지λ₯Ό λ©”λͺ¨λ¦¬λ‘œ μ˜¬λ¦¬λŠ”λ° 컀널 μ΄λ―Έμ§€μ˜ 첫 뢀뢄이 기계어 μˆ˜μ€€μ˜ μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œλ‘œ λ˜μ–΄ μžˆλ‹€

 

μ²˜μŒμ— μƒμ„±λ˜λŠ” swapper(shed) ν”„λ‘œμ„ΈμŠ€ (PID 0번) 은 μŠ€μΌ€μ€„λ§μ— μ‚¬μš©λ˜λŠ” ν”„λ‘œμ„ΈμŠ€λ“€μ„ κ΄€λ¦¬ν•˜λŠ”λ°, ν”„λ‘œμ„ΈμŠ€λ“€μ„ λ©”λͺ¨λ¦¬μ™€ λ””μŠ€ν¬ μ‚¬μ΄μ—μ„œ μŠ€μ™‘ (swap in/out) ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€

swapper 은 init ν”„λ‘œμ„ΈμŠ€ (PID 1번) 을 μ‹€ν–‰ν•˜λŠ”λ° init ν”„λ‘œμ„Έμ„œλŠ” μƒˆλ‘œ μƒμ„±λ˜λŠ” 것이 μ•„λ‹ˆλΌ 기쑴에 swapper λ₯Ό μœ„ν•΄ λ§Œλ“€μ—ˆλ˜ ν”„λ‘œμ„ΈμŠ€μ˜ ꡬ쑰λ₯Ό λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•œλ‹€

PID 0번 ν”„λ‘œμ„ΈμŠ€λŠ” λΆ€νŒ… ν›„ λ°”λ‘œ 감좰지고, PID 1번 init ν”„λ‘œμ„ΈμŠ€λŠ” 계속 λ‚¨μ•„μ„œ λ‹€λ₯Έ λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ˜ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€κ°€ λœλ‹€

init ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰λ˜λ©΄μ„œ /etc/inittab νŒŒμΌμ„ μ½μ–΄μ„œ κ·Έ λ‚΄μš©λ“€μ„ μ°¨λ‘€λŒ€λ‘œ μ‹€ν–‰ν•˜λŠ”λ°, μ‹œμŠ€ν…œκ³Ό κ΄€λ ¨λœ μ„€μ • 파일과 데λͺ¬ ν”„λ‘œμ„ΈμŠ€λ“€μ΄ λ°±κ·ΈλΌμš΄λ“œ λͺ¨λ“œλ‘œ μ‹€ν–‰λœ ν›„ λͺ¨λ“  것이 μ™„λ£Œλ˜λ©΄ μ‚¬μš©μž 둜그인 ν”„λ‘¬ν”„νŠΈκ°€ ν‘œμ‹œλœλ‹€

 

μ»€λ„μ˜ λ‘œλ”©μ΄ 되면 μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ§Œλ“œλŠ”λ°, Cμ–Έμ–΄ μ½”λ“œκ°€ 싀행될 수 μžˆλ„λ‘ λ©”λͺ¨λ¦¬ ꡬ쑰λ₯Ό μ„€μ •ν•˜κ³  Cμ–Έμ–΄λ‘œ λ˜μ–΄ μžˆλŠ” μ΄ˆκΈ°ν™” μ½”λ“œκ°€ μ‹œμž‘λœλ‹€

 

Cμ–Έμ–΄μ˜ λ©”λͺ¨λ¦¬ μ˜μ—­(Segment) 의 ν…μŠ€νŠΈ μ˜μ—­μ€ CPU에 μ˜ν•΄ μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ…λ Ή μ½”λ“œλ“€μ„ 가지고 μžˆλŠ” μ˜μ—­μœΌλ‘œ ν”„λ‘œμ„ΈμŠ€ 간에 κ³΅μœ κ°€ κ°€λŠ₯ν•˜λ‹€

데이터 μ˜μ—­(Initialized data segment) 은 μ‹€ν–‰ μ‹œμž‘ μ‹œμ— μ΄ˆκΉƒκ°’μ„ κ°–λŠ” λ³€μˆ˜λ“€μ΄ λ“€μ–΄κ°€μžˆλ‹€

λΉ„μ΄ˆκΈ°ν™” 데이터 μ˜μ—­ (Uninitialized data segment) 인 bss (block started by symbol) 은 ν”„λ‘œμ„ΈμŠ€μ— μ˜ν•΄ 0으둜 μ΄ˆκΈ°ν™” λœλ‹€

νž™ μ˜μ—­ (heap) 은 malloc() μ΄λ‚˜ alloc() κ³Ό 같은 C μ–Έμ–΄μ˜ ν•¨μˆ˜λ“€μ΄ λ™μ μœΌλ‘œ λ©”λͺ¨λ¦¬ ν• λ‹Ήν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ¨

μŠ€νƒ μ˜μ—­ (stack) 은 ν•¨μˆ˜ 호좜 μ‹œ 긱쑴의 데이터λ₯Ό λ³΄κ΄€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ¨

ν…μŠ€νŠΈμ™€ 데이터 μ˜μ—­μ€ κ³ μ •λœ 크기λ₯Ό κ°–μ§€λ§Œ νž™κ³Ό μŠ€νƒ μ˜μ—­μ€ λ™μ μœΌλ‘œ μ¦κ°€ν•˜κ±°λ‚˜ κ°μ†Œν•¨

 

⭐ ν”„λ‘œμ„ΈμŠ€μ˜ 처리

ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰λ˜λ©΄ 각각의 ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œμ„ΈμŠ€ ID (PID, Process ID) λΌλŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό ꡬ뢄할 수 μžˆλŠ” λ³„λ„μ˜ ID λ₯Ό λΆ€μ—¬λ°›κ²Œ λœλ‹€

λ¦¬λˆ…μŠ€λ₯Ό μ‹œμž‘ν•˜λ©΄ μ‹€ν–‰λ˜λŠ” swapper λŠ” μ»€λ„μ—μ„œ 직접 μƒμ„±ν•˜μ§€λ§Œ, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ“€μ€ 기쑴의 ν”„λ‘œμ„ΈμŠ€λ₯Ό λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•œλ‹€

PID 0 은 μ‹œμŠ€ν…œ μŠ€μΌ€μ€„λŸ¬ (sche, swapper) 이고 PID 1 은 init ν”„λ‘œμ„Έμ„œ, PID 2λΆ€ν„° νŽ˜μ΄μ§€ 데λͺ¬ λ“±μ˜ μ‹œμŠ€ν…œ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄μ„œ μ„œλ‘œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€ ID λ₯Ό ν• λ‹Ή λ°›λŠ”λ‹€

 

ν”„λ‘œμ„ΈμŠ€κ°€ 생성될 λ•Œ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©λ˜λŠ”λ°, 

ps aux | more

λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•˜λŠ” κ²½μš°μ—λŠ” init ν”„λ‘œμ„ΈμŠ€λ‘œλΆ€ν„° νŒŒμƒλœ bash 셸이 ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•œλ‹€

bash λŠ” 자기 μžμ‹ μ„ λ³΅μ‚¬ν•΄μ„œ pid κ°€ λ‹€λ₯΄μ§€λ§Œ λ™μΌν•œ λ‚΄μš©μ„ κ°–κ³  μžˆλŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό λ§Œλ“œλŠ”λ°, μ΄λ•Œ fork() μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•œλ‹€

λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” exec() μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•΄μ„œ μƒˆλ‘œ μƒμ„±ν•œ ν”„λ‘œμ„ΈμŠ€μ˜ 곡간에 μƒˆλ‘œμš΄ ν”„λ‘œκ·Έλž¨μ˜ λ‚΄μš©μœΌλ‘œ μ±„μš°κ³  μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€

=> ps λͺ…령어와 more λͺ…λ Ήμ–΄λ₯Ό μœ„ν•œ 2개의 ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜κ³  νŒŒμ΄ν”„ (|) μ΄μš©ν•΄μ„œ 두 ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신 (IPC) λ₯Ό 톡해 λ‚΄μš©μ„ μ „λ‹¬ν•˜κ²Œ λœλ‹€

 

β˜‘οΈ getpid() 와 getppid() ν•¨μˆ˜

PID 0 인 swapper 을 μ œμ™Έν•œ ν”„λ‘œμ„ΈμŠ€λ“€μ€ λΆ€λͺ¨λ‘œλΆ€ν„° νŒŒμƒλ˜μ–΄ μƒμ„±λ˜λ―€λ‘œ, λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λ₯Ό ꡬ뢄할 수 μžˆλŠ” ppid (Parent PID)λΌλŠ” 값을 λ³„λ„λ‘œ 가진닀

 

getpid() ν•¨μˆ˜λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ ν”„λ‘œμ„ΈμŠ€ ID λ°˜ν™˜

getppid() ν•¨μˆ˜λŠ” λΆ€λͺ¨μ˜ PID λ°˜ν™˜

λ°˜ν™˜κ°’μ€ pid_T ν˜•μ΄λ‹€

 

 

⭐ ν˜„μž¬ μ‹œμŠ€ν…œμ—μ„œ λ§Œλ“€ 수 μžˆλŠ” μ‚¬μš©μž ν”„λ‘œμ„ΈμŠ€μ˜ 개수 ulimit λͺ…λ Ήμ–΄

ulimit λͺ…λ Ήμ–΄λŠ” μ΅œλŒ€ μŠ€νƒμ˜ 크기 λ“± ν˜„μž¬ μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ œν•œ 사항 을보여쀀닀

getrlimit() ν•¨μˆ˜λŠ” μ‹œμŠ€ν…œμ˜ μžμ›μ— λŒ€ν•œ μ œν•œ 사항

getrusage() ν•¨μˆ˜λŠ” ν˜„μž¬ μ‚¬μš© 쀑인 resource 정보λ₯Ό λ°˜ν™˜ν•¨

ulimit -a

 

#include <sys/time.h>
#include <sys/resource.h>
#include <stdio.h>

int main()
{
    struct rlimit rlim;

    /* ν˜„μž¬ μ‹œμŠ€ν…œμ—μ„œ 생성 κ°€λŠ₯ν•œ ν”„λ‘œμ„ΈμŠ€ */
    getrlimit(RLIMIT_NPROC, &rlim);
    printf("max user processes : %lu / %lu\n",
    rlim.rlim_cur, rlim.rlim_max);

    /* μ˜€ν”ˆ κ°€λŠ₯ν•œ 파일의 수 */
    getrlimit(RLIMIT_NOFILE, &rlim);
    printf("file size : %lu / %lu\n", rlim.rlim_cur, rlim.rlim_max);

    /* ν”„λ‘œμ„ΈμŠ€κ°€ 얻을 수 μžˆλŠ” μ΅œλŒ€ λ©”λͺ¨λ¦¬ */
    getrlimit(RLIMIT_RSS, &rlim);
    printf("max memory size : %lu / %lu\n", rlim.rlim_cur, rlim.rlim_max);

    /* 초 λ‹¨μœ„ CPU μ‹œκ°„ */
    getrlimit(RLIMIT_CPU, &rlim);
    if(rlim.rlim_cur == RLIM_INFINITY) { 	/* λ¬΄ν•œ μ‚¬μš© κ°€λŠ₯이면 UNLIMIT λ©”μ‹œμ§€ 좜λ ₯ */
        printf("cpu time : UNLIMIT\n");
    }

    return 0;
}

/*
gani@gani:~/raspi/Process_Signal $ gcc -o limit limit.c
gani@gani:~/raspi/Process_Signal $ ./limit 

ulimit λͺ…λ Ήμ–΄μ˜€ γ…λ™μΌν•œ κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€
*/
gcc -o limit limit.c
./limit

728x90
λ°˜μ‘ν˜•
Comments