๐Ÿ–ฅ๏ธ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: C์–ธ์–ด๋กœ ์šด์˜์ฒด์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ–ฅ๏ธ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: C์–ธ์–ด๋กœ ์šด์˜์ฒด์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๐Ÿš€

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ ๋ณผ ๊ฑฐ์•ผ. ๋ฐ”๋กœ '์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ'์ด๋ผ๋Š” ๊ฑฐ์ง€. ๋ญ”๊ฐ€ ์–ด๋ ค์›Œ ๋ณด์ด๋Š” ์ด๋ฆ„์ด์ง€๋งŒ, ๊ฑฑ์ • ๋งˆ! ๋‚ด๊ฐ€ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. ๐Ÿ˜‰

์šฐ๋ฆฌ๊ฐ€ ๋งค์ผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํ“จํ„ฐ, ์Šค๋งˆํŠธํฐ, ํƒœ๋ธ”๋ฆฟ... ์ด๋Ÿฐ ๊ธฐ๊ธฐ๋“ค์˜ ๋’ค์—์„œ ๋ฌต๋ฌตํžˆ ์ผํ•˜๊ณ  ์žˆ๋Š” ์ˆจ์€ ์˜์›…์ด ์žˆ๋‹ค๋Š” ๊ฑฐ ์•Œ๊ณ  ์žˆ์—ˆ์–ด? ๋ฐ”๋กœ ์šด์˜์ฒด์ œ(OS: Operating System)์•ผ. ์šด์˜์ฒด์ œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๊ธฐ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ•ต์‹ฌ ์†Œํ”„ํŠธ์›จ์–ด์ธ๋ฐ, ์ด๋Ÿฐ ์šด์˜์ฒด์ œ์˜ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒŒ ๋ฐ”๋กœ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด์•ผ.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ด ๋ชจ๋“  ๊ฑธ C์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฑฐ์•ผ! C์–ธ์–ด๊ฐ€ ๋ญ๋ƒ๊ณ ? ์Œ... ์ปดํ“จํ„ฐ์™€ ๊ฐ€์žฅ ๊ฐ€๊น๊ฒŒ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ. ๋ณต์žกํ•œ ๊ธฐ๊ณ„์–ด๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ ๋„ ํ•˜๋“œ์›จ์–ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€.

์ด ์—ฌ์ •์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ์ปดํ“จํ„ฐ์˜ ์‹ฌ์žฅ๋ถ€๋กœ ๋“ค์–ด๊ฐ€ ๋ณผ ๊ฑฐ์•ผ. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ํƒํ—˜ํ•˜๋“ฏ์ด, ์šด์˜์ฒด์ œ์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด๊ณ  ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ๋ž€ ๋ง์ด์ง€. ์žฌ๋Šฅ๋„ท์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ์ˆจ๊ฒจ์ง„ ์žฌ๋Šฅ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” ํ”Œ๋žซํผ์ด๋“ฏ, ์šฐ๋ฆฌ์˜ ์ด ์—ฌ์ •์€ ์ปดํ“จํ„ฐ์˜ ์ˆจ๊ฒจ์ง„ ๋น„๋ฐ€์„ ๋ฐœ๊ฒฌํ•˜๋Š” ํฅ๋ฏธ์ง„์ง„ํ•œ ๋ชจํ—˜์ด ๋  ๊ฑฐ์•ผ! ๐ŸŽจ๐ŸŽธ๐Ÿ’ป

์ž, ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ? ์•ˆ์ „๋ฒจํŠธ ๊ฝ‰ ๋งค! ์šฐ๋ฆฌ์˜ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์šฐ์ฃผ์„ ์ด ์ด๋ฅ™ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿš€

๐ŸŒŸ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐ€๊ธฐ

์ž, ์นœ๊ตฌ๋“ค! ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๋ถ€ํ„ฐ ํƒํ—˜ํ•  ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„๋Š” ์ •๋ง ๋„“๊ณ  ๊นŠ์–ด. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋ฐฐ์šฐ๋“ฏ์ด, ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋„ ์ˆ˜๋งŽ์€ ํฅ๋ฏธ๋กœ์šด ์ฃผ์ œ๋“ค์„ ๋งŒ๋‚˜๊ฒŒ ๋  ๊ฑฐ์•ผ. ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ? ๐Ÿ˜Ž

1. ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ปดํ“จํ„ฐ์˜ ํ•˜๋“œ์›จ์–ด์™€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ๋งํ•ด. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ์ปดํ“จํ„ฐ์˜ '๋‘๋‡Œ'์ธ ์šด์˜์ฒด์ œ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜, ์šด์˜์ฒด์ œ์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฑฐ์ง€.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ๋งค์ผ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ, ์ž‘์—… ๊ด€๋ฆฌ์ž, ๋””์Šคํฌ ์ •๋ฆฌ ๋„๊ตฌ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ๋ชจ๋‘ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฒฐ๊ณผ๋ฌผ์ด์•ผ. ์ด๋Ÿฐ ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ์šด์˜์ฒด์ œ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋ฐ˜์ ์ธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๋ณด๋‹ค ๋” ๊นŠ์€ ์ˆ˜์ค€์˜ ์ง€์‹๊ณผ ๊ธฐ์ˆ ์ด ํ•„์š”ํ•ด.

2. ์™œ C์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” C์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•  ๊ฑฐ์•ผ. C์–ธ์–ด๋ฅผ ์„ ํƒํ•œ ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ? ๐Ÿค”

  • ํ•˜๋“œ์›จ์–ด ์ œ์–ด: C์–ธ์–ด๋Š” ํ•˜๋“œ์›จ์–ด๋ฅผ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์–ธ์–ด์•ผ. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , CPU ๋ ˆ์ง€์Šคํ„ฐ๋„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€.
  • ํšจ์œจ์„ฑ: C๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ๋งค์šฐ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰๋ผ. ์‹œ์Šคํ…œ ์ž์›์„ ์ตœ์†Œํ•œ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ตœ๋Œ€์˜ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ์–ด.
  • ์ด์‹์„ฑ: C์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ์‰ฝ๊ฒŒ ์ปดํŒŒ์ผ๋˜๊ณ  ์‹คํ–‰๋  ์ˆ˜ ์žˆ์–ด. ์ด๋Š” ์šด์˜์ฒด์ œ ๊ฐœ๋ฐœ์— ๋งค์šฐ ์ค‘์š”ํ•œ ํŠน์„ฑ์ด์ง€.
  • ํ’๋ถ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: C์–ธ์–ด๋Š” ์˜ค๋žœ ์—ญ์‚ฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ, ๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž‘์—…์„ ์œ„ํ•œ ํ’๋ถ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋„๊ตฌ๋“ค์ด ์กด์žฌํ•ด.

์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋“ฏ์ด, C์–ธ์–ด๋„ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ '์žฌ๋Šฅ'์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์…ˆ์ด์ง€! ๐Ÿ˜‰

3. ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฃผ์š” ์˜์—ญ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ํƒํ—˜ํ•  ์ฃผ์š” ์˜์—ญ๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ? ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜์—ญ๋“ค์„ ๋‹ค๋ค„:

  • ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ
  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
  • ํŒŒ์ผ ์‹œ์Šคํ…œ
  • ์ž…์ถœ๋ ฅ(I/O) ๊ด€๋ฆฌ
  • ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„ ๊ฐœ๋ฐœ

์ด ๊ฐ๊ฐ์˜ ์˜์—ญ๋“ค์ด ์–ด๋–ค ๊ฑด์ง€, ๊ทธ๋ฆฌ๊ณ  C์–ธ์–ด๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ•˜๋‚˜์”ฉ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ๊ฑฐ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ์ „๋ฌธ๊ฐ€๋“ค์„ ๋งŒ๋‚˜๋“ฏ์ด, ์šฐ๋ฆฌ๋„ ์ด ์—ฌ์ •์„ ํ†ตํ•ด ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ ๋ถ„์•ผ '์ „๋ฌธ๊ฐ€'๊ฐ€ ๋˜์–ด๋ณผ ๊ฑฐ์•ผ! ๐ŸŽ“

์ค€๋น„๋์–ด? ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ฐ ์˜์—ญ์„ ํƒํ—˜ํ•ด๋ณด์ž๊ณ !

๐Ÿ”„ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ: ์ปดํ“จํ„ฐ์˜ ์ž‘์—… ๊ด€๋ฆฌ์ž ๋˜๊ธฐ

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ํƒํ—˜ ์˜์—ญ์ธ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ญ”์ง€ ๊ถ๊ธˆํ•ด? ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด, ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์„ ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ํ•ด. ์ง€๊ธˆ ๋„ค๊ฐ€ ์ด ๊ธ€์„ ์ฝ๊ณ  ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €๋„ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์•ผ! ๐Ÿ˜Š

1. ํ”„๋กœ์„ธ์Šค๋ž€?

ํ”„๋กœ์„ธ์Šค๋Š” ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์Šคํ„ด์Šค์•ผ. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ๋งŒ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„, CPU ์‹œ๊ฐ„, ํŒŒ์ผ ๋“ฑ์˜ ์‹œ์Šคํ…œ ์ž์›์„ ํ• ๋‹น๋ฐ›์•„ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ๋งŒ์˜ ๊ณต๊ฐ„์—์„œ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

2. ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ

ํ”„๋กœ์„ธ์Šค๋Š” ์ƒ๋ช… ์ฃผ๊ธฐ ๋™์•ˆ ์—ฌ๋Ÿฌ ์ƒํƒœ๋ฅผ ๊ฑฐ์ณ. ์ฃผ์š” ์ƒํƒœ๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ?

  • ์ƒ์„ฑ(New): ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ง‰ ๋งŒ๋“ค์–ด์ง„ ์ƒํƒœ
  • ์ค€๋น„(Ready): ์‹คํ–‰๋  ์ค€๋น„๊ฐ€ ๋œ ์ƒํƒœ
  • ์‹คํ–‰(Running): CPU์— ์˜ํ•ด ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ
  • ๋Œ€๊ธฐ(Waiting): ์–ด๋–ค ์ด๋ฒคํŠธ(์˜ˆ: I/O ์™„๋ฃŒ)๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ
  • ์ข…๋ฃŒ(Terminated): ์‹คํ–‰์ด ๋๋‚œ ์ƒํƒœ

์ด๋Ÿฐ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋  ๊ฑฐ์•ผ:

ํ”„๋กœ์„ธ์Šค ์ƒํƒœ ๋‹ค์ด์–ด๊ทธ๋žจ New Ready Running Waiting Terminated

3. C์–ธ์–ด๋กœ ํ”„๋กœ์„ธ์Šค ๋งŒ๋“ค๊ธฐ

์ž, ์ด์ œ C์–ธ์–ด๋กœ ์–ด๋–ป๊ฒŒ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ? ์šฐ๋ฆฌ๋Š” fork() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฑฐ์•ผ. ์ด ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ๋ณต์‚ฌ๋ณธ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด๋‚ด์ง€. ์ฝ”๋“œ๋กœ ํ•œ๋ฒˆ ๋ณผ๊นŒ?


#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();

    if (pid < 0) {
        fprintf(stderr, "Fork failed\n");
        return 1;
    } else if (pid == 0) {
        printf("Hello from child process!\n");
    } else {
        printf("Hello from parent process!\n");
    }

    return 0;
}
  

์ด ์ฝ”๋“œ๊ฐ€ ํ•˜๋Š” ์ผ์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  1. fork() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค์–ด.
  2. ๋งŒ์•ฝ fork()๊ฐ€ ์‹คํŒจํ•˜๋ฉด (pid < 0), ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ด.
  3. ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” pid๊ฐ€ 0์ด ๋ผ. ๊ทธ๋ž˜์„œ "Hello from child process!"๋ฅผ ์ถœ๋ ฅํ•ด.
  4. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” pid๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ID๊ฐ€ ๋ผ. ๊ทธ๋ž˜์„œ "Hello from parent process!"๋ฅผ ์ถœ๋ ฅํ•ด.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‘ ๊ฐœ๋กœ '๋ณต์ œ'๋˜๋Š” ๊ฑฐ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํ•˜๋‚˜์˜ ์žฌ๋Šฅ์ด ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์—๊ฒŒ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿ˜‰

4. ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  (IPC: Inter-Process Communication)

ํ”„๋กœ์„ธ์Šค๋“ค์€ ์„œ๋กœ ๋…๋ฆฝ์ ์ด์ง€๋งŒ, ๋•Œ๋กœ๋Š” ํ˜‘๋ ฅํ•ด์•ผ ํ•  ๋•Œ๋„ ์žˆ์–ด. ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ (IPC)์ด์•ผ. IPC์˜ ์ฃผ์š” ๋ฐฉ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ?

  • ํŒŒ์ดํ”„(Pipes): ๋ถ€๋ชจ-์ž์‹ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋ผ.
  • ๋ฉ”์‹œ์ง€ ํ(Message Queues): ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด.
  • ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(Shared Memory): ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ณต์œ ํ•ด.
  • ์„ธ๋งˆํฌ์–ด(Semaphores): ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•ด.
  • ์†Œ์ผ“(Sockets): ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉ๋ผ.

์ด ์ค‘์—์„œ ํŒŒ์ดํ”„๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


#include <stdio.h>
#include <unistd.h>
#include <string.h>

#define BUFFER_SIZE 25

int main() {
    int pipefd[2];
    char buffer[BUFFER_SIZE];
    pid_t pid;

    if (pipe(pipefd) == -1) {
        perror("pipe");
        return 1;
    }

    pid = fork();

    if (pid == -1) {
        perror("fork");
        return 1;
    } else if (pid == 0) {  // ์ž์‹ ํ”„๋กœ์„ธ์Šค
        close(pipefd[1]);  // ์“ฐ๊ธฐ ๋ ๋‹ซ๊ธฐ
        read(pipefd[0], buffer, BUFFER_SIZE);
        printf("์ž์‹์ด ๋ฐ›์€ ๋ฉ”์‹œ์ง€: %s\n", buffer);
        close(pipefd[0]);
    } else {  // ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค
        close(pipefd[0]);  // ์ฝ๊ธฐ ๋ ๋‹ซ๊ธฐ
        strcpy(buffer, "์•ˆ๋…•, ๋‚œ ๋„ค ๋ถ€๋ชจ์•ผ!");
        write(pipefd[1], buffer, strlen(buffer) + 1);
        close(pipefd[1]);
    }

    return 0;
}
  

์ด ์ฝ”๋“œ๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์˜ˆ์ œ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋ฉ˜ํ† ๊ฐ€ ๋ฉ˜ํ‹ฐ์—๊ฒŒ ์ง€์‹์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐ŸŽ“

5. ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ค„๋ง

์ปดํ“จํ„ฐ๋Š” ๋ณดํ†ต ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๊ณ  ์žˆ์–ด. ํ•˜์ง€๋งŒ CPU๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€. ๊ทธ๋ž˜์„œ ํ•„์š”ํ•œ ๊ฒŒ ๋ฐ”๋กœ ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ค„๋ง์ด์•ผ.

ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ค„๋ง์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋“ค ์ค‘ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์Œ์— ์‹คํ–‰ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ž‘์—…์ด์•ผ. ์ฃผ์š” ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ?

  • ์„ ์ž…์„ ์ถœ(FIFO): ๋จผ์ € ์˜จ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ด.
  • ์ตœ๋‹จ ์ž‘์—… ์šฐ์„ (SJF): ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์งง์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ด.
  • ์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜: ๊ฐ ํ”„๋กœ์„ธ์Šค์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ด.
  • ๋ผ์šด๋“œ ๋กœ๋นˆ: ๊ฐ ํ”„๋กœ์„ธ์Šค์— ์ผ์ • ์‹œ๊ฐ„์„ ํ• ๋‹นํ•˜๊ณ , ๊ทธ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜์–ด๊ฐ€.

์ด๋Ÿฐ ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์šด์˜์ฒด์ œ๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์ง€๋งŒ, ์šฐ๋ฆฌ๋„ ํ”„๋กœ์„ธ์Šค์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด. C์–ธ์–ด์—์„œ๋Š” nice() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ์„ธ์Šค์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€.


#include <unistd.h>
#include <stdio.h>

int main() {
    int priority = nice(0);  // ํ˜„์žฌ ์šฐ์„ ์ˆœ์œ„ ํ™•์ธ
    printf("ํ˜„์žฌ ์šฐ์„ ์ˆœ์œ„: %d\n", priority);

    nice(10);  // ์šฐ์„ ์ˆœ์œ„๋ฅผ 10๋งŒํผ ๋‚ฎ์ถค
    priority = nice(0);
    printf("๋ณ€๊ฒฝ๋œ ์šฐ์„ ์ˆœ์œ„: %d\n", priority);

    return 0;
}
  

์ด ์ฝ”๋“œ๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ํ™•์ธํ•˜๊ณ , ๊ทธ ๋‹ค์Œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ถ”๋Š” ์˜ˆ์ œ์•ผ. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์•„์ง€๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค๋ณด๋‹ค ๋œ ์ค‘์š”ํ•˜๊ฒŒ ์ทจ๊ธ‰๋˜์–ด CPU ์‹œ๊ฐ„์„ ์ ๊ฒŒ ๋ฐ›๊ฒŒ ๋ผ.

6. ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋  ๋•Œ, ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์กฐ์ ˆํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด. ์ด๋ฅผ ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”๋ผ๊ณ  ํ•ด. ๋™๊ธฐํ™”๊ฐ€ ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์œผ๋ฉด ๊ฒฝ์Ÿ ์ƒํƒœ(Race Condition)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด.

ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„:

  • ๋ฎคํ…์Šค(Mutex): ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด.
  • ์„ธ๋งˆํฌ์–ด(Semaphore): ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋ฅผ ์ œํ•œํ•ด.
  • ๋ชจ๋‹ˆํ„ฐ(Monitor): ๊ณต์œ  ์ž์›์„ ๋‚ด๋ถ€์— ์ˆจ๊ธฐ๊ณ , ์ ‘๊ทผ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด.

C์–ธ์–ด์—์„œ ์„ธ๋งˆํฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

sem_t semaphore;

void* process(void* arg) {
    sem_wait(&semaphore);  // ์„ธ๋งˆํฌ์–ด ํš๋“
    printf("ํ”„๋กœ์„ธ์Šค %d๊ฐ€ ์ž„๊ณ„ ์˜์—ญ์— ์ง„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.\n", *(int*)arg);
    sleep(1);  // ์ž„๊ณ„ ์˜์—ญ์—์„œ์˜ ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    printf("ํ”„๋กœ์„ธ์Šค %d๊ฐ€ ์ž„๊ณ„ ์˜์—ญ์„ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.\n", *(int*)arg);
    sem_post(&semaphore);  // ์„ธ๋งˆํฌ์–ด ๋ฐ˜ํ™˜
    return NULL;
}

int main() {
    pthread_t th1, th2;
    int id1 = 1, id2 = 2;

    sem_init(&semaphore, 0, 1);  // ์„ธ๋งˆํฌ์–ด ์ดˆ๊ธฐํ™”

    pthread_create(&th1, NULL, process, &id1);
    pthread_create(&th2, NULL, process, &id2);

    pthread_join(th1, NULL);
    pthread_join(th2, NULL);

    sem_destroy(&semaphore);

    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค(์—ฌ๊ธฐ์„œ๋Š” ์Šค๋ ˆ๋“œ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜)๊ฐ€ ์„ธ๋งˆํฌ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์ž„๊ณ„ ์˜์—ญ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋™๊ธฐํ™”ํ•˜๊ณ  ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ์žฌ๋Šฅ์„ ๋ฐฐ์šฐ๋ ค๊ณ  ํ•  ๋•Œ, ์ˆœ์„œ๋ฅผ ์ •ํ•ด์„œ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด! ๐Ÿ˜Š

7. ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ์™€ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค

ํ”„๋กœ์„ธ์Šค์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋Š” ์ข…๋ฃŒ์•ผ. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉด ์šด์˜์ฒด์ œ๋Š” ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ๋ชจ๋“  ์ž์›์„ ํšŒ์ˆ˜ํ•ด. ํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ํŠน์ดํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด.

์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋Š” ์ด๋ฏธ ์‹คํ–‰์„ ๋งˆ์ณค์ง€๋งŒ, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹์˜ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์•„ ํ”„๋กœ์„ธ์Šค ํ…Œ์ด๋ธ”์— ๋‚จ์•„์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งํ•ด. ์ด๋Ÿฐ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” wait() ๋˜๋Š” waitpid() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ด.


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    pid_t pid = fork();

    if (pid < 0) {
        perror("fork failed");
        exit(1);
    } else if (pid == 0) {
        printf("์ž์‹ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰\n");
        exit(0);
    } else {
        printf("๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค ๋Œ€๊ธฐ ์ค‘...\n");
        wait(NULL);
        printf("์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ํ™•์ธ\n");
    }

    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” wait() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ , ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ํ”„๋กœ์„ธ์Šค๋Š” ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ์š”์†Œ๋กœ, ํšจ์œจ์ ์ธ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ๋Š” ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์ณ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ๋“ค์ด ์กฐํ™”๋กญ๊ฒŒ ๊ณต์กดํ•˜๋ฉฐ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐ŸŒŸ

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ํ”„๋กœ์„ธ์Šค๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์šด์˜์ฒด์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด๋ฅผ ๊ด€๋ฆฌํ•˜ ๋Š”์ง€ ์‚ดํŽด๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ๊ณ„์† ๊ฐ€๋ณด์ž๊ณ ! ๐Ÿš€

๐Ÿ’พ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ: ์ปดํ“จํ„ฐ์˜ ๊ธฐ์–ต๋ ฅ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด์ œ ์šฐ๋ฆฌ์˜ ๋‘ ๋ฒˆ์งธ ํƒํ—˜ ์˜์—ญ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ปดํ“จํ„ฐ์˜ '๊ธฐ์–ต๋ ฅ'์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์–ด. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜์–ด์•ผ ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด์•ผ ํ•˜์ง€. ๊ทธ๋ž˜์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„์ฃผ ์ค‘์š”ํ•ด! ๐Ÿ˜Š

1. ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ตฌ์กฐ

๋จผ์ € ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ ์ ธ:

  • ํ…์ŠคํŠธ ์„ธ๊ทธ๋จผํŠธ(Text Segment): ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋ผ.
  • ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ(Data Segment): ์ „์—ญ ๋ณ€์ˆ˜์™€ ์ •์  ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋ผ.
  • ํž™(Heap): ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ €์žฅ๋ผ.
  • ์Šคํƒ(Stack): ์ง€์—ญ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ •๋ณด๊ฐ€ ์ €์žฅ๋ผ.

์ด ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋  ๊ฑฐ์•ผ:

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ๋‹ค์ด์–ด๊ทธ๋žจ ํ…์ŠคํŠธ ์„ธ๊ทธ๋จผํŠธ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ ํž™ (Heap) ์Šคํƒ (Stack) ๋‚ฎ์€ ์ฃผ์†Œ ๋†’์€ ์ฃผ์†Œ

2. C์–ธ์–ด์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

C์–ธ์–ด์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •์ ์œผ๋กœ ๋˜๋Š” ๋™์ ์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์–ด. ์ •์  ํ• ๋‹น์€ ์ปดํŒŒ์ผ ์‹œ์— ์ด๋ฃจ์–ด์ง€๊ณ , ๋™์  ํ• ๋‹น์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ์ด๋ฃจ์–ด์ ธ. ๋™์  ํ• ๋‹น์„ ์œ„ํ•ด C์–ธ์–ด๋Š” malloc(), calloc(), realloc(), free() ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด.


#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr;
    int n = 5;

    // ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
    arr = (int*)malloc(n * sizeof(int));

    if (arr == NULL) {
        printf("๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹คํŒจ\n");
        return 1;
    }

    // ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ
    for (int i = 0; i < n; i++) {
        arr[i] = i * 10;
    }

    // ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ด์šฉ ์ถœ๋ ฅ
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
    free(arr);

    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” malloc()์„ ์‚ฌ์šฉํ•ด ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ์‚ฌ์šฉํ•œ ํ›„์—๋Š” free()๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํ•„์š”ํ•œ ๋งŒํผ์˜ ๊ณต๊ฐ„์„ ๋นŒ๋ ค ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค ์“ฐ๋ฉด ๋ฐ˜๋‚ฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด! ๐Ÿ˜‰

3. ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”

๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ค‘์š”ํ•œ ๋ฌธ์ œ์•ผ. ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”์—๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์–ด:

  • ์™ธ๋ถ€ ๋‹จํŽธํ™”: ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ์—ฐ์†์ ์ด์ง€ ์•Š์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ.
  • ๋‚ด๋ถ€ ๋‹จํŽธํ™”: ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ์‹ค์ œ ํ•„์š”ํ•œ ํฌ๊ธฐ๋ณด๋‹ค ํด ๋•Œ ๋ฐœ์ƒ.

์šด์˜์ฒด์ œ๋Š” ์ด๋Ÿฐ ๋‹จํŽธํ™”๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด. ์˜ˆ๋ฅผ ๋“ค๋ฉด:

  • ์ตœ์ดˆ ์ ํ•ฉ(First Fit)
  • ์ตœ์  ์ ํ•ฉ(Best Fit)
  • ์ตœ์•… ์ ํ•ฉ(Worst Fit)

4. ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ

๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์ด์•ผ. ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ๋” ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด.

๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์š” ๊ฐœ๋…๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ?

  • ํŽ˜์ด์ง•(Paging): ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ ์ • ํฌ๊ธฐ์˜ ๋ธ”๋ก(ํŽ˜์ด์ง€)์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ธฐ๋ฒ•.
  • ์„ธ๊ทธ๋จผํ…Œ์ด์…˜(Segmentation): ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋…ผ๋ฆฌ์  ๋‹จ์œ„(์„ธ๊ทธ๋จผํŠธ)๋กœ ๋‚˜๋ˆ„๋Š” ๊ธฐ๋ฒ•.
  • ํŽ˜์ด์ง€ ํดํŠธ(Page Fault): ์ ‘๊ทผํ•˜๋ ค๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์—†์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ.
  • ์Šค์™€ํ•‘(Swapping): ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ด์šฉ์„ ๋””์Šคํฌ๋กœ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜ ๋””์Šคํฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—….

C์–ธ์–ด์—์„œ๋Š” ์ง์ ‘์ ์œผ๋กœ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์–ดํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ์šด์˜์ฒด์ œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ ์œ„์—์„œ ๋™์ž‘ํ•ด. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์€ ์ž๋™์œผ๋กœ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ˜œํƒ์„ ๋ฐ›๊ฒŒ ๋ผ.

5. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•ด. ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๊ณ , ์‹ฌ๊ฐํ•œ ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ์ „์ฒด์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์–ด.

C์–ธ์–ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ์†Œ๊ฐœํ• ๊ฒŒ:

  • ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•ญ์ƒ free()๋กœ ํ•ด์ œํ•˜๊ธฐ.
  • ํฌ์ธํ„ฐ๋ฅผ NULL๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ํ•ด์ œ ํ›„์—๋„ NULL๋กœ ์„ค์ •ํ•˜๊ธฐ.
  • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ๋Œ€์นญ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ.
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํƒ์ง€ ๋„๊ตฌ(์˜ˆ: Valgrind) ์‚ฌ์šฉํ•˜๊ธฐ.

๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์˜ˆ์ œ์™€ ์ˆ˜์ •๋œ ๋ฒ„์ „์„ ๋ณผ๊นŒ?


// ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ
void memory_leak() {
    int *ptr = (int*)malloc(sizeof(int));
    *ptr = 10;
    // free(ptr)๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋จ
}

// ์ˆ˜์ •๋œ ์ฝ”๋“œ
void no_memory_leak() {
    int *ptr = (int*)malloc(sizeof(int));
    if (ptr == NULL) {
        return;  // ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹คํŒจ ์ฒ˜๋ฆฌ
    }
    *ptr = 10;
    free(ptr);
    ptr = NULL;  // ํ•ด์ œ ํ›„ ํฌ์ธํ„ฐ๋ฅผ NULL๋กœ ์„ค์ •
}
  

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ž์‹ ์˜ ์žฌ๋Šฅ์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด. ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์‚ฌ์šฉํ•˜๊ณ , ๋‹ค ์“ด ๊ฒƒ์€ ๋ฐ”๋กœ ์ •๋ฆฌํ•˜๋Š” ์Šต๊ด€์ด ์ค‘์š”ํ•˜์ง€! ๐Ÿงน

6. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

C์–ธ์–ด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š์•„. ํ•˜์ง€๋งŒ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•ด. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด์•ผ.

C์–ธ์–ด์—์„œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๊ณผ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์ฐธ์กฐ ์นด์šดํŒ…์ด๋‚˜ ๋งˆํฌ-์Šค์œ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ™์€ ๊ธฐ๋ฒ•์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•ด. ํ•˜์ง€๋งŒ ์ด๋Š” ๋ณต์žกํ•˜๊ณ  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€๋ถ€๋ถ„์˜ C ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ˆ˜๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ด.

7. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ ์ตœ์ ํ™”

ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด. ๋ช‡ ๊ฐ€์ง€ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์†Œ๊ฐœํ• ๊ฒŒ:

  • ๋ฉ”๋ชจ๋ฆฌ ํ’€(Memory Pool): ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•ด๋‘๊ณ  ์žฌ์‚ฌ์šฉ.
  • ๊ฐ์ฒด ์žฌ์‚ฌ์šฉ: ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•˜์—ฌ ํ• ๋‹น/ํ•ด์ œ ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ.
  • ๋ฉ”๋ชจ๋ฆฌ ์ •๋ ฌ: ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํžˆ ์ •๋ ฌํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์„ฑ ์ฆ๊ฐ€.
  • ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘: ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ๋งคํ•‘ํ•˜์—ฌ I/O ์„ฑ๋Šฅ ํ–ฅ์ƒ.

๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ’€ ๊ตฌํ˜„ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


#include <stdio.h>
#include <stdlib.h>

#define POOL_SIZE 10
#define BLOCK_SIZE sizeof(int)

typedef struct {
    char memory[POOL_SIZE * BLOCK_SIZE];
    int is_used[POOL_SIZE];
} MemoryPool;

MemoryPool* create_pool() {
    MemoryPool* pool = (MemoryPool*)malloc(sizeof(MemoryPool));
    for (int i = 0; i < POOL_SIZE; i++) {
        pool->is_used[i] = 0;
    }
    return pool;
}

void* allocate(MemoryPool* pool) {
    for (int i = 0; i < POOL_SIZE; i++) {
        if (!pool->is_used[i]) {
            pool->is_used[i] = 1;
            return &(pool->memory[i * BLOCK_SIZE]);
        }
    }
    return NULL;  // ํ’€์ด ๊ฐ€๋“ ์ฐผ์„ ๋•Œ
}

void deallocate(MemoryPool* pool, void* ptr) {
    int index = ((char*)ptr - pool->memory) / BLOCK_SIZE;
    if (index >= 0 && index < POOL_SIZE) {
        pool->is_used[index] = 0;
    }
}

void destroy_pool(MemoryPool* pool) {
    free(pool);
}

int main() {
    MemoryPool* pool = create_pool();
    
    int* num1 = (int*)allocate(pool);
    int* num2 = (int*)allocate(pool);
    
    *num1 = 10;
    *num2 = 20;
    
    printf("num1: %d, num2: %d\n", *num1, *num2);
    
    deallocate(pool, num1);
    deallocate(pool, num2);
    
    destroy_pool(pool);
    
    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” ๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ’€์„ ๊ตฌํ˜„ํ–ˆ์–ด. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด ์ž‘์€ ๊ฐ์ฒด๋“ค์„ ๋น ๋ฅด๊ฒŒ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์žฌ๋Šฅ๋“ค์„ ์‰ฝ๊ฒŒ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•ด๋‘๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ง€! ๐Ÿ“š

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ค‘์š”ํ•œ ์ฃผ์ œ์•ผ. ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ž์‹ ์˜ ์žฌ๋Šฅ์„ ์ž˜ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐœ์ „์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ํ•ญ์ƒ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด์ง€! ๐ŸŒŸ

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ปดํ“จํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ๊ณ„์† ๊ฐ€๋ณด์ž๊ณ ! ๐Ÿš€

๐Ÿ“ ํŒŒ์ผ ์‹œ์Šคํ…œ: ๋ฐ์ดํ„ฐ์˜ ์˜๊ตฌ์ ์ธ ๋ณด๊ธˆ์ž๋ฆฌ

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด์ œ ์šฐ๋ฆฌ์˜ ์„ธ ๋ฒˆ์งธ ํƒํ—˜ ์˜์—ญ์ธ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์ปดํ“จํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ตฌ์กฐ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฌ๋Šฅ๊ณผ ์ž‘ํ’ˆ๋“ค์„ ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•˜๊ณ  ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ง€! ๐Ÿ˜Š

1. ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋ž€?

ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ๊ตฌ์กฐํ™”ํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ด. ์ฃผ์š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„:

  • ํŒŒ์ผ์˜ ์ด๋ฆ„ ์ง€์ • ๋ฐ ์ €์žฅ
  • ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ๊ด€๋ฆฌ
  • ํŒŒ์ผ ์ ‘๊ทผ ๊ถŒํ•œ ๊ด€๋ฆฌ
  • ํŒŒ์ผ ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ ์ œ๊ณต
  • ๋””์Šคํฌ ๊ณต๊ฐ„์˜ ํšจ์œจ์  ์‚ฌ์šฉ

2. ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ

ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ? ๋Œ€๋ถ€๋ถ„์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด:

ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ตฌ์กฐ ๋ถ€ํŠธ ๋ธ”๋ก ์Šˆํผ ๋ธ”๋ก i-node ๋ชฉ๋ก ๋ฐ์ดํ„ฐ ๋ธ”๋ก
  • ๋ถ€ํŠธ ๋ธ”๋ก: ์‹œ์Šคํ…œ ๋ถ€ํŒ…์— ํ•„์š”ํ•œ ์ •๋ณด ์ €์žฅ
  • ์Šˆํผ ๋ธ”๋ก: ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์ „์ฒด์ ์ธ ์ •๋ณด ์ €์žฅ
  • i-node ๋ชฉ๋ก: ๊ฐ ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ
  • ๋ฐ์ดํ„ฐ ๋ธ”๋ก: ์‹ค์ œ ํŒŒ์ผ ๋‚ด์šฉ ์ €์žฅ

3. C์–ธ์–ด์—์„œ์˜ ํŒŒ์ผ ์ฒ˜๋ฆฌ

C์–ธ์–ด๋Š” ํŒŒ์ผ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด. ์ฃผ์š” ํ•จ์ˆ˜๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ?

  • fopen(): ํŒŒ์ผ ์—ด๊ธฐ
  • fclose(): ํŒŒ์ผ ๋‹ซ๊ธฐ
  • fread(): ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
  • fwrite(): ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ
  • fseek(): ํŒŒ์ผ ํฌ์ธํ„ฐ ์ด๋™
  • fprintf(), fscanf(): ํ˜•์‹ํ™”๋œ ์ž…์ถœ๋ ฅ

๊ฐ„๋‹จํ•œ ํŒŒ์ผ ์“ฐ๊ธฐ์™€ ์ฝ๊ธฐ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


#include <stdio.h>

int main() {
    FILE *file;
    char data[] = "Hello, File System!";
    char buffer[20];

    // ํŒŒ์ผ ์“ฐ๊ธฐ
    file = fopen("example.txt", "w");
    if (file == NULL) {
        printf("ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n");
        return 1;
    }
    fprintf(file, "%s", data);
    fclose(file);

    // ํŒŒ์ผ ์ฝ๊ธฐ
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n");
        return 1;
    }
    fgets(buffer, sizeof(buffer), file);
    printf("ํŒŒ์ผ ๋‚ด์šฉ: %s\n", buffer);
    fclose(file);

    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” ํŒŒ์ผ์— ๋ฌธ์ž์—ด์„ ์“ฐ๊ณ , ๋‹ค์‹œ ๊ทธ ๋‚ด์šฉ์„ ์ฝ์–ด์˜ค๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ค˜. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ž‘ํ’ˆ์„ ์—…๋กœ๋“œํ•˜๊ณ  ๋‹ค์‹œ ํ™•์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ง€! ๐Ÿ“

4. ํŒŒ์ผ ์ ‘๊ทผ ๋ฐฉ์‹

ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด:

  • ์ˆœ์ฐจ ์ ‘๊ทผ(Sequential Access): ํŒŒ์ผ์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ฝ๊ฑฐ๋‚˜ ์”€
  • ์ง์ ‘ ์ ‘๊ทผ(Direct Access): ํŒŒ์ผ์˜ ํŠน์ • ์œ„์น˜์— ๋ฐ”๋กœ ์ ‘๊ทผ
  • ์ธ๋ฑ์Šค ์ ‘๊ทผ(Indexed Access): ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋น ๋ฅด๊ฒŒ ํŠน์ • ๋ ˆ์ฝ”๋“œ์— ์ ‘๊ทผ

C์–ธ์–ด์—์„œ fseek() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ?


#include <stdio.h>

int main() {
    FILE *file;
    char data[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char ch;

    // ํŒŒ์ผ ์“ฐ๊ธฐ
    file = fopen("alphabet.txt", "w");
    fprintf(file, "%s", data);
    fclose(file);

    // ํŒŒ์ผ ์ฝ๊ธฐ (์ง์ ‘ ์ ‘๊ทผ)
    file = fopen("alphabet.txt", "r");
    fseek(file, 10, SEEK_SET);  // 11๋ฒˆ์งธ ๋ฌธ์ž๋กœ ์ด๋™
    ch = fgetc(file);
    printf("11๋ฒˆ์งธ ๋ฌธ์ž: %c\n", ch);
    fclose(file);

    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” ์•ŒํŒŒ๋ฒณ์„ ํŒŒ์ผ์— ์“ด ํ›„, 11๋ฒˆ์งธ ๋ฌธ์ž์— ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ ์ฝ์–ด์˜ค๊ณ  ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํŠน์ • ์ž‘ํ’ˆ์„ ๋ฐ”๋กœ ์ฐพ์•„๊ฐ€๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ง€! ๐Ÿ”

5. ๋””๋ ‰ํ† ๋ฆฌ ๊ด€๋ฆฌ

ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ํŒŒ์ผ๋“ค์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ. C์–ธ์–ด์—์„œ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋“ค๋„ ์ œ๊ณตํ•ด:

  • mkdir(): ์ƒˆ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
  • rmdir(): ๋””๋ ‰ํ† ๋ฆฌ ์‚ญ์ œ
  • opendir(): ๋””๋ ‰ํ† ๋ฆฌ ์—ด๊ธฐ
  • readdir(): ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์šฉ ์ฝ๊ธฐ
  • closedir(): ๋””๋ ‰ํ† ๋ฆฌ ๋‹ซ๊ธฐ

๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์šฉ์„ ์ฝ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


#include <stdio.h>
#include <dirent.h>

int main() {
    DIR *dir;
    struct dirent *ent;

    dir = opendir(".");
    if (dir == NULL) {
        printf("๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n");
        return 1;
    }

    while ((ent = readdir(dir)) != NULL) {
        printf("%s\n", ent->d_name);
    }

    closedir(dir);
    return 0;
}
  

์ด ์˜ˆ์ œ๋Š” ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํŠน์ • ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋ชจ๋“  ์ž‘ํ’ˆ์„ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด! ๐Ÿ“‚

6. ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋ณด์•ˆ

ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ณด์•ˆ์€ ๋งค์šฐ ์ค‘์š”ํ•ด. ์ฃผ์š” ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„:

  • ์ ‘๊ทผ ๊ถŒํ•œ: ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์‹คํ–‰ ๊ถŒํ•œ ์„ค์ •
  • ์‚ฌ์šฉ์ž ์ธ์ฆ: ์‚ฌ์šฉ์ž ID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•œ ์ธ์ฆ
  • ์•”ํ˜ธํ™”: ์ค‘์š”ํ•œ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์•”ํ˜ธํ™”
  • ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ: ๋ฐ์ดํ„ฐ ์†์‹ค ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์ •๊ธฐ์ ์ธ ๋ฐฑ์—…

C์–ธ์–ด์—์„œ ํŒŒ์ผ์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


#include <stdio.h>
#include <sys/stat.h>

int main() {
    const char *filename = "example.txt";
    
    // ํŒŒ์ผ ์ƒ์„ฑ
    FILE *file = fopen(filename, "w");
    if (file == NULL) {
        printf("ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n");
        return 1;
    }
    fclose(file);

    // ํŒŒ์ผ ๊ถŒํ•œ ๋ณ€๊ฒฝ (์†Œ์œ ์ž๋งŒ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ฐ€๋Šฅ)
    if (chmod(filename, S_IRUSR | S_IWUSR) == -1) {
        printf("ํŒŒ์ผ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n");
        return 1;
    }

    printf("ํŒŒ์ผ ๊ถŒํ•œ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n");
    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” chmod() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์žˆ์–ด. ์ด๋Š” ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ž‘ํ’ˆ์„ ๋น„๊ณต๊ฐœ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด! ๐Ÿ”’

7. ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”

ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•ด. ๋ช‡ ๊ฐ€์ง€ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์‚ดํŽด๋ณผ๊นŒ?

  • ์บ์‹ฑ: ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€
  • ๋ฒ„ํผ๋ง: ์—ฌ๋Ÿฌ I/O ์ž‘์—…์„ ๋ชจ์•„์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ
  • ์ธ๋ฑ์‹ฑ: ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์Šค ๊ตฌ์กฐ ์‚ฌ์šฉ
  • ์กฐ๊ฐ ๋ชจ์Œ: ํŒŒ์ผ ์กฐ๊ฐ์„ ๋ชจ์•„ ์—ฐ์†์ ์œผ๋กœ ์ €์žฅ

C์–ธ์–ด์—์„œ ๋ฒ„ํผ๋ง์„ ์‚ฌ์šฉํ•œ ํŒŒ์ผ ์“ฐ๊ธฐ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


#include <stdio.h>
#include <string.h>

#define BUFFER_SIZE 1024

int main() {
    FILE *file;
    char buffer[BUFFER_SIZE];
    int i;

    file = fopen("large_file.txt", "w");
    if (file == NULL) {
        printf("ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n");
        return 1;
    }

    // ๋ฒ„ํผ ์„ค์ •
    setvbuf(file, NULL, _IOFBF, BUFFER_SIZE);

    // ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ
    for (i = 0; i < 1000000; i++) {
        sprintf(buffer, "Line %d\n", i);
        fputs(buffer, file);
    }

    fclose(file);
    printf("ํŒŒ์ผ ์“ฐ๊ธฐ ์™„๋ฃŒ!\n");

    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” setvbuf() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ฒ„ํผ๋ง์„ ์„ค์ •ํ•˜๊ณ  ์žˆ์–ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒŒ์ผ ์“ฐ๊ธฐ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ ์ž‘ํ’ˆ์„ ํ•œ ๋ฒˆ์— ์—…๋กœ๋“œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด! ๐Ÿš€

8. ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ

ํ˜„๋Œ€์˜ ์ปดํ“จํŒ… ํ™˜๊ฒฝ์—์„œ๋Š” ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ด. ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ์— ๊ฑธ์ณ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„:

  • ํˆฌ๋ช…์„ฑ: ์‚ฌ์šฉ์ž๋Š” ํŒŒ์ผ์ด ์–ด๋””์— ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†์Œ
  • ํ™•์žฅ์„ฑ: ์ €์žฅ ๊ณต๊ฐ„์„ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Œ
  • ๋‚ด๊ฒฐํ•จ์„ฑ: ์ผ๋ถ€ ๋…ธ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ๋„ ์ „์ฒด ์‹œ์Šคํ…œ์€ ๊ณ„์† ์ž‘๋™
  • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ: ์—ฌ๋Ÿฌ ๋…ธ๋“œ์—์„œ ๋™์‹œ์— ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

C์–ธ์–ด๋กœ ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ณต์žกํ•˜์ง€๋งŒ, ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด. ๊ฐ„๋‹จํ•œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํŒŒ์ผ ์ „์†ก ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


// ์„œ๋ฒ„ ์ฝ”๋“œ (server.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[BUFFER_SIZE] = {0};
    
    // ์†Œ์ผ“ ์ƒ์„ฑ
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }
    
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);
    
    // ๋ฐ”์ธ๋“œ
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
    
    // ๋ฆฌ์Šค๋‹
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }
    
    // ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ˆ˜๋ฝ
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }
    
    // ํŒŒ์ผ ์ˆ˜์‹ 
    FILE *fp = fopen("received_file.txt", "wb");
    int n;
    while ((n = read(new_socket, buffer, BUFFER_SIZE)) > 0) {
        fwrite(buffer, 1, n, fp);
    }
    
    fclose(fp);
    printf("ํŒŒ์ผ ์ˆ˜์‹  ์™„๋ฃŒ\n");
    
    return 0;
}

// ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ (client.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char buffer[BUFFER_SIZE] = {0};
    
    // ์†Œ์ผ“ ์ƒ์„ฑ
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }
    
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    
    // ์„œ๋ฒ„ IP ์ฃผ์†Œ ์„ค์ •
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }
    
    // ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\nConnection Failed \n");
        return -1;
    }
    
    // ํŒŒ์ผ ์ „์†ก
    FILE *fp = fopen("file_to_send.txt", "rb");
    if (fp == NULL) {
        perror("File open failed");
        return -1;
    }
    
    while (1) {
        int n = fread(buffer, 1, BUFFER_SIZE, fp);
        if (n <= 0) break;
        send(sock, buffer, n, 0);
    }
    
    fclose(fp);
    printf("ํŒŒ์ผ ์ „์†ก ์™„๋ฃŒ\n");
    
    return 0;
}
  

์ด ์˜ˆ์ œ๋Š” ๊ฐ„๋‹จํ•œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์„ ์ „์†กํ•˜๊ณ  ์žˆ์–ด. ์‹ค์ œ ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์ด๋ณด๋‹ค ํ›จ์”ฌ ๋ณต์žกํ•˜์ง€๋งŒ, ์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ž‘ํ’ˆ์„ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์™€ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํŒŒ์ผ์„ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ๋กœ ์ „์†กํ•˜๊ณ  ์žˆ๋Š” ๊ฑฐ์•ผ! ๐ŸŒ

9. ๊ฒฐ๋ก 

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์šฐ๋ฆฌ๊ฐ€ ์ปดํ“จํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์•ผ. C์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ์ง์ ‘ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์–ด, ์ด๋Š” ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๋Šฅ๋ ฅ์ด์ง€.

ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ž‘ํ’ˆ์„ ์ž˜ ์ •๋ฆฌํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฌ๋Šฅ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ๊ณต์œ ํ•˜๋“ฏ์ด, ์ปดํ“จํ„ฐ์˜ ๋ฐ์ดํ„ฐ๋„ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฑฐ์•ผ! ๐ŸŽจ๐Ÿ’ป

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ž…์ถœ๋ ฅ(I/O) ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ปดํ“จํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์™ธ๋ถ€ ์žฅ์น˜์™€ ํ†ต์‹ ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ๊ณ„์† ๊ฐ€๋ณด์ž๊ณ ! ๐Ÿš€

๐Ÿ–ฅ๏ธ ์ž…์ถœ๋ ฅ(I/O) ๊ด€๋ฆฌ: ์ปดํ“จํ„ฐ์™€ ์„ธ์ƒ์˜ ์†Œํ†ต ์ฐฝ๊ตฌ

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด์ œ ์šฐ๋ฆฌ์˜ ๋„ค ๋ฒˆ์งธ ํƒํ—˜ ์˜์—ญ์ธ ์ž…์ถœ๋ ฅ(I/O) ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ž…์ถœ๋ ฅ์€ ์ปดํ“จํ„ฐ๊ฐ€ ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์ด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค๊ณผ ์†Œํ†ตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ปดํ“จํ„ฐ๋„ ๋‹ค์–‘ํ•œ ์žฅ์น˜๋“ค๊ณผ ์†Œํ†ตํ•ด์•ผ ํ•ด. ๐Ÿ˜Š

1. ์ž…์ถœ๋ ฅ(I/O)์ด๋ž€?

์ž…์ถœ๋ ฅ(Input/Output, I/O)์€ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ๊ณผ ์™ธ๋ถ€ ์„ธ๊ณ„ ์‚ฌ์ด์˜ ์ •๋ณด ๊ตํ™˜์„ ์˜๋ฏธํ•ด. ์ฃผ์š” I/O ์žฅ์น˜๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„:

  • ํ‚ค๋ณด๋“œ, ๋งˆ์šฐ์Šค (์ž…๋ ฅ ์žฅ์น˜)
  • ๋ชจ๋‹ˆํ„ฐ, ํ”„๋ฆฐํ„ฐ (์ถœ๋ ฅ ์žฅ์น˜)
  • ํ•˜๋“œ ๋””์Šคํฌ, SSD (์ €์žฅ ์žฅ์น˜)
  • ๋„คํŠธ์›Œํฌ ์นด๋“œ (ํ†ต์‹  ์žฅ์น˜)

2. I/O ๊ด€๋ฆฌ์˜ ๋ชฉํ‘œ

I/O ๊ด€๋ฆฌ์˜ ์ฃผ์š” ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„:

  • ์žฅ์น˜ ๋…๋ฆฝ์„ฑ: ํ”„๋กœ๊ทธ๋žจ์ด ํŠน์ • ์žฅ์น˜์— ์ข…์†๋˜์ง€ ์•Š๋„๋ก ํ•จ
  • ํšจ์œจ์„ฑ: I/O ์ž‘์—…์˜ ์†๋„๋ฅผ ์ตœ๋Œ€ํ™”
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ: I/O ์ž‘์—… ์ค‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๊ด€๋ฆฌ
  • ๋™๊ธฐํ™”: ์—ฌ๋Ÿฌ I/O ์š”์ฒญ์„ ์กฐ์œจ

3. I/O ํ•˜๋“œ์›จ์–ด

I/O ์žฅ์น˜๋Š” ํฌ๊ฒŒ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด:

  • ์ปจํŠธ๋กค๋Ÿฌ: ์žฅ์น˜์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” ์ „์ž ํšŒ๋กœ
  • ์žฅ์น˜ ์ž์ฒด: ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ธฐ๊ณ„์  ๋ถ€๋ถ„

์ด ๋‘ ๋ถ€๋ถ„์ด ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•ด๋ณผ๊ฒŒ:

I/O ํ•˜๋“œ์›จ์–ด ๊ตฌ์กฐ CPU I/O ์ปจํŠธ๋กค๋Ÿฌ I/O ์žฅ์น˜ ์‹œ์Šคํ…œ ๋ฒ„์Šค ์žฅ์น˜ ๋ฒ„์Šค

4. I/O ๊ธฐ๋ฒ•

I/O ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฃผ์š” ๊ธฐ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ?

  • ํ”„๋กœ๊ทธ๋žจ๋œ I/O: CPU๊ฐ€ ์ง์ ‘ I/O ์ž‘์—…์„ ์ œ์–ด
  • ์ธํ„ฐ๋ŸฝํŠธ ๊ธฐ๋ฐ˜ I/O: I/O ์ž‘์—… ์™„๋ฃŒ ์‹œ ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ
  • DMA (Direct Memory Access): CPU ๊ฐœ์ž… ์—†์ด ๋ฉ”๋ชจ๋ฆฌ์™€ I/O ์žฅ์น˜ ๊ฐ„ ์ง์ ‘ ๋ฐ์ดํ„ฐ ์ „์†ก

C์–ธ์–ด์—์„œ ์ธํ„ฐ๋ŸฝํŠธ ๊ธฐ๋ฐ˜ I/O์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void io_interrupt_handler(int signum) {
    printf("I/O ์ž‘์—… ์™„๋ฃŒ!\n");
}

int main() {
    signal(SIGALRM, io_interrupt_handler);

    printf("I/O ์ž‘์—… ์‹œ์ž‘...\n");
    alarm(3);  // 3์ดˆ ํ›„์— SIGALRM ์‹œ๊ทธ๋„ ๋ฐœ์ƒ

    // ๋‹ค๋ฅธ ์ž‘์—… ์ˆ˜ํ–‰
    for (int i = 0; i < 5; i++) {
        printf("๋‹ค๋ฅธ ์ž‘์—… ์ˆ˜ํ–‰ ์ค‘...\n");
        sleep(1);
    }

    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” signal() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๊ณ , alarm() ํ•จ์ˆ˜๋กœ 3์ดˆ ํ›„์— ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์žˆ์–ด. ์ด๋Š” ์‹ค์ œ I/O ์ž‘์—…์˜ ์™„๋ฃŒ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•œ ๊ฑฐ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ž‘ํ’ˆ ์—…๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์•Œ๋ฆผ์„ ๋ฐ›๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด! ๐Ÿ””

5. ๋ฒ„ํผ๋ง

๋ฒ„ํผ๋ง์€ I/O ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋ฒ•์ด์•ผ. ๋ฒ„ํผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด์ง€. ๋ฒ„ํผ๋ง์˜ ์ฃผ์š” ๋ชฉ์ ์€:

  • ๋ฐ์ดํ„ฐ ์ „์†ก ์†๋„ ์ฐจ์ด ํ•ด์†Œ
  • ๋ฐ์ดํ„ฐ ์ „์†ก ๋‹จ์œ„ ์ผ์น˜
  • ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต ๊ธฐํšŒ ์ œ๊ณต

C์–ธ์–ด์—์„œ ๋ฒ„ํผ๋ง์„ ์‚ฌ์šฉํ•œ ํŒŒ์ผ I/O ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


#include <stdio.h>

#define BUFFER_SIZE 1024

int main() {
    FILE *file;
    char buffer[BUFFER_SIZE];
    int n;

    file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค");
        return 1;
    }

    // ๋ฒ„ํผ ํฌ๊ธฐ ์„ค์ •
    setvbuf(file, buffer, _IOFBF, BUFFER_SIZE);

    // ํŒŒ์ผ ์ฝ๊ธฐ
    while ((n = fread(buffer, 1, BUFFER_SIZE, file)) > 0) {
        fwrite(buffer, 1, n, stdout);
    }

    fclose(file);
    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” setvbuf() ํ•จ์ˆ˜๋กœ ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๊ณ , fread()์™€ fwrite() ํ•จ์ˆ˜๋กœ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์„ ์ฝ๊ณ  ์žˆ์–ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด I/O ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ ์ž‘ํ’ˆ์„ ํ•œ ๋ฒˆ์— ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด! ๐Ÿš€

6. ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„

์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋Š” ์šด์˜์ฒด์ œ์™€ ํ•˜๋“œ์›จ์–ด ์žฅ์น˜ ์‚ฌ์ด์˜ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•ด. ์ฃผ์š” ๊ธฐ๋Šฅ์€:

  • ์žฅ์น˜ ์ดˆ๊ธฐํ™” ๋ฐ ์ข…๋ฃŒ
  • ์žฅ์น˜ ์„ค์ •
  • ๋ฐ์ดํ„ฐ ์ „์†ก
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ

C์–ธ์–ด๋กœ ๊ฐ„๋‹จํ•œ ๊ฐ€์ƒ ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•ด๋ณผ๊นŒ?


#include <stdio.h>

// ๊ฐ€์ƒ ์žฅ์น˜ ๊ตฌ์กฐ์ฒด
typedef struct {
    int is_open;
    char data[100];
} VirtualDevice;

// ์žฅ์น˜ ์—ด๊ธฐ
int open_device(VirtualDevice *dev) {
    if (dev->is_open) {
        printf("์žฅ์น˜๊ฐ€ ์ด๋ฏธ ์—ด๋ ค์žˆ์Šต๋‹ˆ๋‹ค.\n");
        return -1;
    }
    dev->is_open = 1;
    printf("์žฅ์น˜๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.\n");
    return 0;
}

// ์žฅ์น˜์— ์“ฐ๊ธฐ
int write_device(VirtualDevice *dev, const char *data) {
    if (!dev->is_open) {
        printf("์žฅ์น˜๊ฐ€ ์—ด๋ ค์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.\n");
        return -1;
    }
    snprintf(dev->data, sizeof(dev->data), "%s", data);
    printf("์žฅ์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์Šต๋‹ˆ๋‹ค: %s\n", dev->data);
    return 0;
}

// ์žฅ์น˜์—์„œ ์ฝ๊ธฐ
int read_device(VirtualDevice *dev, char *buffer, int buffer_size) {
    if (!dev->is_open) {
        printf("์žฅ์น˜๊ฐ€ ์—ด๋ ค์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.\n");
        return -1;
    }
    snprintf(buffer, buffer_size, "%s", dev->data);
    printf("์žฅ์น˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค: %s\n", buffer);
    return 0;
}

// ์žฅ์น˜ ๋‹ซ๊ธฐ
int close_device(VirtualDevice *dev) {
    if (!dev->is_open) {
        printf("์žฅ์น˜๊ฐ€ ์ด๋ฏธ ๋‹ซํ˜€์žˆ์Šต๋‹ˆ๋‹ค.\n");
        return -1;
    }
    dev->is_open = 0;
    printf("์žฅ์น˜๋ฅผ ๋‹ซ์•˜์Šต๋‹ˆ๋‹ค.\n");
    return 0;
}

int main() {
    VirtualDevice my_device = {0};
    char read_buffer[100];

    open_device(&my_device);
    write_device(&my_device, "Hello, Virtual Device!");
    read_device(&my_device, read_buffer, sizeof(read_buffer));
    close_device(&my_device);

    return 0;
}
  

์ด ์˜ˆ์ œ๋Š” ๊ฐ„๋‹จํ•œ ๊ฐ€์ƒ ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด. ์‹ค์ œ ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋Š” ์ด๋ณด๋‹ค ํ›จ์”ฌ ๋ณต์žกํ•˜์ง€๋งŒ, ์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ž‘ํ’ˆ์„ ์—…๋กœ๋“œํ•˜๊ณ , ์กฐํšŒํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋„ ํ•˜๋“œ์›จ์–ด์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฑฐ์•ผ! ๐ŸŽจ๐Ÿ’ป

7. I/O ์Šค์ผ€์ค„๋ง

I/O ์Šค์ผ€์ค„๋ง์€ ์—ฌ๋Ÿฌ I/O ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•์ด์•ผ. ์ฃผ์š” I/O ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์€:

  • FCFS (First-Come, First-Served): ์š”์ฒญ์ด ๋„์ฐฉํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ
  • SSTF (Shortest Seek Time First): ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์š”์ฒญ ๋จผ์ € ์ฒ˜๋ฆฌ
  • SCAN: ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๋ฉด์„œ ์š”์ฒญ ์ฒ˜๋ฆฌ, ๋์— ๋„๋‹ฌํ•˜๋ฉด ๋ฐฉํ–ฅ ์ „ํ™˜
  • C-SCAN (Circular SCAN): SCAN๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ด๋™

SSTF ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•ด๋ณผ๊นŒ?


#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define MAX_REQUESTS 100

void sstf(int requests[], int n, int head) {
    int total_movement = 0;
    int current = head;
    int done[MAX_REQUESTS] = {0};

    printf("์ฒ˜๋ฆฌ ์ˆœ์„œ: ");
    for (int i = 0; i < n; i++) {
        int min_distance = INT_MAX;
        int next_request = -1;

        for (int j = 0; j < n; j++) {
            if (!done[j]) {
                int distance = abs(requests[j] - current);
                if (distance < min_distance) {
                    min_distance = distance;
                    next_request = j;
                }
            }
        }

        if (next_request != -1) {
            printf("%d ", requests[next_request]);
            total_movement += min_distance;
            current = requests[next_request];
            done[next_request] = 1;
        }
    }

    printf("\n์ด ์ด๋™ ๊ฑฐ๋ฆฌ: %d\n", total_movement);
}

int main() {
    int requests[] = {98, 183, 37, 122, 14, 124, 65, 67};
    int n = sizeof(requests) / sizeof(requests[0]);
    int head = 53;

    printf("์ดˆ๊ธฐ ํ—ค๋“œ ์œ„์น˜: %d\n", head);
    sstf(requests, n, head);

    return 0;
}
  

์ด ์˜ˆ์ œ๋Š” SSTF ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด. ๋””์Šคํฌ ํ—ค๋“œ์˜ ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์š”์ฒญ์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์ž‘ํ’ˆ์„ ๋จผ์ € ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด! ๐Ÿ”

8. ๊ฒฐ๋ก 

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์ž…์ถœ๋ ฅ(I/O) ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. I/O ๊ด€๋ฆฌ๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด์•ผ. ํšจ์œจ์ ์ธ I/O ๊ด€๋ฆฌ๋Š” ์‹œ์Šคํ…œ์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์ณ.

I/O ๊ด€๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ž‘ํ’ˆ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ณต์œ ํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ž‘ํ’ˆ์„ ๊ฐ์ƒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ์—ฌ๋Ÿฌ๋ถ„์ด ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์†Œํ†ตํ•˜๋“ฏ์ด, ์ปดํ“จํ„ฐ๋„ ๋‹ค์–‘ํ•œ I/O ์žฅ์น˜๋ฅผ ํ†ตํ•ด ์„ธ์ƒ๊ณผ ์†Œํ†ตํ•˜๋Š” ๊ฑฐ์•ผ! ๐ŸŒŸ๐Ÿ’ป

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ปดํ“จํ„ฐ๋“ค์ด ์–ด๋–ป๊ฒŒ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜๊ณ  ํ†ต์‹ ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ๊ณ„์† ๊ฐ€๋ณด์ž๊ณ ! ๐Ÿš€

๐ŸŒ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์ปดํ“จํ„ฐ๋“ค์˜ ๋Œ€ํ™” ๋ฐฉ๋ฒ•

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด์ œ ์šฐ๋ฆฌ์˜ ๋‹ค์„ฏ ๋ฒˆ์งธ ํƒํ—˜ ์˜์—ญ์ธ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ปดํ“จํ„ฐ๋“ค์ด ์„œ๋กœ ์–ด๋–ป๊ฒŒ ๋Œ€ํ™”ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด ๋Œ€ํ™”๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ถ„์•ผ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์ด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค๊ณผ ์†Œํ†ตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ปดํ“จํ„ฐ๋“ค๋„ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์„œ๋กœ ์†Œํ†ตํ•ด. ๐Ÿ˜Š

1. ๋„คํŠธ์›Œํฌ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•ด:

  • IP ์ฃผ์†Œ: ๋„คํŠธ์›Œํฌ์ƒ์˜ ์ปดํ“จํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ
  • ํฌํŠธ: ํ•œ ์ปดํ“จํ„ฐ ๋‚ด์—์„œ ํŠน์ • ํ”„๋กœ๊ทธ๋žจ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฒˆํ˜ธ
  • ํ”„๋กœํ† ์ฝœ: ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์˜ ๊ทœ์น™ (์˜ˆ: TCP, UDP)
  • ์†Œ์ผ“: ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์˜ ๋์ 

2. ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์†Œ์ผ“์€ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ ๋‹จ์œ„์•ผ. C์–ธ์–ด์—์„œ ์†Œ์ผ“์„ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ?


// ์„œ๋ฒ„ ์ฝ”๋“œ (server.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    char *hello = "Hello from server";
    
    // ์†Œ์ผ“ ์ƒ์„ฑ
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }
    
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);
    
    // ๋ฐ”์ธ๋“œ
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
    
    // ๋ฆฌ์Šค๋‹
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }
    
    // ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ˆ˜๋ฝ
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }
    
    // ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 
    read(new_socket, buffer, 1024);
    printf("Client: %s\n", buffer);
    
    // ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „์†ก
    send(new_socket, hello, strlen(hello), 0);
    printf("Hello message sent\n");
    
    return 0;
}

// ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ (client.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *hello = "Hello from client";
    char buffer[1024] = {0};
    
    // ์†Œ์ผ“ ์ƒ์„ฑ
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }
    
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    
    // ์„œ๋ฒ„ IP ์ฃผ์†Œ ์„ค์ •
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }
    
    // ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\nConnection Failed \n");
        return -1;
    }
    
    // ์„œ๋ฒ„์— ๋ฉ”์‹œ์ง€ ์ „์†ก
    send(sock, hello, strlen(hello), 0);
    printf("Hello message sent\n");
    
    // ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 
    read(sock, buffer, 1024);
    printf("Server: %s\n", buffer);
    
    return 0;
}
  

์ด ์˜ˆ์ œ์—์„œ๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ„๋‹จํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ  ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž๋“ค์ด ์„œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿ“จ

3. TCP์™€ UDP

๋„คํŠธ์›Œํฌ ํ†ต์‹ ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐ€์ง€ ํ”„๋กœํ† ์ฝœ์€ TCP์™€ UDP์•ผ. ๊ฐ๊ฐ์˜ ํŠน์ง•์„ ์‚ดํŽด๋ณผ๊นŒ?

TCP (Transmission Control Protocol)

  • ์—ฐ๊ฒฐ ์ง€ํ–ฅ์ : ํ†ต์‹  ์ „์— ์—ฐ๊ฒฐ์„ ์„ค์ •
  • ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก
  • ์ˆœ์„œ ๋ณด์žฅ
  • ํ๋ฆ„ ์ œ์–ด์™€ ํ˜ผ์žก ์ œ์–ด

UDP (User Datagram Protocol)

  • ๋น„์—ฐ๊ฒฐ ์ง€ํ–ฅ์ : ์—ฐ๊ฒฐ ์„ค์ • ์—†์ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก
  • ์‹ ๋ขฐ์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก
  • ์ˆœ์„œ ๋ณด์žฅ ์—†์Œ
  • ๋น ๋ฅธ ์ „์†ก ์†๋„

UDP๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


// UDP ์„œ๋ฒ„ (udp_server.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080
#define MAXLINE 1024

int main() {
    int sockfd;
    char buffer[MAXLINE];
    struct sockaddr_in servaddr, cliaddr;
    
    // ์†Œ์ผ“ ์ƒ์„ฑ
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }
    
    memset(&servaddr, 0, sizeof(servaddr));
    memset(&cliaddr, 0, sizeof(cliaddr));
    
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = INADDR_ANY;
    servaddr.sin_port = htons(PORT);
    
    // ๋ฐ”์ธ๋“œ
    if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
    
    printf("Server is running...\n");
    
    int len, n;
    len = sizeof(cliaddr);
    
    n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, 
                 (struct sockaddr *)&cliaddr, &len);
    buffer[n] = '\0';
    printf("Client : %s\n", buffer);
    
    char *hello = "Hello from server";
    sendto(sockfd, (const char *)hello, strlen(hello), MSG_CONFIRM, 
           (const struct sockaddr *)&cliaddr, len);
    printf("Hello message sent.\n");
    
    return 0;
}

// UDP ํด๋ผ์ด์–ธํŠธ (udp_client.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080
#define MAXLINE 1024

int main() {
    int sockfd;
    char buffer[MAXLINE];
    struct sockaddr_in servaddr;
    
    // ์†Œ์ผ“ ์ƒ์„ฑ
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }
    
    memset(&servaddr, 0, sizeof(servaddr));
    
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    servaddr.sin_addr.s_addr = INADDR_ANY;
    
    int n, len;
    char *hello = "Hello from client";
    
    sendto(sockfd, (const char *)hello, strlen(hello), MSG_CONFIRM, 
           (const struct sockaddr *)&servaddr, sizeof(servaddr));
    printf("Hello message sent.\n");
    
    n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, 
                 (struct sockaddr *)&servaddr, &len);
    buffer[n] = '\0';
    printf("Server : %s\n", buffer);
    
    close(sockfd);
    return 0;
}
  

์ด UDP ์˜ˆ์ œ์—์„œ๋Š” ์—ฐ๊ฒฐ ์„ค์ • ์—†์ด ๋ฐ”๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ  ์žˆ์–ด. UDP๋Š” ๋น ๋ฅธ ์ „์†ก์ด ํ•„์š”ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ)์— ์ฃผ๋กœ ์‚ฌ์šฉ๋ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ํ•  ๋•Œ์™€ ๋น„์Šทํ•˜์ง€! ๐ŸŽฅ

4. HTTP ํ†ต์‹ 

์›น ๊ฐœ๋ฐœ์—์„œ๋Š” HTTP(Hypertext Transfer Protocol)๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด. C์–ธ์–ด๋กœ ๊ฐ„๋‹จํ•œ HTTP ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>

#define MAX_BUFFER_SIZE 4096
#define PORT 80

int main() {
    int sockfd;
    struct sockaddr_in server_addr;
    struct hostent *server;
    char buffer[MAX_BUFFER_SIZE];
    
    // ์†Œ์ผ“ ์ƒ์„ฑ
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("Error opening socket");
        exit(1);
    }
    
    // ์„œ๋ฒ„ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
    server = gethostbyname("www.example.com");
    if (server == NULL) {
        fprintf(stderr, "Error, no such host\n");
        exit(1);
    }
    
    // ์„œ๋ฒ„ ์ฃผ์†Œ ์„ค์ •
    bzero((char *) &server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, (char *)&server_addr.sin_addr.s_addr, server->h_length);
    server_addr.sin_port = htons(PORT);
    
    // ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("Error connecting");
        exit(1);
    }
    
    // HTTP GET ์š”์ฒญ ๋ณด๋‚ด๊ธฐ
    char *request = "GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n";
    if (send(sockfd, request, strlen(request), 0) < 0) {
        perror("Error sending request");
        exit(1);
    }
    
    // ์‘๋‹ต ๋ฐ›๊ธฐ
    int total_bytes = 0;
    int bytes_received;
    while ((bytes_received = recv(sockfd, buffer + total_bytes, MAX_BUFFER_SIZE - total_bytes - 1, 0)) > 0) {
        total_bytes += bytes_received;
        if (total_bytes > MAX_BUFFER_SIZE - 1) {
            break;
        }
    }
    buffer[total_bytes] = '\0';
    
    // ์‘๋‹ต ์ถœ๋ ฅ
    printf("Response from server:\n%s\n", buffer);
    
    close(sockfd);
    return 0;
}
  

์ด ์˜ˆ์ œ๋Š” www.example.com ์›น์‚ฌ์ดํŠธ์— HTTP GET ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์•„์˜ค๊ณ  ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ํ”„๋กœํ•„ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด! ๐ŸŒ

5. ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ

๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ณด์•ˆ์€ ๋งค์šฐ ์ค‘์š”ํ•ด. ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋ณด์•ˆ ๊ฐœ๋…์„ ์‚ดํŽด๋ณผ๊นŒ?

  • ์•”ํ˜ธํ™”: ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์•”ํ˜ธํ™”
  • ์ธ์ฆ: ํ†ต์‹  ์ƒ๋Œ€๋ฐฉ์˜ ์‹ ์› ํ™•์ธ
  • ๋ฐฉํ™”๋ฒฝ: ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ํ•„ํ„ฐ๋ง
  • VPN (Virtual Private Network): ์•ˆ์ „ํ•œ ์‚ฌ์„ค ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•

C์–ธ์–ด์—์„œ OpenSSL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•œ ์•”ํ˜ธํ™” ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


#include <stdio.h>
#include <string.h>
#include <openssl/aes.h>

void encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
             unsigned char *iv, unsigned char *ciphertext) {
    AES_KEY aes_key;
    AES_set_encrypt_key(key, 128, &aes_key);
    AES_cbc_encrypt(plaintext, ciphertext, plaintext_len, &aes_key, iv, AES_ENCRYPT);
}

void decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
             unsigned char *iv, unsigned char *plaintext) {
    AES_KEY aes_key;
    AES_set_decrypt_key(key, 128, &aes_key);
    AES_cbc_encrypt(ciphertext, plaintext, ciphertext_len, &aes_key, iv, AES_DECRYPT);
}

int main() {
    unsigned char key[16] = "0abcdef";
    unsigned char iv[16] = "0123456";
    unsigned char plaintext[] = "Hello, OpenSSL!";
    unsigned char ciphertext[128];
    unsigned char decryptedtext[128];

    int plaintext_len = strlen((char *)plaintext);

    // ์•”ํ˜ธํ™”
    encrypt(plaintext, plaintext_len, key, iv, ciphertext);

    printf("Encrypted text: ");
    for(int i = 0; i < plaintext_len; i++) {
        printf("%02x", ciphertext[i]);
    }
    printf("\n");

    // ๋ณตํ˜ธํ™”
    decrypt(ciphertext, plaintext_len, key, iv, decryptedtext);

    decryptedtext[plaintext_len] = '\0';
    printf("Decrypted text: %s\n", decryptedtext);

    return 0;
}
  

์ด ์˜ˆ์ œ๋Š” AES ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•ด ํ…์ŠคํŠธ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ณ  ๋‹ค์‹œ ๋ณตํ˜ธํ™”ํ•˜๊ณ  ์žˆ์–ด. ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์ „์†กํ•  ๋•Œ ์ด๋Ÿฐ ์•”ํ˜ธํ™” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐœ์ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ง€! ๐Ÿ”

6. ๊ฒฐ๋ก 

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ปดํ“จํ„ฐ๋“ค์ด ์„œ๋กœ ์–ด๋–ป๊ฒŒ ๋Œ€ํ™”ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด ๋Œ€ํ™”๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ํฅ๋ฏธ๋กœ์šด ๋ถ„์•ผ์•ผ.

๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์ด ์ „ ์„ธ๊ณ„์˜ ์‚ฌ๋žŒ๋“ค๊ณผ ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ์—ฌ๋Ÿฌ๋ถ„์ด ์žฌ๋Šฅ๋„ท์—์„œ ์ž‘ํ’ˆ์„ ๊ณต์œ ํ•˜๊ณ , ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ , ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ํ•˜๋“ฏ์ด, ์ปดํ“จํ„ฐ๋“ค๋„ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ  ์„œ๋กœ ํ˜‘๋ ฅํ•˜๋Š” ๊ฑฐ์•ผ! ๐ŸŒ๐Ÿ’ป

์ด๊ฒƒ์œผ๋กœ ์šฐ๋ฆฌ์˜ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ฌํ–‰์ด ๋๋‚ฌ์–ด. ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ, ํŒŒ์ผ ์‹œ์Šคํ…œ, ์ž…์ถœ๋ ฅ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊นŒ์ง€, ์šฐ๋ฆฌ๋Š” ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„๋“ค์„ ํƒํ—˜ํ–ˆ์–ด. ์ด ์ง€์‹๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์€ ๋” ํšจ์œจ์ ์ด๊ณ  ๊ฐ•๋ ฅํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฌ๋Šฅ์„ ๊ฐˆ๊ณ ๋‹ฆ์•„ ๋” ๋ฉ‹์ง„ ์ž‘ํ’ˆ์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐ŸŽจ๐Ÿš€

์•ž์œผ๋กœ๋„ ๊ณ„์†ํ•ด์„œ ํ•™์Šตํ•˜๊ณ  ์‹คํ—˜ํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ๋ฉ‹์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณด๊ธธ ๋ฐ”๋ผ. ํ™”์ดํŒ…! ๐Ÿ‘๐Ÿ˜Š