๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

โœ”๏ธ Etc.

[OS] ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ (Memory Structure) - code, data, stack, heap

728x90
์ปดํ“จํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

 

 


๋จผ์ €, ์•„๋ž˜ ๊ทธ๋ฆผ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •๋ณด๋ฅผ ์ฝ์–ด ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜๋Š” ๊ณผ์ •์œผ๋กœ

ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด OS๋Š” ๋ฉ”๋ชจ๋ฆฌ(RAM)์— ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ด์ค๋‹ˆ๋‹ค.

 

 

์ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„(RAM)์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด,

ํฌ๊ฒŒ ์ฝ”๋“œ(Code), ๋ฐ์ดํ„ฐ(Data), ์Šคํƒ(Stack), ํž™(Heap) ์˜์—ญ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

(๋งˆ์Œ์— ๋“œ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์—†์–ด์„œ ์ง์ ‘ ๋งŒ๋“ค๋‹ค....!!๐Ÿ˜–)

 

 

๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„

๊ทธ๋Ÿผ ๊ฐ ์˜์—ญ์ด ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค :)

 

 

 

โ–ถ ์ฝ”๋“œ(Code) ์˜์—ญ

  • ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ์œผ๋กœ ๊ธฐ๊ณ„์–ด ํ˜•ํƒœ(0,1)๋กœ ์ €์žฅ
  • ์‹คํ–‰ ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์ด ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ ํ•จ์ˆ˜, ์ œ์–ด๋ฌธ, ์ƒ์ˆ˜ ๋“ฑ์ด ์—ฌ๊ธฐ์— ์ง€์ •๋œ๋‹ค.
  • CPU๋Š” ์ฝ”๋“œ ์˜์—ญ์— ์ €์žฅ๋œ ๋ช…๋ น์–ด๋“ค์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ๊ฐ€์„œ ์‹คํ–‰ํ•œ๋‹ค.

 

 

 


โ–ถ ๋ฐ์ดํ„ฐ(Data) ์˜์—ญ 

  • ์ „์—ญ ๋ณ€์ˆ˜์™€ static ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹น๋˜๋Š” ์˜์—ญ
  • mainํ•จ์ˆ˜ ์ „์— ์„ ์–ธ๋˜์–ด ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘๊ณผ ๋™์‹œ์— ํ• ๋‹น๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์–ด์•ผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์†Œ๋ฉธ๋จ
var a: Int = 10;	// ์ „์—ญ๋ณ€์ˆ˜๋กœ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ํ• ๋‹น
var b: Int = 20;	// ์ „์—ญ๋ณ€์ˆ˜๋กœ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ํ• ๋‹น

struct dataFunc(){
	static let data = "data" // ์ •์ (static) ๋ณ€์ˆ˜๋กœ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ํ• ๋‹น
}

 

 


โ–ถ ํž™(Heap) ์˜์—ญ

  • ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹น๋˜๋Š” ์˜์—ญ(Dynamic Memory Allocation)
  • C++์—์„œ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ์ด ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ํž™ ์„ธ๊ทธ๋จผํŠธ์— ํ• ๋‹น
int* ptr = new int; // ptr์€ ํž™์—์„œ 4๋ฐ”์ดํŠธ๋กœ ํ• ๋‹น๋œ๋‹ค. 
int* array = new int[10]; // array๋Š” ํž™์—์„œ 40๋ฐ”์ดํŠธ๋กœ ํ• ๋‹น๋œ๋‹ค.

๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ณ€์ˆ˜๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋Š” ํž™์œผ๋กœ "๋ฐ˜ํ™˜"๋˜๊ณ , ์ดํ›„ ๋‹ค์‹œ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค. ํฌ์ธํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋ณ€์ˆ˜๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ด€๋ จ ์ฃผ์†Œ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šด์˜ ์ฒด์ œ์— ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์›ํ•˜๋Š” ์‹œ์ ์— ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹น(malloc, calloc)ํ•˜๊ณ  ์†Œ๋ฉธ์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ์˜์—ญ
  • ์‚ฌ์šฉํ•˜๊ณ  ๋‚œ ํ›„ ๋ฐ˜๋“œ์‹œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ํ•ด์ค˜์•ผ ํ•จ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด memory leak ๋ฐœ์ƒ.(์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ์œ ์ง€๋จ)
  • ์˜์—ญ ์ค‘ ์œ ์ผํ•˜๊ฒŒ ๋Ÿฐํƒ€์ž„ ์‹œ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •
  • (In Swift) ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค(Class Instance), ํด๋กœ์ €๊ฐ™์€ ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ’์ด ๋ถ€๋ถ„์— ํ•ด๋‹น.
    • Swift๋Š” ARC๋ฅผ ํ†ตํ•ด ํž™์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ์“ธ๋ชจ ์—†์–ด์ง€๋ฉด(์ฐธ์กฐ๋˜์ง€ ์•Š์œผ๋ฉด) ์ž๋™์œผ๋กœ ํ•ด์ œํ•ด์คŒ
  • ๋ฉ”๋ชจ๋ฆฌ ์œ„์ชฝ ์ฃผ์†Œ๋ถ€ํ„ฐ ํ• ๋‹น๋˜๋Š” ์„ ์ž…์„ ์ถœ(FIFO) ๊ตฌ์กฐ.
class Person {
    var name: String?
    var age: Int?
}

var person: Person = Person()    // ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋Š” ํž™, person ๋ณ€์ˆ˜๋Š” ์Šคํƒ ์˜์—ญ์— ํ• ๋‹น

 

 


โ–ถ ์Šคํƒ(Stack) ์˜์—ญ

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ƒ์„ฑ๋˜๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ๋„ ํ•ด์ œ๋จ
  • ๋ฉ”๋ชจ๋ฆฌ ์•„๋ž˜์ชฝ ์ฃผ์†Œ๋ถ€ํ„ฐ ํ• ๋‹น๋˜๋Š” ํ›„์ž…์„ ์ถœ(LIFO) ๊ตฌ์กฐ.
func add(_ a: Int, _ b: Int) -> Int {	// ํŒŒ๋ผ๋ฏธํ„ฐ a,b ๋Š” ์Šคํƒ์— ํ• ๋‹น
      let result = a + b		// ์ง€์—ญ๋ณ€์ˆ˜ result๋Š” ์Šคํƒ์— ํ• ๋‹น
    return result
}

 

๋ฐ˜์‘ํ˜•