Segments are areas of memory defined by the programmer for different purposes like code, data, and stack. Segment descriptors define segments by determining their base address, size, type, privilege level, and other properties. These descriptors are grouped into descriptor tables like the Global Descriptor Table and Local Descriptor Table to manage memory segments.