Data dependency cannot be captured by a precedence graph. In many real-time systems jobs communicate via shared data hence data of one job is dependent with other and called as data dependency. Often the designer chooses not to synchronize producer and consumer jobs such that consumer requires the data at any time instead the producer places the data in a shared address space.
In this case the precedence graph will show the producer and consumer jobs as independent since they are apparently not constrained to run in turn.
In a task graph, data dependencies are represented explicitly by data dependency edges among jobs. There is a data dependency edge from the vertex Ji to vertex Jk in the task graph if the job Jk
consumes data generated by Ji or the job Ji sends messages to Jk . A parameter of an edge from Ji
to Jk is the volume of data from Ji to Jk.
In multiple processor systems the volume of data to be transferred can be used to make decisions about scheduling of jobs on processors.
Sometimes the scheduler may not be able to schedule data dependent jobs independently. To ensure data integrity some locking mechanism must be used to ensure that only one job can access the shared data at a time. This leads to resource contention, which may also constrain the way jobs execute. However this constraint is imposed by scheduling and resource control algorithms. It is not a precedence constraint because it is not an intrinsic constraint on the execution order of jobs.