Что из себя представляет сегмент код программы в процессе?
Для начала Вам надо освоить понятие "адресное пространство" - чем оно отличается от "памяти". Узнать, чем "адресное пространство компьютера" отличается от "адресное пространство процесса" (в частности - у каждого процесса есть собственное адресное пространство).

Дальше хорошо бы узнать сегментную систему адресации процессоров *86 - значительная часть терминологии идёт оттуда, хотя реально после появления 32-битной адресации на процессоре i386 сегменты практически не задействуются.

Ну и надо иметь понятие о программировании на ассемблере.

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


Фраза "поток берет информацию на выполнение" говорит о том, что Вы читали плохие книги (извините за прямоту).
Инструкции программного кода - берёт процессор (или ядро - если процессор многоядерный), т.е. железка. Ядро операционки лишь подготавливает инструкции программного кода для того, чтобы процессор мог их брать. Ядро делает это один раз при старте процесса; ну и вносит поправки при свопинге/пейджинге. А процессор исполняет каждую инструкцию кода; ну, чтобы Вы лучше поняли: каждое сложение или иная арифметическая операция, каждая пересылка данных - является инструкцией.
Кстати, всё, что делает ядро операционки - записано аналогичными инструкциями кода. Но ядру дополнительно позволены особые инструкции.

Мне кажется, Вам рано разбирать понятие "поток". Сначала надо понять, как работает система, в которой не реализованы потоки - т.е. любой процесс является однопоточным. И потом уже - разбираться с потоками.
В гугле легко можно найти статью про сегменты памяти