π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[νλ‘μΈμ€μ μ€λ λ λ€μ€ μ²λ¦¬] 리λ μ€ λΆν κ³Όμ κ³Ό νλ‘μΈμ€ λ³Έλ¬Έ
[νλ‘μΈμ€μ μ€λ λ λ€μ€ μ²λ¦¬] 리λ μ€ λΆν κ³Όμ κ³Ό νλ‘μΈμ€
μ§μ§μνμΉ΄ 2024. 1. 9. 16:47<μμμ§ λμ μ¬λ¬ΌμΈν°λ·μ μν 리λ μ€ νλ‘κ·Έλλ° 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