Process

ν”„λ‘œμ„ΈμŠ€λž€ μ»΄ν“¨ν„°μ—μ„œ 싀행쀑인 ν”„λ‘œκ·Έλž¨μ„ λ§ν•œλ‹€. 쑰금 더 μžμ„Ένžˆ λ§ν•˜λ©΄, μš΄μ˜μ²΄μ œμ— μ˜ν•΄ κ΄€λ¦¬λ˜λ©° μžμ›μ„ ν• λ‹Ήλ°›μ•„ λ…λ¦½μ μœΌλ‘œ 싀행이 κ°€λŠ₯ν•œ ν”„λ‘œκ·Έλž¨μ˜ λ‹¨μœ„μ΄λ‹€.

ν”„λ‘œκ·Έλž¨μ΄λž€ 보쑰기얡μž₯치 (ν•˜λ“œλ””μŠ€ν¬λ‚˜ SSD)에 μ €μž₯λ˜μ–΄ 싀행을 κΈ°λ‹€λ¦¬λŠ” λͺ…령어와 λ°μ΄ν„°μ˜ 집합을 μ˜λ―Έν•˜κ³ , ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œκ·Έλž¨μ΄ λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄ 싀행쀑인 ν”„λ‘œκ·Έλž¨μ„ μ˜λ―Έν•œλ‹€.

μš°λ¦¬κ°€ μ–΄λ–€ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κ²Œ 되면, ν”„λ‘œκ·Έλž¨μ΄ μž‘μ„±λœ μ½”λ“œλ₯Ό 컴퓨터가 μ½μ„μˆ˜ μžˆλŠ” μ €κΈ‰μ–Έμ–΄ ν˜•νƒœλ‘œ λ³€ν™˜ν•˜μ—¬ .exe ν™•μž₯자둜 된 μ‹€ν–‰νŒŒμΌμ„ μƒμ„±ν•œλ‹€. 이 νŒŒμΌμ€ μ‹€ν–‰λ˜λ©΄ λ©”λͺ¨λ¦¬μƒμ— μ˜¬λΌκ°€κ²Œ λ˜λŠ”λ° 이것을 ν”„λ‘œμ„ΈμŠ€λΌκ³  ν•œλ‹€.

λ©”λͺ¨λ¦¬μ— μ €μž₯된 ν”„λ‘œμ„ΈμŠ€λŠ” 크게 4κ°€μ§€μ˜ 곡간(μ˜μ—­)으둜 μ΄λ£¨μ–΄μ Έμžˆλ‹€.

Process μ˜μ—­

Code μ˜μ—­ (Text)

κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ†ŒμŠ€μ½”λ“œκ°€ μ €μž₯λ˜λŠ” 곡간이닀. 컴파일 ν›„ κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­λ˜μ–΄ μ €κΈ‰μ–Έμ–΄ (0,1) 의 ν˜•νƒœλ‘œ μ €μž₯λœλ‹€.

Data μ˜μ—­ (Data)

μ½”λ“œ μ˜μ—­μ—μ„œ μ„ μ–Έλœ μ „μ—­/정적 λ³€μˆ˜, μƒμˆ˜ λ“± ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” ν•„μš”ν•œ 데이터듀이 μ €μž₯λœλ‹€.

Heap μ˜μ—­

μ½”λ“œμ˜μ—­μ—μ„œ μ„ μ–Έλœ 데이터 ꡬ쑰, 객체 λ“± 동적할당(C - malloc)을 μ €μž₯ν•˜κΈ° μœ„ν•œ μ˜μ—­μ΄λ‹€. 예λ₯Ό λ“€μžλ©΄, λ°°μ—΄ μƒμ„±μ‹œ 배열에 데이터가 좔가됨에 따라 μœ λ™μ μœΌλ‘œ μ €μž₯곡간을 μ¦κ°€μ‹œν‚¬μˆ˜ μžˆλŠ” μ˜μ—­μ΄λ‹€. λ‹€λ₯Έ μ˜μ—­ λ“€κ³Ό 달리 런 νƒ€μž„ μ‹œ 크기가 κ²°μ •λœλ‹€. (λ‹€λ₯Έ μ˜μ—­ 듀은 컴파일 μ‹œ 크기가 κ²°μ •λœλ‹€.) μ•„λž˜μ—μ„œ μ‚΄νŽ΄λ³Ό μŠ€νƒ μ˜μ—­λ³΄λ‹€ 크기가 ν¬μ§€λ§Œ, ν¬μΈν„°λ‘œ λ©”λͺ¨λ¦¬μ— μ ‘κ·Όν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 속도가 λŠλ¦¬λ‹€.

정리 ν•˜μžλ©΄, ν”„λ‘œμ„ΈμŠ€κ°€ 싀행쀑 λ™μ μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή/ν•΄μ œ ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.

μœ μ˜μ‚¬ν•­μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν›„ ν•΄μ œν•˜μ§€ μ•ŠμœΌλ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜ (Memory Leak)κ°€ μΌμ–΄λ‚˜κΈ° λ•Œλ¬Έμ— λ°˜λ“œμ‹œ ν•΄μ œλ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

이 과정을 μžλ™μœΌλ‘œ μ‹€ν–‰ν•΄μ£ΌλŠ” Garbage Collector λΌλŠ” κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” 언어듀도 μžˆλ‹€ (μžλ°”, 파이썬 λ“±)

Stack μ˜μ—­

μ§€μ—­λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, 리턴 κ°’ λ“± μž„μ‹œμ μœΌλ‘œ μ‚¬μš© λ˜λŠ” 데이터듀을 μ €μž₯ν•˜λŠ” μ˜μ—­μ΄λ‹€.

μ΄λ¦„μ²˜λŸΌ Stack 자료ꡬ쑰의 ν˜•νƒœ (LIFO) λ₯Ό κ°€μ§€κ³  있으며, ν”„λ‘œμ„ΈμŠ€ λ§ˆλ‹€ 독립적인 μ˜μ—­μ„ κ°€μ§€κ³ μžˆλ‹€. μ €μž₯ν•΄μ•Ό ν•  λ³€μˆ˜μ˜ 양이 λ„ˆλ¬΄ λ§Žμ•„ μ˜μ—­μ„ μ΄ˆκ³Όν•˜κ²Œ 되면 μƒκΈ°λŠ” μ—λŸ¬κ°€ λ°”λ‘œ stack overflow μ—λŸ¬μ΄λ‹€.

Process 관리

사싀 CPUλŠ” ν•œλ²ˆμ— ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œ 싀행이 κ°€λŠ₯ν•˜μ§€λ§Œ, μš΄μ˜μ²΄μ œκ°€ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ΄€λ¦¬ν•˜λ©° 맀우 λΉ λ₯Έμ†λ„λ‘œ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ΅μ²΄ν•˜κΈ° λ•Œλ¬Έμ— μ‚¬μš©μžμ—κ²ŒλŠ” μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•˜λŠ” κ²ƒμ²˜λŸΌ 보인닀.

κ·Έλ ‡λ‹€λ©΄ 이 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ–΄λ–»κ²Œ κ΄€λ¦¬ν•˜λŠ” 것인지 μ‚΄νŽ΄λ³΄μž.

μš΄μ˜μ²΄μ œλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœλ₯Ό μ€€λΉ„, μ‹€ν–‰, 블둝(λŒ€κΈ°) 3κ°€μ§€μ˜ μƒνƒœλ‘œ κ΅¬λΆ„ν•˜κ³  각 λ‹¨κ³„κ°„μ˜ μƒνƒœ 전이λ₯Ό ν™œμš©ν•˜μ—¬ κ΄€λ¦¬ν•œλ‹€.

λ¨Όμ € ν”„λ‘œκ·Έλž¨ μ‹€ν–‰μ‹œ, ν”„λ‘œμ„ΈμŠ€κ°€ 생성 되며, μ€€λΉ„ λ¦¬μŠ€νŠΈμ— ν”„λ‘œμ„ΈμŠ€κ°€ μΆ”κ°€λ˜κ³  CPU λ₯Ό ν• λ‹Ήλ°›κ²Œ λœλ‹€. 이 과정을 λ°”λ‘œ Dispatching 이라고 λΆ€λ₯΄λ©° μ€€λΉ„ ➑️ μ‹€ν–‰ 으둜 μƒνƒœ 전이 λœλ‹€ κ³  ν‘œν˜„ν•œλ‹€.

μ‹€ν–‰μƒνƒœμ—μ„œ CPU λ₯Ό μ‚¬μš©ν•œ ν›„, CPU λ₯Ό ν• λ‹Ήν•΄μ œ ν•˜λ©° 아직 μž‘μ—…μ΄ λλ‚˜μ§€ μ•Šμ•˜λ‹€λ©΄ λ‹€μ‹œ μ€€λΉ„μƒνƒœλ‘œ 전이 λœλ‹€.

λ§Œμ•½ ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€λ₯Ό λ‹€μ‹œ μ‚¬μš©ν•˜κΈ° 전에 μ–΄λ–€ μž…μΆœλ ₯이 ν•„μš”ν•œ μƒνƒœλΌλ©΄, μž…μΆœλ ₯이 μ™„λ£Œλ λ•ŒκΉŒμ§€ 블둝(λŒ€κΈ°μƒνƒœ) 둜 전이 되고, 이후 μž…μΆœλ ₯이 μ’…λ£Œλ˜λ©΄ μ€€λΉ„μƒνƒœλ‘œ 전이 λœλ‹€.

그런데 ν”„λ‘œμ„ΈμŠ€ λ§ˆλ‹€ λ‹€ 같은 μƒνƒœλ₯Ό κ°€μ§€κ³  μžˆμ§€ μ•Šμ„κ²ƒμ΄λ‹€. μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€λŠ” λŒ€κΈ°μƒνƒœ, μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€λŠ” 블둝 μƒνƒœ λ“± μ—¬λŸ¬ μƒνƒœλ₯Ό κ°€μ§€κ³  μžˆμ„ 텐데 이것듀을 어디에 μ €μž₯ ν•˜λŠ”μ§€ 의문이 생긴닀.

μš΄μ˜μ²΄μ œλŠ” ν”„λ‘œμ„ΈμŠ€ 듀을 μ œμ–΄ν•˜κΈ° μœ„ν•΄ PCB λΌλŠ” 곳에 ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœ 및 정보λ₯Ό μ €μž₯ν•œλ‹€.

PCB (Process Control Block)

ν”„λ‘œμ„ΈμŠ€ μƒμ„±μ‹œμ— λ§Œλ“€μ–΄μ§€λ©°, μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœ 및 μ˜μ—­ λ“±μ˜ 데이터가 PCB 에 μ €μž₯λœλ‹€.

μš°λ¦¬κ°€ μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€λ₯Ό 싀행쀑, μž μ‹œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€λ©΄, 이전 ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœλ₯Ό ν¬ν•¨ν•œ μ—¬λŸ¬ 정보듀을 μ €μž₯ν•΄μ•Όν•œλ‹€.

λ”°λΌμ„œ PCB μ—λŠ”

  • ν”„λ‘œμ„ΈμŠ€ 아이디

  • ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœ

  • μš°μ„ μˆœμœ„, μ‹€ν–‰μ‹œκ°„, CPU μ μœ μ‹œκ°„

  • ν”„λ‘œμ„ΈμŠ€ μ£Όμ†Œκ³΅κ°„

...

λ“± 의 μ—¬λŸ¬ 데이터듀을 μ €μž₯ ν•œλ‹€.

μ΄λ•Œ, ν˜„μž¬ 싀행쀑인 ν”„λ‘œμ„ΈμŠ€μ™Έ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜κ²Œ λœλ‹€λ©΄, λ©”λͺ¨λ¦¬μ— μ €μž₯된 PCB λ₯Ό κ΅μ²΄ν•΄μ•Όν•˜λŠ”λ° 이것을 λ°”λ‘œ Context Switch (λ¬Έλ§₯κ΅ν™˜) 이라고 ν•œλ‹€. μ‰½κ²Œ 말해 싀행쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœμ •λ³΄λ₯Ό κ΅ν™˜ν•˜λŠ” 것이닀.

λ°”λ‘œ 이 λ¬Έλ§₯ κ΅ν™˜μ„ ν†΅ν•˜μ—¬ μš°λ¦¬κ°€ μ—¬λŸ¬ ν”„λ‘œκ·Έλž¨λ“€μ„ μ‹€ν–‰ν• μˆ˜ μžˆλŠ” 것이닀. (μœ„μ—μ„œ μ„€λͺ…ν–ˆλ“―이, λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ΄μ•„λ‹Œ λΉ λ₯΄κ²Œ ν”„λ‘œμ„ΈμŠ€κ°€ κ΅μ²΄λ˜λŠ” 것)

μ΄λ•Œ, λ¬Έλ§₯κ΅ν™˜μ΄ μˆ˜ν–‰μ€‘μΌλ•ŒλŠ” λ‹€λ₯Έ μž‘μ—…μ΄ λΆˆκ°€λŠ₯ ν•œλ° 이것을 λ°”λ‘œ μ˜€λ²„ν—€λ“œ 라고 ν•œλ‹€.

+ Thread

일반적으둜 ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ λŠ” 두 κ°œλ…μ„ μ •ν™•ν•˜κ²Œ μ•Œμ§€ λͺ»ν•˜λ©΄ ν˜Όλ™ν•˜κΈ° μ‰¬μš΄ κ°œλ…μ΄λ‹€. (단, CPU μ—μ„œ λ§ν•˜λŠ” μŠ€λ ˆλ“œλŠ” ν•˜λ“œμ›¨μ–΄ μŠ€λ ˆλ“œλ₯Ό λœ»ν•˜κ³ , μ—¬κΈ°μ„œ λ§ν•˜λŠ” μŠ€λ ˆλ“œλŠ” μ†Œν”„νŠΈμ›¨μ–΄ μŠ€λ ˆλ“œλ₯Ό λœ»ν•œλ‹€.)

ν”„λ‘œμ„ΈμŠ€κ°€ λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄ λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰κ°€λŠ₯ν•œ ν”„λ‘œκ·Έλž¨μ˜ λ‹¨μœ„λΌλ©΄ μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” μ—¬λŸ¬ νλ¦„μ˜ λ‹¨μœ„ 이닀. μ΄λ•Œ μ‹€ν–‰λ˜λŠ” μž‘μ—…μ˜ 흐름이 ν•œκ°œλΌλ©΄ 단일 μŠ€λ ˆλ“œ, μ—¬λŸ¬κ°œλΌλ©΄ λ©€ν‹° μŠ€λ ˆλ“œ 라고 ν•œλ‹€. (ν”„λ‘œμ„ΈμŠ€λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ μŠ€λ ˆλ“œλ₯Ό κ°€μ§„λ‹€.)

예λ₯Ό λ“€μ–΄ λΈŒλΌμš°μ €μ—μ„œ 검색을 ν•˜λ©° νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜λŠ” 것은 κ²€μƒ‰μž‘μ—…μ„ ν•˜λŠ” μŠ€λ ˆλ“œ 와 λ‹€μš΄λ‘œλ“œ μž‘μ—…μ„ ν•˜λŠ” μŠ€λ ˆλ“œ, 2κ°€μ§€μ˜ μŠ€λ ˆλ“œλ₯Ό κ°€μ§€κ³  μžˆλŠ” 것이닀.

μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ 4κ°€μ§€ μ˜μ—­ 쀑, μŠ€νƒ μ˜μ—­λ§Œ λ”°λ‘œ ν• λ‹Ήλ°›κ³  λ‚˜λ¨Έμ§€ μ˜μ—­μ€ λ‹€λ₯Έ μŠ€λ ˆλ“œ 와 κ³΅μœ ν•˜λ©° μ‹€ν–‰λœλ‹€.

독립적인 μŠ€νƒ μ˜μ—­μ„ ν• λ‹Ήλ°›λŠ”λ‹€ ➑️ 독립적인 ν•¨μˆ˜ 호좜이 κ°€λŠ₯ν•˜λ‹€ ➑️ 독립적인 싀행흐름이 ν•˜λ‚˜ μΆ”κ°€λœλ‹€

Last updated