Chia sẻ - Một cái nhìn tổng quan về linux system | VN-Zoom | Cộng đồng Chia Sẻ Kiến Thức Công Nghệ và Phần Mềm Máy Tính

Adblocker detected! Please consider reading this notice.

We've detected that you are using AdBlock Plus or some other adblocking software which is preventing the page from fully loading.

We need money to operate the site, and almost all of it comes from our online advertising.

If possible, please support us by clicking on the advertisements.

Please add vn-z.vn to your ad blocking whitelist or disable your adblocking software.

×

Chia sẻ Một cái nhìn tổng quan về linux system

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
1688173937776.png

1688173982317.png


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.
 

carl353

Búa Đá
Shell
Shell là chương trình cho phép bạn tương tác với os. Nó hoạt động như một interface giữa bạn và os, cho phép bạn nhập vào một command và nhận được output

Terminal và shell có phải là một không?
Terminal và shell là 2 nội dung khác nhau nhưng có liên quan chặt chẽ với nhau.
Một terminal hay terminal emulator là một chương trình cung cấp text-based interface, nó cho phép bạn nhập command và nhận output. Mặc khác shell là chương trình chạy trong terminal và interpret command bạn nhập vào.
Nhân tiện nhắc về terminal, có một vài hotkey có thể hữu ích khi làm việc với nó:
- navigate mà không cần dùng arrow key: đi đến đầu dòng (ctrl + a), cuối dòng (ctrl + e), lùi 1 word (alt + b), tiến tới 1 word (alt + f), lùi 1 character (ctrl + b), tiến tới 1 character (ctrl + f)
- quên đi việc sử dụng backspace hay delete key: xoá từ cursor đến đầu dòng (ctrl + u), xoá từ cursor đến cuối dòng (ctrl + k). Nếu bạn đang ở đâu đó ở giữa dòng thì move cursor đến đầu / cuối dòng bằng ctrl + a / e rồi xài ctrl + u / k tuỳ thích.
- xoá từ trước đó: ctrl + w.

Có khá nhiều shell đã được tạo ra, trong đó phổ biến nhất là Bash (Bourne-Again SHell /bin/sh), ngoài ra còn một số loại khác như Zsh, Fish, Tcsh, Ksh. Bash shell được setup mặc định ở phần lớn distro linux, tuy nhiên bạn hoàn toàn có thể thay đổi default shell mà bạn thích bằng cách sử dụng command chsh (change shell)

Standard Input và Standard Output:
Khi bạn chạy một program, nó nhận input và tạo output kết quả trả về bạn. Mặc định thì program nhận input từ keyboard (standard input - stdin) và hiển thị kết quả trả về output qua màn hình (standard ouput - stdout).Ví dụ khi bạn chạy lệnh cat mà không có argument, cat command sẽ đọc data từ stdin (keyboard) và write data vào stdout (screen), vì vậy khi bạn gõ "hello" và nhấn enter, cat command sẽ đọc "hello" từ stdin và write "hello" vào stdout, nó sẽ được hiển thị trên screen.
Tuy nhiên bạn có thể thay đổi stdin, stdout theo ý muốn, ví dụ bạn có thể dùng operator < để redirect stdin từ file, hoặc dùng operator > để redirect stdout đến file thay vì output ra màn hình.
Bên cạnh standard input, standard output còn có một loại stream thứ 3, gọi là standard error (stderr), thường được sử dụng để output những message lỗi. vd khi bạn thực hiện command nào đó trên terminal, thi thoảng sẽ có lỗi output ra screen như không có quyền đọc file ..., bạn không muốn thấy những message như vậy thì có thể output nó ra chỗ khác, không hiển thị lên screen của terminal. vd:
Bash:
command 2 > /dev/null
những output bình thường sẽ hiển thị trên screen, những message lỗi sẽ bị vứt vào /dev/null.

Nếu bạn thắc mắc số 2 kia ở đâu ra, thì số 2 đại diện file descriptor cho standard error (stderr), ngoài ra thì 0 cho stdin, 1 cho stdout.
Khi bạn dùng > để redirect stdout đến một file, thực tế là bạn đang dùng 1>, tuy nhiên vì 1 là default file descriptor cho output redirection nên nó có thể được bỏ qua, chỉ cần dùng > cho đơn giản thay vì 1>.
 


Top