А.В. Столяров - Введение в операционные системы (1152218), страница 32
Текст из файла (страница 32)
Ïîýòîìó âñå òðè ñòàíäàðòíûõ äåñêðèïòîðà îáû÷íî ñâÿçûâàþò ñóñòðîéñòâîì /dev/null. Ýòî ñèìâîëüíîå (òî åñòü áàéò-îòðèåíòèðîâàííîå, èëèïîòîêîâîå) óñòðîéñòâî ÿâëÿåòñÿ ÷èñòî ëîãè÷åñêèì. Âñå, ÷òî â íåãî çàïèñûâàåòñÿ, ïîïðîñòó èñ÷åçàåò, à ïîïûòêà ÷òåíèÿ èç íåãî ñðàçó ñîçäàåò ñèòóàöèþêîíåö ôàéëà.×òîáû äåéñòâèÿ, ïðîèçâîäèìûå ñ êàêèì-ëèáî òåðìèíàëîì, íå ñêàçàëèñüíà ôóíêöèîíèðîâàíèè äåìîíà (íàïðèìåð, áûëî áû íåæåëàòåëüíî ïîëó÷èòü âíåêèé ìîìåíò SIGHUP èç-çà òîãî, ÷òî ïîëüçîâàòåëü ïðåêðàòèë ðàáîòó ñ òåðìèíàëîì), îí îáû÷íî ðàáîòàåò â îòäåëüíîì ñåàíñå.Òàêèì îáðàçîì, ïðîöåäóðà ñòàðòà ïðîöåññà-äåìîíà ìîæåò âûãëÿäåòü ïðèáëèçèòåëüíî òàê:close(0);close(1);close(2);open("/dev/null", O_RDONLY); /* stdin */open("/dev/null", O_WRONLY); /* stdout */open("/dev/null", O_WRONLY); /* stderr */144if(fork()>0) exit(0); /* change pid */setsid();chdir("/");Ïîñêîëüêó ñ òåðìèíàëàìè ïðîöåññ-äåìîí íå ñâÿçàí, âñåâîçìîæíûå ñîîáùåíèÿ îá îøèáêàõ, ïðåäóïðåæäåíèÿ, èíôîðìàöèîííûå ñîîáùåíèÿ è ò.ï., àäðåñîâàííûå ñèñòåìíîìó àäìèíèñòðàòîðó, ïðèõîäèòñÿ ïåðåäàâàòü íåêîòîðûì àëüòåðíàòèâíûì ñïîñîáîì.
Îáû÷íî ýòî äåëàåòñÿ÷åðåç èíôðàñòðóêòóðó ñèñòåìíîé æóðíàëèçàöèè.3Äëÿ ýòîãî èñïîëüçóþòñÿ ñëåäóþùèå áèáëèîòå÷íûå ôóíêöèè :void openlog(const char *ident, int option, int facility);void syslog(int priority, const char *format, ...);void closelog(void);×òîáû íà÷àòü ðàáîòó ñ ñèñòåìîé æóðíàëèçàöèè, ïðîãðàììà âûçûâàåòopenlog(),ïåðåäà-âàÿ ïåðâûì ïàðàìåòðîì ñâîå íàçâàíèå (èëè èíóþ èäåíòèôèöèðóþùóþ ñòðîêó), óêàçûâàÿíåêîòîðûå äîïîëíèòåëüíûå îïöèè â ïàðàìåòðåoptions(â áîëüøèíñòâå ñëó÷àåâ äîñòàòî÷-íî ïåðåäàòü ÷èñëî 0) è óêàçûâàÿ, ê êàêîé ïîäñèñòåìå îòíîñèòñÿ äàííàÿ ïðîãðàììà, ÷åðåçïàðàìåòðfacility.Íàèáîëåå ïîïóëÿðíûå ïîäñèñòåìû (íàïðèìåð, ïî÷òîâûé ñåðâåð) èìåþòñïåöèàëüíûå çíà÷åíèÿ ýòîãî ïàðàìåòðà, ïðî÷èì ïðîãðàììàì ñëåäóåò èñïîëüçîâàòü êîíñòàíòóLOG_USER.Ôóíêöèÿsyslog()printf().
Ïåðâûì ïàðàìåòðîì óêàçûâàåòñÿ ñòåLOG_ERR èñïîëüçóåòñÿ ïðè âîçíèêíîâåíèè íåóñòðàíèïðåäóïðåæäåíèé, LOG_INFO − äëÿ ïðîñòûõ èíôîðìàöèîííûõïîõîæà íà ôóíêöèþïåíü âàæíîñòè ñîîáùåíèÿ (íàïðèìåð,ìîé îøèáêè,LOG_WARN −äëÿñîîáùåíèé). Ñèñòåìíûé àäìèíèñòðàòîð ìîæåò íàñòðîèòü ñèñòåìó æóðíàëèçàöèè òàê, ÷òîáû âôàéëû æóðíàëîâ ïîïàäàëè òîëüêî ñîîáùåíèÿ ñ îïðåäåëåííûì óðîâíåì âàæíîñòè. Âòîðîé ïàðàìåòð− ýòî ôîðìàòíàÿ ñòðîêà, àíàëîãè÷íàÿ èñïîëüçóåìîé â ôóíêöèè printf().
Íàïðèìåð,âûçîâ ìîæåò âûãëÿäåòü òàê:syslog(LOG_INFO, "Daemon started with pid == %d", getpid());Ôóíêöèÿcloselog()çàâåðøàåò ðàáîòó ñ ñèñòåìîé æóðíàëèçàöèè, çàêðûâàÿ îòêðûòûåôàéëû è ò.ï.Óïðàâëåíèå ïðîöåññàìè-äåìîíàìè ìîæåò îñóùåñòâëÿòüñÿ ÷åðåç ñèãíàëû; òàê, ìíîãèå äåìîíû â îòâåò íà ñèãíàëSIGHUP ïåðå÷èòûâàþò êîíôèãóðàöèîííûå ôàéëû è ïðè íåîáõîäèìîñòèìåíÿþò ðåæèìû ðàáîòû.  áîëåå ñëîæíûõ ñëó÷àÿõ âîçìîæíû è äðóãèå ñõåìû óïðàâëåíèÿ.26Çàãðóçêà è æèçíåííûé öèêë ÎÑ UNIXÏîñëå âêëþ÷åíèÿ êîìïüþòåðà óïðàâëåíèå ïîëó÷àåò íåáîëüøàÿ ïðîãðàììà, íàõîäÿùàÿñÿ â ÏÇÓ. Ïîñëå âûïîëíåíèÿ íåêîòîðûõ äåéñòâèé ïî ïðîâåðêåîáîðóäîâàíèÿ ýòà ïðîãðàììà îïðåäåëÿåò çàãðóçî÷íîå óñòðîéñòâî (çàãðóçî÷íûé äèñê), ñ÷èòûâàåò â ïàìÿòü ïåðâûé ñåêòîð ýòîãî äèñêà (íàçûâàåìûé òàêæå çàãðóçî÷íûì ñåêòîðîì ) è ïåðåäàåò óïðàâëåíèå íà ñ÷èòàííûé êîä.3 Èõ ðåàëèçàöèÿ çàâèñèò îò êîíêðåòíîé ñèñòåìû.
Íàïðèìåð, äåìîí, îòâå÷àþùèé çà ñèñòåìíóþ æóðíàëè-çàöèþ, ìîæåò äåðæàòü îòêðûòûé îáùåäîñòóïíûé ñîêåò, â êîòîðûé è áóäóò ïèñàòü ôóíêöèè æóðíàëèçàöèè145Ïîñêîëüêó ðàçìåð ñåêòîðà ñðàâíèòåëüíî íåâåëèê (îáû÷íî 512 áàéò, ïðè÷åì íà÷àëüíûé ñåêòîð ìîæåò ñîäåðæàòü åùå äàííûå ïîìèìî çàãðóçî÷íîãîêîäà), ïðîãðàììà, çàïèñàííàÿ â çàãðóçî÷íûé ñåêòîð, äîñòàòî÷íî ïðîñòà è íåìîæåò âûïîëíèòü ñëîæíûõ äåéñòâèé.
Ïîýòîìó åå ðîëü çàêëþ÷àåòñÿ â çàãðóçêå â ïàìÿòü áîëåå ñëîæíîé ïðîãðàììû, çàïèñàííîé íà äèñêå â ñïåöèàëüíûõîáëàñòÿõ (ýòè îáëàñòè ðàçëè÷íû â ðàçíûõ îïåðàöèîííûõ ñèñòåìàõ è äëÿ ðàçíûõ âåðñèé çàãðóçî÷íûõ ïðîãðàìì). Ýòà ïðîãðàììà íàçûâàåòñÿ çàãðóç÷èêîìîïåðàöèîííîé ñèñòåìû è ìîæåò áûòü óæå ñðàâíèòåëüíî ñëîæíîé. Òàê, çàãðóç÷èê ÎÑ FreeBSD èìååò ñîáñòâåííóþ êîìàíäíóþ ñòðîêó, ïîçâîëÿþùóþâûáðàòü, êàêîé ðàçäåë ñ÷èòàòü êîðíåâûì, èç êàêîãî ôàéëà çàãðóæàòü ÿäðî,è ò.ï., ïðè ýòîì âîçìîæåí äàæå ïðîñìîòð êàòàëîãîâ íà äèñêàõ. Çàãðóç÷èêÎÑ Linux (LILO) íå ñòîëü ãèáîê â âîçìîæíîñòÿõ: îí îáëàäàåò ñïîñîáíîñòüþçàãðóæàòü àëüòåðíàòèâíûå îïåðàöèîííûå ñèñòåìû, âûáèðàòü îäíî èç ïðåäîïðåäåëåííûõ ÿäåð äëÿ çàãðóçêè è ïåðåäàâàòü ÿäðó ïàðàìåòðû, íî ôîðìàòôàéëîâîé ñèñòåìû íå ïîíèìàåò è ïðîñìàòðèâàòü äèñêè íå ïîçâîëÿåò.
ßäðîîí çàãðóæàåò èç ôèêñèðîâàííîãî íàáîðà ôèçè÷åñêèõ ñåêòîðîâ äèñêà. Ïðèýòîì çàãðóç÷èê ìîæåò áûòü óñòàíîâëåí ñ ïîääåðæêîé äîñòàòî÷íî êðàñèâîãîãðàôè÷åñêîãî èíòåðôåéñà4 .Çàãðóç÷èê çàãðóæàåò â ïàìÿòü âûáðàííîå ÿäðî è ïåðåäàåò óïðàâëåíèå åãîèíèöèàëèçàöèîííîìó êîäó. ßäðî èíèöèàëèçèðóåò ñâîè ïîäñèñòåìû, âêëþ÷àÿäðàéâåðû óñòðîéñòâ, ÷òî âêëþ÷àåò, åñòåñòâåííî, è ïðîâåðêó äîñòóïíîãî îáîðóäîâàíèÿ. Çàòåì ÿäðî ìîíòèðóåò ôàéëîâóþ ñèñòåìó ñ êîðíåâîãî äèñêîâîãîóñòðîéñòâà â êà÷åñòâå êîðíåâîãî êàòàëîãà ñèñòåìû.
Îáû÷íî êîðíåâîé êàòàëîãìîíòèðóåòñÿ â ðåæèìå òîëüêî ÷òåíèå.Ïîñëå òîãî êàê ÿäðî ãîòîâî ê ðàáîòå è ñìîíòèðîâàëî êîðíåâîå óñòðîéñòâî,îíî ñîçäàåò ïðîöåññ ñ íîìåðîì 0. Ýòîò ïðîöåññ ñóùåñòâóåò òîëüêî íà ýòàïåçàãðóçêè, è îñíîâíàÿ åãî ðîëü − ñîçäàòü ñ ïîìîùüþ fork() ïðîöåññ ñ íîìåðîì1. Ïîñëå ýòîãî íóëåâîé ïðîöåññ ïðåêðàùàåò ñóùåñòâîâàíèå, ò.å. â ñèñòåìå ñýòîãî ìîìåíòà åñòü òîëüêî ïðîöåññû, ñîçäàííûå ñ ïîìîùüþ fork().Ïðîöåññ íîìåð 1 âûïîëíÿåò âûçîâ execve(), ÷òîáû çàãðóçèòü â ïàìÿòüïðîãðàììó init (îáû÷íî ýòî ôàéë /sbin/init; ÿñíî, ÷òî îí äîëæåí íàõîäèòüñÿ íà êîðíåâîì äèñêîâîì óñòðîéñòâå).
Ýòî óæå ñîâåðøåííî îáû÷íàÿ ïðîãðàììà, íàïèñàííàÿ íà C5 èëè (òåîðåòè÷åñêè) íà ëþáîì äðóãîì êîìïèëèðóåìîìÿçûêå ïðîãðàììèðîâàíèÿ. Ïðîöåññ init ðàáîòàåò âñå âðåìÿ ðàáîòû ÎÑ; åãîçàâåðøåíèå âëå÷åò îñòàíîâ ñèñòåìû. Èìåííî ïðîöåññ init âûïîëíÿåò ïðîâåðêó äèñêîâ, ïåðåìîíòèðóåò êîðíåâîé ðàçäåë â ðåæèì ÷òåíèå/çàïèñü è4 Íåòàê äàâíî ïîÿâèëñÿ íîâûé çàãðóç÷èê, GRUB, îáëàäàþùèé áîëåå ðàçâèòîé ôóíêöèîíàëüíîñòüþ,÷åì LILO. Íåêîòîðûå äèñòðèáóòèâû ÎÑ Linux ïðåäëàãàþò èñïîëüçîâàíèå LILO èëè GRUB íà âûáîð.5  íåêîòîðûõ ñèñòåìàõ ìîæíî äàæå çàãðóçèòü âìåñòî init êàêóþ-ëèáî äðóãóþ ïðîãðàììó, íàïðèìåðèíòåðïðåòàòîð êîìàíäíîé ñòðîêè äëÿ âûïîëíåíèÿ äåéñòâèé ïî îáñëóæèâàíèþ ñèñòåìû146ìîíòèðóåò îñòàëüíûå ôàéëîâûå ñèñòåìû.Çàòåì ïðîöåññ init äîëæåí èíèöèàëèçèðîâàòü ïîäñèñòåìû ÎÑ, íàïðèìåð,ñêîíôèãóðèðîâàòü èíòåðôåéñû ðàáîòû ñ ëîêàëüíîé ñåòüþ; çàïóñòèòü ñèñòåìíûå ïðîöåññû-äåìîíû; è, íàêîíåö, çàïóñòèòü íà èìåþùèõñÿ òåðìèíàëüíûõëèíèÿõ ïðîãðàììû getty, îòâå÷àþùèå çà çàïðîñ âõîäíîãî èìåíè è ïàðîëÿïîëüçîâàòåëåé. Ïðîãðàììà getty ñîçäàåò ñåàíñ, ñâÿçàííûé ñ åå òåðìèíàëîì,è, ïîñëå óñïåøíîé àóòåíòèôèêàöèè ïîëüçîâàòåëÿ, çàïóñêàåò ñ ïîìîùüþ execèíòåðïðåòàòîð êîìàíäíîé ñòðîêè.
Êîãäà ïðîöåññ èíòåðïðåòàòîðà çàâåðøàåòñÿ, ïðîãðàììà init ñíîâà çàïóñêàåò getty íà îñâîáîäèâøåéñÿ òåðìèíàëüíîéëèíèè.Òàêèì îáðàçîì, ôóíêöèîíàëüíîñòü ïðîãðàììû init îêàçûâàåòñÿ äîñòàòî÷íî ñëîæíîé.  ñâÿçè ñ ýòèì îáû÷íî âûïîëíåíèå áîëüøèíñòâà äåéñòâèé,ñâÿçàííûõ ñ èíèöèàëèçàöèåé ñèñòåìû, âîçëàãàåòñÿ íà ñêðèïòû ñèñòåìíîéèíèöèàëèçàöèè (â çàâèñèìîñòè îò ñèñòåìû ýòî ìîæåò áûòü ôàéë /etc/rc,/etc/rc.d/rc è ò.ï.) Ïðîãðàììå init òîãäà äîñòàòî÷íî óêàçàòü (÷åðåç êîíôèãóðàöèîííûé ôàéë èëè â êà÷åñòâå ïàðàìåòðà êîìïèëÿöèè), ãäå íàõîäèòñÿñîîòâåòñòâóþùèé ñêðèïò. Ñêðèïòû ñèñòåìíîé èíèöèàëèçàöèè îáû÷íî ïðåäñòàâëÿþò ñîáîé ïðîãðàììû, íàïèñàííûå íà ÿçûêå ñòàíäàðòíîãî êîìàíäíîãîèíòåðïðåòàòîðà (Bourne Shell).Îòìåòèì, ÷òî è ïðîöåäóðà êîððåêòíîãî îñòàíîâà ñèñòåìû äëÿ ïåðåçàãðóçêè èëè âûêëþ÷åíèÿ êîìïüþòåðà òàêæå âîçëàãàåòñÿ íà init, êîòîðûé, â ñâîþî÷åðåäü, çàïóñêàåò äëÿ ýòîãî ñïåöèàëüíî ïðåäíàçíà÷åííûé ñêðèïò.
 ýòîìñêðèïòå ñîäåðæàòñÿ êîìàíäû ïî óíè÷òîæåíèþ ðàáîòàþùèõ ïðîöåññîâ (ñíà÷àëà ñ ïîìîùüþ ñèãíàëà SIGTERM, çàòåì, ïîñëå ïàóçû, − ñèãíàëîì SIGKILL),ðàçìîíòèðîâàíèÿ âñåõ ôàéëîâûõ ñèñòåì, êðîìå êîðíåâîé (åå ðàçìîíòèðîâàòüíåâîçìîæíî), ïåðåâîä êîðíåâîé ñèñòåìû â ðåæèì òîëüêî ÷òåíèå, ñèíõðîíèçàöèÿ êîðíåâîé ñèñòåìû (çàïèñü íåäîçàïèñàííûõ äàííûõ èç áóôåðîâ, åñëèòàêîâûå åñòü).
Ïîñëå ýòîãî âûïîëíÿåòñÿ ñîáñòâåííî îñòàíîâ ñèñòåìû.147Ëåêöèÿ 122727.1Âçàèìîèñêëþ÷åíèÿÑèòóàöèÿ ãîíîê (race condition)Ïðè îäíîâðåìåííîì äîñòóïå íåñêîëüêèõ ïðîöåññîâ ê ðàçäåëÿåìûì äàííûì ìîãóò âîçíèêàòü îïðåäåëåííûå ïðîáëåìû, ñâÿçàííûå ñ î÷åðåäíîñòüþäåéñòâèé.Ðàññìîòðèì ñëåäóþùèé ïðèìåð.
Äâà ðàçëè÷íûõ ïðîöåññà èìåþò äîñòóïê ðàçäåëÿåìîé ïàìÿòè, â êîòîðîé ñîäåðæèòñÿ öåëî÷èñëåííàÿ ïåðåìåííàÿ.Ïóñòü åå íà÷àëüíîå çíà÷åíèå ðàâíî 5. Îáà ïðîöåññà â íåêèé ìîìåíò ïûòàþòñÿ óâåëè÷èòü çíà÷åíèå ïåðåìåííîé íà 1 (òî åñòü â èòîãå ïåðåìåííàÿ äîëæíàïîëó÷èòü çíà÷åíèå 7).
Äëÿ ýòîãî íåîáõîäèìî çàãðóçèòü çíà÷åíèå â ðåãèñòð,óâåëè÷èòü çíà÷åíèå ðåãèñòðà íà 1 è âûãðóçèòü åãî çíà÷åíèå îáðàòíî â ïàìÿòü1 .Ïðåäñòàâèì, ÷òî ïåðâûé ïðîöåññ âûïîëíèë êîìàíäó mov äëÿ çàãðóçêè çíà÷åíèÿ ïåðåìåííîé â ðåãèñòð (òî åñòü â ðåãèñòðå òåïåðü ñîäåðæèòñÿ ÷èñëî 5),è â ýòîò ìîìåíò ïðîèçîøëî ïðåðûâàíèå ïî òàéìåðó, â ðåçóëüòàòå êîòîðîãîïðîöåññ îêàçàëñÿ ñíÿò ñ èñïîëíåíèÿ è ïîìåùåí â î÷åðåäü ïðîöåññîâ, ãîòîâûõê âûïîëíåíèþ.
 ýòî âðåìÿ âòîðîé ïðîöåññ òàêæå âûïîëíÿåò êîìàíäó mov,ïîòîì êîìàíäó inc äëÿ óâåëè÷åíèÿ çíà÷åíèÿ â ðåãèñòðå è êîìàíäó mov äëÿâûãðóçêè ñîäåðæèìîãî ðåãèñòðà â ïàìÿòü. Ïåðåìåííàÿ òåïåðü ðàâíà 6.Ìåæäó òåì, ïåðâûé ïðîöåññ äîæäàëñÿ ñâîåé î÷åðåäè è ñíîâà ïîñòàâëåí íàâûïîëíåíèå. Ïåðâóþ êîìàíäó mov îí óæå âûïîëíèë, òàê ÷òî â åãî ðåãèñòðåñåé÷àñ ÷èñëî 5. Îí âûïîëíÿåò êîìàíäó inc (â ðåãèñòðå òåïåðü 6) è êîìàíäómov (çíà÷åíèå 6 âûãðóæàåòñÿ â ïàìÿòü).Òàêèì îáðàçîì, ïîëó÷àåòñÿ, ÷òî â èòîãå çíà÷åíèå ïåðåìåííîé îêàçàëîñüðàâíî 6, à íå 7.
Çàìåòèì, ÷òî çíà÷åíèåì áûëî áû èìåííî 7, åñëè áû ïåðâûé ïðîöåññ íå îêàçàëñÿ ïðåðâàí ïîñëå ïåðâîé êîìàíäû. Òàêæå çàìåòèì, ÷òîóçíàòü, áûë ïðîöåññ ïðåðâàí èëè íåò, âîîáùå ãîâîðÿ, íåâîçìîæíî, êàê è çàïðåòèòü ïðåðûâàòü ïðîöåññ.Ïîëó÷àåòñÿ òàê, ÷òî êîíå÷íûé ðåçóëüòàò çàâèñèò îò òîãî, â êàêîé êîíêðåòíî ïîñëåäîâàòåëüíîñòè ïðîèçîéäóò ñîáûòèÿ â íåçàâèñèìûõ ïðîöåññàõ.Ýòî íàçûâàåòñÿ ñèòóàöèåé ãîíîê (àíãë. race condition ); âñòðå÷àåòñÿ òàêæåïåðåâîä ñèòóàöèÿ ñîñòÿçàíèÿ.1 Íàíåêîòîðûõ ñîâðåìåííûõ ïðîöåññîðàõ âîçìîæíî ïðèðàùåíèå çíà÷åíèÿ íåïîñðåäñòâåííî â ïàìÿòè,òîãäà ýòîò ïðèìåð íå ñðàáîòàåò, ò.ê. êàæäàÿ èíñòðóêöèÿ ïðîöåññîðà âûïîëíÿåòñÿ àòîìàðíî. Ýòî, îäíàêî,íå îçíà÷àåò íåïðàâèëüíîñòè ïðèìåðà: ïðåäñòàâüòå ñåáå, ÷òî ÷èñëî õðàíèòñÿ â ïàìÿòè â âèäå ñòðîêîâîãîïðåäñòàâëåíèÿ − â ýòîì ñëó÷àå îïåðàöèÿ åãî ïðèðàùåíèÿ íèêàê íå ñìîæåò áûòü àòîìàðíîé148Ðàññìîòðèì áîëåå ñåðüåçíûé ïðèìåð.
Èìååòñÿ áàçà äàííûõ, ñîäåðæàùàÿîñòàòêè äåíåã íà áàíêîâñêèõ ñ÷åòàõ. Äîïóñòèì, íà ñ÷åòàõ ïîä íîìåðàìè 301,515 è 768 ñîäåðæèòñÿ, ñîîòâåòñòâåííî, $1000, $1500 è $2000. Îäèí îïåðàòîðïðîâîäèò òðàíçàêöèþ ïî ïåðåâîäó ñóììû â $100 ñî ñ÷åòà 301 íà ñ÷åò 768,à äðóãîé − òðàíçàêöèþ ïî ïåðåâîäó $200 ñî ñ÷åòà 768 íà ñ÷åò 515. Åñëè ýòèäåéñòâèÿ ïðîâåñòè â ðàçíîå âðåìÿ, îñòàòêè íà ñ÷åòàõ ñîñòàâÿò, ïîíÿòíîå äåëî,$900, $1700 è $1900.Òåïåðü ïðåäñòàâèì ñåáå, ÷òî ïðîöåññ, çàïóùåííûé âòîðûì îïåðàòîðîì,áûë ïðåðâàí ïîñëå îïåðàöèè ÷òåíèÿ îñòàòêîâ íà ñ÷åòàõ 515 è 768.