(1) කාලයෙහි ප්‍රතිදානයේදී 'තාත්වික', 'පරිශීලක' සහ 'සයිස්' යන්නෙන් අදහස් කරන්නේ කුමක්ද?


1757
$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

කාලය නිමැවුමෙන් 'තාත්වික', 'පරිශීලක' සහ 'සයිස්' යන්නෙන් අදහස් කරන්නේ කුමක්ද?

මගේ යෙදුම මිණුම් සලකුණු කිරීමේදී අර්ථවත් වන්නේ කුමක්ද?


2
මම ඔවුන්ගෙන් එක් කෙනෙකුට පමණක් ප්‍රවේශ වන්නේ කෙසේද? උදාහරණයක් ලෙස තථ්‍ය කාලයද?
මොජ්ටාබා අහමඩි

1
OnConcernedOfTunbridgeWells
Mojtaba Ahmadi

2
As කැසිලස් රියල් - stackoverflow.com/questions/2408981/…
ConcernedOfTunbridgeWells

7
ඔබේ වැඩසටහන වේගයෙන් පිටවන්නේ නම්, ඒ කිසිවක් අර්ථවත් නොවේ, ඒ සියල්ල ආරම්භක උඩිස් ය. ඔබට සම්පූර්ණ වැඩසටහනම මැනීමට අවශ්‍ය නම් time, එය අවම වශයෙන් තත්පරයක් ගතවන යමක් කරන්න.
පීටර් කෝර්ඩ්ස්

5
එය timeබාෂ් මූල පදයක් බව සටහන් කිරීම ඇත්තෙන්ම වැදගත් ය . ඒ නිසා ටයිප් man timeඇත නොහැකි වූ bash සඳහා ඔබ man පිටුව ලබා time, ඒ වෙනුවට එය සඳහා man පිටුව ලබා දෙන /usr/bin/time. මේක මාව උග්‍ර කළා.
irritable_phd_syndrom

Answers:


2084

තාත්වික, පරිශීලක සහ පද්ධති ක්‍රියාවලි කාල සංඛ්‍යාලේඛන

මේ දේවල් වලින් එකක් අනෙකට සමාන නොවේ. තාත්වික යන්නෙන් අදහස් කරන්නේ ගත වූ කාලයයි. පරිශීලකයා සහ Sys යනු ක්‍රියාවලිය මඟින් පමණක් භාවිතා කරන CPU කාලයයි .

  • රියල් යනු බිත්ති ඔරලෝසු කාලයයි - ඇමතුම ආරම්භයේ සිට අවසානය දක්වා කාලය. වෙනත් ක්‍රියාදාමයන් භාවිතා කරන කාල පෙති සහ ක්‍රියාවලිය අවහිර කළ කාලය ඇතුළුව මේ සියල්ල ගත වූ කාලයයි (නිදසුනක් ලෙස එය I / O සම්පූර්ණ වන තෙක් බලා සිටී නම්).

  • පරිශීලක (kernel පිටත) පරිශීලක-මාදිලිය කේතය වැය CPU කාල ප්රමාණය වේ තුළ ක්රියාවලිය. මෙය ක්‍රියාවලිය ක්‍රියාත්මක කිරීමේදී භාවිතා කරන සත්‍ය CPU කාලය පමණි. අවහිර කරන ලද ක්‍රියාවලිය සඳහා වැය කරන වෙනත් ක්‍රියාදාමයන් සහ කාලය මෙම සංඛ්‍යාවට ගණන් නොගනී.

  • Sys යනු ක්‍රියාවලිය තුළ කර්නලය තුළ ගත කරන CPU කාලයයි. මෙයින් අදහස් කරන්නේ පුස්තකාල කේතයට පටහැනිව කර්නලය තුළ පද්ධති ඇමතුම් සඳහා වැය කරන ලද CPU කාලය ක්‍රියාත්මක කිරීම , එය තවමත් පරිශීලක අවකාශයේ ක්‍රියාත්මක වන බවයි. 'පරිශීලකයා' මෙන්, මෙය ක්‍රියාවලිය භාවිතා කරන CPU කාලය පමණි. කර්නල් මාදිලිය ('අධීක්ෂක' මාදිලිය ලෙසද හැඳින්වේ) සහ පද්ධති ඇමතුම් යාන්ත්‍රණය පිළිබඳ කෙටි විස්තරයක් සඳහා පහත බලන්න.

User+Sysඔබේ ක්‍රියාවලිය කොපමණ සත්‍ය CPU කාලයක් භාවිතා කර ඇත්දැයි ඔබට කියනු ඇත. මෙය සියලු CPU හරහා ඇති බව සලකන්න, එම නිසා ක්‍රියාවලියට බහු නූල් තිබේ නම් (සහ මෙම ක්‍රියාවලිය එකකට වඩා වැඩි ප්‍රොසෙසරයක් සහිත පරිගණකයක ක්‍රියාත්මක වේ) එය වාර්තා කළ බිත්ති ඔරලෝසු කාලය ඉක්මවා යා හැකිය Real(සාමාන්‍යයෙන් එය සිදු වේ). ප්රතිදානයේ මෙම සංඛ්යාවන් ඇතුළත් සටහන Userහා Sysසියලු ළමා ක්රියාවලිය (සහ ඔවුන්ගේ දරුවෝ ද) කාලය මෙන්ම ඔවුන් එකතු කර ඇත හැකි විට, උදා: විසින් wait(2)හෝ waitpid(2), යටින් දිවෙන පද්ධතිය ඇමතුම්, ෙවන් ෙවන් වශෙයන් එම ක්රියාවලිය සඳහා සංඛ්යා ලේඛන එහි දරුවන් නැවත වුවද.

වාර්තා කරන ලද සංඛ්‍යාලේඛනවල මූලාරම්භය time (1)

වාර්තා කරන ලද සංඛ්‍යාලේඛන timeවිවිධ පද්ධති ඇමතුම් වලින් ලබා ගනී. 'පරිශීලක' සහ 'සිස්' පැමිණෙන්නේ wait (2)( POSIX ) හෝ times (2)( POSIX ), විශේෂිත පද්ධතිය අනුව ය. 'රියල්' ගණනය කරනු ලබන්නේ gettimeofday (2)ඇමතුමෙන් ලබාගත් ආරම්භක හා අවසාන වේලාවෙනි. පද්ධතියේ අනුවාදය මත පදනම්ව, සන්දර්භය ස්විච ගණන වැනි වෙනත් සංඛ්‍යාලේඛන ද රැස්කර ගත හැකිය time.

බහු-සකසනයක යන්ත්‍රයක, බහු-නූල් ක්‍රියාවලියක් හෝ ළමයින් බලෙන් පැටවීමේ ක්‍රියාවලියක් මුළු CPU කාලයට වඩා අඩු කාලයක් ගත විය හැකිය - විවිධ නූල් හෝ ක්‍රියාවලි සමාන්තරව ක්‍රියාත්මක විය හැකි බැවින්. එසේම, වාර්තා කරන ලද කාල සංඛ්‍යාලේඛන විවිධ සම්භවයන්ගෙන් පැමිණ ඇති බැවින් මුල් පෝස්ටරයේ දැක්වෙන උදාහරණයෙන් පෙන්නුම් කරන පරිදි ඉතා කෙටි ධාවන කාර්යයන් සඳහා වාර්තා වන වේලාවන් වටකුරු දෝෂයන්ට භාජනය විය හැකිය.

කර්නල් එදිරිව පරිශීලක මාදිලිය පිළිබඳ කෙටි ප්‍රාථමිකයක්

යුනික්ස් හෝ ඕනෑම ආරක්ෂිත මතක මෙහෙයුම් පද්ධතියක, 'කර්නල්' හෝ 'සුපරීක්ෂක' මාදිලිය යනු CPU ක්‍රියාත්මක කළ හැකි වරප්‍රසාද ලත් මාදිලියකි . ආරක්ෂාව හෝ ස්ථාවරත්වයට බලපාන ඇතැම් වරප්‍රසාදිත ක්‍රියා සිදු කළ හැක්කේ CPU ක්‍රියාත්මක වන විට පමණි මෙම මාතය; මෙම ක්‍රියා යෙදුම් කේතයට නොමැත. එවැනි ක්‍රියාවකට උදාහරණයක් වන්නේ වෙනත් ක්‍රියාවලියක ලිපින අවකාශයට ප්‍රවේශය ලබා ගැනීම සඳහා MMU හැසිරවීමයි . සාමාන්යයෙන්, පරිශීලක-මාදිලිය කේතය මෙම (හොඳ හේතු සහිත), එය ඉල්ලා ගත හැකි වුවද, කරන්න බැහැ හවුල් මතක , කර්නලය සිට ඇති හැකිඑක් ක්‍රියාවලියකට වඩා කියවීම හෝ ලිවීම. මෙම අවස්ථාවෙහිදී, හවුල් මතකය ආරක්ෂිත යාන්ත්‍රණයක් හරහා කර්නලයෙන් පැහැදිළිව ඉල්ලා සිටින අතර එය භාවිතා කිරීම සඳහා ක්‍රියාවලි දෙකම එයට පැහැදිලිවම ඇමිණිය යුතුය.

වරප්‍රසාද ලත් මාදිලිය සාමාන්‍යයෙන් 'කර්නල්' ප්‍රකාරය ලෙස හඳුන්වනු ලබන්නේ කර්නලය ක්‍රියාත්මක වන්නේ මෙම ප්‍රකාරයේදී ක්‍රියාත්මක වන CPU විසිනි. කර්නල් ප්‍රකාරයට මාරුවීම සඳහා ඔබට නිශ්චිත උපදෙස් (බොහෝ විට උගුලක් ලෙස හැඳින්විය හැක ) නිකුත් කළ යුතු අතර එය CPU කර්නල් ප්‍රකාරයට ධාවනය වන අතර පැනීමේ වගුවක ඇති නිශ්චිත ස්ථානයකින් කේතය ධාවනය කරයි. ආරක්ෂක හේතූන් මත, ඔබට කර්නල් මාදිලිය වෙත මාරු වී අත්තනෝමතික කේත ක්‍රියාත්මක කළ නොහැක - උගුල් කළමනාකරණය කරනු ලබන්නේ ලිපින වගුවක් හරහා වන අතර CPU අධීක්ෂක මාදිලියේ ක්‍රියාත්මක නොවන්නේ නම් ලිවිය නොහැක. ඔබ පැහැදිලි උගුල් අංකයක් සමඟ උගුලට හසු වන අතර ලිපිනය පැනීමේ වගුවේ ඉහළට ඔසවා ඇත; කර්නලයට සීමිත පාලක ප්‍රවේශ ස්ථාන සංඛ්‍යාවක් ඇත.

සී පුස්තකාලයේ ඇති 'පද්ධති' ඇමතුම් (විශේෂයෙන් මෑන් පිටුවල 2 වන කොටසේ විස්තර කර ඇති) පරිශීලක මාදිලියේ අංගයක් ඇත, එය ඔබ ඇත්ත වශයෙන්ම ඔබේ සී වැඩසටහනෙන් අමතයි. තිරයට පිටුපසින්, ඔවුන් I / O වැනි නිශ්චිත සේවාවන් කිරීම සඳහා කර්නලයට පද්ධති ඇමතුම් එකක් හෝ කිහිපයක් නිකුත් කළ හැකි නමුත් පරිශීලක මාදිලියේ කේත ක්‍රියාත්මක වේ. අවශ්‍ය නම් ඕනෑම පරිශීලක අභ්‍යවකාශ කේතයකින් කර්නල් මාදිලියට උගුලක් කෙලින්ම නිකුත් කිරීමට ද හැකිය, නමුත් ඇමතුම සඳහා ලේඛණ නිවැරදිව සැකසීමට ඔබට එකලස් කිරීමේ භාෂාවේ කුඩා කොටසක් ලිවීමට අවශ්‍ය විය හැකිය.

'සයිස්' ගැන වැඩි විස්තර

ඔබගේ කේතයට පරිශීලක ප්‍රකාරයෙන් කළ නොහැකි දේවල් තිබේ - මතකය වෙන් කිරීම හෝ දෘඩාංග වෙත ප්‍රවේශ වීම (HDD, ජාලය ආදිය). මේවා කර්නලයේ අධීක්ෂණය යටතේ පවතින අතර ඒවාට පමණක් එය කළ හැකිය. වැනි සමහර මෙහෙයුම් mallocහෝ fread/ fwriteමෙම කර්නලය කාර්යයන් ඇමතීමටත්, පසුව 'sys' කාලය ලෙස ගණන් කරන බව ය. අවාසනාවට එය "malloc වෙත ලැබෙන සෑම ඇමතුමක්ම 'sys' කාලය තුළ ගණනය කරනු ලැබේ 'තරම් සරල නැත. ඇමතුම mallocතමන්ගේම සැකසුම් සිදු කරනු ඇත (තවමත් 'පරිශීලක' කාලය තුළ ගණනය කර ඇත) පසුව කොතැනක හෝ එය කර්නලයේ ශ්‍රිතය ලෙස හැඳින්විය හැකිය ('sys' වේලාවෙන් ගණනය කෙරේ). කර්නල් ඇමතුමෙන් ආපසු පැමිණි පසු, 'පරිශීලකයා' තුළ තවත් කාලයක් ගතවනු ඇතmallocඔබගේ කේතයට නැවත පැමිණේ. ස්විචය සිදු වන්නේ කවදාද, සහ එයින් කොපමණ ප්‍රමාණයක් කර්නල් ප්‍රකාරයේදී වැය වේද ... ඔබට කිව නොහැක. එය පුස්තකාලය ක්‍රියාත්මක කිරීම මත රඳා පවතී. එසේම, පෙනෙන වෙනත් අහිංසක කාර්යයන් ද භාවිතා කළ හැකි mallocඅතර පසුබිම වැනි දේ නැවත වරක් 'sys' තුළ යම් කාලයක් ගතවනු ඇත.


15
ළමා ක්‍රියාදාමයන් සඳහා වැය කරන කාලය සැබෑ / සයිස් ලෙස ගණන් ගන්නේද?
ron

1
@ron - ලිනක්ස් මෑන් පිටුවට අනුව, එය ක්‍රියාවලි වේලාවන් සමඟ 'සී' වේලාවන් එකතු කරයි, එබැවින් මම සිතමි. (2) ඇමතුම ලබා දුන් වේලාවන්ට වඩා දෙමාපියන්ගේ වේලාවන් සහ ළමා වේලාවන් වෙන වෙනම ලබා ගත හැකිය. මම හිතන්නේ කාලය (1) හි සොලාරිස් / සිස්වී අනුවාදය සමාන දෙයක් කරයි.
ConcernedOfTunbridgeWells

3
ක්‍රියාවලියක CPU භාවිතය මැනීමට පරිශීලක + Sys ඔබට ඉඩ දෙයි. කාර්ය සාධනය මිණුම් සලකුණු කිරීමට ඔබට එය භාවිතා කළ හැකිය. බහු-නූල් කේත සඳහා මෙය විශේෂයෙන් ප්‍රයෝජනවත් වේ, එහිදී එක් CPU හරයක් එකකට වඩා ගණනය කිරීමක වැඩ කරයි.
ConcernedOfTunbridgeWells

1
මාතෘකාව පිළිබඳ නිශ්චිතවම නොවේ, කෙසේ වෙතත්: "\ time <cmd>" ධාවනය කිරීම සිත්ගන්නා සුළුය - එය වඩාත් විස්තර සපයයි: (අදහස් දැක්වීමේදී දුර්වල හැඩතල ගැන්වීම් වලට සමාව දෙන්න): $ time ps PID TTY TIME CMD 9437 pts / 19 00:00:00 bash 11459 pts / 19 00:00:00 ps real 0m0.025s පරිශීලක 0m0.004s sys 0m0.018s \ \ time ps PID TTY TIME CMD 9437 pts / 19 00:00:00 bash 11461 pts / 19 00:00:00 time 11462 pts / 19 00:00:00 ps 0.00user 0.01system 0: 00.02elapsed 95% CPU (0avgtext + 0avgdata 2160maxresident) k 0inputs + 0outputs (0major + 103minor) pagefaults 0swaps $
kaiwan

1
(පෙර අදහස් දැක්වීමේ අක්ෂර වලින් ඉවතට): වැඩි විස්තර? පරිපූර්ණ [1], [2] භාවිතා කරන්න. [1] perf.wiki.kernel.org/index.php/Main_Page [2] brendangregg.com/perf.html
kaiwan

292

පිළිගත් පිළිතුර පුළුල් කිරීම සඳහා , මට අවශ්‍ය වූයේ realuser+ වීමට තවත් හේතුවක් සැපයීමට ය sys.

realසත්‍යාපිත කාලය නිරූපණය කරන බව මතක තබා ගන්න , userසහ sysඅගයන් CPU ක්‍රියාත්මක කිරීමේ කාලය නියෝජනය කරයි. එහි ප්‍රති As ලයක් ලෙස, බහු පද්ධති පද්ධතියක, userසහ / හෝ sysවේලාව (මෙන්ම ඒවායේ එකතුව) ඇත්ත වශයෙන්ම තථ්‍ය කාලය ඉක්මවා යා හැක . උදාහරණයක් ලෙස, මම පන්තිය සඳහා ධාවනය වන ජාවා යෙදුමක මෙම අගයන් සමූහය ලබා ගනිමි:

real    1m47.363s
user    2m41.318s
sys     0m4.013s

11
මම නිතරම මේ ගැන කල්පනා කළා. මගේ වැඩසටහන් තනි නූල් සහිත බව මා දන්නා බැවින්, පරිශීලකයා සහ තථ්‍ය කාලය අතර වෙනස VM ඉහළින් තිබිය යුතුය, හරිද?
ක්වොන්ටම් 7

9
අවශ්‍ය නොවේ; සොලාරිස් යන්ත්‍රවල සන් ජේවීඑම් මෙන්ම මැක් ඕඑස් එක්ස් හි ඇපල්හි ජේවීඑම් ද තනි නූල් සහිත යෙදුම්වල පවා එක් හරයකට වඩා භාවිතා කිරීමට සමත් වේ. ඔබ ජාවා ක්‍රියාවලියක නියැදියක් කරන්නේ නම්, කසළ එකතු කිරීම වැනි දේවල් වෙනම නූල් මත ධාවනය වන බව ඔබට පෙනෙනු ඇත (සහ තවත් සමහර දේවල් මගේ හිස මුදුනේ මතක නැති). ඔබට “වීඑම් උඩිස්” ලෙස හැඳින්වීමට අවශ්‍ය දැයි මම නොදනිමි.
ලෙන්සෝවට්

4
මම හිතන්නේ ඉහළ ඡන්ද ප්‍රමාණය දැන් ඔබට ප්‍රමාණවත් කීර්තියක් ලබා දී ඇත: ඩී. ඒ නිසා ඔබ ගැන මොකද හිතන්නේ realවැඩි userහා sysමුළු? නූල් සන්දර්භය මාරුවීම වැනි මෙහෙයුම් පද්ධතියේ පොදු කාර්ය විය හැකිද?
මුහම්මද් ගෙල්බානා

19
තවත් විභව ගැටළුවක් වනුයේ I / O විය හැකිය: ඔබේ යෙදුම ගොනුවක් හෝ ප්‍රවාහයක් ලබා ගැනීම සඳහා හොඳ කාලයක් වැය කරන්නේ නම්, පැහැදිලිවම තථ්‍ය කාලය පරිශීලකයාගේ / සිස් කාලය ඉක්මවා යනු ඇත. ගොනුවකට හෝ ඊට සමාන දෙයකට.
lesovet

2
U මුහම්මද් ගෙල්බානා - කිසියම් හේතුවක් නිසා යෙදුම ක්‍රියාත්මක කිරීම අවහිර කළහොත් මෙය සිදුවිය හැකිය. උදාහරණයක් ලෙස, එය I / O, IPC හෝ සොකට් සම්බන්ධතා මත රැඳී සිටින්නේ නම් එය අක්‍රියව පවතිනු ඇත, අවහිර කරන ඇමතුම නැවත පැමිණෙන තෙක් CPU කාලය රැස් නොකරයි.
ConcernedOfTunbridgeWells

41

තාත්වික : ක්‍රියාවලිය ආරම්භයේ සිට අවසානය දක්වා ක්‍රියාත්මක කිරීම සඳහා වැය කළ කාලය, එය නැවතුම් ඔරලෝසුවක් සහිත මිනිසෙකු විසින් මනිනු ලැබුවාක් මෙන්

පරිශීලකයා : ගණනය කිරීමේදී සියලුම CPUs විසින් ගත කරන ලද සමුච්චිත කාලය

sys : එවැනි මතකය වෙන් කරන මෙන් පද්ධතිය සම්බන්ධ කාර්යයන් තුළ සියලු ජනිතවන වැය කර ඇති සමස්ත කාලය.

බහු ප්‍රොසෙසර සමාන්තරව ක්‍රියා කරන බැවින් සමහර විට පරිශීලක + සයිස් යථාර්ථයට වඩා වැඩි විය හැකි බව සලකන්න.


sysCPU- කාලය පද්ධති ඇමතුම් සඳහා (සහ පිටු-දෝෂ හසුරුවන්නන්?) ගත කරයි
පීටර් කෝඩ්ස්

1
realබොහෝ විට "බිත්ති-ඔරලෝසු" කාලය ලෙස විස්තර කෙරේ.
පීටර් කෝඩ්ස්

31

අවම ධාවනය කළ හැකි POSIX C උදාහරණ

දේවල් වඩාත් සංයුක්ත කිරීමට, timeඅවම සී පරීක්ෂණ වැඩසටහන් කිහිපයක් සමඟ ආන්තික අවස්ථා කිහිපයක් නිදර්ශනය කිරීමට මට අවශ්‍යය .

සියලුම වැඩසටහන් සම්පාදනය කර ක්‍රියාත්මක කළ හැකිය:

gcc -ggdb3 -o main.out -pthread -std=c99 -pedantic-errors -Wall -Wextra main.c
time ./main.out

උබුන්ටු 18.10, GCC 8.2.0, glibc 2.28, ලිනක්ස් කර්නල් 4.18, ThinkPad P51 ලැප්ටොප්, Intel Core i7-7820HQ CPU (4 core / 8 threads), 2x Samsung M471A2K43BB1-CRC RAM (2x 16GiB) වලින් පරීක්ෂා කර ඇත.

නින්ද

කාර්යබහුල නොවන නින්ද එක්කෝ userහෝ sysපමණක් ගණන් නොගනී real.

උදාහරණයක් ලෙස, තත්පරයක් නිදාගන්නා වැඩසටහනක්:

#define _XOPEN_SOURCE 700
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    sleep(1);
    return EXIT_SUCCESS;
}

GitHub ඉහළට .

වැනි දෙයක් ප්‍රතිදානය කරයි:

real    0m1.003s
user    0m0.001s
sys     0m0.003s

IO ලබා ගැනීම අවහිර කරන ලද වැඩසටහන් සඳහා ද එයම වේ.

උදාහරණයක් ලෙස, පහත දැක්වෙන වැඩසටහන මඟින් පරිශීලකයාට අක්‍ෂරයක් ඇතුළත් කර බලා ඔබන්න:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    printf("%c\n", getchar());
    return EXIT_SUCCESS;
}

GitHub ඉහළට .

ඔබ තත්පරයක් පමණ බලා සිටියහොත්, එය නින්දේ උදාහරණය මෙන් ප්‍රතිදානය කරයි:

real    0m1.003s
user    0m0.001s
sys     0m0.003s

මෙම හේතුව නිසා timeඔබට CPU සහ IO බැඳී ඇති වැඩසටහන් අතර වෙනස හඳුනාගත හැකිය: "CPU bound" සහ "I / O bound" යන වචනවල තේරුම කුමක්ද?

බහු නූල්

පහත දැක්වෙන උදාහරණයෙන් නූල් nitersමත වැඩ නොකරන තනිකරම CPU- බැඳී ඇති ක්‍රියාකාරකම් නැවත සිදු කරයි nthreads:

#define _XOPEN_SOURCE 700
#include <assert.h>
#include <inttypes.h>
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

uint64_t niters;

void* my_thread(void *arg) {
    uint64_t *argument, i, result;
    argument = (uint64_t *)arg;
    result = *argument;
    for (i = 0; i < niters; ++i) {
        result = (result * result) - (3 * result) + 1;
    }
    *argument = result;
    return NULL;
}

int main(int argc, char **argv) {
    size_t nthreads;
    pthread_t *threads;
    uint64_t rc, i, *thread_args;

    /* CLI args. */
    if (argc > 1) {
        niters = strtoll(argv[1], NULL, 0);
    } else {
        niters = 1000000000;
    }
    if (argc > 2) {
        nthreads = strtoll(argv[2], NULL, 0);
    } else {
        nthreads = 1;
    }
    threads = malloc(nthreads * sizeof(*threads));
    thread_args = malloc(nthreads * sizeof(*thread_args));

    /* Create all threads */
    for (i = 0; i < nthreads; ++i) {
        thread_args[i] = i;
        rc = pthread_create(
            &threads[i],
            NULL,
            my_thread,
            (void*)&thread_args[i]
        );
        assert(rc == 0);
    }

    /* Wait for all threads to complete */
    for (i = 0; i < nthreads; ++i) {
        rc = pthread_join(threads[i], NULL);
        assert(rc == 0);
        printf("%" PRIu64 " %" PRIu64 "\n", i, thread_args[i]);
    }

    free(threads);
    free(thread_args);
    return EXIT_SUCCESS;
}

GitHub upstream + plot code .

මගේ හයිපර්ට්‍රෙඩ් සීපීයූ 8 හි ස්ථාවර 10 ^ 10 පුනරාවර්තන සඳහා නූල් ගණනක ශ්‍රිතයක් ලෙස අපි බිත්ති, පරිශීලක සහ සයිස් සැලසුම් කරමු:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

දත්ත සැලසුම් කරන්න .

ප්‍රස්ථාරයෙන් අපට එය පෙනේ:

  • CPU තීව්‍ර තනි මූලික යෙදුමක් සඳහා, බිත්තිය සහ පරිශීලකයා එක සමාන වේ

  • මධ්‍ය 2 ක් සඳහා, පරිශීලකයා බිත්ති 2x ක් පමණ වේ, එයින් අදහස් කරන්නේ පරිශීලක කාලය සියලු නූල් හරහා ගණනය කරන බවයි.

    පරිශීලකයා මූලික වශයෙන් දෙගුණයක් වූ අතර බිත්තිය එලෙසම පැවතුනි.

  • මෙය මගේ පරිගණකයේ ඇති හයිපර්ට්‍රෙඩ් ගණනට ගැලපෙන නූල් 8 ක් දක්වා පවතී.

    8 න් පසු, බිත්තියද වැඩි වීමට පටන් ගනී, මන්ද අපට යම් කාලයක් තුළ වැඩි වැඩ කොටසක් කිරීමට අමතර CPU නොමැති නිසාය!

    මෙම අවස්ථාවෙහිදී සානුව අනුපාතය.

මෙම ප්‍රස්ථාරය එතරම් පැහැදිලි හා සරල බව මතක තබා ගන්න, මන්දයත් එය තනිකරම CPU- බැඳී ඇති හෙයිනි: එය මතක ශක්තියෙන් බැඳී තිබුනේ නම්, අඩු කාර්ය සාධනයක් සහිතව අපට බොහෝ කලකට පෙර කාර්ය සාධනය අඩුවනු ඇත, මන්ද මතක ප්‍රවේශයන් බාධකයක් වනු ඇත්තේ කුමක් ද? "CPU bound" සහ "I / O bound" යන වචන වලින් අදහස් වේද?

Sys බර වැඩ සමඟ sendfile

මට ඉදිරිපත් කළ හැකි බරම sys කාර්ය භාරය වූයේ sendfileකර්නල් අවකාශයේ ගොනු පිටපත් කිරීමේ ක්‍රියාවලියක් භාවිතා කිරීමයි: ගොනුවක් ඉතා සුරක්ෂිතව හා කාර්යක්ෂමව පිටපත් කරන්න

ඉතින් මම හිතුවා මේ කර්නලය memcpyCPU තීව්‍ර මෙහෙයුමක් වේවි කියලා.

පළමුව මම විශාල 10GiB අහඹු ගොනුවක් ආරම්භ කරන්නේ:

dd if=/dev/urandom of=sendfile.in.tmp bs=1K count=10M

ඉන්පසු කේතය ධාවනය කරන්න:

#define _GNU_SOURCE
#include <assert.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/sendfile.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv) {
    char *source_path, *dest_path;
    int source, dest;
    struct stat stat_source;
    if (argc > 1) {
        source_path = argv[1];
    } else {
        source_path = "sendfile.in.tmp";
    }
    if (argc > 2) {
        dest_path = argv[2];
    } else {
        dest_path = "sendfile.out.tmp";
    }
    source = open(source_path, O_RDONLY);
    assert(source != -1);
    dest = open(dest_path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
    assert(dest != -1);
    assert(fstat(source, &stat_source) != -1);
    assert(sendfile(dest, source, 0, stat_source.st_size) != -1);
    assert(close(source) != -1);
    assert(close(dest) != -1);
    return EXIT_SUCCESS;
}

GitHub ඉහළට .

එමඟින් මූලික වශයෙන් බොහෝ දුරට පද්ධති කාලය අපේක්ෂිත පරිදි ලබා දෙයි:

real    0m2.175s
user    0m0.001s
sys     0m1.476s

timeවිවිධ ක්‍රියාදාමයන්හි අන්තරායන් අතර වෙනස හඳුනාගත හැකිදැයි බැලීමට මට කුතුහලයක් ඇති විය , එබැවින් මම උත්සාහ කළෙමි:

time ./sendfile.out sendfile.in1.tmp sendfile.out1.tmp &
time ./sendfile.out sendfile.in2.tmp sendfile.out2.tmp &

ප්‍රති result ලය වූයේ:

real    0m3.651s
user    0m0.000s
sys     0m1.516s

real    0m4.948s
user    0m0.000s
sys     0m1.562s

තනි ක්‍රියාවලියක් සඳහා sys කාලය දෙකටම සමාන වේ, නමුත් බිත්ති කාලය විශාල වන්නේ ක්‍රියාදාමයන් තැටි කියවීමේ ප්‍රවේශය සඳහා තරඟ කරන බැවිනි.

එබැවින් දී ඇති කර්නල් කාර්යයක් ආරම්භ කළේ කුමන ක්‍රියාවලිය සඳහාද යන්න ඇත්ත වශයෙන්ම ගණනය කරන බව පෙනේ.

මූලාශ්‍ර කේතය

ඔබ time <cmd>උබුන්ටු මත පමණක් කරන විට , එය දැක ගත හැකි පරිදි Bash යතුරු පදය භාවිතා කරයි:

type time

කුමන ප්‍රතිදානයන්:

time is a shell keyword

එබැවින් අපි ප්‍රතිදාන නූල සඳහා Bash 4.19 ප්‍රභව කේතයෙන් ප්‍රභවය ලබා ගනිමු:

git grep '"user\b'

එය අපව execute_cmd.c ශ්‍රිතයට time_commandයොමු කරයි, එය භාවිතා කරන්නේ:

  • gettimeofday()හා getrusage()දෙකම ලබා ගත හැකි නම්,
  • times() නැතිනම්

ඒ සියල්ල ලිනක්ස් පද්ධති ඇමතුම් සහ පොසික්ස් කාර්යයන් වේ.

GNU Coreutils ප්‍රභව කේතය

අපි එය මෙසේ නම්:

/usr/bin/time

ඉන්පසු එය GNU Coreutils ක්‍රියාත්මක කිරීම භාවිතා කරයි.

මෙය ටිකක් සංකීර්ණයි, නමුත් අදාළ ප්‍රභවය resuse.c හි ඇති බව පෙනේ .

  • POSIX නොවන BSD wait3ඇමතුමක් තිබේ නම්
  • timesසහ gettimeofdayවෙනත් ආකාරයකින්

14

ක්‍රියාවලියක් සඳහා සම්පූර්ණ හැරවුම් කාලය රියල් පෙන්වයි; පරිශීලක විසින් නිර්වචනය කරන ලද උපදෙස් සඳහා ක්‍රියාත්මක කිරීමේ වේලාව පරිශීලකයා පෙන්වන අතර පද්ධති ඇමතුම් ක්‍රියාත්මක කිරීම සඳහා Sys වේ.

තථ්‍ය කාලයට පොරොත්තු කාලයද ඇතුළත් වේ (I / O ආදිය සඳහා පොරොත්තු කාලය)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.