2009年1月30日 星期五

Linux 的 Real-time 排程支援

Standard
POSIX.1b 定義了一系列的系統呼叫,去提供即時(Real-time)需求的支援,實作細節和實際效能則由各作業系統自行負責。當然,Linux 也依循了這標準,讓各個 Process 有能力的在有限度的範圍內,調整自己的在系統上排程。這裡所講,並不只是一般常見的系統優先權機制,而是建構在其之上的進階排程實作。

首先,可以從 sched_getscheduler(pid_t pid) 的回傳值中,取得目前程式的排程方法,有助於了解當前的排程情形,其可能回傳值如下:
  • SCHED_OTHER
  • SCHED_FIFO
  • SCHED_RR
  • SCHED_BATCH

範例原始碼(sched_policy.c):
#include <stdio.h>
#include <sched.h>

const char *sched_policy[] = {
"SCHED_OTHER",
"SCHED_FIFO",
"SCHED_RR",
"SCHED_BATCH"
};

int main(int argc, char *argv[])
{
printf("Scheduler Policy is %s.\n", sched_policy[sched_getscheduler(0)]);
return 0;
}

Compiling it:
gcc sched_policy.c -o sched_policy

Results:
Scheduler Policy is SCHED_OTHER

標準預設的排程方法是 SCHED_OTHER,意味 Kernel 並不會為這些一般性 Process 做特別的即時排程處理。因為,我們所寫的程式,都沒有被特殊設定,所得到的將都會是使用 SCHED_OTHER。

值得探討的是 SCHED_FIFO 和 SCHED_RR,這是為即時(Real-time)需求所設計的兩種排程類型,在運作規則上,其實兩者是同樣的東西,只是 SCHED_RR 擁有時段分配的制約機制。

SCHED_FIFO(First In-First Out)

SCHED_FIFO 顧名思義就是『先進先出(First In First Out)』,一但 Procees 是 FIFO 模式,在被 Kernel 的排程器設為可運行時,將會立即先佔並插隊執行,比同樣系統優先權的其他『一般 Process』還優先,除非有系統優先權比較高的 Process 正在佔用時間,否則 FIFO Process 通常都會優先佔用。

另外,FIFO Process若是使用 sched_yield() 或是遭暫停而讓出CPU時間,將會被重新排在當時同優先權的最後,等待其他同優先權的 Process 完畢後,再度被運行。所以 SCHED_FIFO ,永遠會有最大的機會被先執行。

SCHED_RR(Round-robin)

而被設定為 SCHED_RR 的 Process,基本上排程行為和 SCHED_FIFO 一樣,不同的是 Process 將被 Kernel 分配一個 timeslice 去限制時間,時間一但用盡,將會被暫停以讓出 CPU。

SCHED_BATCH

大部份排程方法都是被 POSIX 所定義,唯『SCHED_BATCH』是 Linux 獨有的,被實作於 Linux Kernel 2.6.16 之後。被設定 SCHED_BATCH 的 Process,將會在系統沒有其他可運行的 Process 時(Idle),才會被執行,而且不被優先權所影響而導致 Process 提前執行。

至於如何設定排程方法,可這樣實作:
struct sched_param sp = {
.sched_priority = 1
};

sched_setscheduler(0, SCHED_FIFO, &sp);

一般來說,如何去調度 Process ,都是由 Kernel 全權處理,對於撰寫應用程式的開發者來說,除非是有特殊需求,不然不用去考慮這些排程的問題。本文目的,是針對有這樣額外需求的程式,開發人員可參考系統所提供的呼叫,以對排程器做些特殊的調度。

2009年1月27日 星期二

開發程式的好搭檔 - Terminus 字型

Standard
最近 Android 爆紅,連其附帶的 Droid 字型,都讓自由軟體的使用者拍手叫好!雖然不過 3 MB 的大小,卻已經近乎滿足中、日、韓(CJK)使用者的需求,字體細膩美觀叫人看得心曠神怡。又因為大小的優勢,可以預見未來的 Embedded System 必定是 Droid 字型的天下呀!但題外話不多說,若是身為 Geek ,Terminal 的世界才是一切,誰會去管 Droid Font 的好壞呢?

在 Terminal 下長期工作,清楚又順眼的字型是必要的,在這推薦『Terminus』,這是 Fixed-size 的字體,很適合程式開發使用,即使是小字依然很清楚,國外也有為數不少 Geek 都推薦它。

有興趣的人可以自己裝起來試試,若您是使用 Debian/Ubuntu 可直接使用 apt-get 安裝:
sudo apt-get install xfonts-terminus

2009年1月26日 星期一

Linux Suspend 之記憶體機制

Standard
休眠(Suspend)現在已經是 Laptop 必備的電源管理機制之一,而 Suspend 又分為 s2ram(Suspen to RAM)和 s2disk(Suspend to Disk) 兩種模式。若是啟動 Suspend 的機制,可以看到 Operating System 神奇的被暫停,然後 Resume 叫醒回到之前的工作狀態。如果說想深入瞭解這樣一個機制,可以從 Linux 的休眠實作來著手,swsusp 就提供了這樣一個 User-space 的實作,我們可以研究它的sourcecode。

大體上來說,Suspend 機制不過就是儲存當時系統 Memory 狀態,然後再啟動時還原回去,在實作時,必需先鎖定當時系統下所有的記憶體空間,以確保記憶體內容不再變動,可以分別用 mlockall() 和 munlockall() 來達成這樣的任務。
#include <sys/mman.h>
int mlockall(int flags);
int munlockall(void);

flags 又分成:
  • MCL_CURRENT
    • 鎖定全部現有的記憶體分頁
  • MCL_FUTURE
    • 鎖定未來將被新增的記憶體分頁
此外,swsusp 利用了 /dev/snapshot 來對 User Space Process 和 Swap 的操作,以產生目前 System 的記憶體映像檔,/dev/snapshot 可以用 ioctl() 去控制,其命令:
  • SNAPSHOT_FREEZE
    • 鎖定使 User Space Processes 靜止
  • SNAPSHOT_UNFREEZE
    • 解除 User Space Processes 的鎖定
  • SNAPSHOT_ATOMIC_SNAPSHOT
    • 建立一個系統的記憶體快照映像檔
  • SNAPSHOT_ATOMIC_RESTORE
    • 還原系統記憶體狀態
  • SNAPSHOT_FREE
    • 釋放快照映像檔的記憶體
  • SNAPSHOT_SET_IMAGE_SIZE
    • 設定映像檔最大 Size,如果無法達到指定的 Size,kernel 會盡可能建立最小的 image
  • SNAPSHOT_AVAIL_SWAP
    • 取得可用的 Swap 大小
  • SNAPSHOT_GET_SWAP_PAGE
    • 建立一個 Swap 頁
  • SNAPSHOT_FREE_SWAP_PAGES
    • 釋放所有 SNAPSHOT_GET_SWAP_PAGE 產生的 Swap 頁
  • SNAPSHOT_SET_SWAP_FILE
    • 設定 Swap 的儲存位置
Linux Suspend 所相關的記憶機制大致上如此,當然更細節的部份還有待探討,可以在 source code 中找到更多可以研究的方向。 :P

2009年1月17日 星期六

水滴

Standard
一顆水珠滴下來後,會往哪流?直至今天,仍苦腦於這簡單明瞭的問題。

小時候,總是覺得未來很容易,訂定目標向前邁進,遲早都能達成。時間證明,小時候的目標,卻不過是逃避的藉口,等到畢業如何、幾歲又將要如何?而最終面臨到當下,卻又會再次改變計劃,今天要如何、過幾年後又如何?逃避心理依然不變。

相信多數人都並不熱愛自己當下所學,總是怪罪當初的選擇。沒錯,其實我也並不熱愛學校的主修學科,總是懊惱自己當初的選擇愚蠢,逼得自己像無頭蒼蠅一般,到處找尋心所嚮往的方向。看著許多『理論』學者,宣揚著培養第二專長的理論,總深覺諷刺。學者忘記了,自己一直是只有一個專長『嘴砲』,而橫行天下,自己不培養第二專長,卻一直提倡以第二專長提升競爭力。在我看來,與其說是培養第二專長,還不如說是找尋一個自己打從心理熱愛的方向,可以一輩子扛著的甜蜜負擔。

表面上的專業,和熱愛而成的專業,往往程度上就差了十萬八千里,縱使是孫悟空,也得翻一個前無古人後無來者的筋斗才能躍過。靜下來想想,若只是為了五斗米,而一輩子培養專長和專業,那也太過於可悲,一個缺少感動的生命,何苦去維持住它,草草自我了結便是。

歷史上,無論在哪個多麼艱苦的時代,藝術總扮演著潤滑劑的角色,各式『發自內心』的創作,才能發揮出熱愛的感動,或許不能感動他人,卻能感動自己支撐自己。幸運的我們,生在這個時代,有太多的未來可以前進,藝術早已不限於傳統的音樂、繪畫、文學,可以是科技創新或是思想創意,或是更多更多熱情的創作。

升學季節將至,許多多的朋友們,都將未來寄託在學歷和未知的幾年後,從一些交心朋友的接觸中,可以很明顯看到他們臉上的憂慮,他們雖不願承認,卻早已明瞭考研究所或更進一步進修,不過是逃避現實的方法,這就就像買了張彩券,希望在幾天後能後有大獎降臨一般。令人感到痛心和可悲的是,過程中他們臉上充滿了無奈,不見其熱情的笑容。

反省自己,我是否找到了值得我投入的方向?我是否有熱情寫在臉上?擁有廣泛的興趣,是否能一一發揮?欣慰的是,現在勉強日子過得去,又可以回頭思考,一顆水珠滴下來後,會往哪流?

2009年1月16日 星期五

心得分享簡報上線:桌面開發、快速開機、快速開發

Standard
本次分享活動應熱烈,差點沒把敝人搾乾。而簡報以『作中學』為主要訴求,對像以對程式開發有興趣的普通人為主,應要求,『領進門』是本次分享的重點,所以不談論太高深的進階內容,並附上些簡單上手之實例。

本次三個簡報和相關範例檔案可在此取得:

若有更多疑問,可直接與本人連繫和交流,能力所及,將不吝答覆。

2009年1月12日 星期一

心得分享活動:桌面開發、快速開機和社群經驗

Standard
在今天,走在路上隨便問一個人:『你知不知道 Linux?』,已經能聽到比較不同以往的回答,至少,有人會這麼答:『你說的是EeePC的那個系統?』。拜台灣各 PC 大廠所賜,Netbook 這名詞帶起了 Linux 在 PC 市場上的知名度,對一般消費者來說,不再單單只會在手機的產品 DM 上看到 Linux 這個字眼。

雖然從 Netbook 上的作業系統佔有率看來,Linux 又再次敗在微軟的手下,但過程中卻應證了許多 Open Source 的價值,倒並非一無展獲。我們可以看到,擁有高可客制化優勢的 Linux,其桌面開發、UI Design所帶來的想像力,甚至可望提升商品賣相和市場價值,其成果更讓人興奮。

受到『OpenDesktop.org.tw』的邀請,將於本月(1/15 星期四)分享一系列開發心得,活動時間共六小時,其主軸將以 Desktop Environment、UI Design、Fastboot 等開發經驗和社群交流為主,歡迎各界參加、指教。

暫定主要大綱如下:
  1. Desktop Environment Development and UI Design
    * Netbook/MID/Thin Client with Lightweight Desktop Environment
    * Introduce Lightweight Desktop Environment (eg. LXDE, XFCE)
    * GTK+ Development
    * Next Generation UI
    * 3D User Interface Development - Clutter
    * A sample: Application Launcher with Clutter
  2. Fastboot
    * Introduce fastboot and systems(eg, Moblin, PUD Linux, gOS Cloud..)
    * What's Five-second boot
    * How to do that
    * Next Generation Method for fastboot
  3. Programing Experience and Open Source Community
    * Self-Train for Programing
    * Introduce some Libraries for increasing work effciency
    * Contact with community
    * Communicate with upstream
    * How to invite new guys to join us

活動更多訊息可參閱:
http://www.opendesktop.org.tw/modules/news/article.php?storyid=252

2009年1月10日 星期六

Google Android with Acer AspireOne

Standard
外界炒得沸沸揚揚的『Google Android』手機平台,就在最近發佈了可移植到 x86 系統的消息,目前在官方的 Repository 上,立即可以取得針對 EeePC 701 的移植成果和所有 Source Code,令許多想玩 Gphone 卻苦無機會的人,燃起一線在 PC 上嘗鮮的希望,而更多的 netbook 廠商,更希望能夠讓 Android 在自己的硬體上玩耍一番。

Android 是一個 Google 所提出的開放手機平台計劃,先不論成果如何,就光憑著這樣大的名頭在後面撐腰,就已經足以席卷憾動整個資訊產業了。陸陸續續, HP 2133 也成為了可以支援 Andriod 的硬體名單之一,更多人在此時已經全心全意投入 Porting 的行列,可以預見,因為有心人的努力,未來應該可以看到 Andriod 在各種裝置上出現。

經過這兩天的努力,解決了一些問題後,可以很開心的向大家公開,『Acer AspireOne』也可以跑 Android 了!當然,有圖有真相:

由於 Android 並不是使用 X Server 做為影像的處理和輸出,而是直接存取 FrameBuffer,目前還無法在 x86 啟用繪圖晶片的硬體加速功能,所以在顯示效能上還有待加強,此外,一些硬體仍無法完全順利被 Framework 所支援,目前充其量只是有個展示可運作罷了。

畢竟 Android 還是以手機為起點,許多設計仍在 netbook 上格格不入,甚至是不良於使用,還需等待各界共同的改進。

2009年1月7日 星期三

Glib 就是懶.資料處理好手 - GList 雙向鏈結(Doubly-Linked)

Standard
許多資深的『慣C』老手,對雙向鏈結串列(Doubly-Linked List)應該並不陌生,這種資料結構被大量地應用在資料記錄,但這對於其他 Scripts Language 或一些高階語言的慣用者來說,卻是一個無法理解的存在,因為對他們來說,動態增減 Array 的數量和內容,是再平常不過且應該要存在的東西。

但對 C 語言卻不是如此,同樣的功能要利用『記憶體的控制技巧(俗稱資料結構)』,才能達成。但由於 GLib 的 GList 整合,使用鏈結串列時,已經不需要再自己對指標(Pointer)做許多低階的處理,這對『慣C』一族和 C 語言的新手來說,毫無疑問地是件好事。

這裡是個使用 GList 的範例,大致說明了基本的操作:
#include <glib.h>

typedef struct {
gchar *name;
gchar *tel;
} ContactNode;

int main() {
GList *contactlist = NULL;
GList *list = NULL;
ContactNode *node;

/* Fred's contact information */
node = (ContactNode *)g_new0(ContactNode, 1);
node->name = g_strdup("Fred Chien");
node->tel = g_strdup("0926333xxx");

/* add the node to the list */
contactlist = g_list_append(contactlist, node);

/* Penx contact information */
node = (ContactNode *)g_new0(ContactNode, 1);
node->name = g_strdup("Penx");
node->tel = g_strdup("09xxxxxxxx");

/* add the node to the list */
contactlist = g_list_append(contactlist, node);

/* print all of list */
for (list=contactlist;list;list=g_list_next(list)) {
node = (ContactNode *)list->data;

printf("Name: %s, Tel:%s\n", node->name, node->tel);
}

/* remove all */
for (list=contactlist;list;list=g_list_next(list)) {
contactlist = g_list_remove(contactlist, list->data);
}

return 0;
}


此外,最近在撰寫一些程式時,用了些奇淫技巧,以列出 GList 最前面 10 筆資料:
for (i=10, list=contactlist;(list) ? i : NULL;list=g_list_next(list), --i) {
node = (ContactNode *)list->data;
printf("Name: %s, Tel:%s\n", node->name, node->tel);
}


GLib 的出現,讓許多人可以丟掉手邊的『資料結構』工具書,真的是很便利呀。 :P

2009年1月5日 星期一

什麼年代了?還在搞 Home Screen?!

Standard
自從 Netbook 掀起熱潮開始,像『易模式』那樣的功能選單,就到處有廠商投入,每家各有特色,除了比功能性、方便性,又開始比炫比漂亮,搞了這麼久,大家依然還在搞這種 Home Screen 的東西呀!

沒事閒閒,當然也來趕一下最後一波熱潮,記錄一下幾個月前的小成果。與之前 LXDE 的 LXLauncher 的實作不太一樣,這個 Launcher 是一個擁有無聊 3D 小特效的實作,再加上一些自己做的美工 Theme,可參考影片(雖然不是錄得很好,也不是很順暢):

video

由於有使用到 OpenGL 的機制,理所當然的在開啟其他程式時會與 Compiz 打架,所以會看到些破格影像,在 Driver 解決這問題前,停用 Compiz 可暫時避開這議題,只不過錄影時懶得關了!

2009年1月2日 星期五

2009 新年快樂!本年度的目標和展望

Standard
2009 新年快樂!讓我們再次迎接新年的到來(明年也以此類推),回顧 2008 年的一切目標,多半有部份程度的達成,雖進度不盡理想,但也只好認命。
今年度將進一步的目標和展望如下:
  1. 找回對繪畫與藝術和音樂的熱愛
  2. 依然更進一步研究 Linux Kernel 的相關細節和技術
  3. 充實更多 3D 及影像處理方面的技術
  4. 更多 Embedded System 的相關研究
  5. 思考並設計,以試圖突破現有 User Interface 的過時概念
  6. 撰寫更多被『人們所需要』的軟體
  7. 尋求資源以開發或研究更多有趣的東西
  8. 計劃性的惡搞
  9. 更少的睡眠,更多的 Hacking :P
依然是窮學生,以有限的時間和有限的資源,希望能夠達成今年之目標。