Ëåêöèÿ 13 BIOS AMI, Phoenix, Insyde Ïåðâûé BIOS áûë ðàçðàáîòàí îäíîé èç ýòèõ êîìïàíèé. Çàòåì äðóãàÿ êîìïàíèÿ ðàçðàáîòàëà òî÷íî òàêîé æå BIOS (ñ òî÷íî òàêèì æå èíòåðôåéñîì). Intel - ïðè ðàçðàáîòêå ïëàòôîðìû ðàçðàáàòûâàåò ñâîé âíóòðåííèé BIOS (äëÿ îòëàäêè æåëåçà, òàêæå äëÿ ýòîãî ðàçðàáàòûâàåòñÿ SV OS). Ïàðàëëåëüíî: - Ðàçðàáîòêà Hardware ïëàòôîðìû -> ñïåöèôèêàöèè -> êîä -> (DFM) layout -> (DFM) Physical Verification (Cadence Design Systems, Calibra, ...) -> Manufacturing - Ðàçðàáîòêà âíóòðåííåãî BIOS - Ðàçðàáîòêà SV ñêðèïòîâ - Ðàçðàáîòêà ôóíêöèîíàëüíîãî ñèìóëÿòîðà (â ñîîòâåòñòâèè ñî ñïåöèôèêàöèÿìè æåëåçà) AMI - ðàçðàáîòàëà êîíñòðóêòîð äëÿ ðàçðàáîòêè BIOSîâ (AMI BIOS) Phoenix - Òàéáåé (Taipei) (Òàéâàíü) Îòëàäêà BIOS'à - ñ óñòðîéñòâîì ITP (In-Target Probe), îòëàä÷èê ITP. Òî÷êè îñòàíîâà: hardware (àäðåñà òî÷åê îñòàíîâà - â òàáëèöå, ïðè âûïîëíåíèè êàæäîé èíñòðóêöèè åå àäðåñ ñðàâíèâàåòñÿ ñ àäðåñàìè â òàáëèöå) è software (èíñòðóêöèè â òî÷êàõ îñòàíîâà çàìåíÿþòñÿ íà èíñòðóêöèþ, âûçûâàþùóþ SW ïðåðûâàíèå, à ïðè îñòàíîâå ïåðåä âèçóàëèçàöèåé â îòëàä÷èêå èíñòðóêöèÿ âîññòàíàâëèâàåòñÿ). HW òî÷êè îñòàíîâà ñèëüíî çàìåäëÿþò âûïîëíåíèå ïðîãðàììû ïîä îòëàä÷èêîì. Hardware òî÷êè îñòàíîâà íóæíû, êîãäà îïåðàòèâíàÿ ïàìÿòü íå èíèöèàëèçèðîâàíà, òî åñòü êîãäà çàïèñü âìåñòî èíñòðóêöèè äðóãîé èíñòðóêöèè (à èìåííî, èíñòðóêöèè SWI) íåâîçìîæíà. Êàê ïðîèñõîäèò îòëàäêà BIOS: - çàïóñêàåòñÿ - åñëè äîëãî í÷åãî íå ïðîèñõîäèò - ïðîâåðÿåòñÿ, ÷òî îí âûïîëíÿåò - åñëè âûïîëíÿåòñÿ deadloop - èññëåäóåòñÿ, ÷òî ïðèâåëî ê åãî âûçîâó. Äëÿ ýòîãî âûïîëíåíèå çàïóñêàåòñÿ ñíà÷àëà ñ îïðåäåëåííûì êîëè÷åñòâîì øàãîâ (èíñòðóêöèè). Ïîñëå âûïîëíåíèÿ ýòèõ øàãîâ ïðîâåðÿåòñÿ, ìû óæå â deadloop èëè íåò. Çàòåì ñíîâà ïðîèñõîäèò ëèáî çàïóñê ñíà÷àëà, ëèáî âûïîëíåíèå ïðîäîëæàåòñÿ (òîæå ñ îïðåäåëåííûì êîëè÷åñòâîì øàãîâ). Òàê ëîêàëèçóåòñÿ èíñòðóêöèÿ, ïðèâåäøàÿ â deadloop. Ëåêöèÿ 14 Îïåðàöèîííûå ñèñòåìû. Íàçíà÷åíèå ÎÑ - âûïîëíåíèå ïðèêëàäíûõ ïðîãðàìì. Äâà ðåæèìà ïðîöåññîðà: ïîëüçîâàòåëüñêèé (äëÿ ïðèêëàäíûõ ïðîãðàìì) è ïðèâèëåãèðîâàííûé. ÎÑ - ïðîãðàììà, ðàáîòàþùàÿ íà àïïàðàòóðå. Äîïîëíÿåò, èñïðàâëÿåò åå, ïðèñïîñîáëåíà ê íåé. Ïîçâîëÿåò ïðèêëàäíîé ïðîãðàììå áûòü ìàøèííî-íåçàâèñèìîé. Ïðèìåðû îòëè÷èé ÎÑ, íåäîñòàòêè. a) Cadence Design Systems (DFM) - ÏÎ, ðàáîòàþùåå íà ðàçëè÷íûõ ÎÑ. NC SIM - ñèìóëÿòîð ñåòåâîé êàðòû (Network Card). Solaris â 3 ðàçà ìåäëåííåå Linux: íà Solaris EEPROM òåñò øåë 24 ÷àñà, íà Linux - 8 ÷àñîâ. b) Ó Windows íåò ðåàëüíîãî òàéìèíãà. Íàïðèìåð, íóæíî ñèìóëèðîâàòü WiFi ñåòü. Èñïîëüçóåì äðàéâåð TUN/TAP (ñèìóëèðóåò íàëè÷èå ñåòåâîé êàðòî÷êè ó êîìïüþòåðà). Åñëè íóæíû òî÷íûå òàéìèíãè (strict timing sumulation), òî Windows íå ïîäõîäèò. Linux - ñèñòåìà ðåàëüíîãî âðåìåíè => íà ýòîé ÎÑ ìîæíî ðåàëèçîâàòü strict timing simulation. Îñíîâíîå ïîíÿòèå ÎÑ - ïðîöåññ. Ýòî ýêçåìïëÿð âûïîëíÿåìîé ïðîãðàììû, âêëþ÷àÿ òåê.çíà÷åíèÿ ðåãèñòðîâ è ïåðåìåííûõ. Ó ïðîöåññà åñòü ïðîãðàììà, âõîäíûå äàííûå è ñîñòîÿíèå. Àëãîðèòì ïëàíèðîâàíèÿ ïðîöåññîâ. Ñîáûòèÿ, ïðèâîäÿùèå ê ñîçäàíèþ ïðîöåññîâ: 1. Èíèöèàëèçàöèÿ ñèñòåìû 2. Âûïîëíåíèå ðàáîòàþùèì ïðîöåññîì ñèñòåìíîãî âûçîâà, ïðåäíàçíà÷åíííîãî äëÿ ñîçäàíèÿ ïðîöåññà 3. Çàïðîñ ïîëüçîâàòåëÿ íà ñîçäàíèå íîâîãî ïðîöåññà 4. Èíèöèàöèÿ ïàêåòíîãî çàäàíèÿ Çàâåðøåíèå ïðîöåññà: 1. Îáû÷íûé âûõîä (äîáðîâîëüíî) 2. Âûõîä ïðè âîçíèêíîâåíèè îøèáêè (äîáðîâîëüíî) 3. Âîçíèêíîâåíèå ôàòàëüíîé îøèáêè (ïðèíóäèòåëüíî) 4. Óíè÷òîæåíèå äðóãèì ïðîöåññîì (ïðèíóäèòåëüíî) Ñîñòîÿíèÿ ïðîöåññîâ: 1. âûïîëíÿåìûé 2. ãîòîâûé (ïðèîñòàíîâëåííûé, ÷òîáû äàòü âîçì-òü âûïîëíåíèÿ äðóãîìó ïðîöåññó) 3. çàáëîêèðîâàííûé (íåñïîñîáíûé âûïîëíÿòüñÿ, ïîêà íå âîçíèêíåò êàêîå-íèáóäü âíåøíåå ñîáûòèå). Ìåæäó ýòèìè ñîñòîÿíèÿìè - ÷åòûðå ïåðåõîäà: 1->2, 1->3, 3->2, 2->1. Ïðîöåññû ïîòðåáëÿþò ðåñóðñû. Ïðîöåññ ìîæåò áûòü çàáëîêèðîâàí òåì, ÷òî çàïðîñèë äîñòóï ê ðåñóðñó, êîòîðûé íå ìîæåò áûòü ïðåäîñòàâëåí. Åñëè âñå ïðîöåññû çàáëîêèðîâàíû, òî òàêàÿ ñèòóàöèÿ íàçûâàåòñÿ deadlock. Ïðèìåð. Îáåäàþùèå ôèëîñîôû. Åñëè êàæäûé âçÿë ïàëî÷êó ñïðàâà (ðåñóðñ), òî ïàëî÷êà ñëåâà îêàæåòñÿ íåäîñòóïíà è âñå ïðîöåññû (ôèëîñîôû) îêàæóòñÿ çàáëîêèðîâàííûìè.
Çàäà÷à 1. Êàê îòñëåäèòü, ÷òî â ÎÑ âîçíèêëà ñèòóàöèÿ deadlock. Äåéêñòðà ðåøèë ýòó çàäà÷ó. Îáîçíà÷èì ñòðåëî÷êîé îò ðåñóðñà ê ïðîöåññó ñèòóàöèþ, êîãäà ðåñóðñ çàõâà÷åí ïðîöåññîì, à ñòðåëî÷êîé îò ïðîöåññà ê ðåñóðñó - êîãäà ðåñóðñ çàòðåáîâàí ïðîöåñîì. Åñëè â ýòîì ãðàôå (ãäå óçëû - ýòî ïðîöåññû è ðåñóðñû) åñòü çàìêíóòûé öèêë - òî äèàãíîñòèðóåòñÿ deadlock. Çàäà÷à 2. Êàê ðàçðåøèòü (ïðåîäîëåòü) deadlock. Ðåøåíèå Äåéêñòðû: îäèí èç ïðîöåññîâ îñâîáîæäàåò çàõâà÷åííûé ðåñóðñ. Íàïðèìåð, îäèí èç ôèëîñîôîâ êëàäåò ïàëî÷êó íà ñòîë (ñïðàâà).  ðåçóëüòàòå ñèäÿùèé ñïðàâà îò íåãî (òîò, êòî çàòðåáîâàë ýòîò ðåñóðñ) ñìîæåò âûïîëíÿòüñÿ (îáåäàòü).  ðåçóëüòàòå âûïîëíåíèÿ ýòîò ïðîöåññ îñâîáîæäàåò çàõâà÷åííûå ðåñóðñû (îáå ïàëî÷êè) è äðóãèå ïðîöåññû ñìîãóò èõ çàõâàòèòü (ñîñåäè ñïðàâà è ñëåâà îò çàêîí÷èâøåãî îáåä).  ÎÑ åñòü òàáëèöà ïðîöåññîâ. Òàáëèöà ïðîöåññîâ ñîäåðæèò: - òåêóùåå ñîñòîÿíèå ðåãèñòðà ñ÷åò÷èêà êîìàíä - òåêóùåå ñîñòîÿíèå ðåãèñòðà óêàçàòåëü ñòåêà - ðàñïðåäåëåíèå ïàìÿòè - ñîñòîÿíèå îòêðûòûõ ôàéëîâ - ó÷åòíàÿ è ïëàíèðîâî÷íàÿ èíôîðìàöèÿ - âñå îñòàëüíîå, ÷òî ä.á. ñîõðàíåíî Threads (íèòè, ïîòîêè). Ïðèìåð: òåñòîâûé ðåäàêòîð, ôîíîâûå ïðîöåññû. Ïîòîêè ïîçâîëÿþò ðàñïàðàëëåëèâàòü ðàáîòó, ñîõðàíèâ èäåþ ïîñëåäîâàòåëüíûõ ïðîöåññîâ, îñóùåñòâëÿþøèõ áëîêèðóþùèå ñèñòåìíûå âûçîâû. Ïðèìåð èñïîëüçîâàíèÿ íèòåé. Òðè ñïîñîáà ðåàëèçàöèè ñåðâåðà: 1. Ïîòîêè - ïàðàëëåëüíàÿ ðàáîòà, áëîêèðóþùèå ñèñòåìíûå âûçîâû 2. Îäíîïîòî÷íûé ïðîöåññ - îòñóòñòâèå ïàðàëëåëüíîé ðàáîòû, áëîêèðóþùèå ñèñòåìíûå âûçîâû 3. Ìàøèíà ñ êîíå÷íûì ÷èñëîì ñîñòîÿíèé - ïàðàëëåëüíàÿ ðàáîòà, íåáëîêèðóþùèå ñèñòåìíûå âûçîâû, ïðåðûâàíèÿ Ïàðàëëåëüíûå ïðîöåññû (è íèòè) òðåáóþò ñèíõðîíèçàöèè äîñòóïà ê ðàçäåëÿåìûì (îáùèì) ðåñóðñàì. Ðàçäåëÿåìûå ðåñóðñû ó ïðîöåññîâ: 1) Ôàéëû 2) Óñòðîéñòâà ââîäà/âûâîäà 3) Shared memory ... Ó íèòåé ðàçäåëÿåìûå ðåñóðñû: 1) Ôàéëû 2) Óñòðîéñòâà ââîäà/âûâîäà 3) Ãëîáàëüíûå ïåðåìåííûå - òàê êàê ó íèõ îáùèé êîä è îáùàÿ îáëàñòü îïåðàòèâíîé ïàìÿòè. Linux, ñòàíäàðò POSIX: int num = 0; int main(void) { pthread_create(..., ..., func, &x); pthread_create(..., ..., func, &x); } void func(void *arg) { while (1) { if (...) ++num; } } ++: LDR R0, &num (R0 := 0) --> LDR R0, &num (R0 := 0) INC R0 (R0 := 1) -- INC R0 (R0 := 1) Ïåðåäàåòñÿ óïðàâëåíèå âòîðîé íèòè STR R0, &num (num := 1) <---- STR R0, &num (num := 1)  ðåçóëüòàòå num == 1 âìåñòî 2 Äëÿ èñêëþ÷åíèÿ òàêèõ îøèáîê òðåáóåòñÿ ñèíõðîíèçàöèÿ äîñòóïà ê ðàçäåëÿåìûì ðåñóðñàì Îïåðàöèÿ ïî èçìåíåíèþ çíà÷åíèÿ ïåðåìåííîé äîëæíà àòîìàðíîé îïåðàöèåé (òî åñòü åå íåëüçÿ ïðåðâàòü). Êðèòè÷åñêàÿ ñåêöèÿ - êîä, âûïîëíåíèå êîòîðîãî íå äîëæåí áûòü ïðåðâàíî ïåðåêëþ÷åíèåì íà âûïîëíåíèå äðóãîé íèòè.