ruǎn jiàn : xué lèi : tōng xìn gōng chéng > yuán cāo zuò
mùlù
No. 1
  zài duō jìn chéngxiàn chéngde cāo zuò tǒng zhōng néng bèi jìn chéngxiàn chéng duàn de cāo zuò jiù jiào yuán cāo zuòwén jiàn de yuán cāo zuò shì zhǐ cāo zuò wén jiàn shí de néng bèi duàn de cāo zuò
No. 2
  zài duō jìn chéngxiàn chéngfǎng wèn yuán shínéng gòu què bǎo suǒ yòu de jìn chéngxiàn chéngdōubù zài tóng shí jiān nèi fǎng wèn xiāng tóng de yuán
   yuán cāo zuò : UP SMP de tóng
  -----------------------------------------------------------
   yuán cāo zuò shì fēn dezài zhí xíng wán huì bèi rèn rèn huò shì jiàn zhōng duànzài dān chù tǒng (UniProcessor) zhōngnéng gòu zài dān tiáo zhǐ lìng zhōng wán chéng de cāo zuò dōukě rèn wéi shì " yuán cāo zuò ", yīn wéi zhōng duàn zhǐ néng shēng zhǐ lìng zhī jiānzhè shì mǒu xiē CPU zhǐ lìng tǒng zhōng yǐn liǎo test_and_set、 test_and_clear děng zhǐ lìng yòng lín jiè yuán chì de yuán yīndàn shìzài duìchèn duō chǔlǐ (SymmetricMulti-Processor) jié gòu zhōng jiù tóng liǎoyóu tǒng zhōng yòu duō chǔlǐ zài yùn xíng shǐ néng zài dān tiáo zhǐ lìng zhōng wán chéng de cāo zuò yòu néng shòu dào gān rǎo men decl( jiǎn zhǐ lìng ) wéi zhè shì diǎn xíng de " gǎixiě " guò chéngshè liǎng nèi cún fǎng wènshè xiǎng zài tóng CPU yùn xíng de liǎng jìn chéng dōuzài jiǎn mǒu shù zhí néng shēng de qíng kuàng shì
  1 CPUA(CPUA shàng suǒ yùn xíng de jìn chéng xià tóng ) cóng nèi cún dān yuán dāng qián shù zhí (2) zhuāng zài jìn de cún zhōng
  2. CPUB cóng nèi cún dān yuán dāng qián shù zhí (2) zhuāng zài jìn de cún zhōng
  3. CPUA zài de cún zhōngjiàng shù zhí jiǎn wéi 1;
  4. CPUB zài de cún zhōngjiàng shù zhí jiǎn wéi 1;
  5. CPUA xiū gǎi hòu de shù zhí (1) xiě huí nèi cún dān yuán
  6. CPUB xiū gǎi hòu de shù zhí (1) xiě huí nèi cún dān yuán
   men kàn dàonèi cún de shù zhí yīnggāi shì 0, rán 'ér què shì 1。 guǒ gāi shù zhí shì gòng xiǎng yuán de yǐn yòng shùměi jìn chéng dōuzài jiǎn hòu gāi zhí 0 jìn xíng jiàocóng 'ér què dìng shì fǒu yào shì fàng gāi gòng xiǎng yuánzhè shíliǎng jìn chéng diào liǎo duì gāi gòng xiǎng yuán de yǐn yòngdàn méi yòu jìn chéng néng gòu shì fàng -- liǎng jìn chéng tuī duàn chū shù zhí shì 1, gòng xiǎng yuán réng rán zài bèi shǐ yòng
   yuán xìng néng yóu ruǎn jiàn dān bǎo zhèng -- yào yìng jiàn de zhī chíyīn shì jià gòu xiāng guān dezài x86 píng tái shàng, CPU gōng liǎo zài zhǐ lìng zhí xíng jiān duì zǒng xiàn jiā suǒ de shǒu duàn。 CPU xìn piàn shàng yòu tiáo yǐn xiàn #HLOCKpin, guǒ huì biān yán de chéng zhōng zài tiáo zhǐ lìng qián miàn jiā shàng qián zhuì "LOCK", jīng guò huì biān hòu de dài jiù shǐ CPU zài zhí xíng zhè tiáo zhǐ lìng de shí hòu #HLOCKpin de diàn wèi chí dào zhè tiáo zhǐ lìng jié shù shí fàng kāicóng 'ér zǒng xiàn suǒ zhùzhè yàng tóng zǒng xiàn shàng bié de CPU jiù zàn shí néng tōng guò zǒng xiàn fǎng wèn nèi cún liǎobǎo zhèng liǎo zhè tiáo zhǐ lìng zài duō chǔlǐ huán jìng zhōng de yuán xìng
  Linux nèi zhōng de yuán cāo zuò
  -----------------------------------------------------------
   yuán cāo zuò fēn shǐ yòng huì biān yán shí xiànyīn wéi c yán bìng néng shí xiàn zhè yàng de cāo zuò
  * zài x86 de yuán cāo zuò shí xiàn dài zhōngdìng liǎo LOCK hóngzhè hóng fàng zài suí hòu de nèi lián huì biān zhǐ lìng zhī qián guǒ shì SMP, LOCK hóng bèi kuò zhǎn wéi lock zhǐ lìngfǒu bèi dìng wéi kōng -- dān CPU fáng zhǐ CPU de gān rǎosuǒ nèi cún zǒng xiàn wán quán shì zài làng fèi shí jiān
  #ifdefCONFIG_SMP
  #defineLOCK"lock;"
  #else
  #defineLOCK""
  #endif
  *typedefstruct{volatileintcounter;}atomic_t;
   zài suǒ yòu zhī chí de jié gòu shàng yuán lèi xíng atomic_t bǎo cún int zhízài x86 de mǒu xiē chǔlǐ shàngyóu gōng zuò fāng shì de yuán yīnyuán lèi xíng néng gòu bǎo zhèng de yòng fàn wéi zhǐ yòu 24 wèi。 volatile shì lèi xíng miáo shù yào qiú biān yào duì miáo shù de duì xiàng zuò yōu huà chǔlǐduì de xiě yào cóng nèi cún zhōng fǎng wèn
  *#defineATOMIC_INIT(i){(i)}
   yòng zài dìng yuán biàn liàng shíchū shǐ huà wéi zhǐ dìng de zhí
  staticatomic_tcount=ATOMIC_INIT(1);
  *static__inline__voidatomic_add(inti,atomic_t*v)
  ----------------------------------------
   jiāng v zhǐ xiàng de yuán biàn liàng jiā shàng i。 gāi hán shù guān xīn yuán biàn liàng de xīn zhífǎn huí void lèi xíng
   zài xià miàn de shí xiàn zhōngshǐ yòng liǎo dài yòu C/C++ biǎo shì de nèi lián huì biān dài shì xià ( cān kǎo《 AT&TASMSyntax》 ):
  __asm____volatile__("InstructionList":Output:Input:Clobber/Modify);
  __asm____volatile__ zhǐ shì biān yuán fēng dòng bǎo liú biǎo shì zhōng de huì biān zhǐ lìng liè yào kǎo yōu huà chǔlǐshè de yuē shù hái bāo kuò
  1. děng hào yuē shù (=): zhǐ néng yòng shū chū cāo zuò biǎo shì yuē shùshuō míng kuò hào nèi de zuǒ zhí biǎo shì v->counter shì write-only de
  2. nèi cún yuē shù (m): biǎo shì shǐ yòng yào jiè zhù cún zhí jiē shǐ yòng nèi cún fāng shì jìn xíng shū huò shū chū
  3. shù yuē shù (i): biǎo shì shū biǎo shì shì shù ( zhěng shù ), yào jiè zhù rèn cún
  4. cún yuē shù (r): biǎo shì shǐ yòng tōng yòng cún yóu GCC zài %eax/%ax/%al、 %ebx/%bx/%bl、 %ecx/%cx/%cl %edx/%dx/%dl zhòngxuǎn shì de
  {
  __asm____volatile__(
  LOCK"addl%1,%0"
  :"=m"(v->counter)
  :"ir"(i),"m"(v->counter));
  }
  *static__inline__intatomic_sub_and_test(inti,atomic_t*v)
  ----------------------------------------
   cóng v zhǐ xiàng de yuán biàn liàng jiǎn i, bìng shì shì fǒu wéi 0。 ruò wéi 0, fǎn huí zhēnfǒu fǎn huí jiǎyóu x86 de subl zhǐ lìng huì zài jiēguǒ wéi 0 shí shè zhì CPU de zero biāo zhì wèiér qiě zhè biāo zhì wèi shì CPU yòu de huì bèi CPU yǐng xiǎngyīn zhí xíng jiā suǒ de jiǎn cāo zuòzài gēn CPU de zero biāo zhì wèi lái shè zhì běn biàn liàng c, bìng xiāng yìng fǎn huí
  {
  unsignedcharc;
  __asm____volatile__(
  LOCK"subl%2,%0;sete%1"
  :"=m"(v->counter),"=qm"(c)
  :"ir"(i),"m"(v->counter):"memory");
  returnc;
  }
  ------------------------------------
  #defineatomic_read(v)((v)->counter)
   v zhǐ xiàng de yuán biàn liàng de zhíyóu gāi cāo zuò běn shēn jiù shì yuán dezhǐ yào nèi cún fǎng wèn jiù néng wán chéngyīn dìng wéi hóngbìng yòng C dài shí xiàn
  #defineatomic_set(v,i)(((v)->counter)=(i))
   shè zhì v zhǐ xiàng de yuán biàn liàng de zhí wéi i。 yóu gāi cāo zuò běn shēn jiù shì yuán dezhǐ yào nèi cún fǎng wèn jiù néng wán chéngyīn dìng wéi hóngbìng yòng C dài shí xiàn
  static__inline__voidatomic_sub(inti,atomic_t*v)
   cóng v zhǐ xiàng de yuán biàn liàng jiǎn i。
  static__inline__voidatomic_inc(atomic_t*v)
   zēng v zhǐ xiàng de yuán biàn liàng
  static__inline__voidatomic_dec(atomic_t*v)
   jiǎn v zhǐ xiàng de yuán biàn liàng
  static__inline__intatomic_dec_and_test(atomic_t*v)
   jiǎn v zhǐ xiàng de yuán biàn liàngbìng shì shì fǒu wéi 0。 ruò wéi 0, fǎn huí zhēnfǒu fǎn huí jiǎ
  static__inline__intatomic_inc_and_test(atomic_t*v)
   zēng v zhǐ xiàng de yuán biàn liàngbìng shì shì fǒu wéi 0。 ruò wéi 0, fǎn huí zhēnfǒu fǎn huí jiǎ
  static__inline__intatomic_add_negative(inti,atomic_t*v)
   jiāng v zhǐ xiàng de yuán biàn liàng jiā shàng i, bìng shì jiēguǒ shì fǒu wéi ruò wéi fǎn huí zhēnfǒu fǎn huí jiǎzhè cāo zuò yòng shí xiàn semaphore。
yīngwénjièshì
  1. :  atomic operation