MemoryMappedFile ๊ด€๋ จ Span<T>

.NET์€ MemoryMappedFile์„ ์ด์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ํŒŒ์ผ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, C์–ธ์–ด์—์„œ ๋งคํ•‘๋œ ์ฃผ์†Œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์ฒ˜๋Ÿผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ฐ˜ํ•ด C#์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋‹ˆ๋งŒํผ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์„ ํ†ตํ•ด ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  1. MemoryMappedViewAccessor
    CreateViewAccessor()๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ํŒŒ์ผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๋ฅผ ์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ํŒŒ์ผ ์ „์ฒด๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, position๊ณผ length๋กœ ๋ถ€๋ถ„ ์ ‘๊ทผ Accessor๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹คโ€ฆ ์ดํ›„, Accessor๋ฅผ ํ†ตํ•ด position์œ„์น˜์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    ๊ด€๋ฆฌ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” C# ์–ธ์–ด์—์„œ๋Š” ์ด๋Ÿฐ์‹์˜ ๋ฐฉ๋ฒ•์ด ์ตœ์„ ์ผ์ˆ˜๋ฐ–์— ์—†์ง€๋งŒ, ์•„์‰ฝ๊ตฐ์š”. ํŒŒ์ผ์˜์—ญ์„ OS์˜ ํž˜์„ ๋นŒ๋ ค ๋ฉ”๋ชจ๋ฆฌ์ฒ˜๋Ÿผ ์ ‘๊ทผํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์ด์ ์ด ์žˆ์„ํ…๋ฐ์š”.

  2. MemoryMappedViewStream ํด๋ž˜์Šค (System.IO.MemoryMappedFiles) | Microsoft Docs
    ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋Š” CreateViewStream()์„ ํ†ตํ•ด ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ๊ธฐ๋ณธStream๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

Span๋ฅผ ํ†ตํ•ด MemoryMappedFile์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค ์‹ถ์–ด์„œ ์ ‘๊ทผ์„ ํ–ˆ๋˜๊ฒƒ์ธ๋ฐ์š”. ์•„์ง์€ Accessor์˜ ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค. ํ•ด์„œ ๊ด€๋ จ github์˜ ํ™œ๋™์„ ๊ฒ€์ƒ‰ํ•ด๋ดค๋Š”๋ฐ ๊ทธ๋Ÿด๋งŒํ•œ ์ด์œ ๋Š” ์žˆ๋”๊ตฐ์š”.

API Proposal: Add Span accessor for MemoryMapped files ยท Issue #37227 ยท dotnet/runtime (github.com)
์•„์ง Span<T>ํ˜•ํƒœ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ œ๊ณตํ•  ๋งŒํ•œ ํ˜•ํƒœ๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค. (access violation ๋“ฑ)

๊ทธ๋ž˜๋„ ๋ฐฉ๋ฒ•์ด ์—†์„์ˆ˜์•ผ ์—†๊ฒ ์ง€์š”. ์–ด์จŒ๋“  MemoryMappedFiles๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์šด์˜์ฒด์ œ์˜ API๋ฅผ ์ด์šฉํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

How memory mapping files are accessed as a variable?If not, is it possible? ยท Issue #42736 ยท dotnet/runtime (github.com)
์ด ๊ธ€์—์„œ๋Š” ํ•ธ๋“ค์„ ํ†ตํ•ด ํฌ์ธํ„ฐ๋ฅผ ํš๋“ํ•˜๋Š” ๊ฐ€์ด๋“œ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ ์•„์ง ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ, ๊ธ€๋กœ๋งŒ ๋ดค์„ ๋•Œ๋Š” ์ € ํฌ์ธํ„ฐ๋ฅผ Span<byte> ๋˜๋Š” Memory<byte>์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ด๋ด…๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

MemoryMappedFile ์€ ๋‹จ์ˆœํžˆ ํŒŒ์ผ ์—‘์„ธ์Šค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•œ ์‹œ์Šคํ…œ์—์„œ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ์žฅ์  ๊ฐ™์Šต๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”