Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Computer/Computer Science

[Operating System] (iOS) ์„ธ๋งˆํฌ์–ด (Semaphore), ๋ฎคํ…์Šค (Mutex)

๊ฐ์ž ๐Ÿฅ” 2022. 9. 8. 01:17
๋ฐ˜์‘ํ˜•

์Šคํ„ฐ๋””๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น repository์— ๊ฐ€๋ฉด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
ํŠนํžˆ close ๋œ PR์„ ๋ณด์‹œ๋ฉด, ์–ด๋–ค ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ•˜๊ณ  ์Šคํ„ฐ๋””์›๋“ค๊ณผ ์ด์•ผ๊ธฐ๋‚˜๋ˆด๋Š”์ง€ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค 

https://github.com/JulSaMo/CS-start

 

GitHub - JulSaMo/CS-start: ๐Ÿ“ CS ์ง€์‹ ๋Œ€๋ฐฑ๊ณผ โœจ

๐Ÿ“ CS ์ง€์‹ ๋Œ€๋ฐฑ๊ณผ โœจ. Contribute to JulSaMo/CS-start development by creating an account on GitHub.

github.com

 


๐ŸŸ  ๋“ค์–ด๊ฐ€๋ฉฐ

๐Ÿ”ธ Critical section (์ž„๊ณ„์˜์—ญ) ์ด๋ž€?

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

 

 

๐ŸŸ  ์„ธ๋งˆํฌ์–ด (Semaphore)

https://chelseashin.tistory.com/40

  • ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜ ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ฉ”์‹œ์ง€ ์ „์†ก์ด๋‚˜ ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ์ฐธ๊ณ  ๐Ÿ‘‰ https://didu-story.tistory.com/313)
  • ์ฆ‰, ๊ณต์œ ๋œ ์ž์›์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ์จ, ๊ณต์œ ๋œ ์ž์› ์† ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค.
  • ์ด๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ '์„ธ๋งˆํฌ์–ด(Semaphore)' ์ด๋‹ค.
< ์„ธ๋งˆํฌ์–ด์˜ ๊ธฐ๋ณธ ์ง€์‹์„ ์•Œ๊ณ ๊ฐ€์ž. >
- ๋™์‹œ์— ํ•˜๋‚˜์˜ ์ž์›์— ์ ‘๊ทผ์„ ๋ฐฉ์ง€ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
- ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋ฉด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ž์›์„ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ๋ง‰๋Š” ํ”Œ๋ž˜๊ทธ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. 
- Semaphore ๋Š” ๊ณต์œ  ์ž์›์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ํ—ˆ์šฉ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.  (0์ด ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค๋“ค์˜ ๊ณต์œ  ์ž์›์— ์ง„์ž…ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๊ฒƒ)

 

๐ŸŸ  ์„ธ๋งˆํฌ์–ด (Semaphore) ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ 

์„œ๋ฒ„์— ํ”„๋ฆฐํ„ฐ๊ธฐ ๋‹ค์„ฏ๋Œ€๊ฐ€ ๋ฌผ๋ ค์žˆ๋‹ค๊ณ  ์น˜์ž. ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋ฆฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋ƒˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ณต์œ ์ž์› ์ฆ‰ ํ”„๋ฆฐํ„ฐ๊ฐ€ 5๊ฐœ ์žˆ์œผ๋‹ˆ๊นŒ ์„ธ๋งˆํฌ์–ด๋Š” ์ฒ˜์Œ์— 5๋กœ ์„ค์ •๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋ฆฐํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์„ธ๋งˆํฌ์–ด๊ฐ€ ๊ฐ์†Œ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•  ํ”„๋ฆฐํ„ฐ๊ฐ€ ์—†์–ด์ง€๋ฉด ์„ธ๋งˆํฌ์–ด๋Š” ์กฐ๋งŒ๊ฐ„ 0์ด ๋˜๊ณ , ๋‹ค ์“ฐ๊ณ  ๋ฐ˜ํ™˜ํ•˜๋ฉด ์„ธ๋งˆํฌ์–ด๋Š” ๋‹ค์‹œ +1 ์ฆ๊ฐ€ํ•œ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค!!

์ฆ‰, ์„ธ๋งˆํฌ์–ด๋Š” ๋‹จ์ˆœํžˆ ๋ณ€์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค. ๊ณต์œ ์ž์›์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜ 
var semaphore = 2

// ์ž‘์—…1 ์ˆ˜ํ–‰ 
semaphore -= 1 

// ์ž‘์—…2 ์ˆ˜ํ–‰
semaphore -= 1 // ํ˜„์žฌ semaphore == 0

// ์ž‘์—… 3 ์ˆ˜ํ–‰
// ํ˜„์žฌ semaphore ๊ฐ€ 0์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ธฐํ•œ๋‹ค!

 

๐ŸŸ  ์„ธ๋งˆํฌ์–ด(Semaphore) ์ ‘๊ทผ ํ•จ์ˆ˜ : wait(), signal()

์ด๋ฅผ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ wait()๊ณผ signal() ์ด๋‹ค. 

๐Ÿ”ธ wait() 

  • semaphore ์˜ ๊ฐ’์ด ํ˜„์žฌ 0๋ณด๋‹ค ํฌ๋ฉด ๊ฐ’์„ -1
  • ์นด์šดํŒ… ๊ฐ’์ด 0์ด ๋˜๋ฉด ๊ฐ’์ด ์ฆ๊ฐ€ํ• ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์‚ฌ์šฉํ• ํ…Œ๋‹ˆ '๊ธฐ๋‹ค๋ ค๋ผ!'๋ผ๋Š” ์˜๋ฏธ

๐Ÿ”ธ signal()

  • semaphore ๊ฐ’์„ +1
  • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜์™”๋‹ค๋Š” '์‹ ํ˜ธ'๋ฅผ ์˜๋ฏธ

 

๐ŸŸ  Swift์—์„œ์˜ semaphore โœจ

์Šค์œ„ํ”„ํŠธ์—์„œ๋Š” semaphore์˜ ์—ญํ• ์„ ํ•˜๋Š” DispatchSemaphore๊ฐ€ ์žˆ๋‹ค. (
์ฐธ๊ณ ๊ธ€ ๐Ÿ‘‰ https://sujinnaljin.medium.com/ios-%EC%B0%A8%EA%B7%BC%EC%B0%A8%EA%B7%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-gcd-10-cb37c3e0cf13

1. ๋™์‹œ ์ž‘์—… ๊ฐœ์ˆ˜ ์ œํ•œ

๊ณต์œ  ์ž์›์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ž‘์—… ์ˆ˜๋ฅผ 2๋กœ ์ œํ•œํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

let semaphore = DispatchSemaphore(value: 2)

์œ„์™€ ๊ฐ™์ด ๊ณต์œ  ์ž์›์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ (ํ˜น์€ ํ•œ๋ฒˆ์— ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ) ์ž‘์—… ์ˆ˜๋ฅผ ๋ช…์‹œํ•˜๊ณ , ์ž„๊ณ„ ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ๋•Œ์—๋Š” semaphore์˜ wait()๋ฅผ, ๋‚˜์˜ฌ๋•Œ๋Š” signal()์„ ํ˜ธ์ถœํ•œ๋‹ค. (wait๊ฐ€ -1, signal ์ด +1)

for i in 1...8 {
    semaphore.wait() //semaphore ๊ฐ์†Œ
    DispatchQueue.global().async() {

        // ์ž„๊ณ„๊ตฌ์—ญ (critical section)
        print("๊ณต์œ  ์ž์› ์ ‘๊ทผ ์‹œ์ž‘ ๐ŸŒน")
        sleep(3)

        print("๊ณต์œ  ์ž์› ์ ‘๊ทผ ์ข…๋ฃŒ ๐Ÿฅ€")
        sleep(3)
        semaphore.signal() //semaphore ์ฆ๊ฐ€
    }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ž‘์—…์ˆ˜๊ฐ€ 2๊ฐœ ์ด๊ธฐ ๋•Œ๋ฌธ์—  2๊ฐœ ์•ˆ์—์„œ ์ž‘์—…์ด ์™”๋‹ค๊ฐ”๋‹ค ํ•œ๋‹ค. (์‹œ์ž‘์‹œ์ž‘, ์ข…๋กœ์ข…๋ฃŒ, ์‹œ์ž‘์‹œ์ž‘,,, )

์œ„ ์ฝ”๋“œ ๊ฒฐ๊ณผ

2. ๋‘ ์“ฐ๋ ˆ๋“œ์˜ ํŠน์ • ์ด๋ฒคํŠธ ์™„๋ฃŒ ์ƒํƒœ ๋™๊ธฐํ™”

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

Useful for when two threads need to reconcile the completion of a particular event.

์ด๊ฒŒ ๋ฌด์Šจ๋ง์ด๋ƒ๋ฉด

  • ์“ฐ๋ ˆ๋“œ A๋Š” ์ž‘์—… A ์‹คํ–‰์ค‘
  • ์“ฐ๋ ˆ๋“œ B๋Š” ์ž‘์—… A๊ฐ€ ๋๋‚œ ํ›„์— ๋ฌด์–ธ๊ฐ€๋ฅด ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•จ.

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์“ฐ๋ ˆ๋“œ B(์†Œ๋น„์ž)๋Š” ์˜ˆ์ƒ๋œ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ wait๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์“ฐ๋ ˆ๋“œ A(์ƒ์„ฑ์ž)๋Š” ์ž‘์—…์ด ์ค€๋น„๋˜๋ฉด signal์„ ํ˜ธ์ถœํ•˜๋Š” ์‹์œผ๋กœ ์“ฐ๋ ˆ๋“œ B๊ฐ€ ์ž‘์—… A์˜ ์™„๋ฃŒ ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” semaphore ์ดˆ๊ธฐ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

//DispatchSemaphore ์ดˆ๊ธฐ๊ฐ’ 0์œผ๋กœ ์„ค์ •
let semaphore = DispatchSemaphore(value: 0)

print("task A๊ฐ€ ๋๋‚˜๊ธธ ๊ธฐ๋‹ค๋ฆผ")

// ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ task A ์‹คํ–‰
DispatchQueue.global(qos: .background).async {
    //task A
    print("task A ์‹œ์ž‘!")
    print("task A ์ง„ํ–‰์ค‘..")
    print("task A ๋!")
    //task A ๋๋‚ฌ๋‹ค๊ณ  ์•Œ๋ ค์คŒ
    semaphore.signal()
}

// task A ๋๋‚ ๋•Œ๊นŒ์ง€๋Š” value ๊ฐ€ 0์ด๋ผ, task A ์ข…๋ฃŒ๊นŒ์ง€ block
semaphore.wait()        
print("task A ์™„๋ฃŒ๋จ")
  • task A๊ฐ€ ๋๋‚˜์ง€ ์•Š์•˜๋”ฐ๋ฉด (์ฆ‰ , signal()์ด ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด) semaphore.wait() ์ดํ›„์˜ ์ž‘์—…์€ ์‹คํ–‰๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
  • ๊ทธ ์ „์˜ ์„ธ๋งˆํฌ์–ด ๊ฐ’์€ 0์ด๊ธฐ ๋•Œ๋ฌธ์—

 

๐ŸŸ  ๋‹ค๋ฅธ ์˜ˆ์‹œ ์ฝ”๋“œ

(์ฝ”๋“œ์ฐธ๊ณ  ๐Ÿ‘‰ https://onelife2live.tistory.com/5)

์•„๋ž˜ ์ฝ”๋“œ๋„ ์„ธ๋งˆํฌ์–ด๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์ด๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ๋Œ๋ฆฌ๋ฉด ๊ฒฐ๊ณผ๊ฐ’์ด 3000์ด ๋‚˜์˜ค๋Š”๋ฐ, ๋งŒ์•ฝ์— ์„ธ๋งˆํฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด 3000์ด ๋‚˜์˜ค์ง€ ์•Š๊ณ  ๋” ์ž‘์€ ๊ฐ’์ด ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค. ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜์—ฌ ์—ฐ์‚ฐํ•˜๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค! 
์„ธ๋งˆํฌ์–ด๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์ด ํ•œ๊ฐœ์”ฉ ์ง„ํ–‰๋์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

let queue = DispatchQueue(label: "Queue", attributes: .concurrent)
let group = DispatchGroup()
var result: Int = 0

// ๋ณดํ†ต ๋ฆฌ์†Œ์Šค ํ’€์„ ๊ด€๋ฆฌํ•  ๋•Œ๋Š” 0๋ณด๋‹ค ํฐ ๊ฐ’์„ value ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
// ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•˜๋‚˜์”ฉ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด 1์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
let semaphore = DispatchSemaphore(value: 1)

queue.async(group: group) {
    for _ in 1...1000 {
        semaphore.wait() // 1 ๊ฐ์†Œ
        result += 1
        semaphore.signal() // 1 ์ฆ๊ฐ€
    }
}

queue.async(group: group) {
    for _ in 1...1000 {
        semaphore.wait()
        result += 1
        semaphore.signal()
    }
}

queue.async(group: group) {
    for _ in 1...1000 {
        semaphore.wait()
        result += 1
        semaphore.signal()
    }
}

group.notify(queue: DispatchQueue.main) {
    print(result)
}

// 3000

 

https://ios-development.tistory.com/920

 

[iOS - swift] DispatchSemaphore (์„ธ๋งˆํฌ์–ด, Critical Section, wait, signal, atopic operation, ๋™๊ธฐํ™”)

Semaphore ๊ธฐ๋ณธ ์ง€์‹ ๋™์‹œ์— ํ•˜๋‚˜์˜ ์ž์›์— ์ ‘๊ทผ์„ ๋ฐฉ์ง€ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋ฉด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ๋™์‹œ์— ์ ‘๊ทผํ•˜๋Š” ์•ˆ๋˜๋Š” ์ž์›์„

ios-development.tistory.com

์ด ๊ธ€๋„ ์ฝ์–ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. UIKit์—์„œ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”์ง€ ์—ฟ๋ณผ์ˆ˜์žˆ๋‹ค!

 

๐ŸŸ  ๋ฎคํ…์Šค (Mutex) 

๋™์‹œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ณต์œ  ๋ถˆ๊ฐ€๋Šฅํ•œ ์ž์›์˜ ๋™์‹œ ์‚ฌ์šฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ž„๊ณ„๊ตฌ์—ญ(critical section)์„ ๊ฐ€์ง„ ์“ฐ๋ ˆ๋“œ๋“ค์˜ ์‹คํ–‰์‹œ๊ฐ„ (running time)์ด ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๊ณ  ๊ฐ๊ฐ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰ (์ƒํ˜ธ๋ฐฐ์ œ) ๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ 
  • ํ•œ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์†Œ์œ ๋  ์ˆ˜ ์žˆ๋Š” key๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ƒํ˜ธ๋ฐฐ์ œ ๊ธฐ๋ฒ•
  • key์— ํ•ด๋‹นํ•˜๋Š” ์–ด๋–ค ๊ฐ์ฒด (object)๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด ๊ฐ์ฒด๋ฅผ ์†Œ์œ ํ•œ ์“ฐ๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค ๋งŒ์ด ๊ณต์œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค๋“ค์˜ ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์กฐ์œจํ•˜๊ธฐ ์œ„ํ•ด ๋™๊ธฐํ™” (Synchronization) ๋˜๋Š” ๋ฝ(lock)์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ฆ‰, ๋ฎคํ…์Šค ๊ฐ์ฒด๋ฅผ ๋‘ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค!

https://chelseashin.tistory.com/40

๐ŸŸ  ๋ฎคํ…์Šค (Mutex) ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ 

์ฐธ๊ณ  ๐Ÿ‘‰ https://worthpreading.tistory.com/90

๋ฎคํ…์Šค๋Š” ํ™”์žฅ์‹ค์ด ํ•˜๋‚˜ ๋ฟ์ด ์—†๋Š” ์‹๋‹น์— ๋น„์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ™”์žฅ์‹ค์„ ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ๋Š” ์นด์šดํ„ฐ์—์„œ ์—ด์‡ ๋ฅผ ๋ฐ›์•„๊ฐ€์•ผํ•œ๋‹ค. 
๋‚ด๊ฐ€ ๋งŒ์•ฝ ํ™”์žฅ์‹ค์„ ๊ฐ€๋ ค๊ณ ํ•˜๋Š”๋ฐ, ์นด์šดํ„ฐ์— ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ํ™”์žฅ์‹ค์— ์‚ฌ๋žŒ์ด ์—†๋‹ค๋Š” ๋œป์ด๊ณ , ๋‚˜๋Š” ๊ทธ ์—ด์‡ ๋ฅผ ์ด์šฉํ•ด์„œ ํ™”์žฅ์‹ค์— ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๊ฐ€ ๋งŒ์•ฝ ํ™”์žฅ์‹ค์— ์žˆ๋Š”๋ฐ ์˜†ํ…Œ์ด๋ธ”์— ์ž‡๋Š” ์‚ฌ๋žŒ๋„ ํ™”์žฅ์‹ค์— ๊ฐ€๊ณ ์‹ถ๋‹ค. ์ด ์‚ฌ๋žŒ์€ ์•„๋ฌด๋ฆฌ ๊ธ‰ํ•˜๋”๋ผ๋„, ํ™”์žฅ์‹ค ํ‚ค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ™”์žฅ์‹ค์— ๊ฐ€์ง€ ๋ชปํ•œ๋‹ค. ์ด์‚ฌ๋žŒ์€ ๊ฒฐ๊ตญ ์นด์šดํ„ฐ์—์„œ ํ‚ค๊ฐ€ ์˜ฌ๋•Œ๊นŒ์ง€ ๋‚˜๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค.

๋˜ ๋‚ด ์˜†์˜†ํ…Œ์ด๋ธ”์—์„œ ํ™”์žฅ์‹ค์ด ๊ฐ€๊ณ ์‹ถ๋‹ค. ์ด์‚ฌ๋žŒ๋„ ๋˜ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค.

๋‚ด๊ฐ€ ํ™”์žฅ์‹ค์—์„œ ๋‚˜์™€์„œ ํ‚ค๋ฅผ ๋Œ๋ ค๋‘์—ˆ๋‹ค. ์ด์ œ ๊ธฐ๋‹ค๋ฆฌ๋˜ ์‚ฌ๋žŒ ์ค‘ ๋งจ ์•ž์‚ฌ๋žŒ์ด ํ‚ค๋ฅผ ๋ฐ›์•„ ํ™”์žฅ์‹ค์— ๊ฐˆ ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์ด ๋ฎคํ…์Šค๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ™”์žฅ์‹ค์„ ์ด์šฉํ•˜๋Š” ์‚ฌ๋žŒ์€ ํ”„๋กœ์„ธ์Šค ํ˜น์€ ์“ฐ๋ ˆ๋“œ์ด๋ฉฐ, ํ™”์žฅ์‹ค์€ ๊ณต์œ ์ž์›, ํ™”์žฅ์‹ค ํ‚ค๋Š” ๊ณต์œ ์ž์›์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค!

 

๐ŸŸ  Swift์—์„œ์˜ Mutex โœจ

์Šค์œ„ํ”„ํŠธ์—์„œ์˜ ๋ฎคํ…์Šค๋Š”, DispatchSemaphore ์ฒ˜๋Ÿผ ๋”ฐ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ๊ทธ๋ž˜์„œ Mutex๋ฅผ Swift์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฐด์น˜๋งˆํ‚น(?)ํ•ด์„œ ๋งŒ๋“  ๊ธ€์„ ์ฒจ๋ถ€ํ•œ๋‹ค. ์ฝ์–ด๋ณด๋ฉด ์•„์ฃผ ์ข‹์„๋“ฐ!!!!

https://medium.com/@sergebouts/swift-mutex-benchmark-b21ee293d9ad

 

Swift: Mutex benchmark

When designing concurrent programs, correctness is always the most important factor, but you should also consider performance factors as…

medium.com

 

๐ŸŸ  ๋Œ€ํ‘œ์ ์ธ ๋ฎคํ…์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜

1. ๋ฐ์ปค (Dekker) ์•Œ๊ณ ๋ฆฌ์ฆ˜

flag ์™€ turn ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹

  • flag : ํ”„๋กœ์„ธ์Šค ์ค‘ ๋ˆ„๊ฐ€ ์ž„๊ณ„์˜์—ญ์— ์ง„์ž…ํ•  ๊ฒƒ์ด์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜
  • turn : ๋ˆ„๊ฐ€ ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ฐจ๋ก€์ธ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜
while(true) {
    flag[i] = true; // ํ”„๋กœ์„ธ์Šค i๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ ์ง„์ž… ์‹œ๋„
    while(flag[j]) { // ํ”„๋กœ์„ธ์Šค j๊ฐ€ ํ˜„์žฌ ์ž„๊ณ„ ๊ตฌ์—ญ์— ์žˆ๋Š”์ง€ ํ™•์ธ
        if(turn == j) { // j๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์ค‘์ด๋ฉด
            flag[i] = false; // ํ”„๋กœ์„ธ์Šค i ์ง„์ž… ์ทจ์†Œ
            while(turn == j); // turn์ด j์—์„œ ๋ณ€๊ฒฝ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
            flag[i] = true; // j turn์ด ๋๋‚˜๋ฉด ๋‹ค์‹œ ์ง„์ž… ์‹œ๋„
        }
    }
}

// ------- ์ž„๊ณ„ ๊ตฌ์—ญ ---------

turn = j; // ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ๋๋‚˜๋ฉด turn์„ ๋„˜๊น€
flag[i] = false; // flag ๊ฐ’์„ false๋กœ ๋ฐ”๊ฟ” ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆผ

 

2. ํ”ผํ„ฐ์Šจ (peterson) ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐ์ปค์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ƒ๋Œ€๋ฐฉ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ์—๊ฒŒ ์ง„์ž… ๊ธฐํšŒ๋ฅผ ์–‘๋ณดํ•˜๋Š” ๊ฒƒ์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

while(true) {
    flag[i] = true; // ํ”„๋กœ์„ธ์Šค i๊ฐ€ ์ž„๊ณ„ ๊ตฌ์—ญ ์ง„์ž… ์‹œ๋„
    turn = j; // ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์ง„์ž… ๊ธฐํšŒ ์–‘๋ณด
    while(flag[j] && turn == j) { // ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง„์ž… ์‹œ๋„ํ•˜๋ฉด ๋Œ€๊ธฐ
    }
}

// ------- ์ž„๊ณ„ ๊ตฌ์—ญ ---------

flag[i] = false; // flag ๊ฐ’์„ false๋กœ ๋ฐ”๊ฟ” ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆผ

 

3. ์ œ๊ณผ์  (Bakery) ์•Œ๊ณ ๋ฆฌ์ฆ˜

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜. ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์˜ ๋ฒˆํ˜ธํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„๊ตฌ์—ญ์— ์ง„์ž…ํ•œ๋‹ค.

while(true) {
    
    isReady[i] = true; // ๋ฒˆํ˜ธํ‘œ ๋ฐ›์„ ์ค€๋น„
    number[i] = max(number[0~n-1]) + 1; // ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์ค‘์— ๊ฐ€์žฅ ํฐ ๋ฒˆํ˜ธ ๋ฐฐ์ • 
    isReady[i] = false; // ๋ฒˆํ˜ธํ‘œ ์ˆ˜๋ น ์™„๋ฃŒ
    
    for(j = 0; j < n; j++) { // ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค ๋ฒˆํ˜ธํ‘œ ๋น„๊ต
        while(isReady[j]); // ๋น„๊ต ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฒˆํ˜ธํ‘œ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
        while(number[j] && number[j] < number[i] && j < i);
        
        // ํ”„๋กœ์„ธ์Šค j๊ฐ€ ๋ฒˆํ˜ธํ‘œ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•จ
        // ํ”„๋กœ์„ธ์Šค j์˜ ๋ฒˆํ˜ธํ‘œ < ํ”„๋กœ์„ธ์Šค i์˜ ๋ฒˆํ˜ธํ‘œ
    }
}

// ------- ์ž„๊ณ„ ๊ตฌ์—ญ ---------

number[i] = 0; // ์ž„๊ณ„ ๊ตฌ์—ญ ์‚ฌ์šฉ ์ข…๋ฃŒ

 


๐ŸŸ  ๋ฎคํ…์Šค์™€ ์„ธ๋งˆํฌ์–ด ์ฐจ์ด์ 

๋ฌด์Šจ๋ง์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.... ๊ณต๋ถ€ํ•ด๋ด์•ผํ•œ๋‹ค ใ… ใ…  

1๏ธโƒฃ ๋™๊ธฐํ™” ๋Œ€์ƒ์˜ ๊ฐœ์ˆ˜ 

  1. Mutex๋Š” ๋™๊ธฐํ™” ๋Œ€์ƒ์ด only 1๊ฐœ ์ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  2. Semaphore๋Š” ๋™๊ธฐํ™” ๋Œ€์ƒ์ด 1๊ฐœ ์ด์ƒ์ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

2๏ธโƒฃ ์„ธ๋งˆํฌ์–ด๋Š” ๋ฎคํ…์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฎคํ…์Šค๋Š” ์„ธ๋งˆํฌ์–ด๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค.

  • Mutex๋Š” 0, 1๋กœ ์ด๋ฃจ์–ด์ง„ ์ด์ง„ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ, Binary Semaphore์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

3๏ธโƒฃ ์ž์› ์†Œ์œ ์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  1. ๋ฎคํ…์Šค๋Š” ์ž์› ์†Œ์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ์ฑ…์ž„์„ ๊ฐ–๋Š”๋‹ค. (์ƒํƒœ๊ฐ€ 0๊ณผ 1๋ฟ์ด๋ฏ€๋กœ Lock ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ) 
    • lock : ํ˜„์žฌ ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ๊ถŒํ•œ์„ ์–ป์–ด์˜ด (๋งŒ์•ฝ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„๊ตฌ์—ญ ์ˆ˜ํ–‰์ค‘์ด๋ฉด, ์ข…๋ฃŒํ• ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.)
    • unlock : ํ˜„์žฌ ์ž„๊ณ„๊ตฌ์—ญ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ–ˆ์Œ์„ ์•Œ๋ฆผ. (๋Œ€๊ธฐ์ค‘์ธ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„๊ตฌ์—ญ์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ์Œ)
  2. Semaphor ๋Š” ์ž์›์„ ์†Œ์œ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

4๏ธโƒฃ ๋ฎคํ…์Šค๋Š” ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ๋งŒ์ด ์ด ๋ฎคํ…์Šค๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฐ˜๋ฉด, semaphore๋Š” semaphore๋ฅผ ์†Œ์œ ํ•˜์ง€ ์•Š๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ semaphore๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

5๏ธโƒฃ Semaphore๋Š” ์‹œ์Šฝ๋ฉ” ๋ฒ”์œ„์— ๊ฑธ์ณ ์žˆ๊ณ , ํŒŒ์ผ ์‹œ์Šคํ…œ ์ƒ์˜ ํŒŒ์ผ๋กœ ์กด์žฌํ•œ๋‹ค.

  • ๋ฐ˜๋ฉด ๋ฎคํ…์Šค๋Š”, ํ”„๋กœ์„ธ์Šค์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์ž๋™์œผ๋กœ clean up ๋œ๋‹ค.

 

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

 


๐Ÿ“– Reference 

https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Operating%20System/Semaphore%20%26%20Mutex.md

 

GitHub - gyoogle/tech-interview-for-developer: ๐Ÿ‘ถ๐Ÿป ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ „๊ณต ์ง€์‹ & ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋ฐฑ๊ณผ์‚ฌ์ „ ๐Ÿ“–

๐Ÿ‘ถ๐Ÿป ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ „๊ณต ์ง€์‹ & ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋ฐฑ๊ณผ์‚ฌ์ „ ๐Ÿ“–. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub.

github.com

https://sujinnaljin.medium.com/ios-%EC%B0%A8%EA%B7%BC%EC%B0%A8%EA%B7%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-gcd-10-cb37c3e0cf13

 

[iOS] ์ฐจ๊ทผ์ฐจ๊ทผ ์‹œ์ž‘ํ•˜๋Š” GCDโ€Š—โ€Š10

DispatchSemaphore ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค

sujinnaljin.medium.com

https://onelife2live.tistory.com/5

 

[iOS] GCD ํ™œ์šฉํ•˜๊ธฐ 2ํŽธ (DispatchGroup, DispatchSemaphore)

๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์ž‘์—…๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ํ•˜๋‚˜์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํ†ต์ œํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋“ค์„ GCD๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•ด๋ณด๊ฒ ์Šต

onelife2live.tistory.com

https://jwprogramming.tistory.com/13

 

Semaphore๋ž€? ์„ธ๋งˆํฌ์–ด์™€ ๋ฎคํ…์Šค์˜ ์ฐจ์ด๋Š”?

Deadlock์— ์ด์–ด, Semaphore์™€ mutex์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. - ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜, ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ณต์œ ๋œ ์ž

jwprogramming.tistory.com

https://chelseashin.tistory.com/40

 

[OS] ๋ฎคํ…์Šค(Mutex)์™€ ์„ธ๋งˆํฌ์–ด(Semaphore)๋ž€?

ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜, ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ณต์œ ๋œ ์ž์›์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด Critical Section ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜

chelseashin.tistory.com

https://worthpreading.tistory.com/90

 

๋ฎคํ…์Šค(Mutex)์™€ ์„ธ๋งˆํฌ์–ด(Semaphore)์˜ ์ฐจ์ด

์ด ๊ธ€์€ Medium์— ๊ฐœ์‹œ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. Medium์—์„œ ๋ณด์‹œ๋ฉด ์ข€ ๋” ์œ ์พŒํ•œ ํ™˜๊ฒฝ์—์„œ ๊ธ€์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฎคํ…์Šค(Mutex)์™€ ์„ธ๋งˆํฌ์–ด(Semaphore)์˜ ์ฐจ์ด Toilet problem ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ€์žฅ ํฐ ์ˆ™์ œ๋Š” ‘๊ณต

worthpreading.tistory.com

 

๋ฐ˜์‘ํ˜•