Post

๐Ÿ’ป[C#]IPC ํ†ต์‹ ํƒ๊ตฌ (Shared Memory)-2

๐Ÿ“š ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • View VisualStudio 2022
  • View .NET 6
  • View Console APP

๐Ÿ“‘ MemoryMappedFile

์‹ค์Šต์— ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ MSDN ์„ ์ฐธ์กฐํ•œ ๊ฒฐ๊ณผ Shared Memory๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ์œ„ํ•ด MemoryMappedFile์„ ์ด์šฉํ•œ๋‹ค๋”๋ผโ€ฆ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค์ด๋ฉฐ ํŒŒ์ผ ๋‚ด์šฉ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋…ผ๋ฆฌ์  ์ฃผ์†Œ ๊ณต๊ฐ„์— ๋งคํ•‘ํ•œ๋‹ค. ์˜ค๋Š˜์€ ์ด ๋…€์„์„ ํŒŒํ•ด์ณ ๋ณด์ž!

MethodDescription
CreateNew(String, Int64)์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง€์ •๋œ ์šฉ๋Ÿ‰์„ ๊ฐ€์ง„ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
CreateNew(String, Int64, MemoryMappedFileAccess)์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง€์ •๋œ ์šฉ๋Ÿ‰๊ณผ ์•ก์„ธ์Šค ํ˜•์‹์„ ๊ฐ€์ง„ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
CreateNew(String, Int64, MemoryMappedFileAccess, MemoryMappedFileOptions, HandleInheritability)์ง€์ •๋œ ์ด๋ฆ„, ์šฉ๋Ÿ‰, ์•ก์„ธ์Šค ํ˜•์‹, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์˜ต์…˜ ๋ฐ ์ƒ์†์„ ๊ฐ€์ง„ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด MemoryMappedViewAccessor ์„ ์‚ฌ์šฉํ•œ๋‹ค.

MethodDescription
CreateViewAccessor()๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์˜ ๋ทฐ์— ๋งคํ•‘๋˜๋Š” MemoryMappedViewAccessor๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
CreateViewAccessor(Int64, Int64)์ง€์ •๋œ ์˜คํ”„์…‹๊ณผ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์˜ ๋ทฐ์— ๋งคํ•‘๋˜๋Š” MemoryMappedViewAccessor๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
CreateViewAccessor(Int64, Int64, MemoryMappedFileAccess)์ง€์ •๋œ ์˜คํ”„์…‹, ํฌ๊ธฐ ๋ฐ ์•ก์„ธ์Šค ์ œํ•œ์„ ๊ฐ€์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์˜ ๋ทฐ์— ๋งคํ•‘๋˜๋Š” MemoryMappedViewAccessor๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๐Ÿ–ฅ๏ธ Shared Memory ๊ตฌํ˜„

ProcessA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Process A
// "Cat"์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ์šฉ๋Ÿ‰์€ 10000๋ฐ”์ดํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
 using (var mmf = MemoryMappedFile.CreateNew("Cat", 10000))
        {
            // ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ์˜ ์ „์ฒด๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ทฐ ์ƒ์„ฑ
            using (var accessor = mmf.CreateViewAccessor())
            {
                // ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ UTF8๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
                string message = "HI Night Mo.";
                byte[] bytes = Encoding.UTF8.GetBytes(message);

                // ๋ทฐ๋ฅผ ํ†ตํ•ด ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ์— ์“ฐ๊ธฐ
                accessor.WriteArray(0, bytes, 0, bytes.Length);
                Console.WriteLine("Message written to shared memory!");
                
            }
        }

ProcessB


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Process B 
  // ๊ธฐ์กด์— ์ƒ์„ฑ๋œ ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ ์—ด๊ธฐ
using (var mmf = MemoryMappedFile.OpenExisting("Cat"))
            {
                // ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ์˜ ์ „์ฒด๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ทฐ ์ƒ์„ฑ
                using (var accessor = mmf.CreateViewAccessor())
                {
                    // ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ์ƒ์„ฑ
                    byte[] bytes = new byte[10000];

                    // ๋ทฐ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์— ์ €์žฅ
                    accessor.ReadArray(0, bytes, 0, bytes.Length);

                    // ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ UTF8 ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
                    string message = Encoding.UTF8.GetString(bytes).TrimEnd('\0');
                    Console.WriteLine("Message read from shared memory: " + message);
                }
            }

๊ฒฐ๊ณผ

IPC_S_Dev1


๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ Shared Memory๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค.

This post is licensed under CC BY 4.0 by the author.

ยฉ Gubeommo. Some rights reserved.

Using the Chirpy theme for Jekyll.