- Курс - Операционные системы (там код и скрины заданий)
- Лабораторная работа 2
- Открываем нужный курс.
- Открываем задание, которое нужно выполнить.
- Листаем до комментариев и там есть все ответы.
- Профит, ты закрыл весь курс за час.
P.S.: У курса не антиплагиата т.к. он не является авторским от наших преподавателей.
Рубеж 1
Изучите приведенный код. Запишите результат вычисления выражения *ptrAdd:
#include <stdio.h>
#define SIZE 15
int main() {
int vec[SIZE];
for (int i = 0; i < SIZE; i++) {
vec[i] = i;
}
int* ptrAdd = vec + 0x7 + 6;
int* ptrSub = ptrAdd - 2;
int cmp = ptrSub < vec;
}
Ответ: 13
Для приведенного выше кода запишите результат вычисления выражения: *ptrSub.
Ответ: 11
Для приведенного выше кода запишите значение переменной cmp.
Ответ: 0
Реализуйте функцию, выделяющую память под вектор указанного размера и возвращающую типизированный указатель на его начало.
Тип элементов вектора int.
Требуется инициализировать вектор нулями.
Ответ:
int* calloc_foo(size_t size) {
return (int*) calloc(size, sizeof(int));
}
Объявите указатель на функцию, принимающую в качестве параметров три значения int и возвращающую значение целого типа.
Ответ:
int (*fptr)(int,int,int);
Рубеж 2
Расшифруйте аббревиатуру POSIX.
Ответ: Portable Operating System Interface
Безопасно ли писать и читать 64-х битную переменную из нескольких потоков на 32-х битной архитектуре?
Ответ: Нет, не безопасно.
Пояснение: Пример из лекции про техническую гонку данных. Один поток записывает -1, а другой поток читает значения и может получить 0,-1,2^32-1. Но 2^32-1 это не то что мы ожидаем.
Название ассемблерной инструкции для перехода в режим ядра ОС.
Ответ: int
Пояснение: ссылка
Метод isInterrupted в Java сбрасывает флаг?
Ответ: Нет.
Пояснение: Метод isInterrupted только возвращает результат флага, а interrupted еще и сбрасывает значение флага
Название структуры для описания POSIX потока в USER Space:
posix_thread
std::thread
pthread_t
pthread
Ответ: pthread_t
Какие конструкции на Java являются interrupted points?
Thread.sleep(1000);
Thread.sleep(4000);
System.out.println("System software");
int a = 5;
Ответ: 1, 2, 3.
Пояснение: interrupted points это функции из которых может вылететь InterruptedException. Примерами таких функций являются: sleep, ввод/вывод, блокирующие операции. Операция присваивания даже не являетcя функцией/методом.
Пусть функция thread вызывается в двух потоках.
Напишите сумму всех значений которые могут получиться в переменной a
в результате выполнения программы.
int32_t a = 0;
void* thread(void*) {
a++;
}
Ответ: 3
Пояснение: если потоки одновременно инкриминируют переменную, то можем получить 1. Если по очереди, то 2. Сумма равна 3.
Что делает функция pthread_cleanup_pop
?
- Достает только одну функцию обработчик и НЕ исполняет ее
- Достает N функций обработчиков и НЕ исполняет их (N задается как аргумент функции)
- Достает N функций обработчиков и исполняет их (N задается как агрумент функции)
- Достает только одну функцию обработчик и исполняет е
Ответ: ?? формулировка не точная была ??
Пояснение: Вообще зависит от параметра execute который передается в функцию pthread_cleanup_pop. Если true, то будет выполнено иначе просто удаляется из стека.
Какие ошибки многопоточного программирования присутствуют в алгоритме LockTwo с массивом flag без victim?
- deadlock
- use after free
- проблема ABA
- data race
- livelock
- Обращение к не валидной памяти
- memory leak
Ответ: 1, 5.
Пояснение: deadlock и livelock, livelock является частным случаем deadlock на котором происходит активное ожидание.
Выведите сумму уникальных значений value которые могут появиться в результате выполнения функции thread в двух разных потоках.
int32_t value = 0;
void* thread(void*) {
for (size_t i = 0; i < 5; i++) {
value++;
}
}
Ответ: 54
Пояснение: От 2 до 10. Сумма уникальных значений 2+3+..+10=55-1=54. Как может получиться 2 предлагаю подумать самостоятельно
Рубеж 3
Что означает запись #!/bin/perl
в первой строке командного файла?
Ответ: означает, что данный файл является Perl-скпритом.
Допустимо ли имя переменной $var_1
?
Ответ: Да.
Опишите результат выполнения: var=$_bob
.
Ответ: переменной var присваивается значение переменной _bob.
Объясните смысл выполнения команды: typeset -r r; r=1
.
Ответ: Результат - ничего. Командная оболочка просто пропустит это, так как это ошибка. Значение переменной присвоилось в никуда: r: readonly variable
.
Что означает запись вида? !(tom|cat|tomcat)
Ответ: любое кроме одного из указанных (tom|cat|tomcat).
Чему равна переменная $?
?
s='t??'; if[[$s= +(tom|cat|tomcat)]]
print $?; fi
Ответ: 0
Чему равна переменная $?
?
a=5; m=N
if (((a>=8)) || (((a>=6)) && [[ $m=[Yy]* ]]))
print $?; fi; print $?
Ответ: 0
Напишите команду, открывающую выходной поток номера 8 для файла fname.
Ответ: 8>fname
Опишите действие команды: set +o noglob
.
Ответ: включить режим интерпретации мета-символов
Напишите результат выполнения последовательности команд:
a="tom cat";
print "${a% *}"
Ответ: tom
Рубеж 4
Напишите регулярное выражение, которое соответствует номеру телефона в России.
Считаем, что это ограничение на код: +7
Номер телефона может содержать (опционально) символы '-', '(', ')' и пробелы.
Ответ: ^(\+7)?[\s\-]?\(?[0-9]{3}\)?[\s\-]?[0-9]{3}[\s\-]?[0-9]{2}[\s\-]?[0-9]{2}$
Напишите регулярное выражение, соответствующее адресу IPv4.
Оно должно учитывать ограничение на диапазон значений от 0 до 255 для каждого байта.
Ответ: ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}
Напишите регулярное выражение, которое соответствует URL.
Включая схему HTTP, HTTPS, поддомены (опционально), домен, номер порта (опционально) путь к ресурсу (тоже опционально).
Ответ: ^(?:https?:\/\/)?(?:[\w]+\.){0,20}(?:\.?[\w]{2,})?(:[0-9]{0,5})?(\/\w+){0,100}$
Напишите регулярное выражение, соответствующее дате в формате dd.mm.yyyy или dd.mm.yy, где dd - день, mm - месяц, yyyy - год или его две последние цифры.
Ответ: ^(3[01]|[12][0-9]|0?[1-9])\.(1[012]|0?[1-9])\.([0-9]{2}|[0-9]{4})$
Напишите регулярное выражение, которое соответствует в точности словам net и web в тексте, повторяющимся друг за другом дважды.
Ответ: (net[\s]*web).*?(net[\s]*web)
Экзамен
Что выведет данный скрипт в зависимости от входных данных?
Выберите несколько вариантов.
value=$1
if [ $value -eq 100 ]
then
echo "значение = 100"
elif [ $value -gt 100 ]
then
echo "значение больше 100"
else
case $value in
[1-3]*) echo "значение между 1 и 39 (включительно)" ;;
[4-5]*) echo "значение между 40 и 59 (включительно)" ;;
9[1-8]*) echo "значение между 91 и 98 (включительно)" ;;
99) echo "значение = $value" ;;
*) echo "значение неизвестно" ;;
esac
fi
- Если первый аргумент скрипта - 35, будет выведено 'значение неизвестно'.
- Если первый аргумент скрипта - 90, будет выведено 'значение неизвестно'.
- Если первый аргумент скрипта - 91, будет выведено 'значение между 91 и 98 (включительно)'.
- Если первый аргумент скрипта - 99, будет выведено 'значение = $value'.
- Если первый аргумент скрипта - 100, будет выведено 'значение = 100'.
Ответ: 2, 3, 4, 5.
Какая команда позволяет подсчитать количество строк, слов или символов в файле?
countw
wcount
wc
count p
Ответ: 3.
Какая команда позволяет добавить нового пользователя в систему?
useradd
adduser
linuxconf
- Все варианты ответа
- Ни один из вариантов
Ответ: 4.
Какая из перечисленных команд не является фильтром?
sort
wc
grep
cat
- ни одна из перечисленных
Ответ: 4.
Какая из команд в vi позволит удалить три слова?
3$d
3 dw
3 x
3 dd
- Ни одна из перечисленных
Ответ: 2.
Каково отношение времени выполнения двух одинаковых независимых функций в одном потоке к времени выполнению каждой функции в своем потоке на одноядерном процессоре? (считаем накладные расходы на многопоточность нулевыми, ответ - число)
Ответ: Невозможно физически выполнять программу быстрее на одном ядре в двух потоках чем в одном потоке на одном ядре.
Позволят ли пользовательские потоки получить физическое ускорение, если они выполняются на одном потоке ядра?
- Да
- Нет
Ответ: 2.
Пояснение: Единицей планирования является поток ядра операционной системы, поэтому он не сможет на двух и более ядрах процессора выполняться одновременно.
Какая функция используется для ожидания завершения работы потока?
phread_wait
phtread_join
phtread_complete
phtread_kill
phtread_create
Ответ: 2.
Зачем нужны рекурсивные примитивы синхронизации?
- позволяют захватывать примитив синхронизации в одном потоке несколько раз
- без них невозможно реализовать потокобезопасные рекурсивные функции
- можно всегда обойтись без рекурсивных примитивов
- рекурсивные примитивы быстрее нерекурсивных
Ответ: 1, 3.
Пояснение: Рекурсивные мьютексы можно несколько раз захватывать в одном потоке. Но при этом без них можно всегда обойтись, если разделить код на две части (потокобезопасный, не потокобезопасный).
Когда полезно использовать spin_mutex
?
- всегда
- при выделении памяти в куче
- для синхронизации системных вызовов
- для критических секций с быстрым вычислениями
Ответ: 4.
Пояснение: Под spin_mutex тяжелые вычисления будут пагубно влиять на производительность. В итоге ядра процессора будут заняты ожиданием освобождения ресурсов вместо того, чтобы выполнять полезную работу. Системные вызовы являются тяжелыми операциями.