System Call(μ‹œμŠ€ν…œ 콜)

2023. 3. 11. 19:34ㆍCS/CS μŠ€ν„°λ””

μ‚¬μš©μžκ°€ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€κ³  νŒŒμΌμ„ μ—΄μ–΄ λ¬Έμ„œ μž‘μ„± 및 μˆ˜μ •μ„ ν•˜λŠ” 것은 μΌμƒμ—μ„œλ„ ν”νžˆ μΌμ–΄λ‚˜λŠ” 일이닀.

이 μƒν™©μ—μ„œ μ‚¬μš©μžλŠ” ν”„λ‘œκ·Έλž¨ 생성과 파일 μž‘μ„±, μˆ˜μ •μ— λŒ€ν•œ μ œμ–΄κΆŒμ„ μ™„λ²½νžˆ 가지고 μžˆλ‹€κ³  생각할 수 μžˆλ‹€.

사싀은, 해당과정은 μš΄μ˜μ²΄μ œμ— μ˜ν•΄ μˆ˜ν–‰λœ κ²ƒμœΌλ‘œ λ΄μ•Όν•˜κ³  μ‚¬μš©μžλŠ” λ‹¨μˆœνžˆ μš”μ²­μ„ ν•œ 것에 μ§€λ‚˜μ§€ μ•ŠλŠ”λ‹€.

λ§Œμ•½ μ‚¬μš©μž ν˜Ήμ€ μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ΄ 직접 νŒŒμΌμ— μ ‘κ·Όν•˜κ±°λ‚˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성할 수 μžˆλŠ” κΆŒν•œμ΄ μžˆλ‹€λ©΄ μ–΄λ–»κ²Œ 될까.

μ‚¬μš©μžλŠ”, 항상 μ„ μ˜λ₯Ό κ°–κ³  ν–‰λ™ν•˜μ§€λŠ” μ•ŠκΈ° λ•Œλ¬Έμ— μ•…μ˜λ₯Ό 가진 μ‚¬μš©μžκ°€ μ‹œμŠ€ν…œμ„ 망칠 κ°€λŠ₯성이 μ‘΄μž¬ν•œλ‹€.

λ”°λΌμ„œ μ‹œμŠ€ν…œμ— μœ„ν˜‘μ΄ 될 κ°€λŠ₯성이 μ‘΄μž¬ν•˜λŠ” μž‘μ—…μ— λŒ€ν•΄μ„œλŠ” μš΄μ˜μ²΄μ œκ°€ 직접 μˆ˜ν–‰ν•˜κ³  μ‚¬μš©μž 및 μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ€ 이에 λŒ€ν•œ μš”μ²­λ§Œ κ°€λŠ₯ν•˜λ‹€. 

이λ₯Ό μ‹œμŠ€ν…œ 콜이라고 ν•œλ‹€.

 

μ‹œμŠ€ν…œ 콜(System Call)

좜처: https://www.javatpoint.com/system-calls-in-operating-system

μš΄μ˜μ²΄μ œλŠ” μ‚¬μš©μžμ—κ²Œ μ΅œλŒ€ν•œμ˜ 자유λ₯Ό 보μž₯ν•΄μ•Όν•˜λ©°, κ·ΈλŸ¬λŠ” 와쀑에도 μ‹œμŠ€ν…œμ— λŒ€ν•œ 곡격을 λŒ€λΉ„ν•΄μ•Όν•œλ‹€.

λ”°λΌμ„œ μš΄μ˜μ²΄μ œλŠ” μœ μ € λͺ¨λ“œ κΆŒν•œμ„ 톡해 μ‚¬μš©μžμ—κ²Œ 자유λ₯Ό 보μž₯ν•˜λŠ” ν•œνŽΈ,

컀널 λͺ¨λ“œ κΆŒν•œμ„ 톡해 μ‹œμŠ€ν…œμ— μœ„ν˜‘μ΄ 될 κ°€λŠ₯성이 μžˆλŠ” μž‘μ—…μ„ 직접 μˆ˜ν–‰ν•˜μ—¬ μ‹œμŠ€ν…œ μœ„ν˜‘μ— λŒ€λΉ„ν•œλ‹€.

μ‹œμŠ€ν…œ μ½œμ€ μœ μ € λͺ¨λ“œμ™€ 컀널 λͺ¨λ“œ μ‚¬μ΄μ—μ„œ μ‚¬μš©μžκ°€ μ „λ‹¬ν•˜λŠ” μ£Όλ¬Έμ„œμΈ μ…ˆμ΄λ‹€.

μ‹œμŠ€ν…œ μ½œμ„ ν†΅ν•˜λ©΄ 크게 λ‹€μŒμ˜ 이점이 μ‘΄μž¬ν•œλ‹€.

  • μ‹œμŠ€ν…œμ— μœ„ν˜‘μ΄ λ λ§Œν•œ μž‘μ—…μ„ μš΄μ˜μ²΄μ œκ°€ μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— λ³΄μ•ˆμ μΈ μΈ‘λ©΄μ—μ„œ 이점이 쑴재
  • ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 컀널 λ‚΄λΆ€μ˜ κ΅¬ν˜„μ— λŒ€ν•΄ μ•Œ ν•„μš” 없이 잘 μΆ”μƒν™”λœ μ‹œμŠ€ν…œ 콜 μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν˜ΈμΆœν•˜κΈ°λ§Œ ν•˜λ©΄ λ˜λ―€λ‘œ 개발 λ‚œμ΄λ„ μΈ‘λ©΄μ—μ„œ 이점이 쑴재

 

μ‹œμŠ€ν…œ 콜 μž‘λ™ 방식

μ‹œμŠ€ν…œ μ½œμ€ λ‚΄λΆ€μ μœΌλ‘œ 트랩(Trap)을 μ΄μš©ν•œλ‹€.

(트랩의 이해λ₯Ό μœ„ν•œ 포슀트: https://one-armed-boy.tistory.com/entry/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8Interrupt)

μœ μ € λͺ¨λ“œ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‹œμŠ€ν…œ 콜 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄, μ‹œμŠ€ν…œ μ½œμ€ νŠΈλž©μ„ λ°œμƒμ‹œν‚¨λ‹€.

이 λ•Œ κΈ°μ‘΄ ν”„λ‘œμ„ΈμŠ€μ˜ μ •λ³΄λŠ” PCB에 μ €μž₯된 채 컀널 λͺ¨λ“œλ‘œ κΆŒν•œμ΄ κ²©μƒλ˜κ³ , 

호좜된 μ‹œμŠ€ν…œ μ½œμ— λŒ€ν•œ μž‘μ—…μ„ μš΄μ˜μ²΄μ œκ°€ μˆ˜ν–‰ν•œλ‹€.

ν•΄λ‹Ή μž‘μ—…μ€ 컀널 μŠ€νƒμ—μ„œ μˆ˜ν–‰λ˜κ³ , μˆ˜ν–‰μ΄ μ™„λ£Œλ˜λ©΄ ν•΄λ‹Ή 곡간을 μ œκ±°λœλ‹€.

μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ PCBλ₯Ό 톡해 κΈ°μ‘΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ³΅μ›ν•˜κ³ , μ‹œμŠ€ν…œ μ½œμ— λŒ€ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λ©° μž‘λ™μ΄ λλ‚œλ‹€.

 

μ‹œμŠ€ν…œ 콜의 μ’…λ₯˜

λŒ€ν‘œμ μΈ μ‹œμŠ€ν…œ μ½œλ‘œλŠ” λ‹€μŒμ΄ μžˆλ‹€.

  • fork()
  • wait()
  • exec()

μœ„μ—μ„œ μ–ΈκΈ‰ν•œ μ‹œμŠ€ν…œ μ½œλ“€μ˜ 곡톡점은 λ°”λ‘œ λ¦¬λˆ…μŠ€ μ‰˜μ˜ μž‘λ™ 방식과 연관이 μžˆλ‹€λŠ” 점인데,

이에 따라 μ‰˜μ˜ μž‘λ™κ³Ό 연관지어 이듀을 μ„€λͺ…ν•˜κ³ μž ν•œλ‹€.

fork()

forkλŠ” μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μ‹œμŠ€ν…œ μ½œμ΄λ‹€.

forkλŠ” νŠΉμ΄ν•œ λ°©μ‹μœΌλ‘œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜λŠ”λ°, λ°”λ‘œ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ³΅μ œν•˜λŠ” 방식을 μ΄μš©ν•œλ‹€.

이 λ•Œ μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” PID(ν”„λ‘œμ„ΈμŠ€ ID), PPID(λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€ ID), fork ν˜ΈμΆœμ— λŒ€ν•œ λ°˜ν™˜κ°’ μ™Έ λͺ‡λͺ‡μ˜ μš”μ†Œλ₯Ό μ œμ™Έν•˜λ©΄ κ·Έ μ™Έμ˜ λͺ¨λ“  것이 λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ™€ λ™μΌν•˜λ‹€.

λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ μ‹€ν–‰μ»¨ν…μŠ€νŠΈλ§ˆμ € 볡사λ₯Ό ν•˜κΈ° λ•Œλ¬Έμ—, λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ—μ„œ forkλ₯Ό ν˜ΈμΆœν•˜κΈ° μ „μ˜ μ½”λ“œλŠ” μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ‹€μ‹œ μ‹€ν–‰λ˜μ§€ μ•Šκ³  κ·Έ μ΄ν›„μ˜ μ½”λ“œμ— λŒ€ν•΄μ„œλ§Œ μ‹€ν–‰λœλ‹€.

ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 일반적으둜 fork의 호좜 값이 μžμ‹κ³Ό λΆ€λͺ¨μ—μ„œ λ‹€λ₯΄λ‹€λŠ” 점을 톡해 λΆ„κΈ° 처리λ₯Ό μ΄μš©ν•˜μ—¬ λ‹€λ₯Έ μ½”λ“œ 흐름을 μ‹€ν–‰μ‹œν‚€λŠ”λ°, λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” fork 호좜 값이 μƒμ„±λœ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ IDλ₯Ό κ°–λŠ” ν•œνŽΈ, μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” 0 값이 λ°˜ν™˜λœλ‹€.

기쑴의 forkλŠ” μ‹€ν–‰ μ¦‰μ‹œ λΆ€λͺ¨μ˜ λ©”λͺ¨λ¦¬λ₯Ό λ³΅μ‚¬ν•˜μ—¬ 같은 크기의 λ©”λͺ¨λ¦¬λ₯Ό ν•˜λ‚˜ 더 ν• λ‹Ήν–ˆκΈ° λ•Œλ¬Έμ— λΉ„νš¨μœ¨μ΄ μ‘΄μž¬ν–ˆλ‹€.

이λ₯Ό μ™„ν™”ν•˜κΈ° μœ„ν•΄ 이후에 Copy On Write(COW)λΌλŠ” 기법이 λ„μž…λ˜μ—ˆλ‹€.

ν•΄λ‹Ή 기법은 fork μ‹œμ—λŠ” λΆ€λͺ¨μ™€ μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ ν•˜λ‚˜μ˜ λ©”λͺ¨λ¦¬ 곡간을 μ°Έμ‘°ν•˜λ‹€κ°€, λΆ€λͺ¨μ™€ μžμ‹μ΄ μ„œλ‘œ λ‹€λ₯Έ μ½”λ“œ νλ¦„μ˜ μ‹€ν–‰λ˜λ©΄ κ·Έμ œμ„œμ•Ό λ©”λͺ¨λ¦¬ 곡간을 λΆ„λ¦¬ν•˜λŠ” 것이닀. 이λ₯Ό ν†΅ν•˜λ©΄ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ 뢄리가 λ°œμƒν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ μ ˆμ•½ μΈ‘λ©΄μ—μ„œ 도움이 λœλ‹€.

wait()

waitλŠ” λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Όλ˜λŠ” μƒν™©μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ‹œμŠ€ν…œ μ½œμ΄λ‹€.

이λ₯Ό ν˜ΈμΆœν•˜λ©΄ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λŠ” μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚€μ§€ μ•Šκ³  μžˆλ‹€κ°€,

μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ μ™„λ£Œλ˜λ©΄ κ·Έμ œμ„œμ•Ό λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ 이후 μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€.

exec()

exec은 λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•΄μ•Όν•  λ•Œ ν˜ΈμΆœλ˜λŠ” μ‹œμŠ€ν…œ μ½œμ΄λ‹€.

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•œλ‹€λŠ” 것이, μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것이 μ•„λ‹ˆλΌλŠ” 점이닀.

exec μ‹œμŠ€ν…œ μ½œμ€ κΈ°μ‘΄ ν”„λ‘œμ„ΈμŠ€μ˜ 이미지λ₯Ό μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€μ˜ μ΄λ―Έμ§€λ‘œ λŒ€μ²΄ν•œλ‹€. λ”°λΌμ„œ exec μ‹œμŠ€ν…œ 콜이 호좜된 μ΄ν›„μ˜ μ½”λ“œλŠ” μ‹€ν–‰λ˜μ§€ μ•Šκ³  λŒ€μ²΄λœ ν”„λ‘œμ„ΈμŠ€μ˜ μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€.

Linux μ‰˜μ˜ μž‘λ™

μ‰˜μ€ μ‚¬μš©μžμ˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ λ°›κ³  이λ₯Ό μˆ˜ν–‰ν•œ λ’€ κ²°κ³Όλ₯Ό μ½˜μ†”μ— 좜λ ₯ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€.

μ΄λŠ” λ‹€μŒκ³Ό 같은 νλ¦„μœΌλ‘œ μž‘λ™ν•œλ‹€.

  1. μ‰˜μ— λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯
  2. μ‰˜μ€ forkλ₯Ό ν˜ΈμΆœν•˜μ—¬ μžμ‹ μ˜ 볡사본을 생성
  3. μžμ‹ μ‰˜μ— exec을 ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ λͺ…λ Ήμ–΄λ‘œ ν”„λ‘œμ„ΈμŠ€ λŒ€μ²΄
  4. λΆ€λͺ¨ μ‰˜μ€ waitλ₯Ό ν˜ΈμΆœν•˜μ—¬ λͺ…λ Ήμ–΄μ˜ μˆ˜ν–‰μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°
  5. μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ μ™„λ£Œλ˜λ©΄ λΆ€λͺ¨ μ‰˜μ΄ λ‹€μ‹œ μž‘λ™μ„ μ‹œμž‘ν•˜μ—¬ λ°˜ν™˜ 값을 좜λ ₯

 

β€» fork, wait, exec μ‹œμŠ€ν…œ μ½œμ— λŒ€ν•œ μ˜ˆμ‹œ μ½”λ“œλŠ” OSTEP μ €μžμ˜ github에 쑴재

(https://github.com/remzi-arpacidusseau/ostep-code/blob/master/cpu-api/p3.c)