It is suggested is to start with the implementation of an operator that users can execute from the UI.
The render operator (F12 key) is bpy.ops.render.render(). You can know it from the tool tip of the Render button. In the Python console of Blender, the bpy.ops.render.render.idname() method gives you the operator's internal identifier 'RENDER_OT_render'.
The 'RENDER_OT_render' operator is implemented in source/blender/editors/render/render_internal.c. To find it, you need a good string search tool that works efficiently on many files in the Blender code base. I've been using VS 2013 Express.
A bit of code reading and guesses will figure out the following series of function calls: RENDER_OT_render() >> screen_render_invoke() >> render_startjob(). The last function then calls either RE_BlenderAnim() or RE_BlenderFrame(), i.e., animation rendering or still image rendering API function (FYI, the RE_ prefix indicates the function is part of the render API. Similarly, BLI for blenlib, BKE for blenkernel, and ED for editors).
These render API functions are defined in source/blender/render/intern/source/pipeline.c. The control flow from one of the render API functions are rather straightforward, although a series of function calls can be quite deep. Basically individual functions in the source file address a set of render options. Just start following the control flow from RE_BlenderFrame(). Initially the control flow from there would look like a maze indeed, but it is my impression is that the render code is well organized and relatively easy to understand.
It is important to rely on a good code reading tool. Jumping to the definition/declaration of a function from a call of the function, as well as finding all occurrences of an identifier (function name, macro name, etc.) are essential operations that the code reading tool should provide you (VS 2013 Express is a good option in this sense).