carl353
Búa Đá
Tuân thủ nghiêm ngặt tư tưởng abstraction trong oop, để hiểu một thứ phức tạp thì ta sẽ lược bỏ những thứ râu ria, không đi quá sâu vào chi tiết mà tập trung vào những những chức năng chính, cốt lõi của đối tượng. Ví dụ với cái tủ lạnh, chỉ cần biết các khu vực làm mát, đông đá, và không rút phích để tiết kiệm điện là xài được, không cần quan tâm nó làm mát thế nào, sao tự dưng mở cửa thì đèn bật, hay các chế độ điều chỉnh...
Với tư tưởng như vậy thì linux system có thể chia làm 3 thành phần chính:
- Hardware: CPU, Ram, Disk, Network interface...)
- Linux Kernel: Đây là đầu não của cả hệ thống, là ông chủ quản lí mọi thứ và đảm bảo các bộ phận có thể hoạt động trơn tru với nhau. Nó cung cấp các services như System Call, Process Management, Memory Management, Device Driver. Nó như một phiên dịch viên, giúp User Process giao tiếp được với hardware, nó nhận các request từ user process và translate chúng thành những thứ mà hardware có thể hiểu được (machine languge, low level programming bao gồm binary code hoặc assembly languge).
- User Process / Process: GUI, Server, Shell. là những process mà kernel quản lí, bất kể người dùng có tương tác với nó hay không, ví dụ như web server được chạy như một user process, tất cả chúng tạo nên user space.
Một cách tổng quát có thế xem kernel và user process đều là những process, điểm khác giữa chúng là kernel process chạy trong kernel mode, trong khi user process chạy trong user mode. Code chạy trong kernel mode không có bất kì hạn chế nào với quyền truy cập đến bộ xử lí và main memory, nghe là đã thấy nó đầy quyền lực, nhưng cũng đầy nguy cơ khi trong tay có quá nhiều quyền lực như vậy. Khu vực memory mà chỉ có kernel được phép truy cập gọi là kernel space.
Trong khi đó code chạy trong user mode có quyền truy cập khá hạn chế với main memory và bộ xử lí, do vậy nó cũng ít khi gây nên những vấn đề nghiêm trọng. Khi một process chạy với user mode bị lỗi và crash, kernel có thể dọn dẹp nó mà không ảnh hưởng đến những process khác.
Những hình dưới đây thể hiện một số thông tin mà phần memory mà được sử dụng bởi kernel
Chúng ta sẽ tập trung vào phần kernel, bộ não của toàn bộ hệ thống. Nó có một số chức năng chính như sau:
1. Process Management:
Với một process, kernel có thể start, pause, resume, schedule, terminate. Khi thao tác với hệ thống, người dùng cảm giác như mọi thứ đều thực hiện cùng lúc, tuy nhiên mọi thứ không thật sự xảy ra như vậy. Giả sử như system chỉ có 1 core CPU, nhiều process có thể sử dụng CPU đó, thì tại một thời điểm thì chỉ có một process được sử dụng, sau đó nó được pause lại, process khác sẽ được sử dụng CPU, khoảng thời khắc ngắn ngủi này gọi là time slice. Kernel sẽ đảm nhiệm nhiệm vụ luân chuyển quyền sử dụng này (context swich) giữa các process. Trường hợp multi-CPU thì sẽ càng phức tạp, sẽ cần phải luẩn chuyển sao cho các CPU lúc nào cũng phải phục vụ các process.
2. Memory Management: trong suốt một context swich, kernel sẽ quản lí memory phù hợp. Hình dung kernel như vị quản lí khách sạn đầy kinh nghiệm, khi một process check in, nó sẽ tìm một phòng trống (memory region) phù hợp, kernel sẽ phải đảm bảo mỗi process có phòng riêng (memory space) và không có hai process nào chung phòng. Tuy nhiên đôi khi các process sẽ cùng share phòng (inter-process communication: giả sử 2 process sử dụng share memory để chia sẻ thông báo cho nhau, share library: giả sử nhiều process dùng chung một lib, thay vì load các bản copy lib vào memory cho mỗi process thì kernel chỉ load 1 bản copy lib vào memory và các process sẽ dùng chung), lúc này kernel sẽ phải đảm bảo chúng có thể giao tiếp và sử dụng resource một cách an toàn
3. System Call: một system call là một request bởi user space program đến kernel để nhờ kernel làm gì đó (điều mà user space program không thể / bị hạn chế không thể làm được). Nó giúp application tương tác với các phần dưới của hệ thống và truy cập các resource như I/O, network communication Có 2 system call quan trọng là fork và exec, rất quan trọng trong việc quản lí và thực thi program.
- fork() được xử dụng để tạo mới một process (child process) bằng cách duplicate process hiện tại (parent process), sau thời điểm fork() được gọi, cả 2 process child, parent tiếp tục thực thi với PID khác nhau. Hãy xem ví dụ sau để hiểu rõ hơn:
- exec(): trái ngược với fork(), khi exec(program) được gọi, kernel sẽ load và start program. Hình dung là chúng ta có 1 program gốc là program1, trong nó có lệnh gọi exec(program2), khi đó kernel sẽ load program2 vào trong process hiện tại và thực thi nó, program1 không còn chạy trong process nữa, nó đã bị thay thế. Ví dụ:
Nếu bạn băn khoăn lúc thì nói program, lúc thì nói process thì hãy hình dung program chỉ là những tập lệnh mà có thể được thực thi, còn process là instance của program đó. Một program có thể có nhiều process chạy cùng thời điểm, mỗi process có resource (memory, file description) và state (running, waiting...). Nói một cách khác program như một công thức làm bánh (set instructions), bản thân nó không làm được gì cả, nhưng khi bạn làm theo công thức (load vào memory và thực thi) thì bạn tạo ra một cái bánh và nó có những thành phần (resource) và giai đoạn nướng (state) riêng biệt.
Với tư tưởng như vậy thì linux system có thể chia làm 3 thành phần chính:
- Hardware: CPU, Ram, Disk, Network interface...)
- Linux Kernel: Đây là đầu não của cả hệ thống, là ông chủ quản lí mọi thứ và đảm bảo các bộ phận có thể hoạt động trơn tru với nhau. Nó cung cấp các services như System Call, Process Management, Memory Management, Device Driver. Nó như một phiên dịch viên, giúp User Process giao tiếp được với hardware, nó nhận các request từ user process và translate chúng thành những thứ mà hardware có thể hiểu được (machine languge, low level programming bao gồm binary code hoặc assembly languge).
- User Process / Process: GUI, Server, Shell. là những process mà kernel quản lí, bất kể người dùng có tương tác với nó hay không, ví dụ như web server được chạy như một user process, tất cả chúng tạo nên user space.
Một cách tổng quát có thế xem kernel và user process đều là những process, điểm khác giữa chúng là kernel process chạy trong kernel mode, trong khi user process chạy trong user mode. Code chạy trong kernel mode không có bất kì hạn chế nào với quyền truy cập đến bộ xử lí và main memory, nghe là đã thấy nó đầy quyền lực, nhưng cũng đầy nguy cơ khi trong tay có quá nhiều quyền lực như vậy. Khu vực memory mà chỉ có kernel được phép truy cập gọi là kernel space.
Trong khi đó code chạy trong user mode có quyền truy cập khá hạn chế với main memory và bộ xử lí, do vậy nó cũng ít khi gây nên những vấn đề nghiêm trọng. Khi một process chạy với user mode bị lỗi và crash, kernel có thể dọn dẹp nó mà không ảnh hưởng đến những process khác.
Những hình dưới đây thể hiện một số thông tin mà phần memory mà được sử dụng bởi kernel
Chúng ta sẽ tập trung vào phần kernel, bộ não của toàn bộ hệ thống. Nó có một số chức năng chính như sau:
1. Process Management:
Với một process, kernel có thể start, pause, resume, schedule, terminate. Khi thao tác với hệ thống, người dùng cảm giác như mọi thứ đều thực hiện cùng lúc, tuy nhiên mọi thứ không thật sự xảy ra như vậy. Giả sử như system chỉ có 1 core CPU, nhiều process có thể sử dụng CPU đó, thì tại một thời điểm thì chỉ có một process được sử dụng, sau đó nó được pause lại, process khác sẽ được sử dụng CPU, khoảng thời khắc ngắn ngủi này gọi là time slice. Kernel sẽ đảm nhiệm nhiệm vụ luân chuyển quyền sử dụng này (context swich) giữa các process. Trường hợp multi-CPU thì sẽ càng phức tạp, sẽ cần phải luẩn chuyển sao cho các CPU lúc nào cũng phải phục vụ các process.
2. Memory Management: trong suốt một context swich, kernel sẽ quản lí memory phù hợp. Hình dung kernel như vị quản lí khách sạn đầy kinh nghiệm, khi một process check in, nó sẽ tìm một phòng trống (memory region) phù hợp, kernel sẽ phải đảm bảo mỗi process có phòng riêng (memory space) và không có hai process nào chung phòng. Tuy nhiên đôi khi các process sẽ cùng share phòng (inter-process communication: giả sử 2 process sử dụng share memory để chia sẻ thông báo cho nhau, share library: giả sử nhiều process dùng chung một lib, thay vì load các bản copy lib vào memory cho mỗi process thì kernel chỉ load 1 bản copy lib vào memory và các process sẽ dùng chung), lúc này kernel sẽ phải đảm bảo chúng có thể giao tiếp và sử dụng resource một cách an toàn
3. System Call: một system call là một request bởi user space program đến kernel để nhờ kernel làm gì đó (điều mà user space program không thể / bị hạn chế không thể làm được). Nó giúp application tương tác với các phần dưới của hệ thống và truy cập các resource như I/O, network communication Có 2 system call quan trọng là fork và exec, rất quan trọng trong việc quản lí và thực thi program.
- fork() được xử dụng để tạo mới một process (child process) bằng cách duplicate process hiện tại (parent process), sau thời điểm fork() được gọi, cả 2 process child, parent tiếp tục thực thi với PID khác nhau. Hãy xem ví dụ sau để hiểu rõ hơn:
C:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
// Create a new process
pid_t pid = fork();
if (pid == -1) {
// Handle error
} else if (pid == 0) {
// Child process
printf("Child process: PID = %d\n", getpid());
} else {
// Parent process
printf("Parent process: PID = %d\n", getpid());
// Wait for the child process to exit
wait(NULL);
}
return 0;
}
Output sẽ kiểu thế này:
Parent process: PID = 19101
Child process: PID = 19102
- exec(): trái ngược với fork(), khi exec(program) được gọi, kernel sẽ load và start program. Hình dung là chúng ta có 1 program gốc là program1, trong nó có lệnh gọi exec(program2), khi đó kernel sẽ load program2 vào trong process hiện tại và thực thi nó, program1 không còn chạy trong process nữa, nó đã bị thay thế. Ví dụ:
C:
#include <unistd.h>
int main() {
// Run the ls command with the -l option
execl("/bin/ls", "ls", "-l", (char *) NULL);
printf("All code after the exec statement will be ignored.");
// The exec call only returns if an error occurred
perror("execl");
return 1;
}
Output sẽ trông thế này:
total 4
-rw-r--r-- 1 compiler compiler 177 Jul 1 00:21 'FSKTM student.txt'
-rw-r--r-- 1 compiler compiler 0 Jul 1 01:17 Introductory20.txt
Nếu bạn băn khoăn lúc thì nói program, lúc thì nói process thì hãy hình dung program chỉ là những tập lệnh mà có thể được thực thi, còn process là instance của program đó. Một program có thể có nhiều process chạy cùng thời điểm, mỗi process có resource (memory, file description) và state (running, waiting...). Nói một cách khác program như một công thức làm bánh (set instructions), bản thân nó không làm được gì cả, nhưng khi bạn làm theo công thức (load vào memory và thực thi) thì bạn tạo ra một cái bánh và nó có những thành phần (resource) và giai đoạn nướng (state) riêng biệt.