{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0d0851be",
   "metadata": {},
   "source": [
    "# Тест по блоку #"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "69cc4bb0",
   "metadata": {},
   "source": [
    "##### Вас зовут:\n",
    "___"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97a677e8",
   "metadata": {},
   "source": [
    "##### 1. Системный вызов fork\n",
    "\n",
    "- [ ] используется для получения pid родительского процесса\n",
    "- [ ] используется для вызова функций в отдельных потоках\n",
    "- [ ] создает точную копию родительского процесса\n",
    "- [ ] используется для создания дочернего процесса"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed5a5645",
   "metadata": {},
   "source": [
    "##### 2. Системный вызов fork\n",
    "\n",
    "- [ ] в дочернем процессе вызов fork возвращает 0\n",
    "- [ ] в родительском процессе вызов fork возвращает 0\n",
    "- [ ] в дочернем процессе вызов fork возвращает pid родительского процесса\n",
    "- [ ] в родительском процессе вызов fork возвращает pid дочернего"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed1ad7fd",
   "metadata": {},
   "source": [
    "##### 3. Что происходит с памятью в дочернем процессе при работе с Python?\n",
    "\n",
    "- [ ] Копируется из родительского процесса\n",
    "- [ ] Разделяется с родительским процессом"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "089d9f0a",
   "metadata": {},
   "source": [
    "##### 4. Файловые дескрипторы в дочернем процессе\n",
    "\n",
    "- [ ] будут недоступны, их нужно переоткрыть заново\n",
    "- [ ] будут скопированы и переоткрыты\n",
    "- [ ] будут скопированы\n",
    "- [ ] будут переоткрыты Python интерпретатором автоматически"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4795ad4",
   "metadata": {},
   "source": [
    "##### 5. Выделить истинные выражения:\n",
    "\n",
    "- [ ] блокировки нужно брать в одном порядке, освобождать в произвольном\n",
    "- [ ] предпочтительнее использовать контекстный менеджер для работы с блокировками в Python\n",
    "- [ ] блокировки нужно брать в одном порядке, освобождать в обратном\n",
    "- [ ] блокировки нужно брать в одном порядке, освобождать строго в том же порядке"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4136254c",
   "metadata": {},
   "source": [
    "##### 6. Очереди замедляют процесс работы потоков Python, лучше использовать объекты блокировки\n",
    "\n",
    "- [ ] Да\n",
    "- [ ] Нет"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "950359b9",
   "metadata": {},
   "source": [
    "##### 7. Выделить истинные выражения:\n",
    "\n",
    "- [ ] GIL замедляет выполнение главного потока управления в Python3, даже если нет других потоков\n",
    "- [ ] GIL никак не влияет на выполнение отдельных процессов на Python3\n",
    "- [ ] GIL нужен для защиты памяти интерпретатора от разрушений\n",
    "- [ ] GIL запрещает одновременное выполнение инструкций байткода в разных потоках"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dca2b7a0",
   "metadata": {},
   "source": [
    "##### 8. Если программа на Python выполняет много операций ввода вывода (IO-bound), то для ускорения ее работы нужно\n",
    "\n",
    "- [ ] разбить ее на отдельные функции, выполнить их в потоках\n",
    "- [ ] создать отдельные процессы"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "470c17f9",
   "metadata": {},
   "source": [
    "##### 9. Если программа на Python выполняет операции вычисления, требующие только CPU (CPU-bound), то для ускорения ее работы нужно\n",
    "\n",
    "- [ ] разбить ее на отдельные функции, выполнить их в потоках\n",
    "- [ ] создать отдельные процессы"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db80a6b9",
   "metadata": {},
   "source": [
    "##### 10. Генератор в Python – это\n",
    "\n",
    "- [ ] функция в которой присутствует инструкция `yield`\n",
    "- [ ] инструкция `yield`\n",
    "- [ ] специальный вызов `yield from`\n",
    "- [ ] объект типа `concurrent.futures.Future`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2dfd1a7f",
   "metadata": {},
   "source": [
    "##### 11. Отметить все истинные утверждения:\n",
    "\n",
    "- [ ] итератор хранит значение для генерации следующего элемента последовательности в `self`\n",
    "- [ ] генератор хранит значение для генерации следующего элемента последовательности в локальных переменных\n",
    "- [ ] исключение `StopIteration` используется для остановки работы итератора\n",
    "- [ ] итератор прерывает свое выполнение на каждой итерации, сохраняя состояние локальных переменных"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbce1351",
   "metadata": {},
   "source": [
    "##### 12. Отметить все истинные утверждения:\n",
    "\n",
    "- [ ] сопрограммы исполняются в отдельных потоках параллельно\n",
    "- [ ] исключения нельзя обрабатывать в сопрограммах, это нужно делать в основном потоке\n",
    "- [ ] сопрограмма может прерывать свою работу, сохраняя свое состояние и значения всех локальных переменных\n",
    "- [ ] из одной сопрограммы можно вызвать другую при помощи `yield from`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d0f7a809",
   "metadata": {},
   "source": [
    "##### 13. Отметить все истинные утверждения, касающиеся `asyncio event loop`:\n",
    "\n",
    "- [ ] позволяет выполнять функции и `callable` Python объекты\n",
    "- [ ] переключает контекст между Python-потоками\n",
    "- [ ] выполняет все корутины последовательно, переключая контекст между ними\n",
    "- [ ] выполняет несколько корутин параллельно в разных потоках\n",
    "- [ ] отвечает за выделение памяти в основном процессе\n",
    "- [ ] позволяет выполнять корутины, зарегистрированные в нем"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "19f24d7a",
   "metadata": {},
   "source": [
    "##### 14. Отметить все истинные утверждения:\n",
    "\n",
    "- [ ] блокирующий код в Python никак не повлияет на выполнение других корутин в `asyncio event loop`\n",
    "- [ ] объект типа `asyncio.Task` выполняется в отдельном потоке управления, никак не влияя на выполнения других объектов типа `asyncio.Task`\n",
    "- [ ] объект типа `asyncio.Task` хранит в себе связанную корутину и содержит статус ее выполнения\n",
    "- [ ] из объектов типа `asyncio.Future` можно создавать цепочки и дожидаться их выполнения в `asyncio event loop`"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
