๐Ÿ€ Knowledge/์šด์˜์ฒด์ œ(OS)

[์šด์˜์ฒด์ œ] Process Context์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

TIlearn 2024. 3. 16. 14:34

 

 

 

Process Context

 

์ปจํ…์ŠคํŠธ๋ž€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Process Context๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ์„ ๋งํ•œ๋‹ค.

 

 

์ปจํ…์ŠคํŠธ์—๋Š” ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๋Š”๋ฐ ํ•˜๋‚˜๋Š” User Context, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” System Context์ด๋‹ค.

 

 

  • User Context
    • ์ฝ”๋“œ : ์œ ์ € ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ
    • ๋ฐ์ดํ„ฐ : ํ”„๋กœ์„ธ์Šค์˜ ์ „์—ญ ๋ณ€์ˆ˜
    • User Stack : LIFO ์ž๋ฃŒ๊ตฌ์กฐ
      • ์ง€์—ญ ๋ณ€์ˆ˜, ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ด ์ •๋ณด ๋“ฑ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • System Context
    • ์šด์˜์ฒด์ œ๊ฐ€ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.
    • Kernel Stack(System Stack)
      • ์ปค๋„ ์ฝ”๋“œ ๋‚ด์— ์žˆ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์œ„ํ•œ ์ธ์ž, ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
      • ์ปค๋„ ์˜์—ญ์— ์กด์žฌ
    • Process Control Block(PCB)
      • ํ”„๋กœ์„ธ์Šค ์ œ์–ด๋ฅผ ์œ„ํ•œ ์ •๋ณด

 

 

 

 

 

์ด์ „์— ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ฐฐ์šด ๋ฐ”๊ฐ€ ์žˆ๋‹ค. _fork()_ํ•จ์ˆ˜๋Š” ์ž์‹์„ ์ƒ์„ฑํ•˜๋ฉฐ ํ•ด๋‹น ๋ถ€๋ถ„์—์„œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

 

๋”ฐ๋ผ์„œ ๋ถ€๋ชจ๋Š” 6๊ณผ 88์„ ์ถœ๋ ฅํ•˜๊ณ  ์ž์‹์€ 7๊ณผ 89๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

 

 

User Part of Process Context

 

 

 

 

 

gcc์™€ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด์กฐ๊ธฐ์–ต์žฅ์น˜์— ์œ„์™€ ๊ฐ™์ด _a.out_์ด๋ผ๋Š” ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. Linux์—์„œ _a.out_์€ ELF๋ผ๋Š” format์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

 

 

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์‹คํ–‰ ํŒŒ์ผ์€ ๋ณด์กฐ๊ธฐ์–ต์žฅ์น˜ ๋‚ด์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๊ฐ€์ง„๋‹ค.

 

 

  • header
    • ์‹คํ–‰ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด
  • code
    • ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ
  • data
    • ๊ฐ’์ด ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ
  • bss
    • ๊ฐ’์ด ์ฃผ์–ด์ง€์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ
  • stack
    • ์ง€์—ญ ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ด ๊ฐ’ ๋“ฑ

 

 

์ด๋Ÿฌํ•œ _a.out_์„ ๋”๋ธ”ํด๋ฆญํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด๋•Œ ์œ„์™€ ๊ฐ™์€ ์ •๋ณด๋“ค๊ณผ ํ•จ๊ป˜ virtual address space์— ์šฐ์„ ์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ์ด ๊ณต๊ฐ„์€ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ 4GB๋งŒํผ ์ฑ„์›Œ์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋Š” 2์˜ 32์Šน์œผ๋กœ Hex ์ฝ”๋“œ๋กœ _0xffffff_๊ฐ€ ๋œ๋‹ค.

 

 

์ด๋•Œ, ์ด๋ ‡๊ฒŒ๋‚˜ ํฐ ๊ณต๊ฐ„์€ _code_, _data_, _bss_,  _stack_์ด ํ•œ ๋ฒˆ์— ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋นˆ ๊ณต๊ฐ„์œผ๋กœ ๋‘๋ฉฐ ์ตœ๋Œ€ 4GB๋งŒํผ ์ปค์งˆ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

๋˜ํ•œ 0~3GB๊นŒ์ง€๋Š” ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋ž˜๋จธ์— ์˜ํ•ด์„œ ๋งŒ๋“ค์–ด์ง€๋Š” User Context์ด๋ฉฐ 3GB~4GB๊นŒ์ง€๋Š” ์ปค๋„์ด ๋“ค์–ด๊ฐ„๋‹ค.  ์ฆ‰, _code_์—์„œ 3GB๊นŒ์ง€ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ _user mode_๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , 3GB~4GB์˜ ์ปค๋„ ์˜์—ญ์˜ ์‹œ์Šคํ…œ ์ฝœ(fork ๋“ฑ)์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ _kernel mode_๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

user mode์™€ kernel mode๋ฅผ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์„ mode change๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

 

virtual adress space ๋‚ด์˜ stack์€ ๋ณด์กฐ๊ธฐ์–ต์žฅ์น˜ ๋‚ด์—์„œ์™€ ๋‹ฌ๋ฆฌ ๊ฑฐ๊พธ๋กœ ๋ฐฐ์น˜๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜๋กœ ์ž๋ผ์•ผ ํ•œ๋‹ค.(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋†’์€ ๊ณณ์—์„œ ๋‚ฎ์€ ๊ณณ์œผ๋กœ) ์ด์œ ๋Š” kernel์˜ ์˜์—ญ์„ ์นจ๋ฒ”ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

 

 

๋น„์–ด์žˆ๋Š” ์˜์—ญ์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜น์€ heap ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์ด ๋“ค์–ด๊ฐ€๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ง€๊ธˆ๊นŒ์ง€ ๋ณด์กฐ๊ธฐ์–ต์žฅ์น˜ ๋‚ด์—์„œ virtual address space๊ฐ€ ์กด์žฌํ•˜๋Š” ์ƒํ™ฉ์ธ๋ฐ, ์ด๋Š” ํ”„๋กœ์„ธ์Šค ์ƒํƒœ์—์„œ  _new_ ์ƒํƒœ์ธ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๊ฒŒ ๋˜๋ฉด virtual address space์— ์žˆ๋Š” ๊ฐ’๋“ค์ด ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. ๊ฒฐ๊ตญ์—๋Š” ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ ์ด์™ธ์˜ ๊ณณ์—์„œ ํ”„๋กœ๊ทธ๋žจ์€ ์‹คํ–‰๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

์ด๋ ‡๊ฒŒ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๋กœ ํ”„๋กœ์„ธ์Šค์˜ ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ์ƒํƒœ๋Š” ํ”„๋กœ์„ธ์Šค ์ƒํƒœ์—์„œ _Ready_์ƒํƒœ์ด๋‹ค.

 

 

 

 

 

 

 

Main Memory, Virtual Adress Space

 

 

 

 

์•ž์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด Virtual Adress Space๋Š” ๋ชจ๋‘ ๋‹ค ์–ด๋–ค ๊ธฐ์ค€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฑฐ๋ฆฌ๋ฅผ ๋งค๊ฒผ๊ธฐ์— ์ƒ๋Œ€์ ์ธ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.(4GB)

 

 

ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง์ž. Virtual Adress Space์— ์žˆ๋Š” ๊ฐ๊ฐ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์›๋ณธ์— ํ•ด๋‹น๋˜๋Š” ๊ฒƒ๋“ค์ด๊ณ  ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ณณ์€ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ(Physical Address)์ธ ๊ฒƒ์ด๋‹ค.

 

 

 

 

 

 

 

Context Saving in the User Stack

 

 

Stack์€ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์˜ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

 

 

 

 

 

์‚ฌ์ง„์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฐ”์™€ ๊ฐ™์ด User Stack์—์„œ๋Š” ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด์”ฉ ์Œ“์ด๊ฒŒ ๋œ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ , ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ •๋ณด๋Š” ์ง€์—ญ๋ณ€์ˆ˜, ์ธ์ž, ๊ทธ๋ฆฌ๊ณ  ๋ฆฌํ„ด๋  ์ฃผ์†Œ์™€ ๋ฆฌํ„ด ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

 

 

ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋ ˆ์ด์–ด๋Š” ํ•˜๋‚˜์”ฉ ๋น ์ง€๊ฒŒ ๋˜๋ฉฐ ๋น ์ง€๊ฒŒ ๋œ ๋ ˆ์ด์–ด์— ์žˆ๋Š” ๊ฐ’๋“ค์—๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

 

 

 

 

 

 

Context Saving in the Kernel Stack

 

 

 

 

 

์ปค๋„๋„ ์‹œ์Šคํ…œ ์ฝœ์ด ํ˜ธ์ถœ๋  ๋•Œ ์Šคํƒ์ด ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด _fork()_๋ผ๋Š” User Level์˜ Execution์ด ์ƒ๊ฒผ์„ ๋•Œ, System Call ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ด์— ๋Œ€ํ•œ ๋ฆฌํ„ด ์ฃผ์†Œ์™€ ์ธ์ž, ๊ทธ๋ฆฌ๊ณ  ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. System Call์€ ๋‚ด๋ถ€์ ์œผ๋กœ Disk Interrupt๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์ด์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋„ ์—ฐ์‡„์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

 

 

์ฆ‰, User Stack์ด๋“ , Kernel Stack์ด๋“  ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์€ ์œ ์‚ฌํ•˜๋‹ค.