程式的兩種執行方式:
1、CPU直接執行CPU自身能理解的機器指令;
2、CPU執行虛擬機器程式碼,虛擬機器內部執行位元組碼;
一般來說,第二種情形的執行效率肯定是小於第一種!
為什麼要使用JIT技術?
為了使CPU密集的程式在虛擬機器中執行的更快!
JIT最基本的實現原理是什麼?
首先將位元組碼翻譯成CPU可直接理解執行的機器指令,在記憶體中分配空間儲存翻譯後的指令,設定指令指標指向程式碼地址。
下面結合兩個檔案(function.c,jit.c)來說明:
看,我們做到了!
如果不呼叫mmap,透過下面的方式是否可以直接執行程式碼呢?
答案是:不可以!如果你編譯後執行會報錯:Segmentation fault (core dumped)
因為mmap呼叫後,程序虛擬地址空間會多出一段區域,這段區域是可讀、可寫、可執行的,所以程式碼在這段記憶體空間是可執行的!
但執行失敗的程式碼的問題是,你準備執行的指令是儲存在資料段空間的,資料段空間的許可權是:可讀、可寫,但是不可執行!所以這是報錯的原因。
程式的兩種執行方式:
1、CPU直接執行CPU自身能理解的機器指令;
2、CPU執行虛擬機器程式碼,虛擬機器內部執行位元組碼;
一般來說,第二種情形的執行效率肯定是小於第一種!
為什麼要使用JIT技術?
為了使CPU密集的程式在虛擬機器中執行的更快!
JIT最基本的實現原理是什麼?
首先將位元組碼翻譯成CPU可直接理解執行的機器指令,在記憶體中分配空間儲存翻譯後的指令,設定指令指標指向程式碼地址。
下面結合兩個檔案(function.c,jit.c)來說明:
看,我們做到了!
如果不呼叫mmap,透過下面的方式是否可以直接執行程式碼呢?
答案是:不可以!如果你編譯後執行會報錯:Segmentation fault (core dumped)
因為mmap呼叫後,程序虛擬地址空間會多出一段區域,這段區域是可讀、可寫、可執行的,所以程式碼在這段記憶體空間是可執行的!
但執行失敗的程式碼的問題是,你準備執行的指令是儲存在資料段空間的,資料段空間的許可權是:可讀、可寫,但是不可執行!所以這是報錯的原因。