Всеки ред в програма (с изключение на декларациите на променливи) ще използва ли в крайна сметка поне едно системно извикване?

Мислех си за системните извиквания и кода, който пишем! Да кажем, че имам програма като по-долу

#include<stdio.h>
int main()
{
   int a=0,b=2,c;
   c=a+b;
   printf("The value of c is %d", c);
   return 0;
}

Да вземем случая на c = a+b; ако беше c++ компилатор, тогава вярвам, че ще има извикване на функцията operator+(). Компилаторът, разбира се, може да го оптимизира, като го замени с действителния код, който извършва добавяне, а не извикване на функция в асемблерния код.

И printf ще трябва да използва системно извикване, за да го запише в различни хардуерни буфери. Така че аз вярвам, че повечето от API, предоставени от езика, ще използват системно повикване, за да изпълнят функцията.. Не съм сигурен дали разбирането ми е правилно. Моля, поправете ме, ако греша.


person Karthick    schedule 21.09.2011    source източник
comment
Дефинирайте „системно повикване“, преди да мислите по-нататък.   -  person the.malkolm    schedule 22.09.2011


Отговори (2)


Нищо подобно. Не съм сигурен дали вашата дефиниция за системно извикване е правилна. Кражба на определение от Уикипедия:

В компютърната техника системното повикване е начинът, по който една програма изисква услуга от ядрото на операционната система.

Това означава, че видовете операции, които водят до системни извиквания, са I/O, синхронизация и т.н. -- не математика, присвоявания, (повечето) присвоявания на памет, ...

Дори malloc() обикновено се прилага, така че не винаги се нуждаете от системно извикване. По принцип: само действия, които засягат или взаимодействат с заобикалящата среда на програмата, изискват системно извикване. Регистри, програмни променливи и т.н. не се считат за част от околната среда.

person Ethereal    schedule 21.09.2011
comment
+1 ясен отговор, който избягва подвеждането, като същевременно не навлиза в ненужни подробности. - person R.. GitHub STOP HELPING ICE; 22.09.2011
comment
Определението от wikipedia е доста широко и следователно не винаги е толкова просто, колкото може да се мисли. Например повечето съвременни операционни системи използват виртуална памет, така че дори достъпът до собствената памет на процеса (присвояване на променлива) може да изисква извикване на някои функции на операционната система (непряко и от гледна точка на програма невидимо, но все пак), напр. в случай, че страницата с памет трябва да бъде сменена в действителна RAM. Мисля, че това също се квалифицира като услуга от операционна система, въпреки че обикновено не разбираме системното повикване така. - person j_kubik; 22.09.2011
comment
@j_kubik: по тази логика дори goto може да направи това: кодът също може да бъде заменен. Не мисля, че е продуктивно да считаме достъпа до паметта за заявка за услуга. - person MSalters; 22.09.2011
comment
@j_kubik 'системно повикване' е мястото, където програмата иска системна услуга, т.е. извиква системата. Повечето от това, което описахте, е изпълнено чрез прекъсвания като грешки на страницата, които не са заявки. - person user207421; 24.09.2011

Добавяйки към отговора на Ethereal, дори ако имате предвид „повикване“ (като към функция), а не „системно повикване“, отговорът все още е „не“. Например, c=a+b вероятно ще генерира вградено сглобяване, подобно на следното псевдосглобяване:

mov reg1, [a]
mov reg2, [b]
add reg1, reg2
mov [c], reg1

Няма нужда от обаждания!

person Codie CodeMonkey    schedule 21.09.2011