Membership signup when already a member
This is hard to answer without more details, such as your CiviCRM version and CMS type.

If your CMS supports it - I think the easiest way to handle this is to create a separate membership page for renewals, and create a membership status for folks within three months of renewal.  Control access to that page with CiviMember Role Sync (for Drupal) or CiviCRM WP Member Sync (WordPress).

If none of that's an option, and you feel comfortable writing code (or know someone who can do it for you), you can use hook_civicrm_validateForm() to have the membership fail validation when membership end date falls outside of a given range.

Of course, the simplest answer - explanatory text telling people not to renew if it's not their time - shouldn't be overlooked.