Let us assume we have a Batch JOB step which executes MAIN-PGM.
Let us assume job step has below call chain.
MAIN-PGM --> SUB-PGM1 --> SUB-PGM2 --> SUB-PGM3
That is MAIN-PGM calls SUB-PGM1
SUB-PGM1 program inturn calls SUB-PGM2
SUB-PGM2 program inturn calls SUB-PGM3
A run unit is a running set of one or more programs that communicate with each other by COBOL static or dynamic CALL statements. So, the above entire flow is called "run unit"
EXIT PROGRAM or GOBACK in sub programs(called programs) returns the control to the calling program.
For example, if we code EXIT PROGRAM or GOBACK in SUB-PGM3, then control returns to the point in the SUB-PGM2 immediately following the CALL statement that invoked SUB-PGM3
GOBACK in main program MAIN-PGM passes the control to the operating system program that invoked it.
EXIT PROGRAM in main program does NOT do anything, control goes to the next statement that immediately follows EXIT PROGRAM.
So, EXIT PROGRAM works only in sub programs (called programs).
If we code STOP RUN in SUB-PGM3 (or any other program in the calling chain), it will directly pass the control to the operating system program that invoked main program MAIN-PGM. That is STOP RUN ends the execution of entire "run unit".