Năm 1969, phịng thắ nghiệm Bell phát triển hệđiều hành đa nhiệm UNIX, phiên bản cài đặt đầu tiên được viết bằng ngơn ngữ assembly. Sau đĩ, cùng với việc sáng chế ra ngơn ngữ C, BELL đã thiết kế và viết lại UNIX bằng ngơn ngữ này. UNIX từđĩ trở
thành một hệđiều hành thơng dụng do khả năng cĩ thể chạy tốt trên nhiều lọai máy từ
máy tắnh cá nhân PC đến máy tắnh cỡ lớn như mainframe. Ngày nay, cĩ rất nhiều dịng hệđiều hành được phát triển trên nền UNIX, như :
Ớ AIX của IBM
Ớ Solaris của SUN Microsystem.
Ớ HP-UX và Tru64 của Hewlett Packard
Ớ UnixWare của Caldera
Ớ Linux và FreeBSD, là hai hệđiều hành mã nguồn mở.
KHOA CNTT Ờ
ĐH KHTN
Hình 3 - 2 Các dịng hệđiều hành phát triển trên nền UNIX
Về kiến trúc, hệđiều hành UNIX cĩ thể phân thành 3 lớp chức năng : mức thấp nhất là kernel, cung cấp việc quản lý tài nguyên, các tác vụđiều phối, và vấn đề bảo mật (security). Mức kế tiếp là shell, thơng dịch các lệnh do người dùng đưa vào và khởi
động các ứng dụng. Mức cao nhất là utilities, cung cấp những ứng dụng hỗ trợ.
KHOA CNTT Ờ
ĐH KHTN
Hình 3 - 3 Kiến trúc của hệđiều hành UNIX
3.1.3 So sánh tổng quát về lập trình đa nhiệm trên hai mơi trường
Đặc điểm Windows UNIX Cơ chế chắnh, hỗ trợ mạnh Tiểu trình (thread) Tiến trình (process) Hỗ trợ tiến trình Cĩ Cĩ Hỗ trợ tiểu trình Cĩ Cĩ, nhưng cài đặt khác biệt Tiểu trình Fiber Cĩ Khơng Điểm mạnh Hỗ trợ tốt việc tạo lập tiểu trình (thread) Hỗ trợ tốt đối với việc tạo lập tiến trình (process) Trang 105
KHOA CNTT Ờ ĐH KHTN Cấu trúc phân cấp tiến trình Khơng Cĩ Kế thừa các ỘcờỢ bảo mật của tiến trình cha Cĩ Cĩ ( trừ lệnh setuid) Vấn đề quản lý các tiến trình
Các hệđiều hành đa nhiệm như Windows và UNIX phải quản lý và điều khiển nhiều tiến trình cùng một lúc. Mỗi tiến trình cĩ dữ liệu, tài nguyên hệ thống, trạng thái Ầ của riêng nĩ. Tài nguyên bao gồm khơng gian bộ nhớảo, các tập tin và các đối tượng điều phối. Các tiểu trình là một phần của một tiến trình, mỗi tiến trình cĩ thể cĩ một hoặc nhiều hơn một tiểu trình chạy bên trong nĩ. Giống tiến trình, một tiểu trình cũng cĩ tài nguyên và trạng thái của riêng nĩ. Hệđiều hành Windows và UNIX đều hỗ trợ tiến trình và tiểu trình nhưng cĩ cách quản lý khác nhau.
Vấn đề đa nhiệm
UNIX được thiết kế với chiến thuật điều phối độc quyền truy xuất (preemptive multitasking) thắch hợp cho người dùng tạo ra nhiều tiến trình chạy đồng thời tại một thời điểm. Do đĩ, lập trình viên trên UNIX thường tạo ra một tiến trình mới mỗi khi cần tạo các xử lý đồng thời trong ứng dụng.
Việc tạo lập một tiến trình mới trên Windows, ngược với UNIX, tiêu tốn rất nhiều tài nguyên và bản thân chiến thuật điều phối của Windows khơng thắch hợp nên lập trình viên trên Windows thường tạo lập các tiểu trình (thread) mỗi khi cần xử lý đồng thời. Windows cũng cĩ một lọai thread đặc biệt là Fiber mà UNIX khơng cĩ, đây được gọi
KHOA CNTT Ờ
ĐH KHTN
là thread ỘnhẹỢ (lightweight thread) , thắch hợp cho các ứng dụng phải phục vụ một số
lớn người dùng như hệ thống cơ sở dữ liệu ..
Đây là khác biệt quan trọng giữa Windows và các hệđiều hành phát triển trên nền UNIX.
Cấu trúc phân cấp của tiến trình
Khi một ứng dụng UNIX tạo lập một tiến trình (process), tiến trình mới trở thành tiến trình con của tiến trình tạo lập. Cấu trúc phân cấp này thường quan trọng và hệ thống sẽ cĩ những chỉ thị lệnh để quản lý các tiến trình con này.
Tiến trình trong Windows khơng hồn tồn sử dụng cấu trúc phân cấp như UNIX. Khi tạo lập tiến trình, ta nhận được handle và cả ID của tiến trình, việc tạo lập cấu trúc phân cấp như UNIX là tùy chọn đối với ứng dụng nếu nĩ thật sự cần.
Vấn đề signals, exceptions, và events
UNIX và Windows đều cĩ cơ chế giúp tiến trình xử lý một sự kiện hay một lỗi xảy ra. Trong UNIX cơ chế này gọi là signal, trong Windows thì cĩ cơ chế exception trong đĩ Windows sử dụng Cấu trúc Xử lý ngoại lệ (Structured Exception Handling Ờ SEH) để
xử lý.
Vấn đề bộ lọc (filter) và ống dẫn (pipes)
UNIX giới thiệu một kiến trúc khác biệt trong lập trình là : bộ lọc và ống dẫn. Một chương trình trong UNIX cĩ thể xem như một Ộbộ lọc nướcỢ, nĩ nhận dữ liệu vào từ
một Ộdịng nhập liệu chuẩnỢ (input stream) và sau khi xử lý nĩ sẽ cho dữ liệu ỘchảyỢ ra một Ộdịng kết quả chuẩnỢ (output stream). Ống dẫn cho phép ta nối các bộ lọc nước
KHOA CNTT Ờ
ĐH KHTN
này lại với nhau, nghĩa là Ộdịng kết quảỢ của bộ lọc này lại tiếp tục được ỘlọcỢ qua một bộ lọc nước khác trước khi ra ngồi, hay sẽ cĩ nhiều Ộbộ lọcỢ nối tiếp nhau trong việc xử lý dữ liệu đầu vào.. Đây là điểm đặc biệt của UNIX mà Windows khơng cĩ.
Tiến trình Daemons và Windows Services
Trong UNIX, một tiến trình deamon là tiến trình được hệ thống khởi động để cung cấp một dịch vụ nào đĩ cho những ứng dụng khác. Thơng thường, tiến trình deamon khơng giao tiếp với người sử dụng. UNIX sẽ khởi động tiến trình deamon lúc boot máy trong
đoạn script khởi tạo.
Khái niệm tiến trình deamon trong UNIX tương đương với khái niệm Windows
Services trong Windows. Các services hồn tồn giống deamon về vai trị nhiệm vụ và cũng được khởi động ở giai đoạn boot máy, các service được điều khiển thơng qua Bộ điều khiển Service ( Service Control Manager Ờ SCM), ta phải giao tiếp khi lập trình với SCM để quyết định việc khởi tạo, dừng và cài đặt cho Service.
Vấn đề giao tiếp giữa các tiến trình
Các hệđiều hành đa nhiệm phải cung cấp cơ chế cho phép các ứng dụng (tiến trình) giao tiếp và chia sẻ dữ liệu với nhau. Cơ chế này gọi là giao tiếp liên tiến trình (Interprocess Communication Ờ IPC)
Đối với UNIX : Bộ nhớ được chia sẻ, pipe, và hàng đợi message (message queue)
Đối với Windows : bên cạnh Bộ nhớ được chia sẻ, pipe, và hàng đợi message (message queue) nĩ cịn cĩ thêm clipboard, COM, DDE, và cơ chế send message.
KHOA CNTT Ờ
ĐH KHTN
Đồng bộ hố
Cả UNIX và Windows đều cĩ cơ chếđồng bộ hố thơng qua semaphores, mutex và miền găng (critical section).
Semaphore để kiểm sốt sự truy cập vào tài nguyên địi hỏi phải giới hạn số lượng user truy cập xác định.
Mutex dùng để tạo cơ chếđộc quyền truy xuất, chỉ cho một user được sử dụng tài nguyên tại một thời điểm.
Miền găng là một phiên bản thu nhỏ của mutex, chỉ thực hiện điều phối trong phạm vi một tiến trình, giữa các tiểu trình (thread) tranh chấp tài nguyên của tiến trình với nhau. Tại một thời điểm, chỉ cho một tiểu trình sử dụng tài nguyên của tiến trình.
3.1.4 So sánh về hệ thống file của hai mơi trường
Đặc điểm Windows UNIX
Cấu trúc tổng quát Phân cấp và đa cây Phân cấp và đơn cây
Cĩ phân biệt ổđĩa và thư mục Cĩ (C,D) Khơng, mọi thứđược mount vào cây quản lý.
Ký tự phân cách đường dẫn \ /
Phân biệt chữ hoa và chữ thường Khơng Cĩ
Hệ thống file mạng SMB NFS
KHOA CNTT Ờ
ĐH KHTN
Tập tin thiết bị Khơng Cĩ
Thiết lập ID của User quản lý cho tập tin/ thư mục
Khơng Cĩ
Security ACLs Simple bit permissions
Tập tin thiết bị (device file) : trong UNIX, thiết bị phần cứng được đại diện bằng những tập tin, thường chứa trong thư mục /dev. Nhờđặc điểm này, ta cĩ thể chạy một chương trình nhưng hơng thèm nhận kết quả trả về của nĩ bằng cách chuyển hướng kết quả (redirect - tức dùng ký tự Ổ>Ỗ hoặc Ổ<Ỗ ) kết xuất của chương trình ra null device, /dev/null. Dùng kỹ thuật tương tự, ta cĩ thể gửi dữ liệu trực tiếp ra cổng song song (serial port) ..
Hệ thống file mạng (Network File System)
Đối với UNIX, đĩ là Network File System Ờ NFS, phát triển bởi Sun
Microsystems.Tĩm gọn cơ chế như sau : NFS server sẽ cung cấp một thư mục cho phép chia sẻ, và NFS client cĩ quyền mount thư mục đĩ vào cây thư mục của mình. Trên nền MS-DOS, việc chia sẻ tài nguyên được thực hiện thơng qua NetBIOS (Network Basic Input Output System), tựđộng chuyển đến thư mục/tập tin trên máy tắnh khác khi yêu cầu I/O đến những thư mục/ tập tin này được chấp thuận. NetBIOS sử dụng giao thức Server Message Block (SMB), ngày nay giao thức này được phát triển thêm để cĩ thểứng dụng trên Internet và được gọi tên mới là Common Internet File System (CIFS).
KHOA CNTT Ờ
ĐH KHTN
Mơ hình bảo mật của UNIX
UNIX gán quyền hạn truy cập của user trực tiếp lên file. Mơ hình này làm việc tốt vì UNIX sử dụng file để đại diện cho thiết bị, bộ nhớ và ngay cả tiến trình. User cĩ thể là người dùng đã đang nhập thành cơng vào hệ thống hoặc cĩ thể là một service của hệ
thống. Mỗi USER thuộc về một GROUP và cĩ một UID (User ID). Mỗi GROUP cĩ nhiều USER và cĩ một GID (Group ID). Mỗi tiến trình đều thuộc về một UID và một GID xác định.
Mơ hình bảo mật của Windows
Trong mơ hình trên
user : Người dùng đăng nhập thành cơng vào hệ thống.
objects : là những tài nguyên yêu cầu bảo mật của hệ thống. Vắ dụ như tập tin, các
đối tượng đồng bộ hố, các đối tượng kernel ...
Access Token : là một cấu trúc dữ liệu đi kèm với mỗi tiến trình , xác định người dùng khởi động tiến trình này là ai, thuộc nhĩm security nào. Mỗi Access Token
được định danh trong hệ thống thơng qua một SID (Security Identifiers)
KHOA CNTT Ờ
ĐH KHTN
Security Descriptor : thơng tin mơ tả thuộc tắnh bảo mật của mỗi tài nguyên. Thơng tin này bao gồm người chủ (owner) của object này là ai, và một danh sách các quyền hạn cho phép truy cập DACL (Discretionary Access Control List ). Danh sách này cĩ thể bao gồm nhiều quyền, mỗi quyền được được gọi là một đơn vị quyền hạn truy cập ACE ( Access Control Entry), trong ACE sẽ chứa danh sách các SID được phép đối với quyền này.
Mơ tả :
Khi một tiến trình truy xuất vào một tài nguyên cĩ yêu cầu bảo mật, hệ thống sẽ
kiểm tra trong danh sách DACL của tài nguyên đĩ, cụ thể là ở mỗi ACE xem cĩ SID của tiến trình này cĩ được phép khơng. Kết thúc quá trình này, hệ thống sẽ xác định
được những quyền hạn mà tiến trình được phép thực hiện đối với tài nguyên này và dựa vào đĩ quyết định từ chối hay chấp nhận yêu cầu của tiến trình.
3.1.5 Giao diện người dùng
UNIX dựa trên giao tiếp lệnh là chắnh, người dùng gõ lệnh trực tiếp trong khi đĩ Windows sử dụng hồn tồn giao tiếp đồ hoạ (dù rằng vẫn hỗ trợ giao tiếp lệnh một cách hạn chế). Lý do là khi UNIX được xây dựng, khả năng đồ hoạ của máy tắnh cịn rất hạn chế, đến giai đoạn Windows ra đời thì điều này đã được cải thiện.
Để cung cấp khả năng giao tiếp thơng qua giao diện đồ hoạ tương tự Window cho UNIX, một hệ thống hỗ trợ được gọi là XWindows, được phát triển bởi đại học MIT.
KHOA CNTT Ờ
ĐH KHTN
3.1.6 Shell và script
Shell là một cơng cụ thơng dịch các lệnh được nhập vào bởi người dùng và sau đĩ ỘchạyỢ và thể hiện kết quả của các lệnh đĩ. Ngồi việc chạy các chương trình ra, shell cịn hỗ trợ thêm các đặc điểm cao cấp khác như cho phép gọi lại những lệnh đã được thực hiện gần đĩ, và cung cấp một ngơn ngữ lập trình dạng script để cĩ thể viết những chương trình đơn giản.
Trên nền Windows, lệnh cmd.exe sẽ mở shell của Windows cho phép chạy các
command. Trên nền Windows, các script cĩ thể kểđến là VBScript, JScript chạy được nhờ Windows Script Host (WSH).
Trên nền UNIX : cĩ nhiều kiểu shell
Ớ Bourne Shell (sh) là shell đơn giản nhất và là shell mặc định, cĩ thể gọi một chương trình, tạo pipe nhưng khơng cĩ bộ nhớ lệnh.
Ớ C Shell (Csh) : cĩ bộ nhớ lệnh và ngơn ngữ script tương tự như ngơn ngữ lập trình C
Ớ Korn Shell (Ksh) : cĩ bộ nhớ lệnh và khả năng xây dựng script. Được phát triển lên từ Bourne Shell.
UNIX giao tiếp với người dùng phần lớn thơng qua gõ lệnh trực tiếp, nên các shell đĩng vai trị quan trọng. Bên cạnh các shell, một loại ngơn ngữ lập trình đơn giản khác cũng được hỗ
trợ là script : Python, Perl, TCL/TK ..
3.2 Sơ lược về phần mềm GRASS
Phiên bản GRASS mới nhất (tắnh đến thời điểm 8/7/2004) là version 5.7
Phiên bản GRASS mà chúng em đang chuyển đổi vào thời điểm nhận luận văn là 5.0.2
KHOA CNTT Ờ
ĐH KHTN
Source Grass5 (phiên bản các loại) cĩ thể download tại http://grass.itc.it/download.html Source được nén theo kiểu .tar, cĩ tên như sau: grass5.0.2_src.tar
Chú ý:
Source Grass cĩ 2 phiên bản, phiên bản chạy trên Linux và phiên bản chạy trên CygWin (là một trình giả lập mơi trường Linux chạy trên Windows)
3.3 Sơ lược về mã nguồn của GRASS 5.0.2
Kắch thước tổng cộng của Source Grass trên xấp xỉ gần 100 MB, số lượng file tổng cộng là
19777 files, nằm trong 2860 folder.
Trong đĩ, thư mục SRC là thư mục phát triển chắnh yếu, thư mục này chứa tồn bộ source code cần thiết tối thiểu nhất để chạy chương trình. Các thư mục cịn lại chỉ là các package kèm theo, các tools, các tài liệu, cùng với các source phát triển khác cịn dang dở như:
src.contrib, src.garden, src.todo v.vẦ
Source Grass được viết bằng ngơn ngữ C trên Linux (tạm gọi là C-Linux), là ngơn ngữ
giống với ANSI C trên Window, nhưng cĩ sử dụng nhiều thư viện hệ thống khác mà trên Window khơng cĩ, vắ dụ như thư viện #include <unistd.h>, <sys/time.h>, <sys/wait.h>, <pwd.h>, <zlib.h>, <rpc/Ầ> v.vẦ
Bên cạnh đĩ, hệ thống xử lý đồ họa trong Linux cũng hồn tồn khác với MS Window, C- Linux sử dụng hệ thống đồ họa là các hàm X, để tương tác với hệ thống giao diện đồ họa
XWindow của Linux.
(Ghi chú thêm: Bộ thư viện lập trình đồ họa trên Linux (giống như bộ thư viện GDI của Windows) bao gồm 3 thư viện là: XLIB, XTOOLKIT, và MOTIF, trong đĩ GRASS sử dụng bộ thư viện cơ bản nhất là XLIB, sẽđược xem xét kỹ hơn vào phần sau )
KHOA CNTT Ờ
ĐH KHTN
Ngồi source code C/Linux ra, source Grass cịn được viết bằng các tập tin Shell Script
(*.sh Ờ là một tập tin thực thi giống như file .bat trên Window), các Script này sẽđược gọi
để hỗ trợ cho source CẦ
3.4 Mơi trường sử dụng để chuyển đổi GRASS5
Chúng em sử dụng mơi trường chuyển đổi là VISUALệ C++ 6.0 Service Pack 5
Phương châm chuyển đổi:
+Để tiết kiệm thời gian và cơng sức, chúng em đề ra phương châm là:
ỘẦHạn chế sửa đổi mã nguồn của GRASS đến mức thấp nhấtỢ
Một sốđiều kiện cần thiết:
+ Do Source Grass được viết theo kiểu lập trình hướng thủ tục cổđiển
(procedure oriented programming), khơng sử dụng lập trình hướng đối tượng, nhưng vẫn sử
dụng cơ chế include prototype (cĩ nghĩa là sẽ cĩ 2 file, 1 file .h chứa các hàm prototype, 1 file .c sẽ chứa các cài đặt của các hàm mơ tả trong file .h đĩ, chẳng hạn, ...) nên khi sử dụng kiểu include như vậy trên Visual C++ thì phải chỉnh lại Setting như sau:
Bấm tổ hợp Alt+F7 để vào Setting
− − − −
Chọn tab C/C++
Chọn Category là PreCompiled Headers
Chọn option ỘAutomatic use of precompiled headersỢ
Nếu khơng thiết lập như trên thì khi add vào 1 file .h, 1 file .c thì VC++ sẽ khơng hiểu và sẽ
báo lỗi ỘUnexpected end of file Ầ.Ợ
KHOA CNTT Ờ
ĐH KHTN
+ Do Source Grass được viết bằng C, mà trình biên dịch VC++ lại dịch theo kiểu C++, (cĩ nghĩa là file .cpp gọi hàm trong file .c sẽ khơng được), nên chúng ta phải sử dụng một số chỉ
thị tiền xử lý (pre-compiler directive) để định hướng lại biên dịch khi gọi hàm ANSI C như