ν”„λ‘œμ„ΈμŠ€ μ£Όμ†Œ 곡간

2023. 3. 1. 15:40ㆍCS/CS μŠ€ν„°λ””

ν”„λ‘œμ„ΈμŠ€?

ν”„λ‘œμ„ΈμŠ€λž€ User modeμ—μ„œ μž‘λ™ν•˜λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ„ μ˜λ―Έν•œλ‹€. (ex. 크둬, μΉ΄μΉ΄μ˜€ν†‘, λ””μŠ€μ½”λ“œ λ“±)

각 ν”„λ‘œμ„ΈμŠ€λ“€μ€ CPU와 λ©”λͺ¨λ¦¬ μžμ›μ— μ˜μ‘΄ν•˜μ—¬ μž‘λ™λ˜λ©° User mode μˆ˜μ€€μ—μ„œ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ— 파일 μž…μΆœλ ₯, λ„€νŠΈμ›Œν¬ 톡신 등을 직접 μˆ˜ν–‰ν•˜μ§€λŠ” λͺ»ν•˜κ³  νŠΈλž©μ„ 톡해 λ‹€μ–‘ν•œ μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•˜μ—¬ 이λ₯Ό Kernel mode(운영 체제)에 μš”μ²­ν•˜κ²Œ λœλ‹€. 

각 ν”„λ‘œμ„ΈμŠ€λ“€μ€ λ™μ‹œλ‹€λ°œμ μœΌλ‘œ μž‘λ™ν•  수 μžˆλŠ”λ°, μ΄λŠ” 운영체제의 λ¦¬μ†ŒμŠ€ 가상화λ₯Ό ν†΅ν•΄μ„œ 이루어진닀. νŠΉμ • PC의 CPU와 λ©”λͺ¨λ¦¬λŠ” 각각 ν•˜λ‚˜λΏμΌμ§€λΌλ„ μš΄μ˜μ²΄μ œκ°€ 이듀을 마치 각 ν”„λ‘œμ„ΈμŠ€λ“€λ§Œμ„ μœ„ν•œ CPU, λ©”λͺ¨λ¦¬κ°€ μžˆλŠ” κ²ƒμ²˜λŸΌ μͺΌκ°œκ³  μŠ€μΌ€μ€„λ§ν•œλ‹€. 

CPU κ°€μƒν™”λŠ” 각 ν”„λ‘œμ„ΈμŠ€κ°€ 맀우 짧은 μ‹œκ°„ λ™μ•ˆλ§Œμ„ CPUλ₯Ό μ μœ ν•˜λ„λ‘ ν•˜μ—¬ κ³„μ†ν•΄μ„œ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ„ μˆ˜ν–‰ν•˜λŠ” λ°©μ‹μœΌλ‘œ 이루어진닀. μ΄λŸ¬ν•œ μž‘μ—…μ„ 톡해 μ‚¬μš©μžλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ 마치 λ³‘λ ¬μ μœΌλ‘œ μˆ˜ν–‰λ˜κ³  μžˆλ‹€κ³  착각할 수 μžˆλ‹€.

λ©”λͺ¨λ¦¬ κ°€μƒν™”λŠ” μ•žμ„œ 동일 μžμ›μ„ κ³„μ†ν•΄μ„œ 돌렀 썼던 CPU κ°€μƒν™”μ™€λŠ” 달리, ν•˜λ‚˜μ˜ 물리 λ©”λͺ¨λ¦¬λ₯Ό μͺΌκ°  λ’€ 이듀을 ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€μ— λŒ€μ‘μ‹œν‚€λŠ” λ°©μ‹μœΌλ‘œ 이루어진닀. 운영체제의 관리 ν•˜μ—, 이듀 λ©”λͺ¨λ¦¬λŠ” μ„œλ‘œ κ°„μ„­λ˜μ§€ μ•Šκ³  μ™„μ „νžˆ κ²©λ¦¬λœλ‹€. 

 


ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간

μ•žμ„œ μ–ΈκΈ‰ν•œ ν”„λ‘œμ„ΈμŠ€μ— λŒ€μ‘λ˜λŠ” κ°€μƒν™”λœ λ©”λͺ¨λ¦¬λ₯Ό ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간이라고 ν‘œν˜„ν•œλ‹€.

ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간은 크게 μ½”λ“œ μ˜μ—­, 데이터 μ˜μ—­, μŠ€νƒ μ˜μ—­, νž™ μ˜μ—­μœΌλ‘œ λ‚˜λ‰œλ‹€. 

좜처: https://subscription.packtpub.com/book/application-development/9781785883057/1/ch01lvl1sec9/process-descriptors

μ½”λ“œ μ˜μ—­

ν”„λ‘œμ„ΈμŠ€λ₯Ό μž‘λ™μ‹œν‚¬ μ½”λ“œκ°€ μ €μž₯λ˜λŠ” μ˜μ—­μ΄λ‹€.

μ—¬κΈ°μ—μ„œ μ½”λ“œλž€ μ‚¬λžŒμ— μ˜ν•΄ Javaλ‚˜ Javascript, Python으둜 μž‘μ„±λœ μ½”λ“œλ₯Ό μ˜λ―Έν•˜λŠ” 것이 μ•„λ‹Œ, 컴퓨터가 이해할 수 있게 컴파일된 기계어λ₯Ό μ˜λ―Έν•œλ‹€.

ν•΄λ‹Ή μ˜μ—­μ˜ λ°μ΄ν„°λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰λ˜λŠ” μ™€μ€‘μ—λŠ” μˆ˜μ •μ΄ λΆˆκ°€λŠ₯ν•˜κ³ , 읽기만 κ°€λŠ₯ν•˜λ‹€.

 

데이터 μ˜μ—­

데이터 μ˜μ—­μ—λŠ” μ „μ—­ λ³€μˆ˜, 정적 λ³€μˆ˜, μƒμˆ˜ 등이 μœ„μΉ˜ν•œλ‹€. 

Javaλ₯Ό 톡해 μ˜ˆμ‹œλ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

정적 λ³€μˆ˜

public class Human {
	static int maxAge = 100;
}

Human 클래슀의 μ΅œλŒ€ 수λͺ…을 100μ„Έλ‘œ λ‘”λ‹€λ©΄ λ‹€μŒκ³Ό 같이 정적 λ³€μˆ˜λ‘œ ν¬ν•¨μ‹œν‚¬ 수 μžˆλ‹€. μ΄λŠ” Human 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ§€ μ•Šλ”λΌλ„ Human 클래슀 내뢀에 μ‘΄μž¬ν•˜κ³ , 이런 값듀은 데이터 μ˜μ—­μ— μ €μž₯되고 κ΄€λ¦¬λœλ‹€.

μƒμˆ˜

public class Circle {
	static final int PI = 3.141592;
}

Circle 클래슀의 PI 값은 λ³€ν•  일이 μ—†λŠ” κ°’μ΄λ―€λ‘œ μƒμˆ˜λ‘œ μ„ μ–Έν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ μƒμˆ˜λ“€ λ˜ν•œ λ§ˆμ°¬κ°€μ§€λ‘œ 데이터 μ˜μ—­μ— μ €μž₯λœλ‹€.

데이터 μ˜μ—­μ€ μ½”λ“œ μ˜μ—­κ³Ό 달리 ν”„λ‘œμ„ΈμŠ€κ°€ μž‘λ™ν•˜λŠ” 와쀑에도 읽기 및 μ“°κΈ° μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ‹€.

 

μŠ€νƒ μ˜μ—­

μŠ€νƒ μ˜μ—­μ€ ν•¨μˆ˜μ˜ 호좜과 κ΄€λ ¨λœ 정보λ₯Ό μ €μž₯ν•˜λŠ” μ˜μ—­μ΄λ‹€.

μŠ€νƒ μ˜μ—­μ€ 이름 κ·ΈλŒ€λ‘œ, 자료 ꡬ쑰둜 μŠ€νƒμ„ μ΄μš©ν•œλ‹€. (LIFO)

μŠ€νƒ μ˜μ—­μ˜ ν¬κΈ°λŠ” 컴파일 μ‹œμ μ— 컴파일러의 μ˜ˆμΈ‘μ— μ˜ν•΄ κ²°μ •λœλ‹€.

νŠΉμ • ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ μŠ€νƒ μ˜μ—­μ— ν•΄λ‹Ή μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ(ex. 인자, 지역 λ³€μˆ˜)κ°€ μŒ“μ΄κ²Œ 되고, ν•¨μˆ˜κ°€ μž‘λ™μ„ 마치고 λ¦¬ν„΄λ˜λ©΄ μŠ€νƒμ—μ„œ μ œκ±°λœλ‹€. 

μ΄λŸ¬ν•œ νŠΉμ„± λ•Œλ¬Έμ—, λ§Œμ•½ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šκ³  κ³„μ†ν•΄μ„œ μŒ“λ‹€λ³΄λ©΄ λ©”λͺ¨λ¦¬ λΆ€μ‘± 문제 λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€κ°€ μ£½μ–΄λ²„λ¦¬λŠ”λ° 이것이 λ°”λ‘œ κ·Έ 유λͺ…ν•œ Stack Overflow이닀. ν•΄λ‹Ή λ¬Έμ œλŠ” μž¬κ·€ ν•¨μˆ˜μ—μ„œ μ’…μ’… λ°œμƒν•˜λŠ”λ°, μž¬κ·€ μ’…λ£Œ 쑰건을 μ œλŒ€λ‘œ 주지 μ•Šμ•˜μ„ λ•Œ λ°œμƒν•  수 μžˆλ‹€.

 

νž™ μ˜μ—­

νž™ μ˜μ—­μ€ λŸ°νƒ€μž„μ— 크기가 κ²°μ •λ˜λ©° 동적 λ©”λͺ¨λ¦¬ 할당을 μœ„ν•΄ μ‚¬μš©λœλ‹€.

νž™ μ˜μ—­μ€ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ User modeμ—μ„œ 직접 μ œμ–΄ν•  수 μžˆλŠ” μ˜μ—­μΈλ°, 할당은 malloc(), ν•΄μ œλŠ” free() ν•¨μˆ˜λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

(λ¬Όλ‘  Javaλ‚˜ Python처럼 할당은 ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ 맑기되 ν•΄μ œλŠ” 자체 가비지 μ½œλ ‰ν„°λ₯Ό 톡해 μˆ˜ν–‰λ˜μ–΄ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 신경써야할 뢀뢄을 쀄인 언어도 μ‘΄μž¬ν•œλ‹€.)

νž™ μ˜μ—­μ—λŠ” 객체, λ°°μ—΄ 등이 μ €μž₯되며 객체의 경우 Javaλ‚˜ Python, NodeJS의 new μ—°μ‚°μžλ₯Ό 톡해 λ©”λͺ¨λ¦¬ 할당이 μˆ˜ν–‰λœλ‹€.