A hobby servo motor has three wires: power, ground, and signal. You can move it by sending a specific waveform on the signal line. The convention is bizarre and beautiful: a 1.0–2.0 millisecond pulse, repeated every 20 milliseconds, where the pulse width (not the duty cycle, not the frequency) is what the servo measures.
Why this specific encoding
The format predates microcontrollers. Model-aircraft radio control systems in the 1970s used a sequence of pulses, one per control channel, transmitted at 50 Hz. Each pulse's width encoded the position of one stick. Servos were designed to read this format directly. When microcontrollers arrived, we kept the protocol because the servos were already there.
The encoding: 1.0 ms = fully one way (0°), 1.5 ms = center (90°), 2.0 ms = fully the other way (180°). Some servos accept slightly wider ranges (0.8–2.2 ms). The Arduino Servo library handles the timing for you: myServo.write(angle) generates the right pulse width and repeats it forever in the background using a hardware timer.
The Servo library is a tiny scheduler
Behind the scenes, the library uses Timer1 (or similar) on the AVR to generate the pulses without blocking the CPU. Up to twelve servos can be driven simultaneously from one Arduino — the library multiplexes them onto the same timer. This is why you can't easily use analogWrite on pins 9 and 10 once you've called Servo.attach: the timer is busy.