C# Rookiss Part4 ๊ฒ์์๋ฒ : ContextSwitching
๐โโ๏ธ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์ฝ์ด๋ก ์ด๋
- ์ฐ๋ ๋์ ์ ๋ณด๋ฅผ ๋จ์ ๋ณด๊ด
- ๋ค๋ฅธ ์ฐ๋ ๋์ ์ ๋ณด๋ฅผ ๋จ์์ ๊ฐ์ ธ์ค๊ณ ์ฐ๋ ๋์๊ฒ ์ฝ์ด ์ฐ๊ฒฐ
์ํผ์ ๋ฐ๊พธ๋ ๊ฒ์ด ์ด๋ง์ด๋งํ ๋น์ฉ์ด ๋ค๊ธฐ๋๋ฌธ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ์คํ๋ฝ ์ฆ, ์ ์ ๋ชจ๋์์ ๊ณ์ ์๋ํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ์ ์๋ค