00:44 

Ищо про внутренности Линукса

ТёмныйЭльфНавостриэль2010
Из книжки про Операционные Системы Таненбаума и Боса, 4-е изд.
Ещё забыл сказать, шо это - где-то в памяти ядра хранится таблица открытых файлов, в которой записаны все открытые в данный момент файлы и позиция их внутреннего указателя. Процесс-родитель видит, какие файлы открыты дочерним процессом, а вот наоборот видит ли дочерний процесс родительские файлы - не знаю. Возможно, тоже видит. Ваще - открытые до того, как он родился - стопудово видит - их дескрипторы копируются в его структуру, и щитаецца, что он их какбэ тоже открыл, а вот если родительский после рождения чо откроет, вот это хз.
Если родительский процесс пейсал что-то в стандартный вывод (например, перенаправленный в файл), потом вызвал дочерний, он тоже пишет в этот же вывод с места, где закончил родительский, т.к. при вызове fork он унаследовал дескрипторы открытых файлов, а в ядре хранилось смещение в этих файлах. Дочерний процесс выходит, а смещение остаётся там, где он закончил пейсать. Родительский опять пишет, потом вызывает второй дочерний и так далее. В файле их вывод не затрёт друг друга, а будет идти последовательно. Пиздец, да? Вот же ж придумали!
Это что ж получается? Если родительский процесс открыл файл, а потом назапускал до хера потоков, они все могут последовательно пейсать в общий файл? Получается так. А по-другому у них и не получится пейсать, да? Токо последовательно. Но ведь, чтобы пейсать, нужна эксклюзивная блокировка файла, не? Один ставит лок и может пейсать, другие в этот момент могут токо читать. Не, не нужна. Во, я забурился тут wm-help.net/lib/b/book/2075737573/331 Блокировку можно поставить на диапазон, причём, относительно текущей позиции смещения SEEK_CUR или относительно конца файла SEEK_END. Что такое SEEK_SET, даже они умалчивают - никто не хочет говорить всего, такой он сцуко Линукс, сплошная недосказанность. И есть поле l_len - сколько блокировать в байтах. Но если мы поставим SEEK_END, зададим длину, а потом начнём пейсать в конец, SEEK_END же будет сдвигацца? :gigi: или тут имеется ввиду SEEK_END, как он был на момент объявления блокировки? Типа, мы относительно него объявили и дальше файл начал расти. Надеюсь, что так.

Можно накладывать блокировки на конкретный диапазон байтов файла. Блокировка может быть с монополизацией (exclusive locks) - видимо, чтение-запись и блокировка без монополизации (shared locks), только чтение.
Пиздец, как я заебался читать, а просветление всё не наступает.

Про Андроид. Андроид это ядро Линукс с несколькими расширениями. Например, блокировка сна. Все процессы Андроида дрочат на блокировку сна, передают эстафету друг другу - если один её убирает, дабы передать управление другому процессу, другой тут же выставляет, иначе устройство заснёт и пиздец.
Контроль памяти. Т.к. раздела подкачки там нет, Андроид гораздо жоще контролирует память, и если её остаётся мало, бежалосно килит приложения. У каждого процесса есть параметр oom_adj, в котором указаны его запросы к памяти, и Андроид килит сначала самые жирные процессы, потом помельче.
Приложения написаны на Яве, некоторые вставки есть на С++. Через это нужна среда выполнения Ява. Там она называется Dalvik и её байт-код отличается от обычного большей компактностью. Типа, обычная Ява это стек-ориентированная машина, а Dalvik регистроориентированная. Сначала приложение пишецца на обычной Яве, компилится в байт-код, а потом этот байт-код перекомпиливается в байт-код Dalvik. Каждое приложение запускается в своём собственном процессе Линукс со своей собственной средой выполнения Dalvik. Чтобы это происходило быстро, в системе выполняется демон zygote - копия пустой среды Dalvik. Когда надо запустить приложение, zygote форкается, и в его копию загружается приложение.
Межпроцессных каналов в стандартном понимании в Андроиде нет, вместо них используется RPC релизованное в виде модуля ядра Binder.
В ядре для каждого процесса имеется область памяти, которую видит и ядро и процесс - для обмена информацией с другими процессами. Ядро само создаёт в этих областях ссылки на объекты других процессов и предоставляет процессу дескрипторы этих объектов.
Про приложения Андроид - это ваще откровение. Приложение там упаковано в контейнер со всем необходимым. И оно имеет не одну точку входа, а несколько. И фрагменты приложения стандартизированы, а их тырфейс описан на AIDL - Android Interface Definition Language. Фрагменты приложения могут быть нескольких типов и действуют независимо друг от друга. Точнее, они действуют не то, чтобы сами - их вызывает система. Типы следующие:
Активность - это собсно приложение, Активностей может быть несколько - например, главное окно, это одна, а окно чата - другая, и они независимы друг от друга. Глупый юзер думает, что находится в одной программе, а если я всё правильно понял, переход из чатика в окно контактов вотсапа - это переход из одной программы в другую, но в рамках одного контейнера приложения.
Служба - это то, что висит в фоне и отслеживает сообщения. То есть, согласно этой концепции - ярлык вотсапа на экране, это служба, а главное окно вотсапа - это Активность.
Получатель - это такой одноразовый триггер, которая ждёт определённого события. Когда событие случается, получатель то ли сообщает, то ли запускает чо-то и удаляется.
Поставщик Контента - тут, как я понял, публикуются ссылки на объекты приложения, по которым другие приложения могут открыть в своём окне фрагмент текущего приложения. Или необязательно окне, вот, например, когда в вотсап надо послать снимок, видимо, вотсап обращается к поставщику контента камеры или Галереи и открывает внутри себя окно этой Галереи.
Намерение. Бывают явные и неявные. Это не фрагмент программы, а список того, что одно приложение собирается пытацца делать с помощью других приложений. Звучит сложно. В общем, ты ставишь приложение, и оно сообщает системе "Я буду посылать, я буду делицца, я буду фоткать - соотвецтвенно мне нужны приложения, которые могут это делать" Явные намерения это прям конкретно сцылка на объекты другого приложения. Это приложение должно уже быть, а если его нет, наверное система должна об этом сказать или предложить установить, хз. Неявное интереснее - это название действия. Другие приложения (в Активностях) сообщают системе, что они могут делать. Например, посылать у нас может вотсап, вайбер, делицца они же + Инстаграмм и всякие соцсети. Когда приложение выражает неявное намерение что-то сделать, система с помощью компонента ResolverActivity запрашивает все имеющиеся приложения - кто из вас может это сделать? Если никто, клиент посылается нахуй, если одно, то его окно открывается на экране, если несколько, появляется диалог выбора и решить должен юзер.
Короче, меня тут поразило то шо глупый юзер думает, что работает в рамках одной программы и она каким-то чудесным образом знает, какие у него установлены приложения и какие из них могут выполнить именно то, что нужно. На самом деле программы сменяют друг друга - одно приложение - система - другое приложение.
Ещё оказывается, проги ставятся с разным uid, чтобы не лазили друг к другу. Две копии одной проги тоже будут иметь разные uid.
Андроид имеет процесс system_server, внутри которого может сохранять состояния других процессов. Потом он может килить эти процессы в случае нехватки памяти, а когда нехватка прошла, восстанавливать покиленные процессы с помощью сохранённого состояния процесса.

@темы: Linux

URL
Комментарии
2018-07-04 в 10:18 

Rumthes
Pourquoi бы не pas?
Ппц. На половине уже мозг пытаеццо съебаццо в панике. Пыщ-пыщ, враг отакуе! :alles:
Надо в себя прийти и продолжить :kaktus: осмыслять это вот всё)

2018-07-04 в 10:54 

ТёмныйЭльфНавостриэль2010
Ну да, есть такое, но мозг он штука ленивая, если его не напрягать, заплывает жыром. Поэтому вот читать - бесполезно, забывается большая часть, а вот читать и пытацца осмыслить - прикольно. Я ж поэтому и пешу, чтобы проверить, что я из этого понял. Но мож это я так пишу?

Можешь попробовать почитать книжку, 10ю главу - это около ста страниц - читаецца в общем легко, мы ж уже знаем предмет, но когда начинаешь задумывацца и задавать вопросы, выясняицца, что на ста страницах достаточно подробно всё осветить не получицца.

URL
2018-07-04 в 11:03 

Rumthes
Pourquoi бы не pas?
Если не вникать - то и смысла нет. Так во всём. Не люблю поверхности, вредная привычка.

2018-07-04 в 12:59 

ТёмныйЭльфНавостриэль2010
Ммм, с одной стороны да. С другой - ты просто не успеешь вникнуть во все эти миллиарды байтов - эти красноглазые *** их всё равно переписывают каждый месяц. Мы даже не знаем - так ли оно щас, как написано или уже что-то поменялось.

Ну и в плане Андроида - так, обзорно, шо мол и так можно, оказывается. МЫ ж ведь не собираемся в ближайшем будущем пейсать под него ПО? Для написания ПО вышеприведённых знаний явно недостаточно.

URL
2018-07-04 в 14:57 

Rumthes
Pourquoi бы не pas?
ТёмныйЭльфНавостриэль2010, это скорее для лучшего понимания структуры и принципа работы. Ведь это можно заюзать в своих интересах, только придумать как)

     

Днивник Тёмнава Эльфа 80лвл

главная