2014/03/18

[Linux] 連續記憶體分配策略(Contiguous Memory Allocation)

作業系統的記憶體管理,可以分成採用連續記憶體分配(Contiguous Memory Allocation)和採用分頁(Paging)技術。採用連續記憶體分配,方法簡單且速度快速,但缺點在於容易產生剩餘的記憶體片段(Fragmentation),記憶體的使用效率並不好,為了解決此現象,因此採用記憶體分頁的方式,來提升記憶體的使用率。

而在連續記憶體分配,有三個最常見的演算法,最先適用(first-fit)、最佳適用(best-fit)和最不適用(worst-fit)。底下舉特考的例子為例:

(102調查局特考_計算機概論)
五、記憶體的配置策略(Storage Placement Strategies)是用以決定進來的程式或資料應置於記憶體的那一區域。其策略包含最不適用(worst-fit)、最佳適用(best-fit)和最先適用(first-fit)等。 
(一)請說明上述三種策略(最不適用、最佳適用和最先適用)在比較之下,各策略的優勢為何?(10分)
(二)若目前記憶體分區(memory partitions)狀況依序為 490 KB,190 KB,290 KB及550 KB,而記憶體空間需求依序為400 KB,220 KB,120 KB及450 KB。請分別描述在最不適用、最佳適用和最先適用三種不同策略下的記憶體配置情形。(10分)

2014/03/16

[Linux] fork()的使用介紹

整個作業系統(Operating System, OS)是為了分配有限的硬體資源給Program使用,然而OS也視為一個Program,放進CPU中執行,為了讓OS Kernel辨識每個Process,就會有所謂的行程辨識元(Process Identifier, PID),其中特別的是PID 0和1,0是Kernel用來Swap,交換分頁使用;而1則是初始化行程,也是Kernel建立的第一個Process,其他的Process基本上都是透過PID 1的init Process來產生。因此整個OS系統本身可以想像成一個Tree of Processes,root為init Process,亦為Parent Process,然後用fork()依序產生底下的Child Process,並回傳值0代表是Child Process。

[Linux] Program, Process and Thread之差異

  • Program: code程式
  • Process: 正在CPU執行的Program
  • Thread: 使用CPU的最小單元,較為輕巧的process,一個process可以產生多的threadCPU是配給thread使用。


Thread存在有以下的目的:
(1) Responsiveness: 允許程式可以在被I/O中斷時,能夠繼續執行,譬如Web瀏覽器,可以同時看影片及下載檔案
(2) Resource Sharing: thread分享同樣的memoryresource,而process只能透過shared memorymessage passing的方法來分享資料
(3) Economy: threadprocess輕巧,創建和context switch thread比創建一個process來的快速
(4) Scalability: 可以平行執行於多核心的平台。


總結來說,寫好的code稱作為Program,放到CPU中執行就變成Process,但Process可以使用多的Thread代表的CPU執行單元,來增加執行效率。

2014/03/01

[OpenSSL] RSA非對稱型加解密演算法

RSA為目前在電子商業網路上很常用的加解密演算法,其安全性依靠因數分解,因為對極大整數做因數分解是很困難且花時間的,一般都會採用RSA numbers來產生公鑰(Public Key)和私鑰(Private Key),目前大多採用1024bits2048bits

公鑰和私鑰的產生
1.      隨意選擇兩個大的質數pqp不等於q,計算N=p*q
2.      根據歐拉函式,求得r= φ(N) = φ(p)φ(q) = (p-1)*(q-1)
3.      選擇一個小於r的整數e,且與r互質。
4.      用以下公式計算d : d*e1 (mod(p-1)*(q-1))
5.      (N, e)為私鑰,(N, d)則為公鑰。

2014/02/26

[Linux] Ubuntu12.04下利用QEMU + chroot來編譯Linux Kernel (二)

參考上篇設定,利用QEMU執行Ubuntu,且連上網路。下載完Linux Kernel後,就可以準備來進行編譯Linux的Kernel了。細節可以參考這篇http://linux.vbird.org/linux_basic/0540kernel.php,目標是Ubuntu 12.04採用3.2版Kernel改成3.5版的Kernel。

查詢目前Kernel版本
\>uname -r

2014/02/20

[Linux] Ubuntu12.04下利用 QEMU + chroot來編譯 Linux Kernel

為了避免在編譯Linux Kernel的錯誤,把原本的Linux OS損壞。可以採用在原本的Linux中使用QEMU的Guset OS的Linux的環境來編譯Kernel,這樣就可以避免修改到原本的OS系統,細節可以參考這篇文章

不過照著教學的步驟,使用Ubuntu 12.04來設定QEMU和編譯可能會遇到一些問題,像是一開始安裝QEMU和KVM之後
$ sudo apt-get install qemu qemu-kvm
會發現其實在Ubuntu 12.04找不到qemu的指令

2014/02/13

[Android] 用WifiManager來get wifi的SSID, power level和所使用的channel基本資訊

***2017/01/06更新***
請參考 [Android] WifiManager for Android M or later
******

在行動裝置上最常用到的莫過於是網路了,其中因為Wi-Fi在很多政府機關、公共場所都是免費可使用的,因此Wi-Fi應該算得上是在行動裝置中很重要的一部分。

Android本身有提供WifiInfoWifiManager兩個類別提供我們來使用及控制Wi-Fi,除了可以開啟、關閉Wi-Fi之外,也可以取得目前的位置有哪些Wi-Fi網路存在、訊號強度如何,所使用的頻帶有否跟其他Wi-Fi網路重疊,也可以取得目前連線的Wi-Fi IP資訊、速度等資訊。

以下利用WifiInfo和WifiManager類別簡單的開發一個查詢目前周遭有哪些Wi-Fi網路,取得服務設定的識別碼(Service Set Identifie, SSID),並且回報最強的訊號是哪一個SSID,所使用的是哪個頻段(2.4G/5G)等等。

2014/01/16

[Android] Android Virtual Device path 設定

隨著Android版本越出越新,但其實還是有大多手機使用者是使用舊版Android,所以開發程式的時候就得載很多版本的Android來測試。

但偏偏Eclipse預設存在C槽,假設空間不夠大的話常常就會爆掉了。所以可以修改增加系統變數ANDROID_SDK_HOME,再把Eclipse重開就可以看到Android Virtual Device的路徑變成自己所設定的位置了。

設定新增系統變數 我的電腦->按右鍵->內容->進階系統設定->進階->環境變數->新增系統變數

[VirtualBox] Ubuntu Waiting for network configuration

工程師換新電腦最麻煩的事情就是要重架環境,假設不想重架可以直接用VirtualBox來開啟虛擬作業系統的vdi檔案,就可以直接執行了。

不過網路的設定上卻遇到了"Waiting for network configuration"的問題,Google了一下要做以下的設定修正

2014/01/11

[Java] 使用DatagramSocket類別來撰寫UDP網路程式

除了TCP之外,另外一種網路連線方式就是透過UDP。與TCP相較之下,UDP因為不需要連線,也沒有麻煩的重傳等機制,雖然在可靠度上不如TCP,但對於不要求每個byte都不能損失的資料型態,像是影音串流,就適合用UDP來傳送。

最有名的UDP程式的例子,非DNS(Domain Name Server)莫屬了,假設每個電腦要詢問網址的主機IP位址都要透過TCP建連線的話,在資源使用上是很浪費的,而且IP位址的封包資料並沒有很大,因此就很適合利用UDP來實作。

2013/12/16

[Java] Web Server撰寫

網路的連線可以分成TCP以及UDP連線,TCP是連線導向且為可靠式,傳送上以每個byte為單位,有重傳機制確保資料可以正確地送到目的IP位址,適合用在傳輸文字、各種檔案、HTTP網路連線等這種不能損失封包的資料上,缺點是較無效率;而UDP則是非連線導向且為不可靠式,傳送上以每個packet為單位,因為不保證資料都能夠送達目的地,沒有重傳機制,速度較快,適合用在傳輸影音串流上,缺點是封包會有損失。

網路的連線可以從Physical layer -> Data Link layer -> Network layer -> Transport layer -> Application layer來探討,舉HTTP這個在user上的application為例子,是透過網路連線,經過電腦的MAC和IP位址,還有IP port number 80,最後透過HTTP的protocol來連線溝通。