zài duō jìn chéng( xiàn chéng) fǎng wèn zī yuán shí, néng gòu què bǎo suǒ yòu qí tā de jìn chéng( xiàn chéng) dōubù zài tóng yī shí jiān nèi fǎng wèn xiāng tóng de zī yuán。
yuán zǐ cāo zuò : UP hé SMP de yì tóng
-----------------------------------------------------------
yuán zǐ cāo zuò shì bù kě fēn gē de, zài zhí xíng wán bì bù huì bèi rèn hé qí tā rèn wù huò shì jiàn zhōng duàn。 zài dān chù lǐ qì xì tǒng (UniProcessor) zhōng, néng gòu zài dān tiáo zhǐ lìng zhōng wán chéng de cāo zuò dōukě yǐ rèn wéi shì " yuán zǐ cāo zuò ", yīn wéi zhōng duàn zhǐ néng fā shēng yú zhǐ lìng zhī jiān。 zhè yě shì mǒu xiē CPU zhǐ lìng xì tǒng zhōng yǐn rù liǎo test_and_set、 test_and_clear děng zhǐ lìng yòng yú lín jiè zī yuán hù chì de yuán yīn。 dàn shì, zài duìchèn duō chǔlǐ qì (SymmetricMulti-Processor) jié gòu zhōng jiù bù tóng liǎo, yóu yú xì tǒng zhōng yòu duō gè chǔlǐ qì zài dú lì dì yùn xíng, jí shǐ néng zài dān tiáo zhǐ lìng zhōng wán chéng de cāo zuò yě yòu kě néng shòu dào gān rǎo。 wǒ men yǐ decl( dì jiǎn zhǐ lìng ) wéi lì, zhè shì yī gè diǎn xíng de " dú - gǎi- xiě " guò chéng, shè jí liǎng cì nèi cún fǎng wèn。 shè xiǎng zài bù tóng CPU yùn xíng de liǎng gè jìn chéng dōuzài dì jiǎn mǒu gè jì shù zhí, kě néng fā shēng de qíng kuàng shì:
1 . CPUA(CPUA shàng suǒ yùn xíng de jìn chéng, yǐ xià tóng ) cóng nèi cún dān yuán bǎ dāng qián jì shù zhí (2) zhuāng zài jìn tā de jì cún qì zhōng;
2. CPUB cóng nèi cún dān yuán bǎ dāng qián jì shù zhí (2) zhuāng zài jìn tā de jì cún qì zhōng。
3. CPUA zài tā de jì cún qì zhōngjiàng jì shù zhí dì jiǎn wéi 1;
4. CPUB zài tā de jì cún qì zhōngjiàng jì shù zhí dì jiǎn wéi 1;
5. CPUA bǎ xiū gǎi hòu de jì shù zhí (1) xiě huí nèi cún dān yuán。
6. CPUB bǎ xiū gǎi hòu de jì shù zhí (1) xiě huí nèi cún dān yuán。
wǒ men kàn dào, nèi cún lǐ de jì shù zhí yīnggāi shì 0, rán 'ér tā què shì 1。 rú guǒ gāi jì shù zhí shì yī gè gòng xiǎng zī yuán de yǐn yòng jì shù, měi gè jìn chéng dōuzài dì jiǎn hòu bǎ gāi zhí yǔ 0 jìn xíng bǐ jiào, cóng 'ér què dìng shì fǒu xū yào shì fàng gāi gòng xiǎng zī yuán。 zhè shí, liǎng gè jìn chéng dū qù diào liǎo duì gāi gòng xiǎng zī yuán de yǐn yòng, dàn méi yòu yī gè jìn chéng néng gòu shì fàng tā -- liǎng gè jìn chéng dū tuī duàn chū: jì shù zhí shì 1, gòng xiǎng zī yuán réng rán zài bèi shǐ yòng。
yuán zǐ xìng bù kě néng yóu ruǎn jiàn dān dú bǎo zhèng -- bì xū xū yào yìng jiàn de zhī chí, yīn cǐ shì hé jià gòu xiāng guān de。 zài x86 píng tái shàng, CPU tí gōng liǎo zài zhǐ lìng zhí xíng qī jiān duì zǒng xiàn jiā suǒ de shǒu duàn。 CPU xìn piàn shàng yòu yī tiáo yǐn xiàn #HLOCKpin, rú guǒ huì biān yǔ yán de chéng xù zhōng zài yī tiáo zhǐ lìng qián miàn jiā shàng qián zhuì "LOCK", jīng guò huì biān yǐ hòu de jī qì dài mǎ jiù shǐ CPU zài zhí xíng zhè tiáo zhǐ lìng de shí hòu bǎ #HLOCKpin de diàn wèi lā dī, chí xù dào zhè tiáo zhǐ lìng jié shù shí fàng kāi, cóng 'ér bǎ zǒng xiàn suǒ zhù, zhè yàng tóng yī zǒng xiàn shàng bié de CPU jiù zàn shí bù néng tōng guò zǒng xiàn fǎng wèn nèi cún liǎo, bǎo zhèng liǎo zhè tiáo zhǐ lìng zài duō chǔlǐ qì huán jìng zhōng de yuán zǐ xìng。
Linux nèi hé zhōng de yuán zǐ cāo zuò
-----------------------------------------------------------
yuán zǐ cāo zuò dà bù fēn shǐ yòng huì biān yǔ yán shí xiàn, yīn wéi c yǔ yán bìng bù néng shí xiàn zhè yàng de cāo zuò。
* zài x86 de yuán zǐ cāo zuò shí xiàn dài mǎ zhōng, dìng yì liǎo LOCK hóng, zhè gè hóng kě yǐ fàng zài suí hòu de nèi lián huì biān zhǐ lìng zhī qián。 rú guǒ shì SMP, LOCK hóng bèi kuò zhǎn wéi lock zhǐ lìng; fǒu zé bèi dìng yì wéi kōng -- dān CPU wú xū fáng zhǐ qí tā CPU de gān rǎo, suǒ 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 tǐ xì jié gòu shàng yuán zǐ lèi xíng atomic_t dū bǎo cún yī gè int zhí。 zài x86 de mǒu xiē chǔlǐ qì shàng, yóu yú gōng zuò fāng shì de yuán yīn, yuán zǐ lèi xíng néng gòu bǎo zhèng de kě yòng fàn wéi zhǐ yòu 24 wèi。 volatile shì yī gè lèi xíng miáo shù fú, yào qiú biān yì qì bù yào duì qí miáo shù de duì xiàng zuò yōu huà chǔlǐ, duì tā de dú xiě dū xū yào cóng nèi cún zhōng fǎng wèn。
*#defineATOMIC_INIT(i){(i)}
yòng yú zài dìng yì yuán zǐ biàn liàng shí, chū shǐ huà wéi zhǐ dìng de zhí。 rú:
staticatomic_tcount=ATOMIC_INIT(1);
*static__inline__voidatomic_add(inti,atomic_t*v)
----------------------------------------
jiāng v zhǐ xiàng de yuán zǐ biàn liàng jiā shàng i。 gāi hán shù bù guān xīn yuán zǐ 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ōng, shǐ yòng liǎo dài yòu C/C++ biǎo dá shì de nèi lián huì biān dài mǎ, gé shì rú xià ( cān kǎo《 AT&TASMSyntax》 ):
__asm____volatile__("InstructionList":Output:Input:Clobber/Modify);
__asm____volatile__ zhǐ shì biān yì qì yuán fēng bù dòng bǎo liú biǎo dá shì zhōng de huì biān zhǐ lìng xì liè, bù yào kǎo lǜ yōu huà chǔlǐ。 shè jí de yuē shù hái bāo kuò:
1. děng hào yuē shù (=): zhǐ néng yòng yú shū chū cāo zuò biǎo dá shì yuē shù, shuō míng kuò hào nèi de zuǒ zhí biǎo dá shì v->counter shì write-only de。
2. nèi cún yuē shù (m): biǎo shì shǐ yòng bù xū yào jiè zhù jì cún qì, zhí jiē shǐ yòng nèi cún fāng shì jìn xíng shū rù huò shū chū。
3. lì jí shù yuē shù (i): biǎo shì shū rù biǎo dá shì shì yī gè lì jí shù ( zhěng shù ), bù xū yào jiè zhù rèn hé jì cún qì。
4. jì cún qì yuē shù (r): biǎo shì shǐ yòng yī gè tōng yòng jì cún qì, yóu GCC zài %eax/%ax/%al、 %ebx/%bx/%bl、 %ecx/%cx/%cl hé %edx/%dx/%dl zhòngxuǎn qǔ yī gè hé 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 zǐ biàn liàng jiǎn qù i, bìng cè shì shì fǒu wéi 0。 ruò wéi 0, fǎn huí zhēn, fǒu zé fǎn huí jiǎ。 yóu yú 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è gè biāo zhì wèi shì CPU sī yòu de, bù huì bèi qí tā CPU yǐng xiǎng。 yīn cǐ, kě yǐ zhí xíng yī cì jiā suǒ de jiǎn cāo zuò, zài gēn jù CPU de zero biāo zhì wèi lái shè zhì běn dì 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)
dú qǔ v zhǐ xiàng de yuán zǐ biàn liàng de zhí。 yóu yú gāi cāo zuò běn shēn jiù shì yuán zǐ de, zhǐ xū yào yī cì nèi cún fǎng wèn jiù néng wán chéng, yīn cǐ dìng yì wéi yī gè hóng, bìng yòng C dài mǎ shí xiàn。
#defineatomic_set(v,i)(((v)->counter)=(i))
shè zhì v zhǐ xiàng de yuán zǐ biàn liàng de zhí wéi i。 yóu yú gāi cāo zuò běn shēn jiù shì yuán zǐ de, zhǐ xū yào yī cì nèi cún fǎng wèn jiù néng wán chéng, yīn cǐ dìng yì wéi yī gè hóng, bìng yòng C dài mǎ shí xiàn。
static__inline__voidatomic_sub(inti,atomic_t*v)
cóng v zhǐ xiàng de yuán zǐ biàn liàng jiǎn qù i。
static__inline__voidatomic_inc(atomic_t*v)
dì zēng v zhǐ xiàng de yuán zǐ biàn liàng。
static__inline__voidatomic_dec(atomic_t*v)
dì jiǎn v zhǐ xiàng de yuán zǐ biàn liàng。
static__inline__intatomic_dec_and_test(atomic_t*v)
dì jiǎn v zhǐ xiàng de yuán zǐ biàn liàng, bìng cè shì shì fǒu wéi 0。 ruò wéi 0, fǎn huí zhēn, fǒu zé fǎn huí jiǎ。
static__inline__intatomic_inc_and_test(atomic_t*v)
dì zēng v zhǐ xiàng de yuán zǐ biàn liàng, bìng cè shì shì fǒu wéi 0。 ruò wéi 0, fǎn huí zhēn, fǒu zé fǎn huí jiǎ。
static__inline__intatomic_add_negative(inti,atomic_t*v)
jiāng v zhǐ xiàng de yuán zǐ biàn liàng jiā shàng i, bìng cè shì jiēguǒ shì fǒu wéi fù。 ruò wéi fù, fǎn huí zhēn, fǒu zé fǎn huí jiǎ。 zhè gè cāo zuò yòng yú shí xiàn semaphore。 |