λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

운영체제

[OS] ν”„λ‘œμ„ΈμŠ€μ™€ PCB(Process Control Block)

πŸ“Œ ν”„λ‘œμ„ΈμŠ€(Process)

ν”„λ‘œμ„ΈμŠ€λŠ” μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ„ μ˜λ―Έν•œλ‹€. ν”„λ‘œμ„ΈμŠ€λŠ” μš΄μ˜μ²΄μ œμ— μ˜ν•΄ κ΄€λ¦¬λ˜λ©°, λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜κ³  μžμ›μ„ ν• λ‹Ή 받을 수 μžˆλŠ” λ‹¨μœ„μ΄λ‹€. μš΄μ˜μ²΄μ œλŠ” ν”„λ‘œμ„ΈμŠ€λ“€μ—κ²Œ 적절히 μžμ›λ“€μ„ λΆ„λ°°ν•˜μ—¬ μ—¬λŸ¬κ°€μ§€ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있게 ν•œλ‹€.

 

πŸ“Œ ν”„λ‘œμ„ΈμŠ€ ꡬ쑰

ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” μ½”λ“œμ˜ 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— 올렀 μ‹€ν–‰μ‹œμΌœμ•Ό ν•œλ‹€. μ΄λ•Œ, ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ κ³ μœ ν•œ 가상 λ©”λͺ¨λ¦¬ 곡간을 μ œκ³΅ν•˜λ©°, 이 곡간은 4개둜 λ‚˜λˆŒ 수 μžˆλ‹€.

 

 

β‘  code μ˜μ—­(Text Segment)

  • λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œκ°€ μ €μž₯λ˜λŠ” κ³΅κ°„μœΌλ‘œ, μ½”λ“œλŠ” 컴파일 λ˜μ–΄ 0κ³Ό 1둜 λ³€ν™˜λœ 기계어가 μ €μž₯λœλ‹€.

β‘‘ Data μ˜μ—­(Data Segment)

  • λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œμ—μ„œ μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜, 정적 λ³€μˆ˜, μƒμˆ˜ 등을 μ €μž₯ν•œλ‹€.
  • μ΄ˆκΈ°ν™”λœ λ³€μˆ˜μ™€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ λ³€μˆ˜λ“€μ΄ λ‚˜λˆ μ„œ μ €μž₯λœλ‹€.
  • 데이터 μ˜μ—­μ€ ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘ μ‹œ μ΄ˆκΈ°ν™”λ˜λ©°, ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λœλ‹€.

β‘’ Stack

  • λ‚΄κ°€ μž‘μ„±ν•œ ν•¨μˆ˜μ—μ„œ μ§€μ—­λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, return μ£Όμ†Œλ“€μ„ μ €μž₯ν•œλ‹€.
  • μ•Œκ³ λ¦¬μ¦˜μ—μ„œ μ‚¬μš©ν•˜λŠ” stack ꡬ쑰λ₯Ό μ‚¬μš©ν•΄μ„œ stack이라고 λΆ€λ₯Έλ‹€. ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ 독립적인 stack을 κ°€μ§ˆ 수 있고, stack 포인터λ₯Ό 톡해 μŠ€νƒμ˜ μƒνƒœλ₯Ό κ΄€λ¦¬ν•œλ‹€.
  • ν•¨μˆ˜κ°€ 호좜되면 stack 곡간이 μƒμ„±λ˜λ©°, ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ μ œκ±°λœλ‹€.

β‘£ Heap

  • λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œμ—μ„œ λ™μ μœΌλ‘œ μƒμ„±λ˜λŠ” 데이터 κ΅¬μ‘°λ‚˜ 객체듀을 μ €μž₯ν•œλ‹€.
  • 예λ₯Ό λ“€λ©΄, κ°μ²΄λ‚˜ 배열을 μƒμ„±ν–ˆμ„ λ•Œ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰λ§ˆλ‹€ μ–Όλ§ˆλ§ŒνΌμ˜ 데이터가 좔가될 μ§€ λͺ¨λ₯Έλ‹€. 데이터가 좔가됨에 따라 μœ λ™μ μœΌλ‘œ 곡간을 늘릴 수 μžˆλŠ”κ²Œ νž™ μ˜μ—­μ΄λ‹€.
  • νž™μ€ λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ, ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰ 쀑에 λ™μ μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›κ³  ν•΄μ œν•˜λŠ”λ° μ‚¬μš©λœλ‹€.
  • νž™μ€ ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ κ³΅κ°„μ˜ λ‚˜λ¨Έμ§€ μ˜μ—­μ— μœ„μΉ˜ν•˜λ©°, ν¬κΈ°λŠ” λ™μ μœΌλ‘œ ν™•μž₯될 수 μžˆλ‹€.

 

 

  • μ „μ—­ 데이터 μ„Ήμ…˜μ€ μ΄ˆκΈ°ν™”λœ 데이터와 μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ€ 데이터λ₯Ό μ €μž₯ν•˜λŠ” λ‹€λ₯Έ μ„Ήμ…˜μœΌλ‘œ λ‚˜λ‰œλ‹€.
  • main() ν•¨μˆ˜μ— μ „λ‹¬λœ argc , argvλŠ” λ§€κ°œλ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” λ³„λ„μ˜ μ„Ήμ…˜μ΄ μ œκ³΅λœλ‹€.
  • int iλ‚˜ int* valuesλŠ” μ§€μ—­λ³€μˆ˜λ‘œ μ“°μ΄λ―€λ‘œ stack 칸에 λ“€μ–΄κ°€λŠ” 것을 λ³Ό 수 μžˆλ‹€.
  • int x,yλŠ” μ „μ—­ λ³€μˆ˜ μ΄λ―€λ‘œ data ꡬ간에 λ“€μ–΄κ°„λ‹€.
  • heap은 동적할당

πŸ“Œ ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœ

 

 

β‘  ν”„λ‘œμ„ΈμŠ€ 생성(new)

ν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±λœ μƒνƒœμ΄λ‹€. μƒμ„±λ§Œ λ˜μ—ˆκ³ , 아직 μ‹€ν–‰λ˜κΈ° μœ„ν•œ μžμ›μ„ ν• λ‹Ήλ°›μ§€ λͺ»ν•œ μƒνƒœμ΄λ‹€.

β‘‘ μ‹€ν–‰ κ°€λŠ₯(Ready)

ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰μ„ κΈ°λ‹€λ¦¬λŠ” μƒνƒœμ΄λ‹€. ν”„λ‘œμ„ΈμŠ€κ°€ ν•„μš”ν•œ μžμ›μ„ λͺ¨λ‘ ν• λ‹Ήλ°›μ•˜μœΌλ©°, 싀행을 μœ„ν•œ μ€€λΉ„κ°€ μ™„λ£Œλ˜μ—ˆμ§€λ§Œ CPUλ₯Ό ν• λ‹Ήλ°›μ§€ λͺ»ν•œ μƒνƒœμ΄λ‹€. 이 μƒνƒœμ—μ„œλŠ” CPUλ₯Ό ν• λ‹Ήλ°›κΈ° μœ„ν•΄ μŠ€μΌ€μ€„λ§ λŒ€κΈ°μ—΄(Queue)에 λ“€μ–΄κ°€κ²Œ λœλ‹€.

β‘’ μ‹€ν–‰ μƒνƒœ(Running)

ν”„λ‘œμ„ΈμŠ€κ°€ CPUλ₯Ό ν• λ‹Ήλ°›μ•„ μ‹€μ œλ‘œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μƒνƒœμ΄λ‹€. 이 μƒνƒœμ—μ„œλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μž‘μ—…μ„ μ²˜λ¦¬ν•˜κ³  κ²°κ³Όλ₯Ό λ§Œλ“€μ–΄ λ‚Έλ‹€.

β‘£ λŒ€κΈ°(Blocked)

ν”„λ‘œμ„ΈμŠ€λ₯Ό μ²˜λ¦¬μ€‘μ— μž‘μ—… μ‹œκ°„μ΄ μ΄ˆκ³Όλ˜κ±°λ‚˜ μžμ› μ‚¬μš©μ„ μœ„ν•΄ λŒ€κΈ°ν•΄μ•Ό ν•˜λŠ” μ΄λ²€νŠΈκ°€ λ°œμƒν•΄μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ μž μ‹œ 멈좘 μƒνƒœμ΄λ‹€. 이 μƒνƒœμ—μ„œλŠ” CPUλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. νŠΉμ • μžμ›μ„ μ‚¬μš©ν•  수 μžˆμ„ λ•ŒκΉŒμ§€ 싀행을 λ©ˆμΆ”κ³ , λ‹€μ‹œ λŒ€κΈ°μ—΄(Ready Queue)둜 λ“€μ–΄κ°€κ²Œ 되며, ν”„λ‘œμ„ΈμŠ€ 처리 κ°€λŠ₯ μƒνƒœκ°€ 되면 μ‹€ν–‰(Running) μƒνƒœλ‘œ λ³€κ²½ν•œλ‹€.

β‘€ μ’…λ£Œ(Terminated, exit)

ν”„λ‘œμ„ΈμŠ€μ˜ 싀행이 μ™„λ£Œλ˜μ–΄ μ’…λ£Œλœ μƒνƒœμ΄λ‹€. 이 μƒνƒœμ—μ„œλŠ” ν• λ‹Ήλœ μžμ›μ΄ ν•΄μ œλ˜κ³ , ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ 곡간은 μš΄μ˜μ²΄μ œμ— λ°˜ν™˜λœλ‹€.

 

πŸ“Œ ν”„λ‘œμ„ΈμŠ€μ˜ 흐름

  1. new -> ready -> running ν”„λ‘œμ„ΈμŠ€κ°€ 생성(New)되면 Ready μƒνƒœμ— μžˆλ‹€.μ—¬λŸ¬κ°œμ˜ ν”„λ‘œμ„ΈμŠ€λ“€μ€ λŒ€λΆ€λΆ„ Ready μƒνƒœμ— 있고, 운영체제의 μŠ€μΌ€μ€„λ§ 기법에 따라 κ·Έ 쀑 단 1개만 Running 으둜 λ°”λ€” 수 μžˆλ‹€.Running μƒνƒœκ°€ 되면 μ‹€μ œ CPUλ₯Ό μ΄μš©ν•΄μ„œ ν•˜κ³ μžν•˜λŠ” 일을 μˆ˜ν–‰ν•œλ‹€.
  2. running -> waiting -> ready예λ₯Ό λ“€μ–΄ scanf, read, printf λ“± μ™ΈλΆ€μž₯μΉ˜μ— λŒ€ν•΄ μž…μΆœλ ₯을 μš”κ΅¬ν–ˆμ„ λ•Œμ΄λ‹€.Waiting이 λλ‚˜λŠ” μ‹œμ μ€ I/O 이벀트 μ™„λ£Œ μΈν„°λŸ½νŠΈκ°€ λ°œμƒλ  λ•Œμ΄λ‹€.
  3. 이 μΈν„°λŸ½νŠΈκ°€ λ°œμƒλ˜λ©΄ λ‹€μ‹œ ready μƒνƒœκ°€ λ˜μ–΄ λ‹€μ‹œ μŠ€μΌ€μ€„λŸ¬μ— μ˜ν•œ 싀행을 κΈ°λ‹€λ¦¬κ²Œ λœλ‹€.
  4. 이 μž‘μ—…μ€ ꡉμž₯히 느리기 λ•Œλ¬Έμ— CPUλŠ” λ¬΄μž‘μ • κΈ°λ‹€λ¦¬λŠ” 것이 μ•„λ‹ˆλΌ μƒνƒœλ₯Ό waiting 으둜 λ°”κΎΈκ²Œ λœλ‹€.
  5. running μƒνƒœμ— μžˆλŠ” ν”„λ‘œμ„ΈμŠ€λŠ” 계속 μ‹€ν–‰λ˜λŠ” 것이 μ•„λ‹ˆλΌ μ–΄λ–€ 쑰건이 만쑱되면 μƒνƒœκ°€ λ³€κ²½λœλ‹€.
  6. running -> exit Running μƒνƒœμ— 있던 ν”„λ‘œμ„ΈμŠ€μ˜ μ’…λ£Œλ₯Ό μ˜λ―Έν•œλ‹€.
  7. running -> ready -> running -> ready -> running -> ready ....1ms ~ 10ms λ§ˆλ‹€ 타이머 μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•˜μ—¬ μš΄μ˜μ²΄μ œλŠ” ν˜„μž¬ 싀행쀑인 ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°•μ œλ‘œ 쀑지λ₯Ό μ‹œν‚¨ λ’€ ready μƒνƒœλ‘œ λΉΌλ†“λŠ”λ‹€.그리고 ready μƒνƒœμ— μžˆλŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ μ‹œν‚¨λ‹€. 이 과정은 맀우 λΉ λ₯΄κ²Œ μƒνƒœ λ³€ν™”λ₯Ό μΌμœΌν‚€λ©° 반볡되기 λ•Œλ¬Έμ— 마치 μ—¬λŸ¬κ°œμ˜ ν”„λ‘œμ„ΈμŠ€κ°€ 1개의 CPUλ₯Ό κ°€μ§€κ³  λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보인닀.=> 이λ₯Ό 톡해 μš΄μ˜μ²΄μ œλŠ” λ©€νƒœνƒœμŠ€ν‚Ή λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ„ λ‹¬μ„±ν•˜κ²Œ λœλ‹€.

 

πŸ“Œ PCB(Process Control Block)

 

 

ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄ ν”„λ‘œμ„ΈμŠ€μ˜ 정보λ₯Ό μ €μž₯ν•˜λŠ” λ³„λ„μ˜ 곡간이 λ”°λ‘œ μƒκΈ°κ²Œ λœλ‹€. 운영체제의 컀널(Kernel) λ˜ν•œ ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ΄λ―€λ‘œ ν”„λ‘œμ„ΈμŠ€μ™€ 같이 정보λ₯Ό μ €μž₯ν•  수 μžˆλŠ” 곡간(stack, data, heap ...)이 생긴닀. μ΄λ•Œ, μ»€λ„μ˜ 데이터(Data) μ˜μ—­μ—μ„œλŠ” 각 ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœ, CPU μ‚¬μš©μ˜ 정보, λ©”λͺ¨λ¦¬ μ‚¬μš© 정보 λ“± 각쒅 μžμ›μ„ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ PCBλΌλŠ” 곡간을 λ‘”λ‹€.

즉, PCBλž€ μš΄μ˜μ²΄μ œκ°€ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 데이터 ꡬ쑰이닀. PCBλŠ” 각 ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ μœ μ§€λ˜λ©°, ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœ 정보와 μ œμ–΄ 정보λ₯Ό μ €μž₯ν•œλ‹€. ν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±λ˜λ©΄ μš΄μ˜μ²΄μ œλŠ” PCBλ₯Ό ν• λ‹Ήν•˜κ³ , ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜λ©΄ ν•΄λ‹Ή PCBλ₯Ό ν•΄μ œν•œλ‹€.

 

PCBμ—λŠ” λ‹€μŒκ³Ό 같은 정보듀이 μ €μž₯λœλ‹€.

 

β‘  ν”„λ‘œμ„ΈμŠ€ μƒνƒœ(Process State)

ν”„λ‘œμ„ΈμŠ€μ˜ ν˜„μž¬ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 예λ₯Ό λ“€λ©΄, μ‹€ν–‰(Running), μ€€λΉ„(Ready), λŒ€κΈ°(Waiting) λ“±μ˜ μƒνƒœ 등이 μžˆλ‹€. 이 μƒνƒœ μ •λ³΄λŠ” ν”„λ‘œμ„ΈμŠ€ μŠ€μΌ€μ€„λ§κ³Ό μƒν˜Έμž‘μš©ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€μ˜ 싀행을 κ΄€λ¦¬ν•œλ‹€.

β‘‘ ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°(Program Counter, PC)

ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€μŒμ— μ‹€ν–‰ν•  λͺ…λ Ήμ–΄(μ½”λ“œ)의 μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터이닀. PCλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ€‘λ‹¨λ˜μ—ˆμ„ λ•Œ λ‹€μ‹œ μ‹œμž‘ν•  μœ„μΉ˜λ₯Ό μ•Œλ €μ£ΌλŠ” μ€‘μš”ν•œ 역할을 ν•œλ‹€.

β‘’ λ ˆμ§€μŠ€ν„°(Registers)

ν”„λ‘œμ„ΈμŠ€κ°€ ν˜„μž¬ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ μ‚¬μš©λ˜λŠ” λ ˆμ§€μŠ€ν„° 값듀을 μ €μž₯ν•œλ‹€. μ—¬κΈ°μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ μΌμ‹œ μ€‘λ‹¨λ˜κ³  λ‹€μ‹œ μ‹€ν–‰ 될 λ•Œ λ ˆμ§€μŠ€ν„° 값듀을 λ³΅μ›ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

β‘£ μŠ€μΌ€μ€„λ§ 정보(Scheduling Information)

ν”„λ‘œμ„ΈμŠ€μ˜ μš°μ„ μˆœμœ„, ν• λ‹Ή 된 CPU μ‹œκ°„, μŠ€μΌ€μ€„λ§ μ•Œκ³ λ¦¬μ¦˜κ³Ό κ΄€λ ¨λœ 정보 λ“± μŠ€μΌ€μ€„λ§μ— ν•„μš”ν•œ 정보λ₯Ό ν¬ν•¨ν•œλ‹€.

β‘€ λ©”λͺ¨λ¦¬ 관리 정보(Memory Management Information)

ν”„λ‘œμ„ΈμŠ€κ°€ μ‚¬μš©ν•˜λŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œ λ²”μœ„, νŽ˜μ΄μ§€ ν…Œμ΄λΈ”, λ©”λͺ¨λ¦¬ ν• λ‹Ή 정보 λ“±κ³Ό 같이 λ©”λͺ¨λ¦¬ 관리에 ν•„μš”ν•œ 정보λ₯Ό μ €μž₯ν•œλ‹€.

β‘₯ μž…μΆœλ ₯ μƒνƒœ(I/O state)

ν”„λ‘œμ„ΈμŠ€κ°€ ν˜„μž¬ μ‚¬μš© 쀑인 μž…μΆœλ ₯ μž₯μΉ˜μ™€ κ΄€λ ¨λœ 정보λ₯Ό ν¬ν•¨ν•œλ‹€. 예λ₯Ό λ“€μ–΄, μ–΄λ–€ μž…μΆœλ ₯ μš”μ²­μ„ 보내고 μžˆλŠ”μ§€, μ–΄λ–€ νŒŒμΌμ„ μ—΄μ–΄λ‘μ—ˆλŠ”μ§€ λ“±μ˜ 정보λ₯Ό μ €μž₯ν•œλ‹€.

CPUλŠ” ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μˆ˜ν–‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό 쀑간 쀑간에 λ°”κΏ”κ°€λ©΄μ„œ μˆ˜ν–‰ν•œλ‹€.

κ·ΈλŸ¬λ―€λ‘œ CPUλŠ” μˆ˜ν–‰μ€‘μΈ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ‚˜κ°ˆ λ•Œ, 이 ν”„λ‘œμ„ΈμŠ€μ˜ 정보λ₯Ό μ–΄λ”˜κ°€μ— μ €μž₯ν•˜κ³  μžˆμ–΄μ•Ό λ‹€μŒμ— 이 ν”„λ‘œμ„ΈμŠ€λ₯Ό μˆ˜ν–‰ν•  λ•Œ 이전에 μˆ˜ν–‰ν•œ κ·Έ λ‹€μŒλΆ€ν„° μ΄μ–΄μ„œ μž‘μ—…ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ 정보λ₯Ό μ €μž₯ν•˜λŠ” 곳이 PCB이닀.