Unix์—์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

Unix์—์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
์ด ๋ฌธ์„œ์—์„œ๋Š” Unix ์ปค๋„์˜ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. "๋ผ๋Š” ์ œ๋ชฉ์˜ ์ตœ๊ทผ ๊ธฐ์‚ฌ์— ๋‹ค์†Œ ์‹ค๋งํ–ˆ์Šต๋‹ˆ๋‹ค.Unix์—์„œ ํŒŒ์ดํ”„๋ผ์ธ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?" ๊บผ์กŒ๋‹ค ์•„๋‹ˆ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋‚˜๋Š” ํ˜ธ๊ธฐ์‹ฌ์ด ์ƒ๊ฒจ ๋‹ต์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์˜ค๋ž˜๋œ ์ถœ์ฒ˜๋ฅผ ํŒŒํ—ค์ณค๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ฌด์Šจ ์†Œ๋ฆฌํ•˜๋Š”๊ฑฐ์•ผ?

ํŒŒ์ดํ”„๋ผ์ธ์€ "์•„๋งˆ๋„ Unix์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฐœ๋ช…ํ’ˆ"์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์นœ์ˆ™ํ•œ ๋ช…๋ น์ค„ ์Šฌ๋กœ๊ฑด์„ ๊ฒฐํ•ฉํ•˜๋Š” Unix์˜ ๊ธฐ๋ณธ ์ฒ ํ•™์„ ์ •์˜ํ•˜๋Š” ํŠน์ง•์ž…๋‹ˆ๋‹ค.

$ echo hello | wc -c
6

์ด ๊ธฐ๋Šฅ์€ ์ปค๋„ ์ œ๊ณต ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. pipe, ์„ค๋ช…์„œ ํŽ˜์ด์ง€์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„(7) ะธ ํŒŒ์ดํ”„(2):

ํŒŒ์ดํ”„๋ผ์ธ์€ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ๋‹จ๋ฐฉํ–ฅ ์ฑ„๋„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์—๋Š” ์ž…๋ ฅ(์“ฐ๊ธฐ ๋)๊ณผ ์ถœ๋ ฅ(์ฝ๊ธฐ ๋)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ž…๋ ฅ์— ๊ธฐ๋ก๋œ ๋ฐ์ดํ„ฐ๋Š” ์ถœ๋ ฅ์—์„œ โ€‹โ€‹์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์€ ๋‹ค์Œ์„ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. pipe(2), ๋‘ ๊ฐœ์˜ ํŒŒ์ผ ์„ค๋ช…์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ž…๋ ฅ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ์ถœ๋ ฅ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์œ„ ๋ช…๋ น์˜ ์ถ”์  ์ถœ๋ ฅ์€ ํŒŒ์ดํ”„๋ผ์ธ ์ƒ์„ฑ๊ณผ ์ด๋ฅผ ํ†ตํ•ด ํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

$ strace -qf -e execve,pipe,dup2,read,write 
    sh -c 'echo hello | wc -c'

execve("/bin/sh", ["sh", "-c", "echo hello | wc -c"], โ€ฆ)
pipe([3, 4])                            = 0
[pid 2604795] dup2(4, 1)                = 1
[pid 2604795] write(1, "hellon", 6)    = 6
[pid 2604796] dup2(3, 0)                = 0
[pid 2604796] execve("/usr/bin/wc", ["wc", "-c"], โ€ฆ)
[pid 2604796] read(0, "hellon", 16384) = 6
[pid 2604796] write(1, "6n", 2)        = 2

์ƒ์œ„ ํ”„๋กœ์„ธ์Šค ํ˜ธ์ถœ pipe()์ฒจ๋ถ€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜์˜ ์„ค๋ช…์ž์— ์“ฐ๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ ์„ค๋ช…์ž์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์‰˜์€ stdin ๋ฐ stdout๊ณผ ์ผ์น˜ํ•˜๋„๋ก dup2๋กœ ์„ค๋ช…์ž 3 ๋ฐ 4๋ฅผ "์ด๋ฆ„ ๋ณ€๊ฒฝ"ํ•ฉ๋‹ˆ๋‹ค.

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

ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋นˆ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ฝ์œผ๋ ค๊ณ  ํ•˜๋ฉด read(2) ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์— ์“ฐ๊ธฐ๋ฅผ ์‹œ๋„ํ•˜๋ฉด write(2) ์“ฐ๊ธฐ๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ถฉ๋ถ„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ๊นŒ์ง€ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

POSIX ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๊ฒƒ์€ ์ค‘์š”ํ•œ ์†์„ฑ์ž…๋‹ˆ๋‹ค. PIPE_BUF ๋ฐ”์ดํŠธ(์ตœ์†Œ 512)๋Š” ์ผ๋ฐ˜ ํŒŒ์ผ(๊ทธ๋Ÿฌํ•œ ๋ณด์žฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ)์ด ํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์›์ž์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๋Š” ๋ชจ๋“  ์ถœ๋ ฅ์„ ์—ฌ๊ธฐ์— ์“ฐ๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์™ธ๋ถ€ ์‹ ํ˜ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜(์˜ˆ: ์„ธ๋งˆํฌ์–ด)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋“œ ๋ณ‘๋ ฌ ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•˜์—ฌ ์“ฐ๊ธฐ ๋˜๋Š” ์ฝ๊ธฐ ์™„๋ฃŒ์— ๋Œ€ํ•ด ์„œ๋กœ์—๊ฒŒ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจ๋ฒ ์ด์–ด๋Š” ์ด ๋ชจ๋“  ๋ฒˆ๊ฑฐ๋กœ์›€์—์„œ ์šฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์ค๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

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

์šฐ๋ฆฌ๋Š” ์ด์ œ ๋ง‰์—ฐํ•œ ์ •์‹  ๋ชจ๋ธ์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋ฐ˜์ฆํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์€ ๋žจํ”„ ์•„๋ž˜์—์„œ ์ปค๋„์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์กฐ์‚ฌํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ญ์ƒ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์— ๋Œ€๋น„ํ•˜์‹ญ์‹œ์˜ค.

์šฐ๋ฆฌ๋Š” ์–ด๋””๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

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

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

ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ณ ๋Œ€ ์—ญ์‚ฌ์— ๋Œ€ํ•œ ํ˜ธ๊ธฐ์‹ฌ์„ ๋งŒ์กฑ์‹œํ‚ค๋ฉด ๋น„๊ต๋ฅผ ์œ„ํ•ด ํ˜„๋Œ€ ์ฝ”์–ด๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, pipe ํ…Œ์ด๋ธ”์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ฒˆํ˜ธ 42์ž…๋‹ˆ๋‹ค. sysent[]. ์šฐ์—ฐ์˜ ์ผ์น˜?

์ „ํ†ต์ ์ธ ์œ ๋‹‰์Šค ์ปค๋„(1970โ€“1974)

์•„๋ฌด ํ”์ ๋„ ๋ชป ์ฐพ์•˜์–ด pipe(2) ์–ด๋Š ์ชฝ๋„ PDP-7 ์œ ๋‹‰์Šค (1970๋…„ XNUMX์›”) ์ดˆํŒ ์œ ๋‹‰์Šค (1971๋…„ XNUMX์›”), ๋ถˆ์™„์ „ํ•œ ์†Œ์Šค ์ฝ”๋“œ ๋‘๋ฒˆ์งธ ๋ฒ„์ „ (1972๋…„ XNUMX์›”).

TUHS๋Š” ์ œXNUMXํŒ ์œ ๋‹‰์Šค (1973๋…„ XNUMX์›”)์€ ํŒŒ์ดํ”„๋ผ์ธ์ด ํฌํ•จ๋œ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

Unix์˜ ์„ธ ๋ฒˆ์งธ ์—๋””์…˜์€ ์ปค๋„์ด ์–ด์…ˆ๋ธ”๋Ÿฌ๋กœ ์ž‘์„ฑ๋œ ๋งˆ์ง€๋ง‰ ๋ฒ„์ „์ด์ž ํŒŒ์ดํ”„๋ผ์ธ์ด ์žˆ๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. 1973๋…„์— ์ œXNUMXํŒ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ด์—ˆ๊ณ  ์ปค๋„์€ C๋กœ ์žฌ์ž‘์„ฑ๋˜์–ด ์œ ๋‹‰์Šค ์ œXNUMXํŒ์ด ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ๋…์ž๋Š” Doug McIlroy๊ฐ€ "์ •์› ํ˜ธ์Šค์™€ ๊ฐ™์€ ์—ฐ๊ฒฐ ํ”„๋กœ๊ทธ๋žจ"์ด๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ์ œ์•ˆํ•œ ๋ฌธ์„œ ์Šค์บ”์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Unix์—์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
๋ธŒ๋ผ์ด์–ธ ์ปค๋‹ˆ๊ฑด์˜ ์ฑ…์—์„œ์œ ๋‹‰์Šค: ์—ญ์‚ฌ์™€ ํšŒ๊ณ ๋กโ€, ์ปจ๋ฒ ์ด์–ด ์ถœํ˜„์˜ ์—ญ์‚ฌ๋Š” ๋˜ํ•œ์ด ๋ฌธ์„œ๋ฅผ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. "... Bell Labs์—์žˆ๋Š” ๋‚ด ์‚ฌ๋ฌด์‹ค ๋ฒฝ์— 30 ๋…„ ๋™์•ˆ ๊ฑธ๋ ค์žˆ์—ˆ์Šต๋‹ˆ๋‹ค." ์—ฌ๊ธฐ ๋งคํ‚ฌ๋กœ์ด์™€์˜ ์ธํ„ฐ๋ทฐ๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ 2014๋…„์— ์ž‘์„ฑ๋œ McIlroy์˜ ์ž‘์—…:

Unix๊ฐ€ ๋“ฑ์žฅํ–ˆ์„ ๋•Œ ์ฝ”๋ฃจํ‹ด์— ๋Œ€ํ•œ ๋‚˜์˜ ์—ด์ •์€ OS ์ž‘์„ฑ์ž์ธ Ken Thompson์—๊ฒŒ ์ผ๋ถ€ ํ”„๋กœ์„ธ์Šค์— ๊ธฐ๋ก๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žฅ์น˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ์˜ ์ข…๋ฃŒ์—๋„ ํ—ˆ์šฉ๋˜๋„๋ก ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. Ken์€ ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๋‹ˆ๋ฉ€๋ฆฌ์ŠคํŠธ๋กœ์„œ ๊ทธ๋Š” ๋ชจ๋“  ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ์ด ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ํŒŒ์ผ์— ์“ฐ๋Š” ๊ฒƒ๋ณด๋‹ค ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์ง์ ‘ ์“ฐ๊ธฐ๊ฐ€ ์‹ค์ œ๋กœ ํฐ ์ด์ ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  "ํŒŒ์ดํ”„๋ผ์ธ"์ด๋ผ๋Š” ๋ˆˆ์— ๋„๋Š” ์ด๋ฆ„๊ณผ ํ”„๋กœ์„ธ์Šค ์ƒํ˜ธ ์ž‘์šฉ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์„ค๋ช…์œผ๋กœ ํŠน์ • ์ œ์•ˆ์„ํ–ˆ์„ ๋•Œ๋งŒ Ken์€ ๋งˆ์นจ๋‚ด "๋‚ด๊ฐ€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค! "๋ผ๊ณ  ์™ธ์ณค์Šต๋‹ˆ๋‹ค.

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

๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์ œXNUMXํŒ ์œ ๋‹‰์Šค ์ปค๋„์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” ์œ ์‹ค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. C๋กœ ์ž‘์„ฑ๋œ ์ปค๋„ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ์ œXNUMXํŒ, 1973๋…„ XNUMX์›”์— ์ถœ์‹œ๋˜์—ˆ์ง€๋งŒ ๊ณต์‹ ์ถœ์‹œ ๋ช‡ ๋‹ฌ ์ „์— ๋‚˜์™”๊ณ  ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌํ˜„์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ „์„ค์ ์ธ Unix ๊ธฐ๋Šฅ์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์•„๋งˆ๋„ ์˜์›ํžˆ ์‚ฌ๋ผ์ง„๋‹ค๋Š” ๊ฒƒ์€ ์•ˆํƒ€๊นŒ์šด ์ผ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์— ๋Œ€ํ•œ ๋ฌธ์„œ ํ…์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. pipe(2) ๋‘ ๋ฆด๋ฆฌ์Šค ๋ชจ๋‘์—์„œ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ๋ฒ„์ „ (ํŠน์ • ๋‹จ์–ด์˜ ๊ฒฝ์šฐ "์ˆ˜๋™์œผ๋กœ" ๋ฐ‘์ค„์ด ๊ทธ์–ด์ ธ ์žˆ๊ณ  ^H ๋ฌธ์ž ๋’ค์— ๋ฐ‘์ค„์ด ์˜ต๋‹ˆ๋‹ค!). ์ด ํ”„๋กœํ† -pipe(2) ์–ด์…ˆ๋ธ”๋Ÿฌ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ํ•˜๋‚˜์˜ ํŒŒ์ผ ์„ค๋ช…์ž๋งŒ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ์ด๋ฏธ ์˜ˆ์ƒ๋˜๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ํ˜ธ์ถœ ํŒŒ์ดํ”„ ํŒŒ์ดํ”„๋ผ์ธ์ด๋ผ๋Š” I/O ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ํŒŒ์ผ ์„ค๋ช…์ž๋Š” ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์“ฐ๋ฉด ์ตœ๋Œ€ 504๋ฐ”์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ๋งํ•œ ํ›„ ์“ฐ๊ธฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ผ์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ฝ์„ ๋•Œ ๋ฒ„ํผ๋ง๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด๋“ฌํ•ด ์ปค๋„์€ C๋กœ ์žฌ์ž‘์„ฑ๋˜์—ˆ๊ณ , pipe(2) ์ œXNUMXํŒ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ํ˜„๋Œ€์ ์ธ ๋ชจ์Šต์„ ๊ฐ–์ถ”๋‹ค "pipe(fildes)ยป:

์‹œ์Šคํ…œ ํ˜ธ์ถœ ํŒŒ์ดํ”„ ํŒŒ์ดํ”„๋ผ์ธ์ด๋ผ๋Š” I/O ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ํŒŒ์ผ ์„ค๋ช…์ž๋Š” ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์–ธ๊ฐ€๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์— ๊ธฐ๋ก๋˜๋ฉด r1(resp. fildes[1])์— ๋ฐ˜ํ™˜๋œ ์„ค๋ช…์ž๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ ์ตœ๋Œ€ 4096๋ฐ”์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ๋งํ•œ ํ›„ ์“ฐ๊ธฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ผ์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ฝ์„ ๋•Œ r0์œผ๋กœ ๋ฐ˜ํ™˜๋œ ์„ค๋ช…์ž(๊ฐ๊ฐ fildes[0])๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ผ๋‹จ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ •์˜๋˜๋ฉด ๋‘ ๊ฐœ(๋˜๋Š” ๊ทธ ์ด์ƒ)์˜ ์ƒํ˜ธ ์ž‘์šฉ ํ”„๋กœ์„ธ์Šค(ํ›„์† ํ˜ธ์ถœ์— ์˜ํ•ด ์ƒ์„ฑ๋จ)๊ฐ€ ํฌํฌ) ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ะธ ์“ฐ๋‹ค.

์…ธ์—๋Š” ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ ํ”„๋กœ์„ธ์Šค์˜ ์„ ํ˜• ๋ฐฐ์—ด์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ์ชฝ ๋๋งŒ ์žˆ๋Š”(๋ชจ๋“  ์“ฐ๊ธฐ ํŒŒ์ผ ์„ค๋ช…์ž๊ฐ€ ๋‹ซํž˜) ๋น„์–ด ์žˆ๋Š” ํŒŒ์ดํ”„๋ผ์ธ(๋ฒ„ํผ๋ง๋œ ๋ฐ์ดํ„ฐ ํฌํ•จ)์—์„œ ์ฝ๊ธฐ ํ˜ธ์ถœ์€ "ํŒŒ์ผ ๋"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์œ ์‚ฌํ•œ ์ƒํ™ฉ์˜ ์“ฐ๊ธฐ ํ˜ธ์ถœ์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ด๋ฅธ ๋ณด์กด๋œ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌํ˜„ ๊ด€๋ จ ์œ ๋‹‰์Šค XNUMXํŒ๊นŒ์ง€ (1974๋…„ XNUMX์›”) ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์— ๋“ฑ์žฅํ•œ ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„๋งŒ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฏ€๋กœ XNUMXํŒ์€ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ๋‹‰์Šค 1975ํŒ(XNUMX)

Unix ์†Œ์Šค ์ฝ”๋“œ ์ฝ๊ธฐ ์‹œ์ž‘ ์—ฌ์„ฏ ๋ฒˆ์งธ ํŒ (1975๋…„ XNUMX์›”). ์ฃผ๋กœ ๋•๋ถ„์— ์‚ฌ์ž ์ด์ „ ๋ฒ„์ „์˜ ์†Œ์Šค๋ณด๋‹ค ์ฐพ๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ˆ˜๋…„ ๋™์•ˆ ์ฑ… ์‚ฌ์ž Bell Labs ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Unix ์ปค๋„์— ๋Œ€ํ•œ ์œ ์ผํ•œ ๋ฌธ์„œ์˜€์Šต๋‹ˆ๋‹ค. XNUMXํŒ ๋ผ์ด์„ ์Šค์—์„œ๋Š” ๊ต์‚ฌ๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ–ˆ์ง€๋งŒ XNUMXํŒ ๋ผ์ด์„ ์Šค์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฐ์ œํ•˜์—ฌ ๋ถˆ๋ฒ• ํƒ€์ž๋ณธ์œผ๋กœ ๋ฐฐํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋ณต์‚ฌ๊ธฐ์—์„œ ํ•™์ƒ๋“ค์„ ๋ฌ˜์‚ฌํ•˜๋Š” ์ฑ…์˜ ์žฌ ์ธ์‡„ ์‚ฌ๋ณธ์„ ๊ตฌ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  TUHS ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•œ Warren Toomey ๋•๋ถ„์— XNUMXํŒ ์›๋ณธ PDF. ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋…ธ๋ ฅ์ด ๋“ค์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

15๋…„ ์ „์— ์ €๋Š” ์‚ฌ์ž์•Œ๋ ค์ง€์ง€ ์•Š์€ ๋‹ค๋ฅธ ์‚ฌ๋ณธ์˜ ํ’ˆ์งˆ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. TUHS๋Š” ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์•˜๊ณ  ์ด์ „ ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 1988๋…„์— PDP9 ์ปดํ“จํ„ฐ์—์„œ ๋ฐฑ์—…ํ•œ 11๊ฐœ ํŠธ๋ž™์ด ์žˆ๋Š” ์˜ค๋ž˜๋œ ํ…Œ์ดํ”„๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ ์—ฌ๋ถ€๋ฅผ ์•Œ๊ธฐ๋Š” ์–ด๋ ค์› ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ํŒŒ์ผ์ด 1979๋…„์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋Š” ์˜จ์ „ํ•œ /usr/src/ ํŠธ๋ฆฌ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ๋‹น์‹œ์—๋„ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์ผ๊ณฑ ๋ฒˆ์งธ ํŒ ๋˜๋Š” PWB ํŒŒ์ƒ๋ฌผ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฐœ๊ฒฌ์„ ๊ธฐ์ดˆ๋กœ ์‚ผ์•„ ์ถœ์ฒ˜๋ฅผ ์—ฌ์„ฏ ๋ฒˆ์งธ ํŒ์˜ ์ƒํƒœ๋กœ ์ˆ˜๋™์œผ๋กœ ํŽธ์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์ผ๋ถ€๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜์—ˆ๊ณ  ์ผ๋ถ€๋Š” ์•ฝ๊ฐ„ ํŽธ์ง‘ํ•˜์—ฌ ์ตœ์‹  ํ† ํฐ +=์„ ๊ตฌ์‹ =+๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์‚ญ์ œ๋˜์—ˆ๊ณ  ์–ด๋–ค ๊ฒƒ์€ ์™„์ „ํžˆ ๋‹ค์‹œ ์ž‘์„ฑ๋˜์–ด์•ผ ํ–ˆ์ง€๋งŒ ๋„ˆ๋ฌด ๋งŽ์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” TUHS์—์„œ XNUMXํŒ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์˜จ๋ผ์ธ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Dennis Ritchie๊ฐ€ ์†์„ ์žก์€ ์•„์นด์ด๋ธŒ.

๊ทธ๋Ÿฐ๋ฐ ์–ธ๋œป ๋ณด๊ธฐ์— ์ปค๋‹ˆ๊ฑด๊ณผ ๋ฆฌ์น˜ ์‹œ๋Œ€ ์ด์ „์˜ C ์ฝ”๋“œ์˜ ์ฃผ์š” ํŠน์ง•์€ ๊ฐ„๊ฒฐ. ๋‚ด ์‚ฌ์ดํŠธ์˜ ์ƒ๋Œ€์ ์œผ๋กœ ์ข์€ ํ‘œ์‹œ ์˜์—ญ์— ๋งž๊ฒŒ ๊ด‘๋ฒ”์œ„ํ•œ ํŽธ์ง‘ ์—†์ด ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ญ…๋‹ˆ๋‹ค.

์ดˆ๊ธฐ์˜ /usr/sys/ken/pipe.c ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ, ๋” ์žˆ์Šต๋‹ˆ๋‹ค. /usr/sys/dmr):

/*
 * Max allowable buffering per pipe.
 * This is also the max size of the
 * file created to implement the pipe.
 * If this size is bigger than 4096,
 * pipes will be implemented in LARG
 * files, which is probably not good.
 */
#define    PIPSIZ    4096

๋ฒ„ํผ ํฌ๊ธฐ๋Š” XNUMXํŒ ์ดํ›„๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—์„œ๋Š” ๊ณต๊ฐœ ๋ฌธ์„œ ์—†์ด ํŒŒ์ดํ”„๋ผ์ธ์ด ํ•œ๋•Œ ํŒŒ์ผ์„ ๋Œ€์ฒด ์Šคํ† ๋ฆฌ์ง€๋กœ ์‚ฌ์šฉํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

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

๋‹ค์Œ์€ ์‹ค์ œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. pipe:

/*
 * The sys-pipe entry.
 * Allocate an inode on the root device.
 * Allocate 2 file structures.
 * Put it all together with flags.
 */
pipe()
{
    register *ip, *rf, *wf;
    int r;

    ip = ialloc(rootdev);
    if(ip == NULL)
        return;
    rf = falloc();
    if(rf == NULL) {
        iput(ip);
        return;
    }
    r = u.u_ar0[R0];
    wf = falloc();
    if(wf == NULL) {
        rf->f_count = 0;
        u.u_ofile[r] = NULL;
        iput(ip);
        return;
    }
    u.u_ar0[R1] = u.u_ar0[R0]; /* wf's fd */
    u.u_ar0[R0] = r;           /* rf's fd */
    wf->f_flag = FWRITE|FPIPE;
    wf->f_inode = ip;
    rf->f_flag = FREAD|FPIPE;
    rf->f_inode = ip;
    ip->i_count = 2;
    ip->i_flag = IACC|IUPD;
    ip->i_mode = IALLOC;
}

์ฃผ์„์€ ์—ฌ๊ธฐ์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ€๋ถ„์ ์œผ๋กœ "์‚ฌ์šฉ์ž u๋ฅผ ๊ตฌ์„ฑยป ๋ฐ ๋ ˆ์ง€์Šคํ„ฐ R0 ะธ R1 ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋งค๊ฐœ ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

ํ•จ๊ป˜ ํ•ด๋ณด์ž ialloc() ๋””์Šคํฌ์— ๋ฐฐ์น˜ ์•„์ด๋…ธ๋“œ(inode), ๊ทธ๋ฆฌ๊ณ  ๋„์›€์œผ๋กœ ํด๋ก() - ๋งค์žฅ XNUMX๊ฐœ ํŒŒ์ผ. ๋ชจ๋“  ๊ฒƒ์ด ์ˆœ์กฐ๋กญ๊ฒŒ ์ง„ํ–‰๋˜๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‘ ๋์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ๋™์ผํ•œ inode(์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 2๊ฐ€ ๋จ)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ inode๋ฅผ ์ˆ˜์ •๋˜์–ด ์‚ฌ์šฉ ์ค‘์ธ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์— ๋Œ€ํ•œ ์š”์ฒญ์— ์ฃผ์˜ ์ž…๋ ฅ() ์˜ค๋ฅ˜ ๊ฒฝ๋กœ์—์„œ ์ƒˆ inode์˜ ์ฐธ์กฐ ํšŸ์ˆ˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

pipe() ๊ธฐํ•œ R0 ะธ R1 ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•œ ํŒŒ์ผ ์„ค๋ช…์ž ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. falloc() ํŒŒ์ผ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๋‹ค์Œ์„ ํ†ตํ•ด "๋ฐ˜ํ™˜"ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. u.u_ar0[R0] ๋ฐ ํŒŒ์ผ ์„ค๋ช…์ž. ์ฆ‰, ์ฝ”๋“œ๋Š” ๋‹ค์Œ ์œ„์น˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. r ์ฝ๊ธฐ๋ฅผ ์œ„ํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์—์„œ ์ง์ ‘ ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•œ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. u.u_ar0[R0] ๋‘ ๋ฒˆ์งธ ํ†ตํ™” ํ›„ falloc().

๊นƒ๋ฐœ FPIPEํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค ๋•Œ ์„ค์ •ํ•œ ๋Š” ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. sys2.c์˜ rdwr(), ํŠน์ • I/O ๋ฃจํ‹ด์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

/*
 * common code for read and write calls:
 * check permissions, set base, count, and offset,
 * and switch out to readi, writei, or pipe code.
 */
rdwr(mode)
{
    register *fp, m;

    m = mode;
    fp = getf(u.u_ar0[R0]);
        /* โ€ฆ */

    if(fp->f_flag&FPIPE) {
        if(m==FREAD)
            readp(fp); else
            writep(fp);
    }
        /* โ€ฆ */
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ธฐ๋Šฅ readp() ะฒ pipe.c ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ตฌํ˜„์„ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. writep(). ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ธ์ˆ˜ ์ „๋‹ฌ ๊ทœ์น™์˜ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ๋” ๋ณต์žกํ•ด์กŒ์ง€๋งŒ ์ผ๋ถ€ ์„ธ๋ถ€ ์ •๋ณด๋Š” ์ƒ๋žต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

writep(fp)
{
    register *rp, *ip, c;

    rp = fp;
    ip = rp->f_inode;
    c = u.u_count;

loop:
    /* If all done, return. */

    plock(ip);
    if(c == 0) {
        prele(ip);
        u.u_count = 0;
        return;
    }

    /*
     * If there are not both read and write sides of the
     * pipe active, return error and signal too.
     */

    if(ip->i_count < 2) {
        prele(ip);
        u.u_error = EPIPE;
        psignal(u.u_procp, SIGPIPE);
        return;
    }

    /*
     * If the pipe is full, wait for reads to deplete
     * and truncate it.
     */

    if(ip->i_size1 == PIPSIZ) {
        ip->i_mode =| IWRITE;
        prele(ip);
        sleep(ip+1, PPIPE);
        goto loop;
    }

    /* Write what is possible and loop back. */

    u.u_offset[0] = 0;
    u.u_offset[1] = ip->i_size1;
    u.u_count = min(c, PIPSIZ-u.u_offset[1]);
    c =- u.u_count;
    writei(ip);
    prele(ip);
    if(ip->i_mode&IREAD) {
        ip->i_mode =& ~IREAD;
        wakeup(ip+2);
    }
    goto loop;
}

ํŒŒ์ดํ”„๋ผ์ธ ์ž…๋ ฅ์— ๋ฐ”์ดํŠธ๋ฅผ ์“ฐ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. u.u_count. ๋จผ์ € inode๋ฅผ ์ž ๊ธ€ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์•„๋ž˜ ์ฐธ์กฐ). plock/prele).

๊ทธ๋Ÿฐ ๋‹ค์Œ inode ์ฐธ์กฐ ํšŸ์ˆ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์˜ ์–‘์ชฝ ๋์ด ์—ด๋ ค ์žˆ๋Š” ํ•œ ์นด์šดํ„ฐ๋Š” 2์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. rp->f_inode), ๋”ฐ๋ผ์„œ ์นด์šดํ„ฐ๊ฐ€ 2 ๋ฏธ๋งŒ์ด๋ฉด ์ฝ๊ธฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋์„ ๋‹ซ์•˜๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ซํžŒ ํŒŒ์ดํ”„๋ผ์ธ์— ์“ฐ๊ธฐ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด๋Š” ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์˜ค๋ฅ˜ ์ฝ”๋“œ EPIPE ๊ทธ๋ฆฌ๊ณ  ์‹ ํ˜ธ SIGPIPE ์œ ๋‹‰์Šค XNUMXํŒ์—์„œ ๋“ฑ์žฅ.

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

ํŒŒ์ดํ”„๋ผ์ธ์— ์ถฉ๋ถ„ํ•œ ์—ฌ์œ  ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค. ์“ฐ๋‹ค(). ๋ชจ์ˆ˜ i_size1 inode'a(๋นˆ ํŒŒ์ดํ”„๋ผ์ธ์ด 0์ผ ์ˆ˜ ์žˆ์Œ)๋Š” ์ด๋ฏธ ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ์˜ ๋์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์“ธ ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํ•˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์„ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. i_size1 ์— PIPESIZ. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ฝ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์šฐ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ํ•„์š”ํ•œ ๋งŒํผ์˜ ๋ฐ”์ดํŠธ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ƒˆ ๊ธฐ๋ก ์ฃผ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ i_mode inode๋Š” ๊ถŒํ•œ์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. r, w ะธ x. ๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ ๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์“ฐ๊ธฐ ๋˜๋Š” ์ฝ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. IREAD ะธ IWRITE ๊ฐ๊ธฐ. ํ”„๋กœ์„ธ์Šค๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. sleep(), ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜ธ์ถœํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. wakeup().

์ง„์ •ํ•œ ๋งˆ๋ฒ•์€ sleep() ะธ wakeup(). ๊ทธ๋“ค์€์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค slp.c, ์œ ๋ช…ํ•œ "๋‹น์‹ ์€ ์ด๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค" ๋Œ“๊ธ€์˜ ์ถœ์ฒ˜์ž…๋‹ˆ๋‹ค. ์šด ์ข‹๊ฒŒ๋„ ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ฃผ์„๋งŒ ์‚ดํŽด๋ณด์„ธ์š”.

/*
 * Give up the processor till a wakeup occurs
 * on chan, at which time the process
 * enters the scheduling queue at priority pri.
 * The most important effect of pri is that when
 * pri<0 a signal cannot disturb the sleep;
 * if pri>=0 signals will be processed.
 * Callers of this routine must be prepared for
 * premature return, and check that the reason for
 * sleeping has gone away.
 */
sleep(chan, pri) /* โ€ฆ */

/*
 * Wake up all processes sleeping on chan.
 */
wakeup(chan) /* โ€ฆ */

ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœ์„ธ์Šค sleep() ํŠน์ • ์ฑ„๋„์˜ ๊ฒฝ์šฐ ๋‚˜์ค‘์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ๊นจ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. wakeup() ๋™์ผํ•œ ์ฑ„๋„์— ๋Œ€ํ•ด. writep() ะธ readp() ์ด๋Ÿฌํ•œ ํŽ˜์–ด๋ง ํ†ตํ™”๋ฅผ ํ†ตํ•ด ์ž‘์—…์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ  pipe.c ํ•ญ์ƒ ์šฐ์„ ์ˆœ์œ„ PPIPE ๋ถ€๋ฅผ ๋•Œ sleep(), ๊ทธ๋ž˜์„œ ๋ชจ๋‘ sleep() ์‹ ํ˜ธ์— ์˜ํ•ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. readp():

readp(fp)
int *fp;
{
    register *rp, *ip;

    rp = fp;
    ip = rp->f_inode;

loop:
    /* Very conservative locking. */

    plock(ip);

    /*
     * If the head (read) has caught up with
     * the tail (write), reset both to 0.
     */

    if(rp->f_offset[1] == ip->i_size1) {
        if(rp->f_offset[1] != 0) {
            rp->f_offset[1] = 0;
            ip->i_size1 = 0;
            if(ip->i_mode&IWRITE) {
                ip->i_mode =& ~IWRITE;
                wakeup(ip+1);
            }
        }

        /*
         * If there are not both reader and
         * writer active, return without
         * satisfying read.
         */

        prele(ip);
        if(ip->i_count < 2)
            return;
        ip->i_mode =| IREAD;
        sleep(ip+2, PPIPE);
        goto loop;
    }

    /* Read and return */

    u.u_offset[0] = 0;
    u.u_offset[1] = rp->f_offset[1];
    readi(ip);
    rp->f_offset[1] = u.u_offset[1];
    prele(ip);
}

์ด ํ•จ์ˆ˜๋ฅผ ์•„๋ž˜์—์„œ ์œ„๋กœ ์ฝ๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "์ฝ๊ณ  ๋ฐ˜ํ™˜" ๋ถ„๊ธฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์— ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๋Š” ์ฝ๋‹ค() ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ f_offset ์ฝ์€ ๋‹ค์Œ ํ•ด๋‹น ์˜คํ”„์…‹ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

ํ›„์† ์ฝ๊ธฐ์—์„œ ์ฝ๊ธฐ ์˜คํ”„์…‹์— ๋„๋‹ฌํ•˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์ด ๋น„์–ด ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. i_size1 ์•„์ด๋…ธ๋“œ์—์„œ. ์œ„์น˜๋ฅผ 0์œผ๋กœ ์žฌ์„ค์ •ํ•˜๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์— ์“ฐ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์šฐ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ปจ๋ฒ ์ด์–ด๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด writep() ์— ์ž ๋“ค๋‹ค ip+1. ์ด์ œ ํŒŒ์ดํ”„๋ผ์ธ์ด ๋น„์–ด ์žˆ์œผ๋ฏ€๋กœ ์ ˆ์ „ ๋ชจ๋“œ๋ฅผ ํ•ด์ œํ•˜์—ฌ ์“ฐ๊ธฐ ์ฃผ๊ธฐ๋ฅผ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ์„ ๊ฒƒ์ด ์—†๋‹ค๋ฉด, readp() ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค IREAD ๊ทธ๋ฆฌ๊ณ  ์ž ๋“ค๋‹ค ip+2. ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์ด ๊ทธ๋ฅผ ๊นจ์šธ์ง€ ์••๋‹ˆ๋‹ค writep()ํŒŒ์ดํ”„๋ผ์ธ์— ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ.

์— ๋Œ€ํ•œ ๋Œ“๊ธ€ ์ฝ๊ธฐ() ๋ฐ ์“ฐ๊ธฐi() ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  "uยป ํŒŒ์ผ, ์œ„์น˜, ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฒ„ํผ๋ฅผ ์ทจํ•˜๊ณ  ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ผ๋ฐ˜ I/O ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/*
 * Read the file corresponding to
 * the inode pointed at by the argument.
 * The actual read arguments are found
 * in the variables:
 *    u_base        core address for destination
 *    u_offset    byte offset in file
 *    u_count        number of bytes to read
 *    u_segflg    read to kernel/user
 */
readi(aip)
struct inode *aip;
/* โ€ฆ */

/*
 * Write the file corresponding to
 * the inode pointed at by the argument.
 * The actual write arguments are found
 * in the variables:
 *    u_base        core address for source
 *    u_offset    byte offset in file
 *    u_count        number of bytes to write
 *    u_segflg    write to kernel/user
 */
writei(aip)
struct inode *aip;
/* โ€ฆ */

"๋ณด์ˆ˜์ " ์ฐจ๋‹จ์— ๊ด€ํ•ด์„œ๋Š” readp() ะธ writep() ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ๋•Œ๊นŒ์ง€ inode๋ฅผ ์ž ๊ธ‰๋‹ˆ๋‹ค(์˜ˆ: wakeup). plock() ะธ prele() ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์—…: ๋‹ค๋ฅธ ํ˜ธ์ถœ ์„ธํŠธ ์‚ฌ์šฉ sleep ะธ wakeup ๋ฐฉ๊ธˆ ํ•ด์ œํ•œ ์ž ๊ธˆ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/*
 * Lock a pipe.
 * If its already locked, set the WANT bit and sleep.
 */
plock(ip)
int *ip;
{
    register *rp;

    rp = ip;
    while(rp->i_flag&ILOCK) {
        rp->i_flag =| IWANT;
        sleep(rp, PPIPE);
    }
    rp->i_flag =| ILOCK;
}

/*
 * Unlock a pipe.
 * If WANT bit is on, wakeup.
 * This routine is also used to unlock inodes in general.
 */
prele(ip)
int *ip;
{
    register *rp;

    rp = ip;
    rp->i_flag =& ~ILOCK;
    if(rp->i_flag&IWANT) {
        rp->i_flag =& ~IWANT;
        wakeup(rp);
    }
}

์ฒ˜์Œ์—๋Š” ์™œ ๊ทธ๋Ÿฐ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. readp() ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค prele(ip) ์ „ํ™”ํ•˜๊ธฐ ์ „์— wakeup(ip+1). ์ฒซ ๋ฒˆ์งธ writep() ๋ฃจํ”„์—์„œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. plock(ip), ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. readp() ์•„์ง ๋ธ”๋ก์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋ฉด wakeup(), ์ด๋Š” ํœด๋ฉด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์œผ๋กœ๋งŒ ํ‘œ์‹œํ•˜๋ฏ€๋กœ ๋ฏธ๋ž˜์— sched() ์ •๋ง ๊ฐœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ readp() ์›์ธ wakeup(), ์ž ๊ธˆ ํ•ด์ œ, ์„ค์ • IREAD ๊ทธ๋ฆฌ๊ณ  ์ „ํ™” sleep(ip+2)-์ด ๋ชจ๋“  ์ „์— writep() ์ฃผ๊ธฐ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์œผ๋กœ ์ œXNUMXํŒ์˜ ํŒŒ์ดํ”„๋ผ์ธ ์„ค๋ช…์„ ๋งˆ์นฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ, ๊ด‘๋ฒ”์œ„ํ•œ ์˜ํ–ฅ.

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

Xv6, ๊ฐ„๋‹จํ•œ ์œ ๋‹‰์Šค ๊ณ„์—ด ์ปค๋„

ํ•ต์„ ๋งŒ๋“ค๋ ค๋ฉด XV6 Unix 86ํŒ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•˜์ง€๋งŒ x11 ํ”„๋กœ์„ธ์„œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ์ตœ์‹  C๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ TUHS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Unix ์†Œ์Šค์™€ ๋‹ฌ๋ฆฌ PDP 70/XNUMX์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ปดํŒŒ์ผ, ์ˆ˜์ • ๋ฐ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ฝ”์–ด๋Š” ๋Œ€ํ•™์—์„œ ์šด์˜ ์ฒด์ œ์— ๋Œ€ํ•œ ๊ต์žฌ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ถœ์ฒ˜ Github์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ์—๋Š” ๋ช…ํ™•ํ•˜๊ณ  ์‚ฌ๋ ค ๊นŠ์€ ๊ตฌํ˜„์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„.c, ๋””์Šคํฌ์˜ inode ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฒ„ํผ์— ์˜ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” "๊ตฌ์กฐ์  ํŒŒ์ดํ”„๋ผ์ธ"์˜ ์ •์˜์™€ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. pipealloc():

#define PIPESIZE 512

struct pipe {
  struct spinlock lock;
  char data[PIPESIZE];
  uint nread;     // number of bytes read
  uint nwrite;    // number of bytes written
  int readopen;   // read fd is still open
  int writeopen;  // write fd is still open
};

int
pipealloc(struct file **f0, struct file **f1)
{
  struct pipe *p;

  p = 0;
  *f0 = *f1 = 0;
  if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0)
    goto bad;
  if((p = (struct pipe*)kalloc()) == 0)
    goto bad;
  p->readopen = 1;
  p->writeopen = 1;
  p->nwrite = 0;
  p->nread = 0;
  initlock(&p->lock, "pipe");
  (*f0)->type = FD_PIPE;
  (*f0)->readable = 1;
  (*f0)->writable = 0;
  (*f0)->pipe = p;
  (*f1)->type = FD_PIPE;
  (*f1)->readable = 0;
  (*f1)->writable = 1;
  (*f1)->pipe = p;
  return 0;

 bad:
  if(p)
    kfree((char*)p);
  if(*f0)
    fileclose(*f0);
  if(*f1)
    fileclose(*f1);
  return -1;
}

pipealloc() ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๋‚˜๋จธ์ง€ ๊ตฌํ˜„์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. piperead(), pipewrite() ะธ pipeclose(). ์‹ค์ œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ sys_pipe ์—์„œ ๊ตฌํ˜„๋œ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค. sysfile.c. ๊ทธ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚œ์ด๋„๋Š” XNUMXํŒ์˜ ์†Œ์Šค์ฝ”๋“œ ์ˆ˜์ค€์ด์ง€๋งŒ ํ›จ์”ฌ ์‰ฝ๊ณ  ์ฆ๊ฒ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Linux 0.01

Linux 0.01์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ ์—ฐ๊ตฌ์—์„œ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ตฌํ˜„์„ ์—ฐ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์œ ์ตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. fs/pipe.c. ์—ฌ๊ธฐ์—์„œ๋Š” ํŒŒ์ดํ”„๋ผ์ธ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ inode๊ฐ€ ์‚ฌ์šฉ๋˜์ง€๋งŒ ํŒŒ์ดํ”„๋ผ์ธ ์ž์ฒด๋Š” ์ตœ์‹  C๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. XNUMXํŒ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ•ดํ‚น์„ ํ–ˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์€ ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด์š” write_pipe():

int write_pipe(struct m_inode * inode, char * buf, int count)
{
    char * b=buf;

    wake_up(&inode->i_wait);
    if (inode->i_count != 2) { /* no readers */
        current->signal |= (1<<(SIGPIPE-1));
        return -1;
    }
    while (count-->0) {
        while (PIPE_FULL(*inode)) {
            wake_up(&inode->i_wait);
            if (inode->i_count != 2) {
                current->signal |= (1<<(SIGPIPE-1));
                return b-buf;
            }
            sleep_on(&inode->i_wait);
        }
        ((char *)inode->i_size)[PIPE_HEAD(*inode)] =
            get_fs_byte(b++);
        INC_PIPE( PIPE_HEAD(*inode) );
        wake_up(&inode->i_wait);
    }
    wake_up(&inode->i_wait);
    return b-buf;
}

๊ตฌ์กฐ์ฒด ์ •์˜๋ฅผ ๋ณด์ง€ ์•Š๊ณ ๋„ inode ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์“ฐ๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ SIGPIPE. ๋ฐ”์ดํŠธ ๋‹จ์œ„ ์ž‘์—… ์™ธ์—๋„ ์ด ๊ธฐ๋Šฅ์€ ์œ„์˜ ์•„์ด๋””์–ด์™€ ์‰ฝ๊ฒŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง์ˆ˜ ๋…ผ๋ฆฌ sleep_on/wake_up ๊ทธ๋ ‡๊ฒŒ ์™ธ๊ณ„์ธ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ตœ์‹  Linux ์ปค๋„, FreeBSD, NetBSD, OpenBSD

๋‚˜๋Š” ์ตœ์‹  ์ปค๋„์„ ์žฌ๋นจ๋ฆฌ ๊ฒ€ํ† ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ด๋ฏธ ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋†€๋ž์ง€ ์•Š์Šต๋‹ˆ๋‹ค). Linux์—๋Š” ์ž์ฒด ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ ๊ฐ€์ง€ ์ตœ์‹  BSD ์ปค๋„์—๋Š” John Dyson์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ตฌํ˜„์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ์ˆ˜๋…„ ๋™์•ˆ ์„œ๋กœ ๋„ˆ๋ฌด ๋‹ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

์ฝ๋‹ค fs/pipe.c (๋ฆฌ๋ˆ…์Šค์—์„œ) ๋˜๋Š” sys/kern/sys_pipe.c (*BSD์—์„œ) ์ง„์ •ํ•œ ํ—Œ์‹ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฒกํ„ฐ ๋ฐ ๋น„๋™๊ธฐ I/O์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ๋ฐ ์ง€์›์€ ์˜ค๋Š˜๋‚  ์ฝ”๋“œ์—์„œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, ์ž ๊ธˆ ๋ฐ ์ปค๋„ ๊ตฌ์„ฑ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋ชจ๋‘ ๋งค์šฐ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€ํ•™์—์„œ ์šด์˜ ์ฒด์ œ ์ž…๋ฌธ ๊ณผ์ •์— ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ž˜๋œ ํŒจํ„ด(์˜ˆ: SIGPIPE ๊ทธ๋ฆฌ๊ณ  ๋Œ์•„๊ฐ€๋‹ค EPIPE ๋‹ซํžŒ ํŒŒ์ดํ”„๋ผ์ธ์— ์“ธ ๋•Œ) ์ด ๋ชจ๋“  ๋งค์šฐ ๋‹ค๋ฅธ ์ตœ์‹  ์ปค๋„์—์„œ. ์•„๋งˆ๋„ PDP-11 ์ปดํ“จํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜๋Š” ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ํƒœ์–ด๋‚˜๊ธฐ ๋ช‡ ๋…„ ์ „์— ์ž‘์„ฑ๋œ ์ฝ”๋“œ์—์„œ ์—ฌ์ „ํžˆ ๋ฐฐ์šธ ์ ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

2011๋…„ Divi Kapoor๊ฐ€ ์ž‘์„ฑํ•œ ๊ธฐ์‚ฌ "ํŒŒ์ดํ”„ ๋ฐ FIFO์˜ Linux ์ปค๋„ ๊ตฌํ˜„Linux ํŒŒ์ดํ”„๋ผ์ธ(์ง€๊ธˆ๊นŒ์ง€)์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ฐœ์š”์ž…๋‹ˆ๋‹ค. ใ… ์ตœ๊ทผ ๋ฆฌ๋ˆ…์Šค ์ปค๋ฐ‹ ์ž„์‹œ ํŒŒ์ผ์˜ ๊ธฐ๋Šฅ์„ ๋Šฅ๊ฐ€ํ•˜๋Š” ์ƒํ˜ธ ์ž‘์šฉ์˜ ํŒŒ์ดํ”„๋ผ์ธ ๋ชจ๋ธ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ XNUMXํŒ Unix ์ปค๋„์—์„œ ํŒŒ์ดํ”„๋ผ์ธ์ด "๋งค์šฐ ๋ณด์ˆ˜์ ์ธ ์ž ๊ธˆ"์—์„œ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๊ฐ”๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€