Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 38 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
38
Dung lượng
786,91 KB
Nội dung
Share to be shared Căn hệ điều hành NachOS ☺ Tổng quan – System Call – Process (Thread) – Đa chương _.:Gió Reo:._ Mục lục : Lời tỉ tê : I - Giới thiệu NachOS II - Cài đặt NachOS GCC 3x 10 GCC 2.95.3 10 Một số ý biên dịch cài đặt NachOS 12 III - Tổng quan NachOS 15 IV - Thành phần hệ thống NachOS chế độ User MODE , System MODE (Kernel MODE) 17 V - Quá trình biên dịch chương trình người dùng NachOS 22 VI - System call 24 Lần theo dấu vết 24 Tạo system call ? 28 VII - Tiến trình 31 Tiến trình nạp vào nhớ ? 31 Đa chương 33 VIII - Lời kết câu hỏi 36 Vấn đề biến toàn cục: 36 Vấn đề tạo class mới: 36 Vấn đề đa chương: 37 Vấn đề đồng : 37 Lời tỉ tê : Sau tìm tài liệu NachOS mạng tài liệu tiếng Việt nói hệ điều hành , có anh chị năm ngoái , nhiên , anh chị đơn code code , muốn hiểu khó , nhiều lúc , lại dễ bị ảnh hưởng lối viết code người khác ^_^ ! Chính lý , sau học kỳ cực nhọc với NachOS , rút số vấn đề cần phải thấu đáo bạn nghiên cứu NachOS Nghiên cứu NachOS , ta lợi ? Khi nghiên cứu NachOS , ta có hội mô lại hành động hệ điều hành thật cấp phát nhớ , tạo tiến trình , quản lý tiến trình , đồng tiến trình cách dùng semaphore , quản lý xuất nhập I/O … Trong tài liệu ,mình chủ yếu lấy tài liệu NachOS trường đại học Khoa Học Tự Nhiên TPHCM , nơi theo học Có vẻ khó khăn với bạn học khác trường , khác khóa với nơi , khóa có tài liệu khác Nhưng bản, NachOS , đâu , bạn đừng lo lắng Trong tài liệu này, gợi ý bạn hướng để nghiên cứu tìm hiểu NachOS sâu vào số vấn đề cần thiết không show hết toàn Nếu show hết bạn bị ảnh hưởng code , không tốt , phải tốn xíu thời gian cho NachOS kết đạt có giá trị , sung sướng zà zui zẻ ko :D À , , HÃY TẬP ĐỌC TÀI LIỆU TIẾNG ANH nha bạn ^ ^ !! Nếu bạn có khả đọc tiếng Anh cố gắng đọc , thời gian Mình tạm gọi hiểu NachOS nhờ ngồi giựt tóc mà đọc tài liệu tiếng Anh không !! Trước tiếp tục , bạn nên coi qua tài liệu , giúp bạn sử dụng thành thạo với Linux trước tiếp tục công việc ^ ^ CLICK HERE TO DOWNLOAD ==> [dành cho chưa lần chiêm ngưỡng vẻ đẹp đầy bí ẩn cô nàng Linux] Đặc biệt ý cách sử dụng đường dẫn tuyệt đối đường dẫn tương đối linux nha ! Các tài liệu tham khảo khác sử dụng tài liệu (có đính kèm) : + Bien_dich_va_Cai_dat_Nachos.pdf + Giao_tiep_giua_HDH_Nachos_va_chuong_trinh_nguoi_dung.pdf + narten-roadmap.pdf + nachos_study_book.pdf Các bạn ý tài liệu viết dựa chủ yếu vào tài liệu , tài liệu tiếng Việt trường , nên lời khuyên bạn đọc sơ lược qua tài liệu (dẫu ko hiểu trọi :D) Nói chung , bạn cố gắng đọc hết tài liệu tiếng Anh coi bạn khỏi đọc tài liệu , Master hi hi hi !! Mà dù , bạn phải lao đầu vào đọc tài liệu tiếng Anh !! ‘(-.-‘) Và cuối , bạn nắm vững lý thuyết lớp : quản lý tiến trình , nhớ , đồng hóa … trước tiếp tục nghiên cứu !!! Và đọc tài liệu phải đôi với thực hành , đọc suông !! Bạn muốn hiểu thực hành NachOS chuyện hai ngày mà rai lai từ nửa đến nguyên tháng Nó kết cấu từ nhiều class , nhiều file link qua link lại , link tới link lui chết … Hãy đảm bảo bạn có khả bình tĩnh kiên trì NachOS có vấn đề khác lỗi cài đặt , lỗi Linux , lỗi WinSCP , lỗi putty , đống lỗi tè le ko có lý ko hiểu khiến ta điên lên muốn đập nát hình … Goodluck ! Lời cảm ơn Gửi lời cảm ơn chân thành em đến thầy cô môn Mạng Máy Tính khoa Công Nghệ Thông Tin trường đại học Khoa Học Tự Nhiên TPHCM thầy Phạm Tuấn Sơn , thầy Vũ Minh Trí , cô Trần Hồng Ngọc bạn khóa học môn Hệ Điều Hành ☺ ^(*, ,*)^ hù hù Phương pháp học đề nghị : Đọc kỹ tài liệu trước Lấy giấy bút ghi lại khai báo class cần thiết thích thứ Đọc hiểu đến đâu, thực hành tới , tò mò Đọc hoài không hiểu mở máy mà thực hành Thực hành làm hoài không mở tài liệu đọc lại Đọc thực hành hoài không … hỏi người khác Chưa nhận trả lời chơi , đú đởn hoa cành Đú đởn xong quay làm lại bước … Hãy tập thiền tịnh môn nhiều lúc muốn tạt nước máy tính … Bí hết cỡ , bí đường coi code làm sẵn … Copy code … … Oh, U’re loser … I - Giới thiệu NachOS NachOS , pé Tự Nhiên gọi naCHÓ , =)) , tên thật Not Another Completely Heuristic Operating System - Một phần mềm giả lập hệ điều hành với kiến trúc MIPS [ Million Instructions Per Second ] Trong tài liệu , NachOS chạy môi trường Linux với kiến trúc x86 II - Cài đặt NachOS Khi cài đặt NachOS , bạn cần phải cài đặt gói phần mềm NachOS trình biên dịch GCC dành cho trình biên dịch chương trình người dùng hệ điều hành NachOS (Mình gọi tắt GCC 2.95.3 nha , nói sau, GCC 2.95.3 ko chạy NachOS mà chạy Linux ,nó hỗ trợ biên dịch thoy :D) Bạn xem file Bien_dich_va_Cai_dat_Nachos.pdf để biết “nguyên liệu” cần thiết trước bắt đầu cài NachOS Bao gồm : + binutils-2.11.2.tar.gz + gcc-2.95.3.tar.gz + nachos-3.4.tar.gz Xét cho , NachOS chương trình phần mềm cài đặt hệ điều hành Linux mà Vậy , để cài NachOS , tức cài phần mềm lên máy sử dụng hệ điều hành Linux ta phải làm ? (giờ bạn đừng quan tâm NachOS GCC cho NachOS hết nha, coi phần mềm cần phải cài đặt) + Các cách cài đặt phần mềm Linux : Trên Linux có cách cài đặt - vào Add/Remove chọn gói thích rùi cài vào từ đĩa hay từ mạng Internet Ủa, gói đâu có sẵn cho cài ?? Mấy gói phần mềm gói công ty hỗ trợ Linux mà bạn sử dụng cung cấp cho bạn , tự distro Linux kiếm cập nhật ngày server cộng đồng Linux ( hay công ty bảo trợ cho Linux bạn sử dụng) - tìm gói phần mềm cài đặt sẵn ( giống file cài đặt setup.exe hay install.exe windows ) Đối với dòng Linux Redhat rpm với dòng Debian deb , nhấp chuột vào tự cài - biên dịch lại source code phần mềm ( mã nguồn mở mà , người ta gửi code , diên dịch lại để xài thoy , phải qua bước compiler , link ) Tức có mã nguồn tay , dùng trình biên dịch , biên dịch , giải mã mã nguồn thành mã máy , thành file thực thi để chạy Giống windows , bạn dùng VC++ để biên dịch tập tin hello.cpp sau #include void main() { printf(“Hello world !!!”); } Thành file hello.exe để thi hành Và trình cài đặt GCC 2.95.3 NachOS cách thứ (hix) … Còn Binutils ( Binary Utilitys ) dạng dạng tập công cụ lập trình thư viện v v v dùng để tạo thư viện hợp ngữ hay gì ( hỏi anh gu gồ đẹp trai , hem biết ^ ^) **** Các vấn đề cách cài đặt phần mềm thứ : Biên dịch code ***** Để biên dịch từ mã nguồn (ở mã nguồn C) thành file nhấn vào chạy Linux , ta có compiler ( trình dịch) GCC (GNU Compiler Collection) [ Cái GCC gần tương ứng với VC++ Windows , VC++ trình biên dịch kết hợp với trình soạn thảo , GCC ko có , GCC đảm nhiệm việc biên dịch ] Vậy , ý lại , ta có mã nguồn viết = C NachOS , để tạo chương trình NachOS chạy Linux ta phải biên dịch mã nguồn C GCC Tóm lại , NachOS phần mềm Linux , ta dùng GCC Linux để biên dịch , cài đặt [nói chung , nhiên , sâu vào việc cài đặt có số thay đổi nhỏ mà quan trọng] Để tiếp tục nói tiếp phần cài đặt NachOS chi tiết , phải rẽ qua vài khái niệm chút để bạn hình dung trình cài NachOS , gõ lệnh , ý nghĩa , làm ! Sau phần nói sơ GCC , tiếp tục nói việc cài đặt NachOS Như nói , hệ điều hành Linux , thường có tích hợp trình biên dịch GCC (đóng vai trò ~ VC++ windows).Để kiểm tra xem máy có cài gcc chưa , vào Terminal gõ gcc version , phiên gcc coi có máy (lưu ý , với mã nguồn NachOS 3.4 biên dịch tốt , ko lỗi với GCC phiên từ 3.0 đến 4.0) Nếu , bạn cài từ đĩa CD cài đặt cách vào Add/Remove Application tick chọn Development Tools (với RedHat 9) Sau , Linux tự cài cho bạn Rồi , OK, tóm lại , Linux , phải có trình biên dịch GCC để biên dịch mã nguồn thành chương trình thực thi Mình gọi GCC Linux GCC 3x ! GCC 3x Là trình dịch mã nguồn cho Linux , chạy hệ điều hành Linux/nền kiến trúc x86 , biên dịch mã nguồn cấp cao C thành mã máy cho Linux/nền kiến trúc x86 hiểu GCC 2.95.3 Đấy GCC mà phải cài cài đặt NachOS , GCC 2.95.3 cài gói gcc-2.95.3.tar.gz Là trình dịch mã nguồn cho Linux , chạy hệ điều hành Linux/nền kiến trúc x86 , biên dịch mã nguồn cấp cao C thành mã máy cho Linux/nền kiến trúc MIPS hiểu 10 VI - System call Là ? Là lời nhờ vả chương trình người dùng không làm điều , cần đến giúp đỡ hệ điều hành :D Cứ cho hàm API ^_^ Bạn nhớ ý , hiểu bí kíp system call ngộ đạo NachOS , dĩ bất biến , ứng vạn biến , tung hoành ngang dọc , danh trấn giang hồ , sau có phức tạp , thiên biến vạn hóa , xét cho thứ bèo bọt … … nổ xíu thoy Để hiểu system call , ta phải chạy thử chương trình có gọi system call Yêu cầu : mở file Giao_tiep_giua_HDH_Nachos_va_chuong_trinh_nguoi_dung.pdf coi Lần theo dấu vết Chúng ta coi cách mà chương trình halt.noff thực thi tài liệu vẽ Halt.c Nhận xét : Trong chương trình Halt , chẳng có +-*/, hay khai báo biến , while, if mà có hàm tên Halt() Hàm gọi system call (lời gọi hệ thống) có nhiệm vụ tắt máy ảo Như định nghĩa lời nhờ vả chương trình người dùng không làm điều , cần đến giúp dỡ hệ điều hành Chương trình Halt ko thể tự tắt máy , mà phải cần đến hệ điều hành tắt máy cho 24 Sau nạp vào RAM ảo , CPU MIPS bắt đầu nạp lệnh halt.noff để thực thi lệnh halt.noff = tập mã máy MIPS = start.o + hatl.o Sau , dùng hợp ngữ start.s halt.s để diễn tả phần tương ứng Khi chạy halt.noff , chạy từ xuống , chạy vào phần mã máy start trước Đầu tiên nhảy vào hàm main () halt.c lệnh jal main 25 Sau , dựa vào tên hàm system call Halt nhảy đến nhãn (label) – tên hàm nhãn , đơn giản - tương ứng với hàm Tại vị trí label , ta thấy có dòng lệnh addiu $2,$0,SC_Halt Ý nghĩa : Cho mã system call Halt SC_Halt (là số nguyên) vào ghi thứ syscall Ý nghĩa : Lệnh để gọi xử lý system call Khi nạp lệnh , máy ảo giải mã lệnh , nhận thấy opCode lệnh OP_SYSCALL gọi hàm Raise Exception Trong hàm , đơn giản chuyển ngắt qua system mode , thực xử lý system call , sau chuyển lại qua user mode để chạy tiếp chương 26 trình Hiện , hàm Exceptionhandle có xử lý trường hợp cho system call Halt – tắt máy mà , system call khác chưa có Nhiệm vụ nhà phát triển nhân hệ điều hành tạo nhiều system call cung cấp cho nhà phát triển phần mềm viết chương trình Từ , ta nhận xét , file start.s tương tự thư viện lập trình cung cấp cho nhà lập trình phần mềm ứng dụng sử dụng Hễ nhà viết nhân hệ điều hành tạo system call họ cung cấp cho nhà lập trình phần mềm hàm system call file start.s Các bạn nhận thấy , cung cấp hàm Hatl() , nhà lập trình phần mềm chẳng cần quan tâm bên có , muốn tắt máy , cần gọi Halt() ok! Đối với nhà lập trình nhân hệ điều hành có phần phức tạp , họ phải viết nội dung mà hệ điều hành phải xử lý nhận system call Halt() , họ phải thêm vào thư viện hàm start.s để nhà lập trình phần mềm sử dụng Vai trò file start.s làm rõ phần sau , cách tạo system call ! 27 Tạo system call ? Để tạo system call cho nhà lập trình phần mềm sử dụng , bạn phải xem xét file , trải qua bước sau (Coi mũi tên sau cùng): (mình dùng ví dụ tạo system call Create ,hàm dùng tạo file) • Khai báo system call /code/userprog/syscall.h Định nghĩa mã system call #define SC_Create Khai báo tên hàm system call int Create(char* name); • Thêm đoạn mã start.s start.c , phần để người dùng gọi hàm (thư viện hàm) Nó gọi đến system call tương ứng sau : globl Create ent Create Create://Cái nhãn,dùng để nhảy đến hợp ngữ,tên nhãn=tên hàm addiu $2,$0,SC_Create //Cho mã SC_Create=4 vào ghi syscall //Gọi hệ điều hành xử lý giùm system call Create j $31 end Create • Hệ điều hành nhận system call , phải phân loại chúng thuộc system call dạng , tắt máy , ghi file ,tạo file , in hình , nhập từ bàn phím hay v…v…v Sau , bạn bạn phải code cách xử lý chúng Đến coi bạn tạo xong system call void ExceptionHandler(ExceptionType which) //Kiểu Exception { int type = machine->ReadRegister(2); // Đọc ghi thứ để biết mã System call switch (which){ case NoException: return; 28 case SyscallException: //Nếu Exception which System Call … switch (type){ // type thuộc dạng System Call … case SC_Halt: // Nếu system call Halt DEBUG(dbgAddr, "\n Shutdown, initiated by user program."); printf ("\n\n Shutdown, initiated by user program."); interrupt->Halt(); //Thực Halt máy … break; case SC_Open: //Thực xử lý mở file break; case SC_Close: //Thực xử lý đóng file break; case SC_Read: //Thực xử lý đọc file break; case SC_Write: //Thực xử lý ghi file break; case SC_Create: //Thực xử lý tạo file break; … vân vân vân … default: printf("\n SyscallException: Unexpected system call %d", type); //break; Mặc định Halt máy interrupt->Halt(); } //printf("\n Incrementing PC."); DEBUG(dbgAddr, "\n Incrementing PC."); AdvanceProgramCounter(); break; } } default: printf("\n Unexpected user mode exception (%d %d)", which, type); interrupt->Halt(); VÍ DỤ : Trình tự + trình cần thực hàm Create: o Yêu cầu bạn phải mở tài liệu tiếng Anh đọc sơ qua hệ thống file NachOS Mình nói sơ qua , NachOS có hệ thống file , hệ thống file dùng hệ thống file Linux (Unix) Hiện , NachOS xài hệ thống file thứ , nên việc 29 tạo file , thông qua lớp fileSystem , lớp fileSystem lại dùng hàm Linux để tạo file :D !! o Đầu tiên chương trình người dùng muốn tạo file tên char* X = “abc.txt” Chuỗi X nằm vùng nhớ chương trình người dùng , USER MODE Chương trình người dùng dùng đến system call Create(X); để nhờ vả hệ điều hành NachOS làm giùm o Bây ta xem xét chi tiết việc xử lý hàm tạo file (Create) ? o Chương trình ngủ , hệ điều hành NachOS vươn vai thức dậy , đọc ghi R2 , biết nhiệm vụ tạo file Nhưng ôi , biết tạo file tên , hiểu biến phạm vi vùng nhớ , tức KERNEL MODE , USER MODE biết chỗ đâu lấy … hix hix … Thế là, , nhà lập trình nhân hệ điều hành sáng giá , dựa tính chất sau !! Tham số thứ hàm nằm ghi R4 Tham số thứ hai hàm nằm ghi R5 Tham số thứ ba hàm nằm ghi R6 … Đó , dựa vào , ta cần cho NachOS đọc ghi R4 biết vị trí bắt đầu chuỗi đâu vùng nhớ USER MODE o Sau , qua hàm User2System , hệ điều hành NachOS copy chuỗi X “abc.txt” thuộc USER MODE qua chuỗi Y vùng nhớ KERNEL MODE ( chuỗi Y giống hệt chuỗi X ) NachOS tạo file dựa chuỗi Y o Xử lý èo èo xong , hệ điều hành NachOS ngủ , chương trình người dùng chạy tiếp ! Tiếp tục công việc nạp , giải mã , thực thi lệnh … Rồi , bạn tạo xong system call Create(char* x); !!! Mọi nhà lập trình phần mềm sử dụng system call bạn để viết phần mềm ^ ^ !! Các system call khác tương tự y !! 30 VII - Tiến trình Tiến trình nạp vào nhớ ? Xin mời bạn quay lại câu lệnh /userprog/nachos –rs 1023 –x /test/halt Trong /userprog/nachos thể mở chương trình nachos lên , nạp vào nhớ chạy , y chương trình khác Linuz Kwrite , FireFox … /test/halt thể mở chương trình halt lên để nạp vào nhớ máy MIPS ảo chạy Tiến trình chạy mở NachOS lên , gọi tiến trình Hiện , NachOS hệ điều hành đơn nhiệm , cho phép chạy tiến trình Một tiến trình bao gồm nhiều thành phần : class Thread { private: // NOTE: DO NOT CHANGE the order of these first two members // THEY MUST be in this position for SWITCH to work int* stackTop; // the current stack pointer int machineState[MachineStateSize]; // all registers except for stackTop public: Thread(char* debugName); // initialize a Thread debugName tên Thread ~ đường dẫn tương đối đến file thực thi Thread Thread(char* debugName, int priority);// init with a given priority ~Thread(); // deallocate a Thread // NOTE thread being deleted // must not be running when delete // is called // basic thread operations void Fork(VoidFunctionPtr func, int arg); void Yield(); void Sleep(); void Finish(); // Make thread run (*func)(arg) // Relinquish the CPU if any // other thread is runnable Pause // Put the thread to sleep and // relinquish the processor // The thread is done executing void CheckOverflow(); // Check if thread has // overflowed its stack void setStatus(ThreadStatus st) { status = st; } char* getName() { return (name); } void Print() { printf("%s, ", name); } 31 private: // some of the private data for this class is listed above int* stack; // Bottom of the stack // NULL if this is the main thread // (If NULL, don't deallocate stack) ThreadStatus status; // ready, running or blocked char* name; //Tên tiến trình = đường dẫn tương đối đến file chương trình void StackAllocate(VoidFunctionPtr func, int arg); // Allocate a stack for thread // Used internally by Fork() #ifdef USER_PROGRAM // A thread running a user program actually has *two* sets of CPU registers -// one for its state while executing user code, one for its state // while executing kernel code int userRegisters[NumTotalRegs]; public: void SaveUserState(); void RestoreUserState(); AddrSpace *space; #endif }; // user-level CPU register state // save user-level register state // restore user-level register state //Vùng nhớ tiến trình RAM ảo Để coi kỹ cách tạo dựng tiến trình , mời bạn vào threads/main.cc Trong threads/main.cc gọi đến hàm StartProcess userprog/progtest.cc Hàm StartProcess làm công việc sau: - Nạp file.noff vào nhớ ảo máy MIPS (class AddrSpace) - Trỏ vùng nhớ currentThread vào vùng nhớ vừa nạp (con trỏ AddrSpace) - Khởi tạo ghi - Cho chạy máy ảo void StartProcess(char *filename) { OpenFile *executable = fileSystem->Open(filename);//Mở file noff AddrSpace *space; if (executable == NULL) { printf("Unable to open file %s\n", filename); return; } space = new AddrSpace(executable);//Nạp file noff vào nhớ currentThread->space = space; //*****Chú ý - Nói sau***** delete executable; // close file 32 space->InitRegisters(); space->RestoreState(); machine->Run(); ASSERT(FALSE); } // set the initial register values // load page table register // jump to the user progam // machine->Run never returns; // the address space exits // by doing the syscall "exit" Ở cách tiến trình nạp vào hệ thống Các tiến trình , tương tự khác chút xíu nơi khai báo hàm StartProcess (còn tùy , thường tiến trình sau gọi StartProcess exception.cc , hàm copy từ hàm StartProcess gốc userprog/progtest.cc) Đa chương Để NachOS biến thành hệ điều hành đa nhiệm , bạn phải nạp thêm 2,3… tiến trình khác cho chúng chạy “song song” Để làm điều , bạn phải ý điều sau • Từ tiến trình , bạn tạo tiến trình qua system call Exec() • Chú ý số lượng tiến trình , kích thước chương trình nạp vào RAM , RAM máy ảo MIPS nhỏ , bạn reisze lại RAM (machine.h) • Ta phải quan tâm đến việc nạp chương trình vào nhớ cho ta nạp tiến trình vào nhớ mà không xảy việc nạp đè lên vùng nhớ tiến trình khác Điều gây nên sụp đổ hệ thống Giải kỹ thuật phân trang : Paging Xem hàm khởi tạo AdrressSpace , việc nạp file noff vào tiến trình , ta chỉnh lại cách nạp file noff vào nhớ Chỉnh lại ? Cái bạn phải tự suy nghĩ , thật đơn giản mà , với điều kiện bạn phải nắm kỹ kỹ thuật Paging trang (Page) ứng với khung trang (Frame) Khung trang NachOS tên PhysPages – trang vật lý Cách làm giống tìm lỗ trống để nhét bi vào mà Gợi ý : Bạn sử dụng 33 class BitMap để đánh dấu khung trang trống , class BitMap giống mảng cờ hiệu mà , bạn tự tìm hiểu • Và vấn đề cuối liên quan đến hàm Thread::Fork (đọc kỹ tài liệu tiếng Anh nachos_study_book)!! o Các bạn ý thân hàm StartProcess , có dòng mà gạch đỏ ý currentThread->space = space Như nói điều : “Từ tiến trình , bạn tạo tiến trình qua system call Exec()” Như , currentThread trỏ đến tiến trình cha , mà trúng câu lệnh , toàn vùng nhớ tiến trình cha bị trỏ hết vào , không Để giải vấn đề , Exec , ta tạo new Thread x cho x->Fork(con trỏ đến hàm StartProcess (VoidFunctionPtr) , ID tiến trình – có (int)) Hàm Fork làm ?? Nó làm thứ sau Cấp phát vùng nhớ Stack cho tiến trình Trong lúc cấp phát vùng nhớ Stack , Fork gán trỏ hàm VoidFunctionPtr , số nguyên int (số nguyên tham số hàm trỏ VoidFunctionPtr , bạn tùy biến trỏ trỏ đến kiểu liệu khác tùy bạn thiết kế hàm ) vào ghi đặc biệt Chuyển tiến trình vào ReadyList Vậy thân hàm Exec() , hàm StartProcess không thực thi , mà thực thi mà tiến trình điều phối nắm CPU để chạy Tức , Exec() , tạo Thread , trắng hoàn toàn , nằm ReadlyList , Thread nạp file noff vào nhớ khởi tạo ghi nắm quyền cầm CPU Sau , CPU hệ điều hành điều phối theo chế Round Robin , CPU cho tiến trình cha xài chút , hết lượt đến tiến trình xài chút lại quay sang cha tiến trình kết thúc tắt máy (Bởi 34 quan tâm chạy đa chương , chưa quan tâm đến vấn đề đồng hóa mà) Vậy ta kết hợp hàm Fork StartProcess lại làm cho tiện ko ? Tôi không muốn Thread tạo iu quí phải đợi đến lúc nhận điều phối nạp vào nhớ khởi tạo ghi Tôi muốn điều làm hết hàm Exec … Bạn nghiên cứu phần khởi tạo ghi AddressSpace ☺ , việc làm thay đổi ghi máy MIPS ảo , dẫn đến tiến trình cha (currentThread) bị sụp đổ ☺ , nhiên , có lẽ khả hạn hẹp , chưa thông hết , có cách làm , bạn thử nghĩ xem ☺ 35 VIII - Lời kết câu hỏi Chà, đến bạn nắm khái niệm NachOS , tới 30% lận , phần lại bạn vô tư tìm hiểu Hãy suy nghĩ tiếp … quản lý hệ thống file , nhập xuất I/O , quản lý tiến trình , đồng hóa … Hãy nhớ điều , bạn nhà lập trình nhân hệ điều hành vĩ đại , bạn có quyền thay đổi thứ theo ý thích , ví dụ bạn nhận thấy class Thread cần phải có ID định danh cho tiến trình bạn thêm vào int ID chẳng hạn … Bạn nhà sáng tạo phần mềm ứng dụng tuyệt vời , bạn sử dụng hàm system call NachOS để viết chương trình nhập xuất tạo file … , đồng hóa chương trình chạy đồng thời , thực toán đồng hóa kinh điển… Chỉ có điều , sáng tạo thay đổi thứ cách khôn ngoan Sau trả lời số câu hỏi hay thắc mắc trình làm NachOS Vấn đề biến toàn cục: 1) Tôi tạo biến toàn cục ? - Bạn mở thread/system.h system.cc , bạn có thấy biến machine khai báo hủy không , làm theo ^_^ Vấn đề tạo class mới: 1) Tôi tạo class ? - Bạn tạo newclass.h newclass.cc , tùy vào ý nghĩa chúng mà bạn bỏ vào thư mục thích hợp , thread, userprog … - Trong newclass.h , bạn có sử dụng lớp khác bạn #include file h lớp vào Trong file cc bạn cần #include “newclass.h” “system.h” bạn có sử dụng đến biến toàn cục 36 - Ở ,mình muốn lớp newclass sủ dụng mã nguồn thư mục userprog - Mở tập tin Makefile.common (trong nachos-3.4/code) , cuối đoạn bắt đầu dòng USERPROG_H = thêm vào đường dẫn tương đối đến /…/newclass.h , ý , nhớ thêm \ cho dòng , dòng cuối \ - Cuối đoạn USERPROG_C = thêm tương tự đường dẫn tương đối đến newclass.cc - Cuối đoạn USERPROG_O = thêm vào newclass.o Làm thể để biên dịch , GCC 3.x biên dịch file , sử dụng chúng thư mục userprog Vấn đề đa chương: 1) NachOS điều phối theo chế ? - NachOS sử dụng chế điều phối Round Robin với quantum số ngẫu nhiên có seed ~ -rs 1023 (hay số tùy bạn , -rs 200, -rs 100 …) Nó chọn tiến trình theo kiểu First In First Serve Vấn đề đồng : 1) Nếu gọi system call, system call đó, tức KERNEL MODE, bị lặp vô hạn có máy quay USER MODE (giai đoạn nạp xử lý lệnh) lại không ? - Không ☺ , bị lặp lặp hoài 2) Vậy Semaphore::P() thấy có vòng lặp while lặp hoài mà , tiến trình Semaphore::P() mà bị ngủ ? - Vòng lặp while() Semaphore::P() không bị lặp vô hạn đâu , tiến trình vào vòng lặp , hàm hợp ngữ SWITCH chuyển CPU qua cho tiến trình khác sử dụng , bạn thử Debug xem ☺ [xem nachos studybook phần tiến trình] Và lưu ý , , bạn cần việc sử dụng P() V() , không cần quan tâm bên , hiểu chúng y lúc học lý thuyết ,tức gọi P() , ngủ CPU chuyển cho tiến trình khác , đánh thức dậy chạy 37 tiếp khúc P() Nhớ quan tâm thêm vaule biến semaphore 3) Tôi thấy hàm Dow Up lý thuyết ngược với P() V() NachOS - Xin mời bạn mở nachos_study_book coi , có ghi rõ , phương pháp hoàn toàn giống ý nghĩa ^_^ (Khỏi coi dc , biết thoy, coi hồi điên lun ☺ ) Còn lại số câu hỏi khác , câu hỏi khác thấy hoàn toàn tìm thấy câu trả lời thỏa đáng tài liệu tiếng Anh hay web , bạn ráng tìm ^ ^ GoodLuck !!! 38