⑴ linux是什麼
Linux是一種操作系統
1991年8月,芬蘭的一個學生在comp.os.minix新聞組貼上了以下這段話:
你好,所有使用minix的人-我正在為386(486)AT做一個免費的操作系統(只是為了愛好,不會象gnu那樣很大很專業).
這名學生就是LinusTorvalds,而他所說的'愛好'就變成我們今天知道的Linux.
Linux引起黑客們(hacker)的注意,通過計算機網路加入了Linux的內核開發,Linux傾向於成為一個黑客的系統----直到今天,在Linux社區里內核的開發被認為是真正的編程.由於一批高水平黑客的加入,使Linux發展迅猛.
作為一個具備所有特性的類似POSIX的操作系統,Linux並非僅由Linus一人開發,而是由全世界幾百個程序員共同開發的.有趣的是這個巨大的全世界的開發活動不是很協調.當然,Linus為內核定了調子,但Linux並不只是內核.沒有一個管理組織;一個俄羅斯學生得到一塊新的主板,就寫了驅動程序支持這塊主板.馬里蘭的一個系統管理員需要備份軟體,就寫一個,並把它傳給任何需要的人.好象總是在正確的時間發生正確的事.
到1993年底94年初,Linux1.0終於誕生了!Linux1.0已經是一個功能完備的操作系統,而且內核寫得緊湊高效,可以充分發揮硬體的性能,在4M內存的80386機器上也表現得非常好,至今人們還在津津樂道於此,不過自從2.1.xx系列的內核Linux開始走高端的路子----硬體的發展太快了,但是Linux不會失去它的本色.Linux具有良好的兼容性和可移植性,大約在1.3版本之後,開始向其他硬體平台上移植,包括弧稱最快的CPU---DigitalAlpha(至少目前主頻是最高的).所以不要總把Linux與低檔硬體平台聯繫到一塊,Linux發展到今天,這是一個誤區,它只是將硬體的性能充分發揮出來而已,Linux必將從低端應用橫掃到高端應用!
在Linux的發展歷程上還有一件重要的事:Linux加入GNU並遵循公共版權許可證(GPL).此舉大大加強了GNU和Linux,幾乎所有應用的GNU庫/軟體都移植到Linux,完善並提高了Linux的實用性,而GNU有了一個根基,我現在也搞不清楚到底是GNULinux呢還是基於Linux的GNU.:-)更重要的是遵循公共版權許可證,在繼承自由軟體的精神的前提下,不再排斥對自由軟體的商業行為(如把自由軟體打包以光碟形式出售),不排斥商家對自由軟體進一步開發,不排斥在Linux上開發商業軟體.
另一個有趣的事是你可不花錢就得到Linux.你只要有時間並願意下載,你就可以免費得到大多數軟體.
為了使Linux變的容易使用,Linux也有了許多發布版本,發布版實際上就是一整套完整的程序組合。現在已經有許多不同的Linux發行版和各自的版本號,為了不產生混淆,我們先解釋一些常提到的術語。
當我們提到的Linux時,一般是指"RealLinux",即內核,是所有UNIX操作系統的「心臟」。但光有linux並不能成為一個可用的操作系統。還需要許多軟體包,編譯器,程序庫文件,Xwindow系統等等。因為組合方式不同,面向用戶對象不同,所以這就是為什麼有許多不同的Linux發行版的原因。
各地出現了很多的Linux發行版,如Slackware,Redhat,Suse,TurboLinux,OpenLinux等十多種,而且還在增加,注意,嚴格來說,你不能說"RedhatLinux""SuseLinux""SlackwareLinux"等等,Linux主要指操作系統內核,對所有發行版內核原代碼都是一樣的(但集成的內核版本可能因發行時間不同而有所不同).
越來越多的公司在Linux上開發商業軟體或把其他Unix平台的軟體移植到Linux上來,如今很多IT業界的大腕IBM,Intel,Oracle,Infomix,Sysbase,Corel,Netscape,CA,Novell等都宣布支持Linux!商家的加盟彌補了純自由軟體的不足和發展障礙,Linux迅速普及到廣大計算機愛好者,並且進入商業應用,正是打破某些公司壟斷文化圈的希望所在!!
Linux是愛好者們通過Internet協同開發出來的,當然它的網路功能十分強大,比如你可以通過ftp,nfs等來安裝Linux,用它來做網關等等.隨著Linux的發展衍生出來的應用恐怕出乎Linus本人最初的預料,如有人用它來做路由器,有人來做嵌入式系統,有人來做實時性系統......常有新手問Linux能做什麼,其實它不象那些中看不中用的操作系統,不在於你用它能幹什麼,而在於你想干什麼!
感謝Internet的飛速發展使得全世界的程序開發員有了一種全新的有效溝通方法。還要感謝在數年之前由RichardStallman主持的GNU項目。Linux在幾年後變成了一個完整的操作系統。它的能量特到了釋放,它變得非常可靠,並且每天都會有新的改進加入進去。
為了使Linux變的容易使用,Linux也有了許多發布版本,發布版實際上就是一整套完整的程序組合。現在已經有許多不同的Linux發行版和各自的版本號,為了不產生混淆,我們先解釋一些常提到的術語。
當我們提到的Linux時,一般是指"RealLinux",即內核,是所有UNIX操作系統的「心臟」。但光有linux並不能成為一個可用的操作系統。還需要許多軟體包,編譯器,程序庫文件,Xwindow系統等等。因為組合方式不同,面向用戶對象不同,所以這就是為什麼有許多不同的Linux發行版的原因。
Linux是一個在386/486/PentiumPC機上運行的Uinux系統.Linux系統具有最新Unix的全部功能,包括真正的多任務,虛擬存儲,共享庫函數,即時負載,優越的存儲管理和TCP/IP,UUCP網路工具.Linux系統及其發展均符合Posix標准.其內核支持Ethernet,PPP,SLIP,NFS,AX.25,IPX/SPX(Novell),NCP(Novell)等.系統應用包括tellnet,rlogin,ftp,Mail,gopher,talk,term,news(tin,trn,nn)等全套UNIX工具包.X圖形庫,包括xterm,fvwm,xxgdb,mosaic,xv,gs,xman等全部X-Win應用工具.商業軟體有Motif,WordPerfect.中文工具已有Cxterm,celvis,cemasc,cless,hztty,cytalk,ctalk,cmail,等,可以處理GB,BIG5,HZ文件.此外還有DOS模擬軟體,可以運行DOS/Win下的軟體。
Linux由於其系統軟體的免費獲取,硬體費用低廉的特點,近年來發展迅猛.Linux的應用軟體已達上千兆.從DOS環境摸擬到圖像,音響信號的處理,從游戲到中文軟體,無所不包.各大軟體公司已紛紛開始推出Linux版本的商業軟體.最近,對Linux所做的基準測試表明,Pentium/100的速度可以跟SUN/200蓖美.94年底在華盛頓萬國會議中心召開了Linux世界年會,各大軟體公司都派出了陣容強大的代表團.
⑵ 如何查看linux 的CPU是X86還是IA64的
可以用命令「getconf LONG_BIT」查看,
如果返回的結果是32則說明是32位(X86),返回的結果是64則說明是64位(X64)。
還可以內使用命令「容uname -a」查看,
輸出的結果中,如果有x86_64就是64位(X64),沒有就是32位(X86)。
⑶ Linux 內核的特點有哪些
Linux 是一個開放自由的操作系統內核,具有一些鮮明特點如下:
(1) Linux 是一個一體化內核;
註:「一體化內核」是也稱「宏內核」,是相對於「微內核」而言的。幾乎所有
的嵌入式和實時系統都採用微內核,如 VxWorks、uC/OS-II、PSOS 等。
(2) 可移植性強。盡管 Linus 最初只為在 X86 PC 上實現一個「類 UNIX」,後來隨
著加入者的努力,Linux 目前已經成為支持硬體平台最廣泛的操作系統;
註:目前已經在 X86、IA64、ARM、MIPS、AVR32、M68K、S390、Blackfin、M32R
等眾多架構處理器上運行。
(3) 是一個可裁剪操作系統內核。Linux 極具伸縮性,內核可以任意裁剪,可以大至
幾十或者上百兆,可以小至幾百 K,運行的設備從超級計算機、大型伺服器到
小型嵌入式系統、掌上移動設備或者嵌入式模塊,都可以運行;
(4) 模塊化。Linux 內核採用模塊化設計,很多功能模塊都可以編譯為模塊,可以在
內核運行中動態載入/卸載而無需重啟系統;
(5) 網路支持完善。Linux 內核集成了完整的 POSIX 網路協議棧,網路功能完善;
(6) 穩定性強。運行 Linux 的內核的伺服器可以做到幾年不用復位重啟;
(7) 安全性好。Linux 源碼開放,由眾多黑客參與 Linux 的開發,一旦發現漏洞都能及時修復;
(8) 支持的設備廣泛。Linux 源碼中,設備驅動源碼佔了很大比例,幾乎能支持任何
常見設備,無論是很老舊的設備還是最新推出的硬體設備,幾乎都能找到 Linux下的驅動。致遠電子那邊有很多的,你可以去看一下
⑷ linux系統中線程同步實現機制有哪些
LinuxThread的線程機制
LinuxThreads是目前Linux平台上使用最為廣泛的線程庫,由Xavier Leroy ([email protected]) 負責開發完成,並已綁定在GLIBC中發行。它所實現的就是基於核心輕量級進程的"一對一"線程模型,一個線程實體對應一個核心輕量級進程,而線程之間的 管理在核外函數庫中實現。
1.線程描述數據結構及實現限制
LinuxThreads定義了一個struct _pthread_descr_struct數據結構來描述線程,並使用全局數組變數 __pthread_handles來描述和引用進程所轄線程。在__pthread_handles中的前兩項,LinuxThreads定義了兩個全 局的系統線程:__pthread_initial_thread和__pthread_manager_thread,並用 __pthread_main_thread表徵__pthread_manager_thread的父線程(初始為 __pthread_initial_thread)。
struct _pthread_descr_struct是一個雙環鏈表結構,__pthread_manager_thread所在的鏈表僅包括它 一個元素,實際上,__pthread_manager_thread是一個特殊線程,LinuxThreads僅使用了其中的errno、p_pid、 p_priority等三個域。而__pthread_main_thread所在的鏈則將進程中所有用戶線程串在了一起。經過一系列 pthread_create()之後形成的__pthread_handles數組將如下圖所示:
圖2 __pthread_handles數組結構
新創建的線程將首先在__pthread_handles數組中占據一項,然後通過數據結構中的鏈指針連入以__pthread_main_thread為首指針的鏈表中。這個鏈表的使用在介紹線程的創建和釋放的時候將提到。
LinuxThreads遵循POSIX1003.1c標准,其中對線程庫的實現進行了一些范圍限制,比如進程最大線程數,線程私有數據區大小等等。在 LinuxThreads的實現中,基本遵循這些限制,但也進行了一定的改動,改動的趨勢是放鬆或者說擴大這些限制,使編程更加方便。這些限定宏主要集中 在sysdeps/unix/sysv/linux/bits/local_lim.h(不同平台使用的文件位置不同)中,包括如下幾個:
每進程的私有數據key數,POSIX定義_POSIX_THREAD_KEYS_MAX為128,LinuxThreads使用 PTHREAD_KEYS_MAX,1024;私有數據釋放時允許執行的操作數,LinuxThreads與POSIX一致,定義 PTHREAD_DESTRUCTOR_ITERATIONS為4;每進程的線程數,POSIX定義為64,LinuxThreads增大到1024 (PTHREAD_THREADS_MAX);線程運行棧最小空間大小,POSIX未指定,LinuxThreads使用 PTHREAD_STACK_MIN,16384(位元組)。
2.管理線程
"一對一"模型的好處之一是線程的調度由核心完成了,而其他諸如線程取消、線程間的同步等工作,都是在核外線程庫中完成的。在LinuxThreads 中,專門為每一個進程構造了一個管理線程,負責處理線程相關的管理工作。當進程第一次調用pthread_create()創建一個線程的時候就會創建 (__clone())並啟動管理線程。
在一個進程空間內,管理線程與其他線程之間通過一對"管理管道(manager_pipe[2])"來通訊,該管道在創建管理線程之前創建,在成功啟動 了管理線程之後,管理管道的讀端和寫端分別賦給兩個全局變數__pthread_manager_reader和 __pthread_manager_request,之後,每個用戶線程都通過__pthread_manager_request向管理線程發請求, 但管理線程本身並沒有直接使用__pthread_manager_reader,管道的讀端(manager_pipe[0])是作為__clone ()的參數之一傳給管理線程的,管理線程的工作主要就是監聽管道讀端,並對從中取出的請求作出反應。
創建管理線程的流程如下所示:
(全局變數pthread_manager_request初值為-1)
圖3 創建管理線程的流程
初始化結束後,在__pthread_manager_thread中記錄了輕量級進程號以及核外分配和管理的線程id, 2*PTHREAD_THREADS_MAX+1這個數值不會與任何常規用戶線程id沖突。管理線程作為pthread_create()的調用者線程的 子線程運行,而pthread_create()所創建的那個用戶線程則是由管理線程來調用clone()創建,因此實際上是管理線程的子線程。(此處子 線程的概念應該當作子進程來理解。)
__pthread_manager()就是管理線程的主循環所在,在進行一系列初始化工作後,進入while(1)循環。在循環中,線程以2秒為 timeout查詢(__poll())管理管道的讀端。在處理請求前,檢查其父線程(也就是創建manager的主線程)是否已退出,如果已退出就退出 整個進程。如果有退出的子線程需要清理,則調用pthread_reap_children()清理。
然後才是讀取管道中的請求,根據請求類型執行相應操作(switch-case)。具體的請求處理,源碼中比較清楚,這里就不贅述了。
3.線程棧
在LinuxThreads中,管理線程的棧和用戶線程的棧是分離的,管理線程在進程堆中通過malloc()分配一個THREAD_MANAGER_STACK_SIZE位元組的區域作為自己的運行棧。
用戶線程的棧分配辦法隨著體系結構的不同而不同,主要根據兩個宏定義來區分,一個是NEED_SEPARATE_REGISTER_STACK,這個屬 性僅在IA64平台上使用;另一個是FLOATING_STACK宏,在i386等少數平台上使用,此時用戶線程棧由系統決定具體位置並提供保護。與此同 時,用戶還可以通過線程屬性結構來指定使用用戶自定義的棧。因篇幅所限,這里只能分析i386平台所使用的兩種棧組織方式:FLOATING_STACK 方式和用戶自定義方式。
在FLOATING_STACK方式下,LinuxThreads利用mmap()從內核空間中分配8MB空間(i386系統預設的最大棧空間大小,如 果有運行限制(rlimit),則按照運行限制設置),使用mprotect()設置其中第一頁為非訪問區。該8M空間的功能分配如下圖:
圖4 棧結構示意
低地址被保護的頁面用來監測棧溢出。
對於用戶指定的棧,在按照指針對界後,設置線程棧頂,並計算出棧底,不做保護,正確性由用戶自己保證。
不論哪種組織方式,線程描述結構總是位於棧頂緊鄰堆棧的位置。
4.線程id和進程id
每個LinuxThreads線程都同時具有線程id和進程id,其中進程id就是內核所維護的進程號,而線程id則由LinuxThreads分配和維護。