QoS is an umbrella term which covers the use of features such as policing, shaping, traffic classification, and advanced queuing mechanisms.
CoS is a form of QoS limited to layer-2 Ethernet and it uses 3-bits (8 values) of the 802.1Q tag to differentiate your traffic. Therefore no trunking, no CoS.
DSCP is the most commonly acted upon value at layer-3 and it is found in 6-bits (64 values) of the IP header. Typically only 14 of the values are used and are referred to using the notations of best effort, expedited forwarding (EF), and assured forwarding (AF). AF values are in the form AFxy, where x is 1-4 and refers to the precedence and y is 1-3 and refers to the drop probability.
Telco vendors (such as AT&T specifically) use the term CoS to define the bandwidth allocation classes that they support in their MPLS offerings. Basically they turned CoS into a marketing term. Typically a Telco uses DSCP to know which of their CoS classes your traffic is supposed to be a part of.
Another important point for configuring these features is that in a Cisco switch or router you
need to use a command such as 'mls qos trust dscp' or 'mls qos trust cos' or else the device will reset the QoS marking to zero. There are some exceptions based on model, configuration, and IOS version but this has been true for everything within the last few years in my experience. This configuration is required because the device needs to know which marking you want it to act upon since it cannot use both. I like using DSCP. I haven't found a solid reason to use CoS over it but I'm sure someone has one.