I. Introduction
In recent years, the demand to run computationally intensive applications, such as facial recognition, object detection, speech processing, etc., on user equipment (UE) has been increasing steadily. However, due to their limited battery capacity and computation power, UEs cannot afford such applications [1]. Cloud computing provided a promising solution to this challenge, where computationally intensive tasks could be offloaded to centralized cloud servers through a mobile core network and the Internet [2]. For instance, in online cloud gaming, UEs could offload the entire game engine to a cloud server and only receive rendered frames via the Internet to be displayed on their equipment [3]. Overall, cloud computing brought many advantages for UEs, such as increased battery lifetime, unlimited storage space, and the ability to run computationally intensive tasks without owning up-to-date equipment [2]. Despite its considerable advantages, cloud computing suffers from some drawbacks, such as long latency to access a distant cloud server via the Internet. These drawbacks impede newly emerged applications with strict data rate, latency, and response time requirements from exploiting cloud computing [4]. For instance, autonomous vehicles need to process an enormous amount of data in a matter of milliseconds in order to detect routes and obstacles in a timely manner. Offloading this data to a distant cloud server would significantly increase the obstacle detection delay and, therefore, endanger the life of passengers [5]. Consequently, a new paradigm called edge computing was proposed to mitigate the challenges of cloud computing and facilitate strict quality of service (QoS) provisioning by deploying computation resources at the network edge and providing computation services to UEs in their proximity [6].