Для начала Вам надо освоить понятие "адресное пространство" - чем оно отличается от "памяти". Узнать, чем "адресное пространство компьютера" отличается от "адресное пространство процесса" (в частности - у каждого процесса есть собственное адресное пространство).
Дальше хорошо бы узнать сегментную систему адресации процессоров *86 - значительная часть терминологии идёт оттуда, хотя реально после появления 32-битной адресации на процессоре i386 сегменты практически не задействуются.
Ну и надо иметь понятие о программировании на ассемблере.
В первом приближении запуск процесса выглядит так:
- Ядро создаёт структуры данных для процесса. В т.ч. - распределение адресного пространства.
- Ядро смотрит в файл программы и выделяет место под программный код программы (тут я рассуждаю в контексте "процесс есть исполняющаяся программа"). Это место (и/или помещённый туда код) входит в "сегмент кода". Если одну программу запустили несколько раз - её сегмент кода попадает в несколько процессов.
- Ядро смотрит список разделяемых библиотек, прописанный в файле программы. Если эти библиотеки не загружены ранее запущенными процессами - под эти библиотеки тоже выделяется адресное пространство; и это адресное пространство тоже входит в сегмент кода. Но надо понимать, что адресное пространство каждой библиотеки попадает во все процессы, которые используют эту библиотеку. В идеале - библиотека во всех процессах должна находиться на одном и том же адресе адресного пространства; но иногда это не так.
- По ходу дела в процессе работы программа может подгружать новые библиотеки. Их адресное пространство тоже попадёт в сегмент кода.
- Как правило, код программы и код каждой библиотеки - непрерывный. Но между ними - бывают разрывы.
- Для работы нужно выделить адресное пространство под стек. В идеале - одно д.б. непрерывным. Но иногда - приходится извращаться и делать его разрывным. Это = сегмент стека. Активно используется при вызове подпрограмм/процедур/функций - через стек передают аргументы, на стеке располагают локальные данные подпрограмм/etc. Особенно активно стек используется при рекурсии; тогда как в древних языках с запретом рекурсии нередко обходились статическим размещением аргументов и локальных переменных.
- Для данных, размещаемых в областях, резервируеммых функцией malloc() - используется куча. Ей разрешается быть не непрерывной, т.е. состоять из разорванных кусков.
Фраза "поток берет информацию на выполнение" говорит о том, что Вы читали плохие книги (извините за прямоту).
Инструкции программного кода - берёт процессор (или ядро - если процессор многоядерный), т.е. железка. Ядро операционки лишь подготавливает инструкции программного кода для того, чтобы процессор мог их брать. Ядро делает это один раз при старте процесса; ну и вносит поправки при свопинге/пейджинге. А процессор исполняет каждую инструкцию кода; ну, чтобы Вы лучше поняли: каждое сложение или иная арифметическая операция, каждая пересылка данных - является инструкцией.
Кстати, всё, что делает ядро операционки - записано аналогичными инструкциями кода. Но ядру дополнительно позволены особые инструкции.
Мне кажется, Вам рано разбирать понятие "поток". Сначала надо понять, как работает система, в которой не реализованы потоки - т.е. любой процесс является однопоточным. И потом уже - разбираться с потоками.