A skeleton is basically a higher order function modelling a complex computational schema. When dealing with parallel computation, a skeleton captures, organizes and mask to the user all the details involved in the parallel computation structure that are not relevant to the user code. As an example, a divide&conquer skeleton just needs the code for dividing, conquering and deciding termination in order to structure an actual divide&conquer application. The user must supply these codes as parameters to the skeleton, but he/she is not concerned with setting up a proper process network, handling communication, scheduling processes, avoid deadlock, etc.
Therefore, a skeleton based language or programming environment, provides the programmer with a set of skeletons he/she can use (possibily in a nested way) to give structure to his/her parallel applications.
In such systems, the "art" of programming is basically reduced to the ability to pick-up and compose the right set of skeletons for the application at hand.
Furthermore, due to the fact that very often different combinations (nestings) of skeletons exist that compute the same function, the programmer has the ability to transform his/her skeleton application in order to get better performances.
Common skeletons, used in the framework of skeleton based parallel programming are the following:
Have a look here for further reading on skeletons.