diff --git a/infolabs/procmemorylearning/code.c b/infolabs/procmemorylearning/code.c new file mode 100644 index 0000000..7fd9d34 --- /dev/null +++ b/infolabs/procmemorylearning/code.c @@ -0,0 +1,139 @@ +#include +#include + +int scan(void); +unsigned long func(int n); +void output(unsigned long sum); +void encr(unsigned long sum, char *cpum); +int cpumodel(char cpum[]); + + +int main() { + int n; + unsigned long isum; + char cpum[64]; + + cpumodel(cpum); + + printf("Buff: "); + if (getchar() == '1') { + setbuf(stdin, NULL); + printf("buff is off\n"); + } else { + printf("buff is on\n"); + } + while(getchar()!='\n'); + + n = scan(); + if(n == 0) return 0; + isum = func(n); + + output(isum); + encr(isum,cpum); + return 0; +} + +int scan(void){ + int x, n; + n = 0; + + printf("Enter num: 1-100 000\nNum: "); + + while(((x = getchar())!='\n') && x != EOF){ + if((x >= '0') && (x <= '9')){ + n = (n*10) + (x-'0'); + } + + else{ + if(x == '\n'); + else(printf("Err \"%c\" is not a num.\n",x)); + while((x = getchar())!='\n') + if(x == EOF) return 0; + printf("Num: "); + n = 0; + continue; + } + + if(n > 100000){ + while((x = getchar())!='\n') + if(x == EOF) return 0; + n = 0; + printf("You enter n>100 000 Try again\nNum: "); + continue; + } + + } + if (x == EOF) return 0; + return(n); +} + + +unsigned long func(int n){ + int i; + unsigned long sum = 0; + unsigned char mem[65536]; + char data[256 * 1024]; + + for(i = 1; i <= n; i++){ + sum += i; + mem[i%65536] = (unsigned char)(i % 256); + data[i%(256*1024)] = (unsigned char)((sum + i) % 256U); + } + return sum; +} + + +void output(unsigned long sum){ + int i = 0; + char buf[20]; + + printf("\nresult: "); + while(sum > 0){ + buf[i++] = (char)('0' + (sum % 10)); + sum /= 10; + } + while (i-- > 0) + putchar(buf[i]); + putchar('\n'); +} + + +int cpumodel(char cpum[]) { + int c, i = 0; + printf("\nEnter proc name: "); + while ((c = getchar()) != '\n' && c != EOF && i < 64 - 1) { + cpum[i++] = (char)c; + } + cpum[i] = '\0'; + return i; +} + + +void encr(unsigned long sum, char *cpum) { + char buf[20]; + int i = 0; + int cpu_len = strlen(cpum); + + if (cpu_len == 0) { + printf("CPU model is empty!\n"); + return; + } + + if (sum == 0) { + buf[i++] = '0'; + } else { + while (sum > 0) { + buf[i++] = '0' + (sum % 10); + sum /= 10; + } + } + + printf("enc result: "); + for (int j = i - 1; j >= 0; j--) { + int digit = buf[j] - '0'; + char cpu_char = cpum[(i - 1 - j) % cpu_len]; + int enc = (digit + (int)cpu_char) % 10; + putchar('0' + enc); + } + putchar('\n'); +} diff --git a/infolabs/procmemorylearning/homecpu.txt b/infolabs/procmemorylearning/homecpu.txt new file mode 100644 index 0000000..8c1fa6d --- /dev/null +++ b/infolabs/procmemorylearning/homecpu.txt @@ -0,0 +1 @@ +AMD Ryzen 5 5600X 6-Core Processor diff --git a/infolabs/procmemorylearning/questions.md b/infolabs/procmemorylearning/questions.md new file mode 100644 index 0000000..6be8824 --- /dev/null +++ b/infolabs/procmemorylearning/questions.md @@ -0,0 +1,24 @@ +model name : AMD Ryzen 5 5600X 6-Core Processor +cache size : 512 KB +cpu cores : 6 + +MemTotal: 16293648 kB + +Caches (sum of all): + L1d: 192 KiB (6 instances) + L1i: 192 KiB (6 instances) + L2: 3 MiB (6 instances) + L3: 32 MiB (1 instance) + +Кэш‑память расположена близко к ядрам процессора (обычно в том же кристалле), поэтому доступ к ней происходит за несколько тактов процессора, тогда как доступ к оперативной памяти требует десятки‑сот тактов из‑за физической дистанции, шины и контроллера памяти. + +Параметр Кэш L1/L2/L3 Оперативная RAM +Время доступа 1–5 такт(ов) 50–150 такт(ов) +Емкость десятки‑сот КБ несколько ГБ +Стоимость (энергия/площадь) Высокая Низкая + +Ryzen 5 5600X +Тактовая частота ядра: ~4.6 ГГц → один такт ≈ 0.22 нс. +Время доступа к L1: ~4 такт ≈ 0.9 нс. +Время доступа к DDR4‑3200 RAM: ~70 такт ≈ 15 нс. +Если 95 % инструкций и данных находятся в кэше, среднее время доступа будет близко к 1 нс, а не к 15 нс, что делает процессор эффективным несмотря на медленную RAM. diff --git a/infolabs/procmemorylearning/run.sh b/infolabs/procmemorylearning/run.sh new file mode 100755 index 0000000..b3a88c5 --- /dev/null +++ b/infolabs/procmemorylearning/run.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +HOMECPU="homecpu.txt" +CURRENTCPU=$(grep -m1 'model name' /proc/cpuinfo | awk -F':' '{print $2}' | sed -E 's/^[ \t]+//') + +# Извлекаем только модель (например, i7-9700K из полного названия) +EXTRACT_MODEL() { + echo "$1" | grep -oE '[iI]ntel|[aA]md|[iI][0-9]*-[0-9A-Z]*|[rR]yzen|[0-9A-Z]*-[0-9A-Z]*' | head -1 +} + +CURRENT_MODEL=$(EXTRACT_MODEL "$CURRENTCPU") + +gcc ./code.c -o ./run + +if [ ! -f "$HOMECPU" ]; then + echo "Домашняя модель CPU не найдена, используем текущую: $CURRENT_MODEL" + CPUMODEL="$CURRENT_MODEL" +else + HOMECPU_CONTENT=$(<"$HOMECPU") + HOME_MODEL=$(EXTRACT_MODEL "$HOMECPU_CONTENT") + echo "Домашняя модель CPU: $HOME_MODEL" + echo "Текущая модель CPU: $CURRENT_MODEL" + + if [ "$CURRENT_MODEL" = "$HOME_MODEL" ]; then + echo "Модели совпадают, используем текущую модель" + CPUMODEL="$CURRENT_MODEL" + else + echo "Модели не совпадают, используем домашнюю модель" + CPUMODEL="$HOME_MODEL" + fi +fi + +# Отправляем модель CPU и ввод для программы +( printf "%s\n1\n" "$CPUMODEL"; cat ) | ./run diff --git a/infolabs/procmemorylearning/Отчёт по информатике на тему Исследование иерархии памяти, работы процессора в ЭВМ на языке Си.pdf b/infolabs/procmemorylearning/Отчёт по информатике на тему Исследование иерархии памяти, работы процессора в ЭВМ на языке Си.pdf new file mode 100644 index 0000000..31d6871 Binary files /dev/null and b/infolabs/procmemorylearning/Отчёт по информатике на тему Исследование иерархии памяти, работы процессора в ЭВМ на языке Си.pdf differ