์ •๊ธ€/TIL

[TIL] - 2023.05.29

Casteira 2023. 5. 29. 09:02

๐Ÿ“Œ  ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ

์„ ์ ํ˜•(Preemption)

  • ์„ ์ ํ˜•์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋Œ€์‹ ์— ํ”„๋กœ์„ธ์„œ๋ฅผ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.
  • ๋น ๋ฅธ ์‘๋‹ต์‹œ๊ฐ„์„ ์š”ํ•˜๋Š” ๋Œ€ํ™”์‹ ์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•˜๋ฉฐ ๊ธด๊ธ‰ํ•œ ํ”„๋กœ์„ธ์„œ๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ ์ ํ˜• ๋ฐฉ์‹์˜ ์Šค์ผ€์ฅด๋ง์—๋Š”

  • Round Robin : ์‹œ๊ฐ„ ๋‹จ์œ„๊ฐ€ ์„ค์ •๋˜์–ด ๊ฐ ์‹œ๊ฐ„๋™์•ˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋กœ ์ „ํ™˜๋˜๊ฒŒ ํ•œ๋‹ค. ์ „์ฒด์ ์ธ ์‘๋‹ต ์†๋„๊ฐ€ ๋นจ๋ผ์งˆ์ˆ˜๋„ ์žˆ์œผ๋‚˜, ์‹œ๊ฐ„ ๋‹จ์œ„๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ „ํ™˜ํ•  ๋•Œ ๋ฌธ๋งฅ ์ „ํ™˜์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ๋‹นํ•œ ์‹œ๊ฐ„ ๋‹จ์œ„ ์„ค์ •์„ ํ•ด์•ผํ•œ๋‹ค.

๋น„์„ ์ ํ˜•(Non-Preemption)

  • ๋น„์„ ์ ํ˜•์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” CPU๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ณต์ •์„ฑ์ด ์žˆ๊ณ , ๋‹ค์Œ์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ํ”„๋กœ์„ธ์Šค์™€ ๊ด€๊ณ„์—†์ด ์‘๋‹ต ์‹œ๊ฐ„์„ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๊ด„ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•˜๋‹ค.
  • CPU์‚ฌ์šฉ ์‹œ๊ฐ„์ด ๊ธด ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ CPU ์‚ฌ์šฉ์‹œ๊ฐ„์ด ์งง์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜ค๋žซ๋™์•ˆ ๋Œ€๊ธฐ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ฒ˜๋ฆฌ์œจ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋น„์„ ์ ํ˜• ๋ฐฉ์‹์˜ ์Šค์ผ€์ฅด๋ง์—๋Š”

  • FIFO : ๋Œ€๊ธฐ ํ์— ๋จผ์ € ๋“ค์–ด์˜จ ์ž‘์—…์ˆœ์œผ๋กœ CPU๋ฅผ ํ• ๋‹น
  • SJF : ์†Œ์š”์‹œ๊ฐ„์ด ์งง์€ ์ž‘์—…์ˆœ์œผ๋กœ ํ• ๋‹น
  • HRN : ์šฐ์„ ์ˆœ์œ„์™€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ž‘์—…์„ ํ• ๋‹น

 

์„ธ๋งˆํฌ์–ด

  • ๊ณต์œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ํ—ˆ์šฉ์น˜๋งŒํผ ๋™์‹œ์— ์‚ฌ์šฉ์ž ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ธฐ๋ฒ•
  • ๊ณต์œ ์ž์›์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฝ‰ ์ฐฌ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” ๋Œ€๊ธฐ์ƒํƒœ

  • sema_init(struct semaphore *, unsigned value)
    - ์„ธ๋งˆํฌ์–ด์˜ value ๊ฐ’ ์ดˆ๊ธฐํ™”
  • sema_down(struct semaphore *)
    - ์„ธ๋งˆํฌ์–ด์˜ value๊ฐ€ 0์ผ ๊ฒฝ์šฐ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋ฅผ THREAD_BLOCK ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ ํ›„ schedul() ํ˜ธ์ถœ
  • sema_up(struct semaphore *sema)
    - ๋Œ€๊ธฐ ๋ฆฌ์ŠคํŠธ์— ์Šค๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ ๋งจ ์ฒ˜์Œ์— ์œ„์น˜ํ•œ ์Šค๋ ˆ๋“œ๋ฅผ THREAD_READY ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ ํ›„ schedule()ํ˜ธ์ถœ

 

๋ฝ(lock)

  • ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž„๊ณ„ ์˜์—ญ์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์„ ๋•Œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ *์ž„๊ณ„์˜์—ญ์œผ๋กœ ์ง„์ž…ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋Š”๊ฒƒ

*์ž„๊ณ„์˜์—ญ : ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์ด์šฉํ•˜๋„๋ก ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ์˜ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ์˜์—ญ

 

  • lock_init(struct lock *lock)
    - lock ๊ตฌ์กฐ ์ดˆ๊ธฐํ™”
  • lock_acquire(struct lock *lock)
    - lock ์š”์ฒญ
  • lock_release(struct lock *lock)
    - lock์„ release

 

์กฐ๊ฑด ๋ณ€์ˆ˜(condition variable)

  • Condition Variable์€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ณ€์ˆ˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฃผ๋กœ thread๊ฐ„์˜ ์‹ ํ˜ธ ์ „๋‹ฌ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜๋‚˜์˜ thread๊ฐ€ waiting ์ค‘์ด๋ฉด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ thread์—์„œ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๊พธ๊ณ  signaling์„ ํ†ตํ•ด ๊นจ์šฐ๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • cond_init(struct condition *cond)
    - condition data ์ดˆ๊ธฐํ™”
  • cond_wait(struct condition *cond, struct lock *lock)
    - ์กฐ๊ฑด ๋ณ€์ˆ˜๊ฐ€ ๋ณด๋‚ด๋Š” ์‹ ํ˜ธ ๊ธฐ๋‹ค๋ฆผ
  • cond_signal(struct condition *cond, struct lock *lock UNUSED)
    - ์กฐ๊ฑด ๋ณ€์ˆ˜ ์•ˆ์—์„œ ๊ฐ€์žฅ ํฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ„
  • cond-broadcast(struct condition *cond, struct lock *lock)
    - ์กฐ๊ฑด๋ณ€์ˆ˜ ์•ˆ์—์„œ ์‹ ํ˜ธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ์—๊ฒŒ ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ„

 

Implementation of Priority Scheduling-Synchronization

  • ๋ณ€ํ˜•ํ•  ํ•จ์ˆ˜
  • ์šฐ์„ ์ˆœ์œ„๋กœ waiters_list์— ์Šค๋ ˆ๋“œ๋ฅผ ๋„ฃ๊ธฐ์œ„ํ•ด ์ˆ˜์ •ํ•  ํ•จ์ˆ˜๋“ค
    • sema_down(struct semaphore *sema)
    • cond_wait(struct condition *cond, struct lock *lock)
  • waiters_list๋ฅผ ์šฐ์„ ์ˆœ์œ„ ์ˆœ์œผ๋กœ ์ •๋ ฌ
    • waiters_list ์—์„œ thread์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์— ๊ณ ๋ ค๋˜๊ธฐ๋„ ํ•œ๋‹ค.
      • sema_up(struct semaphore *sema)
      • cond_signal(struct condition *cond, struct lock *lock UNUSED)

 

์šฐ์„ ์ˆœ์œ„ ์—ญ์ „

  • ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ˜„์ƒ

 

์œ„์˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ํ˜„์žฌ Thread L์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ค‘๊ฐ„์— Thread H๊ฐ€ key๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ

์ด๋ฏธ L์ด ์‹คํ–‰์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— H๋Š” Blocked ์ƒํƒœ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ  ๊ทธ ํ›„์— Thread M์ด ์‹คํ–‰๋˜๋ฉด์„œ

์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ H๋Š” ์‹คํ–‰๋˜์ง€ ๋ชปํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ M๋จผ์ € ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ inversion์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

 

 

Priority Donation

  • ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Donation์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • lock holder์—๊ฒŒ ์šฐ์„ ๊ถŒ์„ ์ƒ์†ํ•œ๋‹ค.

 

 

 

Nested Donation

 

Multiple Donation

 

Implementation of Priority Donation

  • init_thread(struct thread *t, const char *name, int priority)
    - priority donation ์ดˆ๊ธฐํ™”
  • lock_acquire(struct lock *lock)
    - lock์ด ์ด์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด, lock์˜ ์ฃผ์†Œ ์ €์žฅ
    - ํ˜„์žฌ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ €์žฅํ•˜๊ณ , ๊ธฐ๋ถ€๋ฐ›์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ
    - ์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ถ€

 

 

 

โœ… ์•Œ๊ณ ๋ฆฌ์ฆ˜

14425 S3 ๋ฌธ์ €์—ด ๋ฌธ์ž์—ด ์ง‘ํ•ฉ solved
1543 S4 ๋ฌธ์ž์—ด ๋ฌธ์„œ๊ฒ€์ƒ‰ solved
9996 S3 ๋ฌธ์ž์—ด ํ•œ๊ตญ์ด๊ทธ๋ฆฌ์šธ๋•.. solved

 

 


 

๐Ÿ’ญ  ๋А๋‚€ ์  & ๋ฐฐ์šด ์ 

 

Priority์˜ ๊ฐœ๋…์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์–ด๋А ์ •๋„ ์ดํ•ด๋ฅผ ํ–ˆ๋Š”๋ฐ, priority donation์„ ์“ฐ๋ฉด์„œ ๊ตฌํ˜„์„ ํ•˜๋Š”๊ฒŒ ์‰ฝ์ง€ ์•Š์•„ ๋ณด์ธ๋‹ค.

์˜ค๋Š˜ ์ •๋ฆฌํ•œ ๋‚ด์šฉ๋“ค๊ณผ ๋‚ด์ผ ๋ฐ”๊ฟ”์•ผํ•  ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด ๋ณด๊ณ  ๊ฒช์œผ๋ฉด์„œ ๋А๋ผ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋น ๋ฅผ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

 


 

๐Ÿ”ฅ  ๋‚ด์ผ ๊ณต๋ถ€ํ•  ๋‚ด์šฉ

 

priority ์ˆ˜์ •

 

 


 

๐Ÿ—’๏ธ  ํฌ์ŠคํŒ…

 

 

 

 

๋”๋ณด๊ธฐ

ใ€Œ ๋‚˜๋Š” ๋‹จ์ง€ ์ฝ๊ณ  ์“ด๋‹ค๊ณ  ํ•ด์„œ, ์‹ฌ์ง€์–ด ๋ฐค์ƒˆ๋„๋ก ๊ทธ๋ ‡๊ฒŒ ๋๋‹ค๊ณ  ํ•ด์„œ ์ž๋„ค๋“ค์„ ์—ด์‹ฌํžˆ ํ–ˆ๋‹ค๊ณ  ํ‰๊ฐ€ํ•  ์ˆ˜๋Š” ์—†๋„ค. ๋ฌด์—‡์„ ์œ„ํ•ด ํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ด์ƒ ์„ฑ์‹คํ•˜๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š๊ฒ ๋„ค. (...) ์ž์‹ ์˜ ์ง€๋ฐฐ์ ์ธ ๋„๋• ์›์น™์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ํ•  ๋•Œ์—์•ผ ๋น„๋กœ์†Œ ์ž์—ฐ์ด ์šฐ๋ฆฌ์—๊ฒŒ ์ค€ ๋ณธ์„ฑ๊ณผ ๋Š์ž„์—†์ด ์กฐํ™”๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ฒ ๋„ค. ใ€

-์—ํ”ฝํ…Œํ† ์Šค, ๋Œ€ํ™”๋ก, 4.4.41: 43

 

์•ˆํƒ€๊น๊ฒŒ๋„ ์–ด์ˆ˜์„ ํ•˜๋‹ค ์‹ถ์„ ์ •๋„๋กœ ๋ˆˆ์ฝ” ๋œฐ ์ƒˆ ์—†์ด ๋ถ„์ฃผํ•˜๊ฒŒ ์›€์ง์ด๋ฉด์„œ ๊ทธ์— ํ•ฉ๋‹นํ•œ ๋ณด์ƒ์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ๋Š” ์‹ค์ œ๋กœ ๋งŽ์ง€ ์•Š๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์Šค์Šค๋กœ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋“œ๋ฌผ๋‹ค.

'ํ•˜๊ณ ์žˆ๋Š” ์ผ'๋กœ ์ž์‹ ์„ ํ‰๊ฐ€ํ•˜์ง€ ๋ง๊ณ , '์™œ ํ•˜๋Š”๊ฐ€?' ๊ทธ๋ฆฌ๊ณ  '๋ฌด์—‡์„ ์„ฑ์ทจํ•˜๋ ค ํ•˜๋Š”๊ฐ€?'๋กœ ํ‰๊ฐ€ํ•˜๋ผ. ์—ฌ๊ธฐ์— ์ข‹์€ ๋‹ต์„ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๊ทธ ์ผ์„ ๊ทธ๋งŒ๋‘์–ด๋„ ์ข‹๋‹ค.

์‹œ๊ฐ„์„ ์“ฐ๋Š” ๋งŒํผ ํšจ์œจ์ด ๋งŽ์ด ์—†๋Š” ๊ฒƒ์€ ๋ณธ์ธ๊ณผ ๋™์ผ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌด์—‡์„ ์„ฑ์ทจํ•˜๊ณ  ์‹ถ์€๊ฐ€ ์™œ ํ•˜๋Š”๊ฐ€ ๋‚ด๊ฐ€ ๋ฐ”๋ผ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ธ๊ฐ€?

๋”๋ณด๊ธฐ

ใ€Œ ์ฒ ํ•™์€ ๋ฐ–์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ฒƒ์— ๊ด€์‹ฌ์ด ์—†๋‹ค. ๋‹จ์ง€ ํ•„์š”ํ•œ ๊ฒƒ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๊ณ , ๋งˆ์Œ์— ๋‹ด์•„๋‘˜ ๊ฒƒ์—๋งŒ ๊ด€์‹ฌ์„ ๋‘”๋‹ค.  ใ€

-๋ฌด์†Œ๋‹ˆ์šฐ์Šค ๋ฃจํ‘ธ์Šค, ๊ฐ•์˜๋ก, 16.75.15-16

 

์Šน๋ ค๋Š” ์Šน๋ณต์„ ์ž…๋Š”๋‹ค. ๊ฐ€ํ†จ๋ฆญ ์‚ฌ์ œ๋Š” ๋กœ๋งŒ ์นผ๋ผ๊ฐ€ ๋‹ฌ๋ฆฐ ์‹ ๋ถ€๋ณต์„ ์ž…๋Š”๋‹ค. ์€ํ–‰์›์€ ๊ฐ’๋น„์‹ผ ์–‘๋ณต๊ณผ ์„œ๋ฅ˜๊ฐ€๋ฐฉ์„ ๋“ค๊ณ  ๋‹ค๋‹Œ๋‹ค. ํ•˜์ง€๋งŒ ์Šคํ† ์•„ ์ฒ ํ•™์ž๋“ค์€ ๋ฒ•๋ณต์ด ์—†์—ˆ์œผ๋ฉฐ ์ด๋“ค์„ ๊ทœ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๊ด€๋œ ์–‘์‹๋„ ์—†์—ˆ๋‹ค. ๋ณด์ด๋Š” ์™ธ์–‘์œผ๋กœ ์ด๋“ค์„ ๊ทœ์ •ํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋“ค์„ ์•Œ์•„๋ณด๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด์—ˆ์„๊นŒ? ์˜ค์ง ํ’ˆ์„ฑ๋ฟ์ด๋‹ค.

๋ง์„ ํ•˜์ง€ ์•Š์•„๋„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์•„๋„ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ฒ ํ•™์ž๊ฐ€ ์•„๋‹ˆ์–ด๋„ ์ฒ ํ•™์ž๋กœ ์ฐฉ๊ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šค์Šค๋กœ๋ฅผ ๊ฐ€๊พธ์ž.