mirror of https://github.com/t1meshift/os_labs.git
Compare commits
No commits in common. "1de33e91924527b7c1536ce053cb3e9e336016c5" and "37ef98b7c7ef83bd6a118193ead76f9980813d96" have entirely different histories.
1de33e9192
...
37ef98b7c7
|
@ -14,4 +14,3 @@ function(define_lab lab_name)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
define_lab(lab2)
|
define_lab(lab2)
|
||||||
define_lab(lab3)
|
|
|
@ -3,7 +3,6 @@
|
||||||
## Список
|
## Список
|
||||||
|
|
||||||
- [Лабораторная работа 2](lab2/README.md)
|
- [Лабораторная работа 2](lab2/README.md)
|
||||||
- [Лабораторная работа 3](lab3/README.md)
|
|
||||||
|
|
||||||
## Запуск
|
## Запуск
|
||||||
|
|
||||||
|
|
|
@ -35,5 +35,6 @@ int main() {
|
||||||
assert(x == 20);
|
assert(x == 20);
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
alarm(2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
29
lab3/.execme
29
lab3/.execme
|
@ -1,29 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
IFS=$'\n\t'
|
|
||||||
|
|
||||||
echo "Task 4,3"
|
|
||||||
|
|
||||||
mem_allocs=(1 16 128 512)
|
|
||||||
for i in "${mem_allocs[@]}" ; do
|
|
||||||
echo "Running with $i Mb allocation..."
|
|
||||||
"$1/lab3_memory-user.c_run" "$i" &
|
|
||||||
JOB_PID=$!
|
|
||||||
sleep 3
|
|
||||||
|
|
||||||
echo "pmap -X $JOB_PID command:"
|
|
||||||
pmap -X $JOB_PID
|
|
||||||
echo
|
|
||||||
|
|
||||||
echo "Before termination:"
|
|
||||||
echo "free -m command:"
|
|
||||||
free -m
|
|
||||||
echo
|
|
||||||
|
|
||||||
kill $JOB_PID
|
|
||||||
sleep 3
|
|
||||||
echo "After termination:"
|
|
||||||
free -m
|
|
||||||
echo "------------------"
|
|
||||||
done
|
|
|
@ -1,34 +0,0 @@
|
||||||
cmake_minimum_required(VERSION 3.16)
|
|
||||||
set(CMAKE_C_STANDARD 11)
|
|
||||||
|
|
||||||
# Lab name
|
|
||||||
set(LAB_NAME "lab3")
|
|
||||||
|
|
||||||
# Lab tasks
|
|
||||||
list(APPEND SOURCE_FILES
|
|
||||||
memory-user.c
|
|
||||||
)
|
|
||||||
list(APPEND NON_COMPILABLE_SRC
|
|
||||||
.execme
|
|
||||||
)
|
|
||||||
|
|
||||||
### Here goes the template
|
|
||||||
|
|
||||||
project("${LAB_NAME}" C)
|
|
||||||
|
|
||||||
add_custom_target("${LAB_NAME}")
|
|
||||||
|
|
||||||
foreach (file IN LISTS SOURCE_FILES)
|
|
||||||
add_executable("${LAB_NAME}_${file}_run" "${file}")
|
|
||||||
add_dependencies("${LAB_NAME}" "${LAB_NAME}_${file}_run")
|
|
||||||
endforeach ()
|
|
||||||
|
|
||||||
foreach (file IN LISTS NON_COMPILABLE_SRC)
|
|
||||||
add_custom_command(
|
|
||||||
TARGET "${LAB_NAME}" POST_BUILD
|
|
||||||
DEPENDS "${file}"
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/${file}"
|
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/${file}"
|
|
||||||
)
|
|
||||||
endforeach ()
|
|
|
@ -1,27 +0,0 @@
|
||||||
# Лабораторная работа №3
|
|
||||||
|
|
||||||
Были рассмотрены аллокации памяти размером 1, 16, 128 и 512 Мб.
|
|
||||||
|
|
||||||
Для выполнения заданий 4 и 3 был использован скрипт для оболочки bash, запускаемый точно так же, как и остальные
|
|
||||||
лабораторные: `./run_lab.sh lab3` из директории со всеми работами.
|
|
||||||
|
|
||||||
Он запускает программу [memory-user.c](memory-user.c) из первого задания с заданным объёмом памяти на выделение.
|
|
||||||
Через 3 секунды запускается `pmap` для исследования распределения памяти, затем `free`. После этого исполняется
|
|
||||||
`kill`, memory-user завершает работу. Запускаются те же `pmap` и `free` для сравнения.
|
|
||||||
|
|
||||||
Задержка 3 секунды после вызова `kill` необходима для того, чтобы система успела освободить память. При выделении
|
|
||||||
2048 Мб память успевает высвобождаться лишь наполовину.
|
|
||||||
|
|
||||||
Ниже можно увидеть вывод скрипта для разных объёмов выделенной памяти:
|
|
||||||
|
|
||||||
**1 Mb:**
|
|
||||||
![1Mb](alloc_1mb.png)
|
|
||||||
|
|
||||||
**16 Mb:**
|
|
||||||
![16Mb](alloc_16mb.png)
|
|
||||||
|
|
||||||
**128 Mb:**
|
|
||||||
![128Mb](alloc_128mb.png)
|
|
||||||
|
|
||||||
**512 Mb:**
|
|
||||||
![512Mb](alloc_512mb.png)
|
|
Binary file not shown.
Before Width: | Height: | Size: 517 KiB |
Binary file not shown.
Before Width: | Height: | Size: 542 KiB |
Binary file not shown.
Before Width: | Height: | Size: 526 KiB |
Binary file not shown.
Before Width: | Height: | Size: 537 KiB |
|
@ -1,39 +0,0 @@
|
||||||
#include <assert.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
printf("Current PID: %d\n", getpid());
|
|
||||||
|
|
||||||
const unsigned long mb_size = 1 << 20; // NOLINT: pow(2, 20) won't even touch the significant bit
|
|
||||||
unsigned long alloc_size = 0;
|
|
||||||
|
|
||||||
if (argc > 1) {
|
|
||||||
alloc_size = atoi(argv[1]); // NOLINT: educational purpose only
|
|
||||||
} else {
|
|
||||||
scanf("%ld", &alloc_size); // NOLINT: educational purpose only
|
|
||||||
}
|
|
||||||
|
|
||||||
alloc_size *= mb_size;
|
|
||||||
|
|
||||||
int *array = malloc(alloc_size);
|
|
||||||
printf("Allocated %ldMb at %p\n", alloc_size / mb_size, array);
|
|
||||||
|
|
||||||
srand(alloc_size);
|
|
||||||
unsigned long arr_size = alloc_size / sizeof(*array);
|
|
||||||
|
|
||||||
#pragma clang diagnostic push
|
|
||||||
#pragma ide diagnostic ignored "EndlessLoop"
|
|
||||||
// Intentional endless loop
|
|
||||||
while (1) {
|
|
||||||
for (int i = 0; i < arr_size; ++i) {
|
|
||||||
array[i] = rand(); // NOLINT: randomness of rand() is unimportant in this case
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -5,21 +5,6 @@ IFS=$'\n\t'
|
||||||
|
|
||||||
echo -e "\nTesting script started...\n"
|
echo -e "\nTesting script started...\n"
|
||||||
|
|
||||||
if [ -f "$1/.execme" ]; then
|
|
||||||
echo "Found .execme file!"
|
|
||||||
if [ -x "$1/.execme" ]; then
|
|
||||||
echo "Executing..."
|
|
||||||
"$1/.execme" "$1"
|
|
||||||
exit $?
|
|
||||||
else
|
|
||||||
echo ".execme couldn't be executed!"
|
|
||||||
echo "Run chmod +x \"$1/.execme\" ."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Using default exec all policy..."
|
|
||||||
|
|
||||||
while IFS= read -r -d '' FILE
|
while IFS= read -r -d '' FILE
|
||||||
do
|
do
|
||||||
echo "Executing $FILE..."
|
echo "Executing $FILE..."
|
||||||
|
|
Loading…
Reference in New Issue