13. Как компютрите (не) работят
20 април 2016
Въпрос 1
Какво са built-in функциите в Питон?
- Неща написани на C
- ... и вградени в интерпретатора (също е написан на C).
- ... или съществуващи във външни (native) библиотеки
Въпрос 2
Какво може да бъде модул в Питон?
- *.py файлове
- Директории с __init__.py в тях
- *.pyd/*.so, export-ващи функцията PyInit_*
Въпрос 3
Какво са .pyd файловете в Windows? Каква е разликата с DLL?
- Разширението е разлика
- Вътрешно форматът е същият
- Преименуването на подбони файлове е често срещано
- ... под Linux: *, *.so, *.axf, *.bin, *.elf, *.o, *.prx, *.puff,
- ... под Windows: *.dll, *.exe, *.ko, *.ocx, *.drv, *.sys, *.icl, *.fon
Въпрос 4
Какво са *.dll/*.so файловете?
- *.dll/*.so са динамични библиотеки
- Съкратено от Dynamic Link Library / Shared Object
- Съдържат машинен (native) код
- Съдържат import/export таблици
- Могат да съдържат и други неща
Въпрос 5
Какво са .h файловете?
- *.h са header файлове. Съдържат текст (код на C/C++/Objective C)
- Нужни са на програмиста, за да компилира програма, ползващата даден *.dll/*.so
- Не са нужни на потребител, за да пусне програма компилирана с тях
- Съдържат информация за типове и сигнатури на функции
- Съдържат и други неща
Въпрос 6
Какви проблеми решава Python/C API-то?
- Скорост
- Достъп до неща, недостъпни попринцип в Питон интерпретатора
- Преизползване на съществуващ C код в Python
Но аз не знам/разбирам/харесвам C?
- Тези проблеми съществуват независимо дали харесваме C
- Има алтернативи
Cyton
- Отделен език за програмиране
- Надмножество на Python (2 и 3)
- Има възможност да генерира ефективен C код
- Може лесно да вика както C, така и Питон код
Cyton (2)
- Не е част от стандартния Питон
- Няма да го разглеждаме в детайли
SWIG
- Simplified Wrapper and Interface Generator
- Работи върху C/C++ код
- Генерира Питон модул, който може да бъде import-нат
- В Питон виждаме функции и класове такива, каквито са в C/C++ кода
SWIG (2)
SWIG поддържа още много езици и средиPython, Ruby, Perl, PHP, Lua, GuileJava, .NET, D, Go... още много
SWIG (3)
Не е част от стандартния Питон
Няма да го разглеждаме в детайли
SWIG / Cython
- И двете в крайна сметка генерират *.pyd/*.so файлове
- ... които използват Python/C API-то
- Спестяват ни писането на C код, като го генерират вместо нас
Ctypes
Ctypes позволява да викаме C функции директно от Python без да ни се налага да пишем и капка C код.
- Това е може би най-лесният начин
Ctypes основни моменти
- предназначено за комуникация с чист C код -- lean&mean
- стреми се да бъде минимален и да не "пречи", съответно е от сравнително ниско ниво
- зареждане на динамични библиотеки (shared objects, dynamic link libraries a.k.a. DLL)
- викане на функции от тези библиотеки и даже достъпване на данни
- позволява да описваме интерфейса на функциите, които ще ползваме
- позволява дефиниране на потребителски структури и обединения
Забележка: Unix vs. Windows
- разликите са основно в начина на зареждане на библиотеките
- msvcrt.dll под Windows става на libc.so.6 (или libm.so.6) в Linux
Зареждане на библиотеки
>>> from ctypes import *
>>>
>>> libc = cdll.LoadLibrary('msvcrt.dll')
>>> libc
<CDLL 'msvcrt.dll', handle 7ffc69b80000 at 6ffffe18ed0>
>>>
Calling conventions
- cdll - cdecl
- windll - stdcall, oledll -- само за Windows
Извикване на функции
>>> libc.time(None)
1243423125
Good morning world
libc.printf(b'good morning world'
b', the time is %d\n', libc.time(None))
good morning world, the time is 1243423807
Операционни системи
Парчета код, които управляват хардуера
Позволяват изпълнението на потребителски програми
Има ги разни (Windows/Linux/OS X)
Kernel
Ядрото (duh) на операционната система
Има пряк достъп до всичко в компютъра ви
Грижи се за потребителските програми
Драйвъри
Парчета код в ядрото, които управляват конкретен хардуер
Могат да се слагат отделно от ОС-а
Userland
"GNU" частта от "GNU/Linux"
Полезните програмки, без които една ОС е безполезна
Текстови редактори, web browser-и, терминали, графични среди, etc
User space / Kernel space
Userland частта вървят в първото
Kernel-a върви във второто
Това е грубо казано, демек е омешано, но така е в общия случай
Няма общо с root (Linux)/Administrator (Windows)
Защо е това разделение?
Сигурност: между отделните процеси, както и между тях и ядрото
... а какво всъщност са процеси?
Това са потребителските програми
Всеки е разделен от всички останали
Всеки има свое виждане за паметта
... а какво всъщност е виртуална памет?
Паметта, до която имат достъп процесите
Те НЯМАТ достъп до истинските адреси във физическата памет
Всеки процес има собствена като те не се застъпват
Всеки процес има право да достъпи пълното адресно пространство
Виртуалната памет може да не е във физическата (swap file, memory mapped files, etc)
Как User space достъпва kernel space
През така наречените System Calls
Това са обикновени функции, които можем да викаме
Намират се в стандартната С блиотека, която върви с всяка ОС
Те вътрешно ще направят магията
Магията се нарича interrupt-и
... а какво всъщност са interrupt-и?
Начин да кажем на ядрото, че искаме нещо да се случи (sys call)
Както и начин на процесора да каже на ядрото, че нещо е станало (timer interrupt)
Как изглежда един процес във виртуалната памет?
Всеки процес, очевидно, има изпълним код
Stacks, heeps, read-only segments
Отделно има и mapped files, etc