๐Ÿ™‡โ€โ™€๏ธContextSwitching

Thread.Sleep(1); // ๋ฌด์กฐ๊ฑด ํœด์‹ => ๋ฌด์กฐ๊ฑด 1ms๋งŒํผ ์‰ฌ๊ณ ์‹ถ์–ด์š”

Thread.Sleep(0); // ์กฐ๊ฑด๋ถ€ ์–‘๋ณด => ๋‚˜๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์œผ๋ฉด ์–‘๋ณด ๋ถˆ๊ฐ€, ๋‚˜๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ๋†’์œผ๋ฉด ์“ฐ๋ ˆ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋‹ค์‹œ ๋ณธ์ธํ•œํ…Œ

Thread.Yield(); // ๊ด€๋Œ€ํ•œ ์–‘๋ณด => ๊ด€๋Œ€ํ•˜๊ฒŒ ์–‘๋ณดํ• ํ…Œ๋‹ˆ, ์ง€๊ธˆ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์‹คํ–‰ํ•˜์„ธ์š” => ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์• ๊ฐ€ ์—†์œผ๋ฉด ๋‚จ์€์‹œ๊ฐ„ ์†Œ์ง„

public void Acquire()
{
    while (true)
    {
        // CAD Compare - And - Swap
        int expected = 0;
        int desired = 1;
        if (Interlocked.CompareExchange(ref _locked, desired, expected) == expected)
            break;

        Thread.Sleep(1); // ๋ฌด์กฐ๊ฑด ํœด์‹ => ๋ฌด์กฐ๊ฑด 1ms๋งŒํผ ์‰ฌ๊ณ ์‹ถ์–ด์š”
        Thread.Sleep(0); // ์กฐ๊ฑด๋ถ€ ์–‘๋ณด => ๋‚˜๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์œผ๋ฉด ์–‘๋ณด ๋ถˆ๊ฐ€, ๋‚˜๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ๋†’์œผ๋ฉด ์“ฐ๋ ˆ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋‹ค์‹œ ๋ณธ์ธํ•œํ…Œ
        Thread.Yield(); // ๊ด€๋Œ€ํ•œ ์–‘๋ณด => ๊ด€๋Œ€ํ•˜๊ฒŒ ์–‘๋ณดํ• ํ…Œ๋‹ˆ, ์ง€๊ธˆ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์‹คํ–‰ํ•˜์„ธ์š” => ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์• ๊ฐ€ ์—†์œผ๋ฉด ๋‚จ์€์‹œ๊ฐ„ ์†Œ์ง„
    }
}

์Šคํ•€๋ฝ์ด ์•„๋‹Œ ์ž ์‹œ ํœด์‹์„ ์ฃผ๋Š” ๋žœ๋ค๋ฉ”ํƒ€

๐Ÿช์˜ํ˜ผ ์ด๋™ ๋น„์šฉ

๋กœ๋ด‡์ง์›์—๊ฒŒ ์˜ํ˜ผ์„ ๋ถˆ์–ด์ค˜์•ผ ๋กœ๋ด‡์€ ์ž‘๋™ํ•œ๋‹ค

์šฐ๋ฆฌ ์ปดํ“จํ„ฐ๋Š” ๋‹ค์ˆ˜์˜ ๋กœ๋ด‡์ง์›์ด ์šด์˜ํ•˜์ง€๋งŒ ์ฝ”์–ด(์˜ํ˜ผ)๊ฐ€ ํ•˜๋‚˜์—ฌ์„œ ์˜ํ˜ผ์„ ๋Œ๋ ค๋ง‰๊ธฐ๋ฅผ ํ•œ๋‹ค

๊ฐ ๋กœ๋ด‡๋งˆ๋‹ค 0.1์ดˆ์”ฉ ์˜ํ˜ผ์„ ์ฃผ์–ด ์ „ ๋กœ๋ด‡์ด ์›€์ง์ด๊ฒŒ ๋งŒ๋“ ๋‹ค

์ด๋•Œ ์˜ํ˜ผ์„ ์ด๋™์‹œํ‚ค๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์ด ContextSwitching์ด๋‹ค

์˜ํ˜ผ์„ ์˜ฎ๊ธฐ๋ ค๋ฉด ๋กœ๋ด‡(์“ฐ๋ ˆ๋“œ) -> ์‹๋‹น์šด์˜์ž(์ปค๋„ ๋ชจ๋“œ์˜ cpu์ฝ”์–ด) -> ๋‹ค๋ฅธ ๋กœ๋ด‡(๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ) ์ˆœ์œผ๋กœ ์˜ํ˜ผ์ด ์ด๋™ํ•œ๋‹ค

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

๋น™์˜๋ฅผ ํ•˜๊ณ ๋‚˜๋ฉด ์ด์ „์˜ ์ •๋ณด๋“ค์€ ๋žจ์— ๊ณ ์ด ๋ชจ์…”๋†“๋Š”๋‹ค

๐Ÿช์ •๋ฆฌ

  • ๋กœ๋ด‡์˜ ์˜ํ˜ผ์ด๋™
    • ๋กœ๋ด‡์˜ํ˜ผ์ด ์‹๋‹น์šด์˜์ž๋กœ ์ด๋™
    • ๋กœ๋ด‡์˜ ์ •๋ณด๋“ค์„ ๋žจ์— ๋ชจ์…”๋†“๊ธฐ
    • ๋‹ค๋ฅธ ๋กœ๋ด‡์—๊ฒŒ ์˜ํ˜ผ๊ณผ ๋‹ด๊ธด ์ •๋ณด์ฃผ๊ธฐ
  • cpu์ฝ”์–ด์˜ ์ด๋™
    • ์“ฐ๋ ˆ๋“œ์˜ ์ฝ”์–ด๊ฐ€ ์ปค๋„๋ชจ๋“œ cpu์ฝ”์–ด๋กœ ์ด๋™
    • ์“ฐ๋ ˆ๋“œ์˜ ์ •๋ณด๋ฅผ ๋žจ์— ๋ณด๊ด€
    • ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์˜ ์ •๋ณด๋ฅผ ๋žจ์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ์“ฐ๋ ˆ๋“œ์—๊ฒŒ ์ฝ”์–ด ์—ฐ๊ฒฐ

์˜ํ˜ผ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์–ด๋งˆ์–ด๋งˆํ•œ ๋น„์šฉ์ด ๋“ค๊ธฐ๋•Œ๋ฌธ์— ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„  ์Šคํ•€๋ฝ ์ฆ‰, ์œ ์ €๋ชจ๋“œ์—์„œ ๊ณ„์† ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ผ์ˆ˜ ์žˆ๋‹ค

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: