Dịch sách Programming Ground Up Chương 1 Giới thiệu

Welcome to Programming

Tôi yêu việc lập trình. Tôi thích thử thách trong việc lập trình không chỉ là việc tạo ra chương trình chạy được mà còn làm ra nó với một phong cách. Lập trình giống như thi ca. Nó chuyển các thông điệp tới máy tính, tới những người chỉnh sửa và sử dụng chương trình của bạn. Lập trình như là bạn xây dựng thế giới của bạn với nguyên tắc của bạn.

Một trong số các lập trình viên vĩ đại nhất, Donald Knuth, mô tả việc lập trình không phải là việc nói cho máy tính cách phải làm việc như thế nào, mà là nói với một người cách chỉ thị máy tính làm việc đó. Về điểm này các chương trình có thể đọc bởi mọi người, không chỉ máy tính. Chương trình của bạn sẽ được chỉnh sửa, cập nhật tiếp sau khi bạn đã chuyển qua các dự án khác. Như vậy việc lập trình không phải là việc giao tiếp với máy tính mà là giao tiếp với những người theo sau bạn. Một lập trình viên là những người giải quyết vấn đề (problem-solver), một nhà thơ, một người hướng dẫn. Mục đích của bạn là giải quyết các vấn đề bằng tay, làm việc đó với sự cân bằng và sự thưởng thức, chỉ ra giải pháp của bạn cho các lập trình viên tương lai. Tôi hi vọng rằng cuốn sách này sẽ dạy bạn ít nhất là thi vị và ảo thuật cái làm cho máy tính trở nên thú vị.

Hầu hết lời giới thiệu của các cuốn sách lập trình đều làm tôi bực bội. Đọc xong bạn vẫn sẽ hỏi “Máy tính thực sự hoạt động như thế nào” và không có một câu trả lời thực sự. Mục đích của tôi là giúp bạn có kiến thức, cách viết và cách học như một lập trình viên. Bạn sẽ không biết tất cả mọi thứ, nhưng bạn sẽ có kiến thức nền để bước tiếp. Đọc xong sách, bạn sẽ có thể làm những thứ sau:

Hiểu được một chương trình làm việc và tương tác với các chương trình khác.
Đọc được chương trình của người khác và xem chúng chạy như nào.
Học một ngôn ngữ mới
Học các khái niệm nâng cao về khoa học máy tính

Tôi sẽ không dạy bạn tất cả mọi thứ. Computer science là một lĩnh vực rộng lớn, đặc biết khi bao gồm cả lý thuyết với thực hành lập trình máy tính. Tuy nhiên, tôi sẽ cố gắng giúp bạn bắt đầu trên các nền tảng vì thế bạn có thể dễ dàng đi tiếp.

Cũng có một câu truyện gà hay trứng có trước trong việc dạy lập trình, đặc biệt là hợp ngữ. Có quá nhiều thứ để học - đặc biệt là quá nhiều để học một lần, mỗi thứ lại phụ thuộc vào các cái khác. Vì thế, bạn cần phải nhẫn nại trong khi lập trình. Nếu bạn không hiểu một vài thứ ở lần đầu hãy đọc lại. Nếu ban vẫn không hiểu sau vài lần thử hãy quay lại sau đó. Tiếp xúc với việc lập trình nhiều sẽ giúp các ý tưởng có ý nghĩa hơn. Đừng nản lòng. Nó là một chặng đừng dài nhưng rất đáng giá.

Cuối mỗi chương sẽ có các bài tập.

Các công cụ

Cuốn sách này sẽ dạy bạn hợp ngữ cho vi xử lý x86 và hệ điều hành GNU/Linux.

Advance-Programming-In-UNIX-Environment: Phan 3 File IO

Giới thiệu

Chúng ta sẽ bắt đầu thảo luận về UNIX System bằng cách mô tả các chức năng có sẵn cho file IO - open, read, write, … Hầu hết File IO trên UNIX có thể thực thi sử dụng 5 hàm sau: open, read, write, lseek, close. Chúng ta sẽ xem xét việc sử dụng bufers sizes trên các hàm read, write.

Các hàm mô tả trong chương này được đề cập tới unbuffered IO, ngược lại với chuẩn IO routines, được mô tả trong chương 5. Thuật ngữ unbuffered nghĩa là mỗi lần đọc, ghi sẽ gọi system call trong kernel. Các unbuffered IO không là theo chuẩn ISO C, nhưng theo chuẩn POSIX.1 và Single UNIX Specification.

Chúng tôi sẽ mô tả việc chia sẻ tài nguyên qua nhiều tiến trình, khái niệm atomic sẽ trở nên quan trọng. Chúng ta sẽ xem xét các khái niệm liên quan tới file IO và các tham số của hàm open.

File Descriptors

Windows Server 2016 Inside Out

Giới thiệu

Windows Server 2016 không đơn giản chỉ là một bản phát hành của seri hệ điều hành Windows Server. Không chỉ Windows Server 2016 bao gồm nhiều tính năng mà còn cách khác để triển khai công việc thông qua Windows Server và Hyper-V containers, Windows Server như là Nano Server một phiên bản nhỏ gọn của Windows Server, cái mà tối giản về không gian đĩa và yêu cầu về RAM.

Trong khi Microsoft tập trung phát triển hệ thống cloud, các đổi mới của bản Windows Server 2016 chứng tỏ rằng công ty không bỏ bê khách hàng. Windows Server bao gồm domain controller, DNS server, DHCP server, certificate server, Remote Desktop Server, Web Server, file server, virtualization host, nó còn bao gồm các chức năng bao gồm SQL Server, Exchange Server, SharePoint và System Center sute.

Cuốn sách này sẽ cung cấp cho bạn một cái nhìn tổng quan về các chức năng của Windows Server 2016. Bạn sẽ học cách triển khai và quản lý Windows Server. Bạn cũng sẽ học được cách sử dụng Server Core theo cách truyền thống “full GUI”, và sử dụng PowerShell Just Enough Administration functionality. Đây là tất cả những thứ quan trọng cần biết khi bảo trì hệ thống Windows Server 2016, từ đó bạn có thể triển khai một phòng server tại nhà, trung tâm dữ liệu, một cơ sở hạ tầng.

Cuốn sách này dành cho ai?

Đây là cuốn sách được viết cho các chuyên gia IT những người làm việc với hệ thống Windows Server thường xuyên. Rất có khả năng, Windows Server 2016 không phải là phiên bản đầu tiên của WIndows Server mà bạn quản lý. Điều này là bởi vì đa số quản trị viên Windows Server đang làm việc với vài phiên bản hệ điều hành trong một thập kỷ. Nhớ rằng, cuốn sách này không dành nhiều thời gian để giới thiệu các khái niệm hay kĩ thuật, thay vào đó nó nhắm đến cung cấp từ trung bình đến nâng cao về các tính năng có sẵn trong Windows Server 2016.

Giả sử rằng bạn như là chuyên gia Công nghệ thông tin, bạn biết cách sử dụng search engine để tìm kiếm các thông tin kĩ thuật liên quan. Đầu tiên là câu hỏi hiển nhiên “tại sao tôi mua quyển sách này nếu tôi có thể tìm thấy các thông tin liên quan từ các công cụ tìm kiếm?” Câu trả lời là thông quan đó bạn có thể nhìn thấy thông tin kĩ thuật một cách có hệ thống, có kinh nghiệm lọc các hiệu biết hữu dụng từ các phỏng đoán thiếu chính xác, bạn chỉ tìm kiếm được những thứ đó nếu bạn biết điểm bắt đầu.

Chương 01. Các công cụ quản trị.

Windows Server 2016 đi cùng với một vài công cụ có sẵn giúp bạn quản trị hệ thống. Bạn có thể sử dụng nhiều công cụ đề làm cùng một việc, triết lý của Microsoft là bạn có thể làm hầu hết mọi thứ với giao diện như Active Directory Administrative Center hoặc Server Manager console, bất kỳ nhiệm vụ nào có tính lặp lại bạn có thể tự động hóa sử dụng Windows PowerShell.

Trong chương này, chúng ta sẽ xem tại sao bạn nên thực thi các tác vụ quản trị bằng remote, cái gì nên cân nhắc khi đặt các công cụ quản trị cùng nhau, và có rất nhiều công cụ bạn có thể sử dụng để điều khiển Windows Server 2016

Remote not local

Windows Server 2016 được thiết kế để remote hơn là locally. lấy ví dụ với Nano Server deployment, cái bạn sẽ học trong chương 2, bạn có thể chỉ cần các cấu hình cơ bản trên console. Nếu bạn muốn làm nhiều hơn, bạn cần thiết lập một remote PowerShell hoặc Remote Server Administration Tool(RSAT) console session.

Triết lý “remote first” không làm ngạc nhiên những quản trị viên có kinh nghiệm. Thỉnh thoảng, bạn cần theo tác vật lý với phần cứng, ngày nay servers và workloads ngày càng virtualized và containerized. Hiếm khi server đặt trong phòng server, chúng sẽ ở trong một remote datacenters hoặc cloud.

Dịch sách Advance Progmraming In UNIX Environment - Phần 1 Tổng quan về Hệ thống UNIX

Tổng quan về hệ thống UNIX

Giới thiệu

Tất cả các hệ điều hành cung cấp dịch vụ cho các chương trình chạy trên đó. Các dịch vụ điển hình bao gồm việc thực thi chương trình mới, mở một tập tin, đọc tập tin, cấp phát vùng nhớ, lấy thời gian hiện tại, … Mục tiêu của sách để mô tả các dịch vụ được cung cấp bởi rất nhiều phiên bản của hệ điều hành UNIX.

Việc mô tả hệ thống UNIX một cách nghiêm ngặt sẽ không được mô tả ở đây, nó gần như không thể (và nếu có thì cũng rất chán nản). Chương này giúp bạn lướt qua hệ thống UNIX từ cái nhìn của một lập trình viên. Chúng tôi sẽ gửi bạn vài nét về các tính năng và sẽ đi vào chi tiết trong các chương sau. Chương này sẽ cung cấp một giới thiệu để giới thiệu tổng quan về các dịch vụ bởi hệ thống UNIX cho các lập trình viên mới.

Kiến trúc UNIX

Một định nghĩa chuẩn, hệ điều hành có thể được định nghĩa như là một chương trình điều khiển các tài nguyên phần cứng của máy tính và cung cấp môi trường cho phép các chương trình có thể chạy trên nó. Nói chung, chúng ta có thể gọi phần mềm này là kernel, kể từ khi nó tương đối nhỏ và trú ngụ bên trong lõi của môi trường. Hình 1.1 sẽ mô tả kiến trúc UNIX.

Interface của kernel là các lớp phần mềm được gọi là system calls. Các thư viện của các hàm thường dùng được xây dựng trên system call interface, các ứng dụng có thể thoải mái sử dụng. (Chúng ta sẽ nói nhiều hơn về system calls và library fucntion). The shell là chương trình đặc biệt cung cấp một interface để chạy các ứng dụng khác.

Theo một nghĩa rộng hơn, một hệ điều hành bao gồm kernel và tất cả các chương trình tạo cho một máy tính hữu dụng và tạo ra cá tính của máy tính. Các phần mềm khác bao gồm system utilities, ứng dụng, shells, library of common function, …

Ví dụ, Linux là kernel được sử dụng bởi GNU operating system. Một vài người nhắc đến là GNU/Linux operating system, nhưng thông thường được nhắc đến đơn giản là Linux. Mặc dù cách hiểu này là không hoàn toàn đúng, nhưng nó lại dễ hiểu.

Đăng nhập

Tên đăng nhập

Khi chúng ta đăng nhập vào hệ thống UNIX, chúng ta sẽ nhập tên đăng nhập và mật khẩu. Hệ thống sẽ tìm kiếm tên đăng nhập trong password file, thường là /etc/passwd. Nếu chúng ta đọc password file, chúng ta sẽ nhìn thấy nó gồm 7 trường phân cách bởi dấu hai chấm: tên đăng nhập, mật khẩu được mã hóa, user id (205), group id(105), trường mô tả (Stephen Rago), home directory(/home/sả), shell program (/bin/kash)

sar:x:205:105:Stephen Rago:/home/sar:/bin/ksh

Tất cả các hệ thống đều di chuyển các mật khẩu được mã hóa tới các file khác. Trong chương 6, chúng ta sẽ xem các tập tin này và một vài hàm để truy cập chúng.

Shells

Mỗi lần chúng ta đăng nhập, một vài thông tin về hệ thống sẽ được hiển thị, và sau đó chúng ta có thể gõ lệnh vào shell (Một vài hệ thống bắt đầu một chương trình quản lý cửa sổ sau khi bạn đăng nhập, nhưng bạn thường kết thúc với một shell đang chạy một cửa sổ). Một shell là một trình thông dịch dòng lệnh đọc vào từ người dùng và thực thi các lệnh. Người dùng nhập lệnh tới shell thường thông qua terminal(một shell tương tác) hoặc thỉnh thoảng từ file (được gọi là shell script). Các shell thông thường có thể xem ở bảng 1.2

Dịch sách The Linux Programming Interface - Phần 2 Các khái niệm cơ bản

Mở đầu

The Linux Programming Interface - Phần 2 Các khái niệm cơ bản

Chương này sẽ giới thiệu các khái niệm liên quan tới lập trình hệ thống Linux. Nó tập trng vào những bạn đang sử dụng hệ điều hành khác, hoặc có ít kinh nghiệm với Linux cũng như các bản UNIX implementation khác.

Lõi hệ điều hành: The Kernel

Operating system (hệ điều hành) được sử dụng với 2 nghĩa:

  1. Để chỉ ra tất cả các gói bao gồm của một phần mềm trung tâm quản lý các tài nguyên của máy tính tất cả các công cụ đi kèm như là command line interpreters, graphical user interfaces, file utilities and editors
  2. Nghĩa hẹp hơn là nói tới phần mềm trung tâm quản lý và cấp phép nguồn tài nguyên của máy tính (CPU, RAM and devices)

Thuật ngữ Kernel thường được sử dụng như từ đồng nghĩa với operating system cái mà chúng ta nói tới trong cuốn sách này.

Mặc dù nó có thể chạy các chương trình trên một máy tính mà không cần kernel, Sự hiện diện của kernel đơn giản hóa việc viết và sử dụng các chương trình khác, và tăng tính mạnh mẽ và khả chuyển có sẵn phục vụ các lập trình viên. The kernel đã làm điều này để cung cấp một lớp phần mềm để quản lý các giới hạn tài nguyên của một máy tính

The Linux kernel excutable có thể tìm thấy ở /boot/vmlinuz, hoặc đâu đó tương tự, Nói về lịch sử, Trước UNIX, the kernel được gọi là unix, Sau UNIX, cái mà đã có virtual memory, được đổi tên thành vmunix, Trên Linux tên này là ánh xạ của tên hệ thống với z thay thế x để nói rằng kernel là một bản compressed executable

Các nhiệm vụ được thực thi bởi kernel:

  • Process scheduling: Lập lịch tiến trình: Một máy tính có nhiều CPU cái mà thực thi các chỉ thị của các chương trình. Giống UNIX systems, Linux là hệ điều hành preemptive multitasking, Đa tác vụ nghĩa là đa tiến trình (running programs) có thể đồng thời chạy trên bộ nhớ và mỗi các có thể nhận sử dụng CPU. Preemptive nghĩa là các luật để quản lý việc các tiến trình nào được sử dụng CPU và trong bao lâu .

  • Memory management: Trong khi bộ nhớ máy tính là rất lớn so với 1 2 thế kỉ trước đây, kích cỡ của phần mềm cũng lớn lên tương ứng, vì thế bộ nhớ vật lý (RAM) vẫn là giới hạn và kernel phải chia sẻ chúng cho các tiến trình như một cách công bằng và hiệu quả. Gióng như hầu hết các hệ điều hành hiện đại , Linux sử dụng virtual memory management, một kĩ thuật:

  • Các tiến trình là độc lập với các tiến trình khác và kernel, vì thế một tiến trình không thể đọc và sửa được bộ nhớ của các tiến trình khác hoặc trong kernel
  • Chỉ một phần tiến trình cần giữ memory, hạ thấp bộ nhớ giới hạn của mỗi tiến trình và cho phép nhiều tiến trình cùng giữ trong bộ nhớ RAM. Điều này giúp việc sử dụng dụng CPU,bất kì thời điểm nào cũng có ít nhất một process có mà CPU có thể thực thi
  • Cung cấp một file system: The kernel cung cấp một file system trên đĩa cho phép các file có thể đợc tạo ra, lấy ra, cập nhật và chỉnh sửa trên chúng
  • Tạo và hủy các tiến trình: The kernel có thể tải một chương trình mới vào bộ nhớ, cung cấp cho nó các tài nguyên (như CPU, memory, và access tới các tập tin) cung cấp thứ tự để chạy. Mỗi một tiến trình thực thi xong, kernel sẽ đảm bảo các nguồn tài nguyên nó sử dụng được giải phóng.
  • Truy cập tới thiết bị: Các thiết bị như chuột, màn hình, bàm phím, đĩa cứng, đĩa mềm được đính kèm tới một máy tính cho phép giao tiếp giữa máy tính với các phần khác của thế giới, cho phép vào ra, hoặc cả hai. The kernel cung cấp các chương trình với các interface để chuẩn hóa và đơn giản hóa truy cập tới các thiết bị, trong khi điều chỉnh việc truy cập bởi nhiều tiến trình trên một thiết bị
  • Mạng: The kernel chuyển và nhận các gói tin. Các tác vụ bao gồm việc định tuyến các gói tin tới hệ thống mục tiêu
  • Cung cấp một system call application programming interface (API): Tiến trình có thể yêu cầu kernel thực thi một vài tác vụ bằng cách sử dụng một vài kernel entry points được biến tới như là system calls. The linux system call API là chủ đề chính của cuốn sách này Mục 3.1 sẽ chi tiết các bowsc thực thi khi một tiến trình được thực thi một system call

Ngoài ra thì một hệ điều hành đa người dùng như Linux sẽ cung cấp một vài người dùng trừu tượng như một virtual private computer;
Ví dụ mỗi user có một home directory.

Kernel mode and user mode

Các kiến trúc vi xử lý điển hình cho phép CPU tổ chức ít nhất 2 mode: user mode và kernel mode (supervisor mode). Chỉ thị phần cứng cho phép chuyển đổi giữa 2 cái. Tương ứng, vùng bộ nhớ ảo có thể đánh dấu là user space hoặc kernel space. Khi chạy với user mode, CPU có thể truy cập chỉ bộ nhớ được đánh dấu là user space; Khi chạy trên kernel mode, CPU có thể truy cập tới cả 2 user và kernel memory space.

Một số hành động có thể được thực thi trong kernel mode. Ví dụ việc thực thi dừng hệ thống, truy cập vào các các vùng quản lý bộ nhớ, khởi tạo các thiết bị quản lý vào ra. Bằng cách tận dụng các thiết kế phần cứng để đặt hệ điều hành tỏng kernel space, các bản cài đặt hệ điều hành đảm bảo rằng các tiến trình người dùng không được phép truy cập các chỉ thị và các cấu trúc dữ liệu của kernel, hoặc để các hoạt động làm ảnh hưởng xấu tới hệ thống.

Process vs kernel views of the system

Trong nhiều công việc lập trình ngày nay, chúng ta đã quen với việc nghĩ về chương trình như cách hướng tiến trình. Tuy nhiên, khi xem nhiều chủ đề trong cuốn sách này, nó có thể là hữu dụng khi có một cái nhìn khác, cái nhìn từ kernel. Để làm rõ hơn, chúng ta từ bây giờ sẽ xem xét mọi thư từ cách nhìn process viewpoint và sau đó là kernel viewpoint.

Một chương trình điển hình có rất nhiều tiến trình. Với mỗi tiến trình có rất nhiều thứ xuất hiện bất đồng bộ. Mỗi một tiến trình thực thi không biết khi nào nó sẽ được làm việc tiếp, vì nó phụ thuộc vào việc lập lịch CPU. Việc chuyển các tín hiệu và giao tiếp giữa các tiến trình ngay lập tức hay ở thời điểm nào đó là do kernel. Một tiến trình không biết nó được cấp ở đâu trong bộ nhớ RAM.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
A running system typically has numerous processes. For a process, many things
happen asynchronously. An executing process doesn’t know when it will next time
out, which other processes will then be scheduled for the CPU (and in what order),
or when it will next be scheduled. The delivery of signals and the occurrence of
interprocess communication events are mediated by the kernel, and can occur at
any time for a process. Many things happen transparently for a process. A process
24 Chapter 2
doesn’t know where it is located in RAM or, in general, whether a particular part of
its memory space is currently resident in memory or held in the swap area (a
reserved area of disk space used to supplement the computer’s RAM). Similarly, a
process doesn’t know where on the disk drive the files it accesses are being held; it
simply refers to the files by name. A process operates in isolation; it can’t directly
communicate with another process. A process can’t itself create a new process or
even end its own existence. Finally, a process can’t communicate directly with the
input and output devices attached to the computer.
By contrast, a running system has one kernel that knows and controls everything. The kernel facilitates the running of all processes on the system. The kernel
decides which process will next obtain access to the CPU, when it will do so, and for
how long. The kernel maintains data structures containing information about all
running processes and updates these structures as processes are created, change
state, and terminate. The kernel maintains all of the low-level data structures that
enable the filenames used by programs to be translated into physical locations on
the disk. The kernel also maintains data structures that map the virtual memory of
each process into the physical memory of the computer and the swap area(s) on
disk. All communication between processes is done via mechanisms provided by
the kernel. In response to requests from processes, the kernel creates new processes and terminates existing processes. Lastly, the kernel (in particular, device
drivers) performs all direct communication with input and output devices, transferring information to and from user processes as required.
Later in this book we’ll say things such as “a process can create another process,” “a process can create a pipe,” “a process can write data to a file,” and “a process can terminate by calling exit().” Remember, however, that the kernel mediates
all such actions, and these statements are just shorthand for “a process can request
that the kernel create another process,” and so on.

The Shell

Một Shell là một chương trình đặc biệt được thiết kế để đọc các lệnh được nhập từ người dùng và thực thi các chương trình thích hợp và phản hồi lại. Thỉnh thoảng được biết đến như một trình thông dịch.

Thuật ngữ “login shell” để nói đến tiến trình được tạo để chạy một shell khi người dùng đăng nhập lần đầu.

Trong khi một vài hệ điều hành tích hợp trình thông dịch vào kernel, trên UNIX, shell là một user process. Trên cùng máy tính, người dùng khác nhau có thể sử dụng các shell khác nhau. Một số shell nổi bật:

  • Bourne shell (sh): Là shell cũ nhất và được sử dụng rộng rãi, được viết bởi Steve Bourne. Nó là shell chuẩn của UNIX phiên bản thứ 7. The Bourne shell bao gồm rất nhiều tính năng quan thuộc: IO redirection, pipelines, filename generation (globbing), variables, manipulation of environment variables, command substitution, background command execution, và functions. Tất cả các bản UNIX sau đó đều có Bourne shell.

  • C shell(csh): Shell này được viết bởi Bill Jou tại Đại học California bởi Berkeley. Tên này xuất phát từ sự tương đồng của rất nhiều cấu trúc luồng điều khiển của shell này với ngôn ngữ lập trình C. C shell cung cấp một vài tính năng tương tác không có sẵn trong Bourne shell, bao gồm command history, command line editting, job control, và aliases. The C shell không tương thích ngược với Bourne shell. Mặc dù các chuẩn tương tác trên BSD là C shell, shell scripts.

  • Korn shell (ksh): Đây là shell được viết như là một sự thay thế cho Bourne shell bởi David Korn tại AT&T Bell Laboratories. Trong khi vẫn giữa được sự tương thích với Bourne shell, nó cũng kết hợp các tính năng tương tác giống với C shell.

  • Bourne again shell (bash): Shell này là bản cài đặt GNU project cho Bourne shell. Nó cung cấp các tính năng tương tác với những các có sẵn của C và Korn shell. Tác giả chính của bash là Brian Fox và Chet Ramey. Bash được sử dụng rộng rãi trong Linux.

Các shell được thiết kế không chỉ đơn thuần để cho việc tương tác, mà còn có thể sử dụng để thông dịch shell scripts, là các text files bao gồm shell commands. Với mục đích này mỗi shell có các tiện ích như một ngôn ngữ lập trình: biến, vòng lặp, điều kiện, IO commands, và các hàm.

Mỗi shells thực thi các tác vụ giống nhau, có thể cú pháp khác nhau. Hầu hết các ví dụ trong sách này yêu cầu một shell sử dụng bash, trừ khi được ghi chú, người đọc có thể giả sử rằng tất cả các ví dụ hoạt động cùng một cách với Bourne-type shells.

Người dùng và nhóm

Môi người dùng tỏng hệ thống là duy nhất và một người dùng có thể thuộc vào nhiều nhóm.

Người dùng

Mỗi người dùng trong hệ thống đều có một login name (username) và được có một user ID (UID). MỖi người dùng, được định nghĩa bởi một dòng trong password file /etc/passwd. Bao gồm các thông tin sau:

  • Group ID: là id của nhóm đầu tiên mà người dùng thuộc về
  • Home directory: thư mục khởi tạo nơi user được đặt vào sau khi đăng nhập
  • Login shell: tên của chương trình được thực thi để thông dịch các lệnh của người dùng.

Mỗi password record cũng có thể bao gồm mật khẩu của người dùng, theo dạng mã hóa. Tuy nhiên vì lý do bảo mật, mật khẩu thường được lưu trữ trong các shadow password file, cái mà chỉ đọc cho những người dùng được cấp quyền.

Nhóm

Vì lý do quản trị, điều khiển việc truy cập vào các file và tài nguyên hệ thống - nó là hữu dụng để tổ chức các người dùng vào các nhóm. Ví dụ, mọi người trong một đội có một dự án, và chia sẻ các tập tin. Trong các bản UNIX sớm hơn. một người dùng chỉ có thể là thành viên của chỉ 1 nhóm. BSD cho phép một người dùng thuộc về nhiều nhóm, một ý tưởng được đưa lên bởi các bản UNIX khác và trong chuẩn POSIX.1-1990. Mỗi nhóm được định danh bởi một dòng trong group file /etc/group, mỗi group bao gồm các thông tin dưới đây:

  • Group name: là tên duy nhất của nhóm
  • Group ID: mã griup
  • User list: một danh sách tên đăng nhập phân cách bởi dấu phẩy, những thành viên của nhóm này.

Superuser.

Một người dùng là một superuser sẽ có các quyền đặc biệt trong hệ thống. Tài khoản super user ID là 0, và thông thường có tên đăng nhập là root. Trong hệ thống UNIX, superuser có thể bỏ qua tất cả các quyền được yêu cầu bởi hệ thống. Vì thế super user có thể truy cập bất kỳ tập tin nào, bất kỳ là tập tin đó yêu cầu quyền gì, có thể đọc các tín hiệu của bất kỳ process nào trong hệ thống. Người quản trị hệ thống sử dụng superuser account để thực thi rất nhiều các tác vụ quản trị trên hệ thống.

The Kernel có một cây thự mục đơn tổ chức tất cả các file trong hệ thống. (Khác với Windows nơi mà mỗi đĩa sẽ có một cấu trúc thư mục). Gốc của cây này là root được đặt tên là / (slash). Tất cả các tập tin và thư mục là con cháu của nó.

Các loại tập tin

Có 2 loại tập tin thường được biết đến regular và plain. Các loại tập tin khác bao gồm devices, pipes, sockets, directories, symbolic links.

Thuật ngữ file thường được sử dụng để ám chỉ một tập tin ở bất cứ loại nào, không chỉ là regular file.

Một thư là một tập tin đặc biệt, nội dung của nó là một bảng các tên file với một refer tới tập tin tương ứng, Tên file + reference liên kết với nhau gọi là link, các file có thể có nhiều links, do đó có thể có nhiều tên, có thể cùng hoặc khác thư mục.

Thư mục bao gồm nhiều link tới các tập tin và các thư mục khác. Links giữa các thư mục được thiết lập bởi cấu trúc cây như hình trên.

Mỗi thư mục bao gồm ít nhất 2 đầu vào: . (dấu chấm), cái mà nối tới thư mục hiện tại và .. (chấm chấm) nối tới thư mục cha, thư mục bên trên nó trong cây. Mỗi thư mục trừ thư mục root, đều có cha.

Giống như một link bình thường, một symbolic link cung cấp một tên thay thế cho một tập tin.

….

Filenames

Hầu hết hệ thống files trên Linux, tên file có thể dài tới 255 ký tự. Tên file có thể bao gồm bất kỳ ký tự gì trừ slash (/) và null (\0). Tuy nhiên, nên đặt tên chỉ gồm chữ cái, chữ số, dấu chấm, dấu gạch dưới và dấu gạch ngang. Đây là 65 ký tự được phép [-.a-zA-Z0-9], theo chuẩn SUSv3

Chúng ta nên tránh sử dụng các ký tự khác bởi vì các ký tự khác có những ý nghĩa đặc biệt đối với shell, trong các biểu thức chính quy, và nhiều trường hợp khác. Vì lý do nào đó tên file cần bao gồm các từ khóa đặc biệt, các ký tự này phải được escapes, ký tự đánh dấu đặc biệt backslash (\).

Chúng ta nên tránh tên file bắt đầu bằng dấu trừ (hyphen) (-), tên này có thể gây ra những sai lầm trong các lệnh shell.

Pathnames

Một tên thư mục là một chuỗi bắt đầu bởi slash (/) theo sau là tập các tên file phân cách bởi dấu slash. Tất cả

….

Current working directory

Mỗi tiến trình đều có một current working directory (thỉnh thoảng được nói đến là working directory hay current directory). Đây là địa chỉ hiện tại của tiến trình trong cây thư mục.

Một tiến trình thừa kế current working directory từ cha nó. Một login shell phải khởi tạo current directory cho người dùng trong thư mục /home định nghĩa trong password file /etc/passwd. Current working directory trong shell có thể thay đổi được bằng lệnh cd.

File ownership and permissions

Mỗi tập tin đều liên kết tới user ID và group ID được định nghĩa ra người dùng và nhóm mà nó thuộc về. Quyền sở hữu tập tin được sử dụng để định nghĩa khả năng truy cập của người dùng.

Ví dụ về việc truy cập tập tin, hệ thống chia các người dùng thành 3 nhóm: owner, group, otther.

Quyền truy cập là 9 bit: thể hiện khả năng đọc, ghi, thực thi file, đối với 3 nhóm trên

File I/O Model

Một trong những đặc điểm nổi bật của IO trong UNIX là khái niệm tính phổ quát (universality of I/O). Nghĩa là chúng cùng các lệnh system calls (open(), read(), write(), close(), …) được sử dụng để thực thi các tác vụ vào ra trên tất cả các kiểu tập tin, bao gồm cả các thiết bị. (The kernel dịch các yêu cầu vào ra thành các hệ thống file hoặc các thiết bị điều khiển để thực thi các tác vụ vào ra trên các tập tin hoặc các thiết bị).

1
2
3
4
5
6
The kernel essentially provides one file type: a sequential stream of bytes,
which, in the case of disk files, disks, and tape devices, can be randomly accessed
using the lseek() system call.
Many applications and libraries interpret the newline character (ASCII code 10
decimal, sometimes also known as linefeed) as terminating one line of text and commencing another. UNIX systems have no end-of-file character; the end of a file is
detected by a read that returns no data.

File descriptors

….

The stdio library

….

Các chương trình

Chương trình bình thường chia thành 2 dạng. Dạng đầu tiên là mã nguồn, dạng có thể đọc được tập các biểu thức được viết bằng một ngôn ngữ lập trình như C. Để thực thi được, mã nguồn phải được chuyển đổi sang dạng thứ hai, mã máy là các chỉ thỉ mà máy tính hiểu được. Hai thuật ngữ về chương trình (program) đều đồng nghĩa, từ bước biên dịch và linking chuyển mã nguồn thành mã máy

Bộ lọc (Filters)

Một bộ lọc là tên thường được nói đến một chương trình đọc dữ liệu từ stdin, trích xuất thông tin từ đó để in ra stdout. Ví dụ lệnh cat, grep, tr, sort, wc, sed, awk

Command-line arguments

Trong C, chương trình có thể truy cập commandline arguments, để hỗ trợ khi sử dụng dòng lệnh để chạy chương trình

1
2

int main(int argc, char *argv[])

Biến argc sẽ bao gồm tất cả tham số dòng lệnh.

Processes

Nói đơn giản, một tiến trình là một instance của chương trình đang thực thi. Khi một chương trình được thực thi, kernel sẽ tải code của chương trình vào bộ nhớ ảo, cấp phép không gian cho các biến chương trình, và thiết lập các thông tin (như process ID, trạng thái, users ID, groups ID) về tiến trình.

Từ điểm nhìn từ kernel (kernel point of view), các tiến trình là các thực thể được kernel phân bổ tài nguyên trong máy tính. Với các nguồn lực có hạn như bộ nhớ, the kernel khởi tạo vào cấp phép một phần nguồn lực cho tiến trình, điều chỉnh việc cấp phép này theo nhu cầu của hệ thống. Khi tiến trình dừng, tất cả các tài nguyên được giải phóng và được sử dụng lại bởi tiến trình khác. Các nguồn lực khác, như CPU, băng thông mạng được chia sẻ công bằng tất cả các tiến trình

Process memory layout

Một tiến trình được chia thành các phần sau: được gọi là segments.

  • Text: các chỉ thị chương trình.
  • Data: các biến static được sử dụng bởi chương trình.
  • Heap: một vùng của bộ nhớ được cấp phát động
  • Stack: một mảnh bộ nhớ tăng lên hoặc giảm đi như các chương trình được gọi và trả về và được sử dụng để cấp phát các biến cục bộ các thông tin các lời gọi hàm

Sự tạo process và thực thi chương trình

Một tiến trình có thể tạo một tiến trình mới sử dụng lệnh fork() system call. Tiến trình cũ được gọi là parent process, tiến trình mới là child process.

Memory Mappings

Static and Shared Libraries

Interprocess Communication and Synchronization

Signals

Threads

Process Groups and Shell Job Control

Sessions, Controlling Terminals, and Controlling Processes

Pseudoterminals

Date and Time

Client-Server Architecture

Realtime

The /proc File System

Tổng kết

Trong chương này, chúng ta đã khảo sát một tập các khái niệm cơ bản liên quan đế lập trình hệ thống Linux. Việt hiểu được các khái niệm đã được cung cấp với những người dùng còn ít kinh nghiệm là các nền tảng để bắt đầu học lập trình hệ thống.

Kết bài

Chương này dài quá mình sẽ dịch nốt trong ngày mai vẫn trong bài viết này.

Việc viết được chương này cho dễ hiểu cũng cần phải có hiểu biết nhất định. Bài viết này sẽ còn được chỉnh sửa khi hiểu biết của mình khá hơn.

Cảm ơn các bạn

Biển học là vô bờ. Hai chữ “vô bờ” bản thân nó vốn ám chỉ rằng không có đích đến rồi. Bạn rong ruổi trên một con tàu theo năm tháng trên đại dượng tri thức. Vậy thì ý nghĩa của một cuộc sống như vậy nằm ở đâu? Là vẻ đẹp của những hòn đảo bạn ghé thăm, những trải nghiệm về phong ba bão táp của đại dương, những cuộc gặp gỡ duyên phận với những con tàu khác, những cuộc đua và những khi tản mạn.

Về bài tập các bạn hãy tiếp tục xem seri Bài số 6 của Arif Butt: https://www.youtube.com/watch?v=tuWDi53pomU&list=PL7B2bn3G_wfBuJ_WtHADcXC44piWLRzr8&index=7

Cùng học tiếng anh

One of the distinguishing features of : Một trong những đặc điểm nổi bật

The linux programming interface Phần 1 - Lịch sử và các chuẩn

Linux là một thành viên trong họ hệ điều hành UNIX. UNIX có một lịch sử lâu dài. Phần đầu tiên của chương nói về tổng quan về lịch sử. Chúng ta sẽ mô tả các sự kiện chính của hệ thống UNIX và ngôn ngữ lập trình C, sau đó sẽ xem 2 điều dẫn hệ thống Linux vẫn tồn tại cho đến ngày nay: dự án GNU và sự phát triển của Linux kernel.

Một trong những tính năng đáng chú ý của hệ thống UNIX là không bị điều khiển mở một nhà cung cấp hay một tổ chức duy nhất. Hơn thế, rất nhiều nhóm, cả thương mại và phi thương mại, đều đóng góp vào sự phát triển của nó. Kết quả là có rất nhiều tính năng được thêm vào UNIX, nhưng cũng gây ra những hậu quả là các bản UNIX implementations đã khác nhau quá nhiều, vì thế việc viết ứng dụng để có thể chạy trên tất cả các bản UNIX implementations trở nên ngày càng khó khăn hơn. Điều này dẫn đến việc phải đưa ra các chuẩn cho UNIX, cái mà chúng ta đã thảo luận trong phần 1 của chương này.

Có hai định nghĩa về UNIX thường được sử dụng. Một là nói đến những hệ điều hành mà đã đạt được chuẩn Single UNIX Specification. Tại thời điểm hiện tại, không có phiên bản free UNIX implementations (ví dụ Linux và Free BSD đạt được branding này)

Hai là hệ điều hành có chức năng và giao diện giống với hệ điều hành UNIX cổ điển (ví dụ Bell Laboratories UNIX, System V và BSD). Bởi định nghĩa Linux cũng được xếp vào UNIX. Mặc dù chúng ta sẽ tập chung vào Single UNIX Specifications trong cuốn sách này, chúng sẽ theo định nghĩa thứ 2 về UNIX. Vì thế chúng tôi sẽ thường xuyên nói “Linux, cũng như các bản UNIX implementations khác…”

Tóm tắt lịch sử về UNIX và C

Phiên bản đầu tiên UNIX được phát triển vào năm 1969 (cùng năm Linus Torvalds sinh ra) bởi Ken Thompson tại phòng thí nghiệm Bell, một bộ phận của telephone corporation AT&T. Nó được viết bằng hợp ngữ cho máy Digital PDP-7 mini-computer. Tên UNIX như là một kiểu chơi chữ MULTICS (Multiplexed Information and Computer Service), tên của dự án hệ điều hành sớm hơn của AT&T kết hợp với MIT và General Electric. Thompson đã vẽ ra một vài ý tưởng cho hệ điều hành mới từ MULTICS, bao gồm cấu trúc cây thư mục, các chương trình độc lập và các trình thông dịch (the shell), và các khái niệm về tập tin như là một unstructured streams of bytes.

Năm 1970, UNIX được viết lại bằng hợp ngữ cho máy Digital PDP-11 minicomputer.

Một thời gian ngắn sau đó, Dennis Ritchie, một đồng nghiệp của Thompson tại Bell đã thiết kế và phát triển ngôn ngữ lập trình C. Đây là một bước tiến lớn. C kế thừa từ một số trình thông dịch, B. B bắt đầu được implement bởi Thompson và được kế thừa từ các ngôn ngữ lập trình trước đó có tên là BCPL. Năm 1973, C đã phát triển đến độ hầu hết UNIX kernel được viết lại bằng C. UNIX trở thành một hệ điều hành đầu tiên được viết bằng ngôn ngữ bậc cao, sự thật là vẫn phải có các chuyển đổi qua lại giữa các kiến trúc phần cứng.

Nguồn gốc của C giải thích tại sao, hậu duệ của nó C++, lại được sử dụng rộng rãi như một ngôn ngữ lập trình hệ thống ngày nay. Các ngôn ngữ khác: FORTRAN cho việc làm toán bởi các kĩ sư và nhà khoa học. COBOL cho các hệ thống thương mại và xử lý dữ liệu. C vẫn được phát triển cho đến nay, và không giống FORTRAN hay COBOL (được phát triển bởi nhiều committees), C được thiết kế bởi cá nhân cho tới khi đạt được duy nhất một mục đích: phát triển một ngôn ngữ bậc cao cho việc implement UNIX kernel và các phần mềm liên quan. Giống như chính hệ điều hành UNIX, C được phát triển bởi các chuyên gia lập trình cho mục đích sử dụng của họ. Kết quả là một ngôn ngữ nhỏ gọn, hiệu quả, mạnh mẽ, ngắn gọn, mô đun hóa, và mạch lạc trong thiết kế.

6 phiên bản đầu tiên của UNIX

Giữa những năm 1969 và 1979, UNIX đã phát hành vài phiên bản, gọi là “editions”. Bản chất là các bản snapshots được phát triển bởi AT&T.

  • Phiên bản đầum 11/1971: thời điểm này, UNIX chạy trên PDP-11 và có trình biên dịch FORTRAN và rất nhiều chương trình hữu dụng cho tới ngày nay, bao gồm ar, cat, chmod, chown, cp, dc, ed, find, ln, ls, mkdir, mv, rm, sh, su và who
  • Bản thứ 2, 6/1972, UNIX có thể cài đặt trên 10 máy của AT&T
  • Bản thứ 3, 2/1973, bao gồm trình biên dịch C và bản implementation đầu tiên về pipes
  • Bản thứ 4, 11/1973, hầu hết UNIX được viết bằng C
  • Bản thứ 5, 6/1974 UNIX được cài đặt cho hơn 50 hệ thống
  • Bản thứ 6, 5/1975: được sử dụng rộng rãi ngoài AT&T
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Over the period of these releases, the use and reputation of UNIX began to spread,
first within AT&T, and then beyond. An important contribution to this growing
awareness was the publication of a paper on UNIX in the widely read journal
Communications of the ACM ([Ritchie & Thompson, 1974]).
At this time, AT&T held a government-sanctioned monopoly on the US telephone system. The terms of AT&T’s agreement with the US government prevented
it from selling software, which meant that it could not sell UNIX as a product.
Instead, beginning in 1974 with Fifth Edition, and especially with Sixth Edition,
AT&T licensed UNIX for use in universities for a nominal distribution fee. The
university distributions included documentation and the kernel source code (about
10,000 lines at the time).
AT&T’s release of UNIX into universities greatly contributed to the popularity
and use of the operating system, and by 1977, UNIX was running at some 500 sites,
including 125 universities in the United States and several other countries. UNIX
offered universities an interactive multiuser operating system that was cheap yet
powerful, at a time when commercial operating systems were very expensive. It also
gave university computer science departments the source code of a real operating
system, which they could modify and offer to their students to learn from and
experiment with. Some of these students, armed with UNIX knowledge, became
UNIX evangelists. Others went on to found or join the multitude of startup companies selling inexpensive computer workstations running the easily ported UNIX
operating system.

Lịch sử của BSD và System V

Tháng 1/1979, phiên bản 7 của UNIX, được nâng cấp và cung cấp hệ thống file system. Bản phát hành này bao gồm rất nhiều công cụ mới bao gồm awk, sed, tar, uucp. Bourne shell và một FORTRAN 77 compiler. Bản phát hành thứ 7 rất có ý nghĩa bởi vì UNIX đã được chuyển hướng thành 2 biến thể: BSD và System V.

Thompson dành năm 1975/1976 để thăm các giáo sư ở trường đại học University of California ở Berkeley, là trường đại học cũ của ông. Tại đó, ông đã làm việc với rất nhiều học sinh và thêm rất nhiều tính năng cho UNIX. (Trong số các học sinh này, Bill Joy sau đó đã trở thành nhà đồng sáng lập Sun Microsystems). Qua thời gian rất nhiều công cụ và tính năng được phát triển tại Berkeley, bao gồm C shell, vi editor, một bản nâng cấp file system (the Berkeley Fast File System), sendmail, một Pascal compiler, và trình quản lý bộ nhớ ảo trên kiến trúc mới Digital VAX

Dưới tên Berkeley Software Distribution (BSD), phiên bản này của UNIX, bao gồm mã nguồn, được phân phối rộng rãi. Phiên bản được phân phối đầy đủ là 3BSD trong tháng 12/1979. (Sớm hơn là Berkeley-BSD và 2BSD).

Trong năm 1983, the Computer Systems Research Group tại University of California ở Berkeley phát hành 4.2BSD. Bản phát hành này rất có ý nghĩa bởi vì nó bao gồm các bản cài đặt hoàn tất của TCP/IP, bao gồm lập trình socket, và rất nhiều networking tools. Phiên bản trước đó 4.1BSD được phân phối rộng rãi cho các trường đại học trên khắp thế giới. Học cũng là những người tạo nên nền tảng cho SunOS (phát hành năm 1983), bản UNIX được bán bởi Sun.

Một số bản BSD khác như 4.3BSD năm 1986, và bán cuốn 4.4BSD năm 1993

1
2
3
4
5
6
The very first ports of the UNIX system to hardware other than the PDP-11
occurred during 1977 and 1978, when Dennis Ritchie and Steve Johnson
ported it to the Interdata 8/32 and Richard Miller at the University of Wollongong in Australia simultaneously ported it to the Interdata 7/32. The Berkeley
Digital VAX port was based on an earlier (1978) port by John Reiser and Tom
London. Known as 32V, this port was essentially the same as Seventh Edition
for the PDP-11, except for the larger address space and wider data types.

Trong khi đó, luật chống độc quyền tại mỹ, ép việc chia AT&T (bắt đầu từ giữa năm 1970, tới 1982). Kết quả là trong bản System III được phát hành năm 1981. System III được phát triển bởi AT&T’s UNIX Support Group (USG), có vài trăm nhân viên phát triển và nâng cấp UNIX và các ứng dụng. Phiên bản đầu tiên của System V vào năm 1983, và có hàng loạt các phiên bản được phát triển sau đó, năm 1989 System V Release 4 (SVR4), thời gian này System V kết hợp nhiều tính năng từ BSD bao gồm các tiện ích mạng.

Do vậy, rất nhiều BSD distributions sau nhưng năm 80s. UNIX có sẵn rất nhiều implementation chạy trên nhiều phần cứng. Các implementations này bao gồm SunOS và sau đó là Solaris, Digitals Ultrix và OSF/1 (sau được đổi tên HP Tru64 YNIX), IBM AIX, Hewlett-Parkard’s (HP’s) HP-UX, NeXT’s NeXTStep, A/UX cho Apple Macintosh, và Microsoft và SCO’s XENIX cho kiến trúc 32 bit Intel. Mỗi nhà cung cấp sản xuất một hoặc một vài chip architectures độc quyền, họ bán các hệ điều hành độc quyền.

Tóm tắt lịch sử Linux

Thuật ngữ Linux thường được nói đến là hệ điều hành UNIX-like với Linux kernel là một phần của nó. Tuy nhiên, điều này là không chính xác kể tử khi rất nhiều thành phần quan trọng được bao gồm các trong các bản phân phối Linux thương mại. Nguồn gốc thực sự của Linux là từ một dự án.

The GNU Project

Trong năm 1984, Richard Stallman, là một lập trình viên tài năng đặc biệt, người mà đã làm việc ở MIT, đã tạo ra một phiên bản miễn phí của UNIX. Stallman đã chống lại giới hạn về sự hợp pháp của việc độc quyền về hệ điều hành của các nhà cung cấp máy tính. Các giới hạn này nghĩa là việc mua máy tính mà không nhìn thấy mã nguồn của các phần mềm, chúng đang mua và họ chắc chắn không thể sao chép thay đổi và phân phối lại nó. Anh ấy cũng khuyến khích các lập trình viên để cạnh tranh với những người khác và tích hợp vào công việc của họ.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Stallman militated against the legal restrictions placed on proprietary operating systems by computer vendors. These restrictions meant that purchasers of computer software in general could not see the source code of the software they were
buying, and they certainly could not copy, change, or redistribute it. He pointed
out that such a framework encouraged programmers to compete with each other
and hoard their work, rather than to cooperate and share it.
In response, Stallman started the GNU project (a recursively defined acronym
for “GNU’s not UNIX”) to develop an entire, freely available, UNIX-like system,
consisting of a kernel and all associated software packages, and encouraged others
to join him. In 1985, Stallman founded the Free Software Foundation (FSF), a nonprofit organization to support the GNU project as well as the development of free
software in general.
When the GNU project was started, BSD was not free in the sense that Stallman meant. Use of BSD still required a license from AT&T, and users could
not freely modify and redistribute the AT&T code that formed part of BSD.
One of the important results of the GNU project was the development of the GNU
General Public License (GPL), the legal embodiment of Stallman’s notion of free
6 Chapter 1
software. Much of the software in a Linux distribution, including the kernel, is
licensed under the GPL or one of a number of similar licenses. Software licensed
under the GPL must be made available in source code form, and must be freely
redistributable under the terms of the GPL. Modifications to GPL-licensed software are freely permitted, but any distribution of such modified software must also
be under the terms of the GPL. If the modified software is distributed in executable form, the author must also allow any recipients the option of obtaining the
modified source for no more than the cost of distribution. The first version of the
GPL was released in 1989. The current version of the license, version 3, was
released in 2007. Version 2 of the license, released in 1991, remains in wide use,
and is the license used for the Linux kernel. (Discussions of various free software
licenses can be found in [St. Laurent, 2004] and [Rosen, 2005].)
The GNU project did not initially produce a working UNIX kernel, but did
produce a wide range of other programs. Since these programs were designed to
run on a UNIX-like operating system, they could be, and were, used on existing
UNIX implementations and, in some cases, even ported to other operating systems. Among the more well-known programs produced by the GNU project are the
Emacs text editor, GCC (originally the GNU C compiler, but now renamed the
GNU compiler collection, comprising compilers for C, C++, and other languages),
the bash shell, and glibc (the GNU C library).
By the early 1990s, the GNU project had produced a system that was virtually
complete, except for one important component: a working UNIX kernel. The GNU
project had started work on an ambitious kernel design, known as the GNU/HURD,
based on the Mach microkernel. However, the HURD was far from being in a form
that could be released. (At the time of writing, work continues on the HURD,
which currently runs only on the x86-32 architecture.)
Because a significant part of the program code that constitutes what is commonly known as the Linux system actually derives from the GNU project, Stallman prefers to use the term GNU/Linux to refer to the entire system. The
question of naming (Linux versus GNU/Linux) is the source of some debate
in the free software community. Since this book is primarily concerned with
the API of the Linux kernel, we’ll generally use the term Linux.
The stage was set. All that was required was a working kernel to go with the otherwise complete UNIX system already produced by the GNU project.

Linux Kernel

Trong năm 1991, Linus Torvalds, một học sinh Phần Lan tại trường Đại học của Helsinki, đã viết một hệ điều hành cho máy tính Intel 80386 của ông. Trong một khóa học, ông phải sử dụng Minix, một hệ điều hành nhỏ UNIX-like được phát triển vào giữa năm 80 của thế kỷ trước bởi Andrew Tanenbaum, một giáo sư Đại học tại Holland. Tanenbaum tạo ra Minix. The Minix kernel có thể build và chạy trên hệ thống 386, Tuy nhiên, nó được sử dụng như là một công cụ dạy học, nó được thiết kế phụ thuộc vào kiến trúc phần cứng, và nó không sử dụng được hết khả năng của vi xử lý 386.

Torvalds bắt đầu dự án tạo ra một kernel có đầy đủ tính năng của UNIX kernel chạy trên 386. Vài tháng sau, Torvalds phát triển một kernel cho phép ông có thể biên dịch và chạy được rất nhiều GNU programs. Sau đó 5-10-1991, Torvalds yêu cầu sự giúp đỡ của các lập trình viên khác.

1
2
3
4
5
6
7
8
9
10
11
12
Do you pine for the nice days of Minix-1.1, when men were men
and wrote their own device drivers? Are you without a nice
project and just dying to cut your teeth on a OS you can try to
modify for your needs? Are you finding it frustrating when
everything works on Minix? No more all-nighters to get a nifty
program working? Then this post might be just for you. As I
mentioned a month ago, I’m working on a free version of a
Minix-look-alike for AT-386 computers. It has finally reached the
stage where it’s even usable (though may not be depending on
what you want), and I am willing to put out the sources for wider
distribution. It is just version 0.02 . . . but I’ve successfully run
bash, gcc, gnu-make, gnu-sed, compress, etc. under it.

Theo sau truyền thống của UNIX đều kết thúc với chữ X, kernel này được gọi là Linux. Ban đầu Linux được đặt dưới rất nhiều giấy phép giới hạn, nhưng Torvalds sớm tạo nó có sẵn dưới giấy phép GNU GPL.

Rất nhiều lập trình viên khác tham gia với Torvalds trong quá trình phát triển của Linux, thêm rất nhiều tính năng như nâng cấp file system, hỗ trợ networking, thiết bị in, hỗ trợ đa vi xử lý. Tháng 4 1994, các lập trình viên đã phát hành phiên bản 1.0. Linux 1.2 vào tháng 3/1995. phiên bản 2.0 vào tháng 6/1996, Linux 2.2 vào 1/1999, Linux 2.4 vào 1/2991. 2.5 tháng 11/2001, 2.6 vào tháng 12/2003

An aside: the BSDs

Linux kernel version numbers

Ports to other hardware architectures

Linux distributions

Các chuẩn

Tổng kết

Hệ thống UNIX được phát triển đầu tiên 1969 trên máy tính Digital PDP-7 minicomputer bởi Ken Thompson tại Bell Laboratories (của AT&T). hệ điều hành lấy nhiều ý tưởng và được chơi chữ theo tên MULTICS system. Năm 1973, UNIX được viết cho PDP-11 và được viết lại bằng C, một ngôn ngữ được thiết kế và cài đặt tại phòng thí nghiệm Bell bởi Dennis Ritchie. Để hợp pháp hóa việc bán UNIX, AT&T đã phân phối các hệ thống tới các trường đại học trên danh nghĩa. Các phân phối này bao gồm cả mã nguồn, và trở nên rất nổi tiếng trong trường đại học, từ đó nó cung cấp một hệ điều hành rẻ hơn mà mã nguồn được học và chỉnh sửa bởi các nhà khoa học máy tính và các học sinh.

Trường đại học California tại Berkeley đóng vai trò như nhà phát triển hệ thống UNIX. tại đây Ken Thompson và một số học sinh đã tốt nghiệp tại đây mở rộng hệ điều này. Năm 1979, trường đại học đã sản xuất các bản phân phối UNIX của họ, BSD, Các phân phối này được sử dụng rộng rãi và là nền tảng của rất nhiều bản UNIX thương mại.

Cùng với BSD là hệ thống System V.

Hai thứ khác nhau cùng dẫn tới việc phát triển hệ hống (GNU/) Linux. Một trong số đó là GNU Project được sáng lập bởi Richard Stallman. Những năm cuối thập niên 80. GNU Project đã hầu như hoàn tất, có thể phân phối miễn phí. Năm 1991 lấy cảm hứng bởi Minix kernel viết bởi Andrew Tanenbaum, Linux Torvalds đã xây dựng UNIX kernel cho kiến trúc Intel x86-32. Torvalds mời các lập trình viên khác tham gia với ông để phát triển kernel này. Nhiều lập trình viên khác đã làm vậy, qua thời gian, Linux đã mở rộng và chạy được trên rất nhiều kiến trúc phần cứng

Vấn đề portability problems (Người dịch: portability problems/ porting/ portability issues mình hiểu là để chạy trên nhiều phần cứng, đa nền tảng, …) trong UNIX và C implementations tồn tại từ những năm 80s. Ngôn ngữ C có chuẩn năm 1989 (C89), và được sửa đổi năm 1999 (C99). Lần đầu đọc chuẩn hóa operating system interface POSIX.1, phê chuẩn bởi tổ chức IEEE năm 1988, và như ISO standard năm 1990. Trong suốt những năm 1990, các chuẩn khác đề u được phác thảo bao gồm rất nhiều chuẩn của Single UNIX Specification. Năm 2001, gộp POSIX 1003.1-2001 và SUSv3 được phê duyệt. Chuẩn này được hợp nhất và mở rộng từ rất nhiều bản POSIX trước đó và Single UNIX Specifications trước đó. Trong năm 2008, sửa đổi và hoàn thiện gộp POSIX 1003.1-2008 và SUSv4.

Không giống như các bản thương mại UNIX implementations, Linux chia ra rất nhiều phân phối. Hậu quả là không có một bản “official” Linux distribution. Mỗi nhà phân phối Linux lại tạo ra các bản snapshot từ bản kernel hiện tại, với rất nhiều các bản vá được áp dụng. LSB phát triển và quảng cáo một tập các hệ thống Linux nhắm đén sử bảo đảm các ứng dụng có thể tương thích giữa các bản phân phối Linux, vì thế các ứng dụng đã được biên dịch và chạy ổn định trên các hệ thống Linux khác nhau.

Cùng học tiếng anh

notable: đáng chú ý
significant: có ý nghĩa

The linux programming interface

Giới thiệu

Mình là lập trình viên, mình thích nhiều thứ. System programming là điều thú vị đối với mình. Mình chưa biết gì cả. Chúng ta sẽ cùng học. Nội dung bài viết là phần dịch cuốn The Linux Programming Interface. Một số ý kiến cá nhân được thêm vào trong nội dung bài viết trong các dấu ngoặc tròn. Cuối bài viết sẽ gồm tổng kết của mình, có thể có một số bài luyện tập của mình đưa ra, lời khuyên, …

Chỉ thấy Linux, lập trình C chắc cũng khiến nhiều bạn bấm nút back và đọc bài khác. Đây là một cuốn sách nổi tiếng, và mình tin rằng các bạn sẽ học được rất nhiều từ sách. Mình mong rằng các bài dịch sẽ hữu ích cho các bạn.

Và đây là bài đầu tiên. Giới thiệu về cuốn sách.

Nhiệm vụ

Trong cuốn sách này tôi sẽ mô tả về Linux Programming Interface - về system calls, library functions, và low level interface được cung cấp bởi Linux, một phiên bản miễn phí của hệ điều hành UNIX. Các interfaces này đã được sử dụng, trực tiếp hoặc gián tiếp bởi tất cả các chương trình chạy trên Linux. Chúng cho phép các ứng dụng có thể thực thi các tác vụ như file I/O, tạo hoặc xóa các tập tin, thư mục, tạo mới các tiến trình, thực thi các chương trình, thiết lập đồng hồ, giao tiếp giữa các processes, threads trên cùng một máy tính và giao tiếp giữa các tiến trình chạy trên các máy tính khác nhau cùng một mạng. Đây là tập các low level interfaces, cũng được gọi là system programming interface.

Mặc dù tôi tập trung vào Linux, tôi cũng nói về các tiêu chuẩn và portablility issues, phân biệt rõ ràng và thảo luận về các chi tiết riêng về thảo luận các tính năng thông thường của hầu hết các bản UNIX implementations và các chuẩn POSIX và Single UNIX Specification. Do vậy, cuốn sách này cung cấp một cách toàn diện về UNIX/POSIX programming interface và có thể được sử dụng bởi các lập trình viên đang viết ứng dụng cho các hệ thống UNIX khác hoặc tập trung vào các ứng đa nền tảng

Đối tượng hướng đến

Cuốn sách này nhắm đến:

  • Các lập trình viên và các nhà thiết kế phần mềm xây dựng các ứng dụng cho Linux, các hệ thống UNIX khác, hay POSIX
  • Các lập trình viên ứng dụng chạy giữa Linux và các bản UNIX hoặc giữa Linux và các hệ điều hành khác
  • Các giáo viên, học sinh đang dạy và học Linux hoặc UNIX
  • những người quản lý hệ thống những “power users” muốn mở rộng hiểu biết về Linux/UNIX programming interface.

Tôi giả sử bạn đã có kinh nghiệm về lập trình, nhưng không có kinh nghiệm về lập trình hệ thống. Tôi cũng giả sử bạn có kinh nghiệm đọc code C, và biết sử dụng shell và các commands cơ bản của Linux/Unix. Nếu bạn là người mới Linux và UNIX., bạn sẽ tìm thấy các giúp đỡ trong chương 2.

Linux và UNIX

Cuốn sách này có thể hoàn toàn nói về các chuẩn UNIX (đó là, POSIX) bởi về hầu hết các tính năng tìm thấy trong các UNIX implementations cũng có trong Linux và ngược lại. Tuy nhiên, khi viết các portable applications là mục đích xứng đáng, nó cũng là quan trọng để mô tả Linux extensions tới các chuẩn UNIX. Cũng vì sự nổi tiếng của Linux. Mặt khác các extensions khác không chuẩn thỉnh thoảng lại cần thiết, vì lý do hiệu năng hoặc các access functionality không có sẵn trong chuẩn UNIX programming interface (Tất cả các bản UNIX implementtations cung cấp các nonstandard extensions với lý do này).

Vì thế, tôi viết cuốn sách này như là tiện ích cho lập trình viên làm việc với tất cả các bản UNIX implementations, Tôi cũng full coverage về các tính năng được chỉ định cho Linux. Các tính năng bao gồm:

  • epoll: một cơ chế để lấy đợc các notifications của các sự kiện vào ra.
  • inotify: một cơ chế để theo dõi sự thay đổi của các tập tin và các thư mục
  • capabilities: cơ chế để cấp quyền cho một tiến trình được thực thi bởi superuser
  • extended attributes
  • i-node flags
  • clone() system calls
  • /proc file system
  • Linux specific I/O, signals, timers, threads, shared libraries, interprocess communication, và sockets

Cách sử dụng và tổ chức

Bạn có thể sử dụng cuốn sách này theo ít nhất 2 cách.

  • Như là một tutorial hướng dẫn về Linux/UNIX programming interface. Bạn có có thể đọc từ đầu tới cuối. Sau mỗi chương hãy làm các bài tập
  • Như là tài liệu tham khảo toàn diện về Linux/UNIX programming interface.

Tôi đã nhóm các chương của cuốn sách này thành các phần như bên dưới.

  1. Nền tảng và các khái niệm: Lịch sử về UNIX, C, Linux, tổng quan về các chuẩn UNIX (chương 1); a programmer-oriented introduction to Linux and
    UNIX concepts (chương 2), và các khái niệm cơ bản về system programming trên Linux và Unix (chương 3).
  2. Các tính năng cơ bản của system programming interface: vào ra files (chương 4 và 5). Tiến trình (Chương 6). Cấp phát bộ nhớ (chương 7). users và groups (Chương 8). process cridential (chương 9); time (chương 10). system limits và options (chương 11); lấy thông tin hệ thống và tiến trình (chương 12).
  3. Các tính năng nâng cao của system programming interface: file IO buffering (chương 13). file system (Chương 14). file attributes (chương 15). extened attributes (chương 16). access control lists (chương 17). thư mục và links (chương 18). monitoring file event (chương 19); signals (chương 20 đến 22) và timers (chương 23)
  4. Process, Programs và threads: Việc tạo mới tiesng trình, dừng tiếng trình, theo dõi các tiến trình con, và thực thi chương trình (chương 24 đến 28) và POSIX threads (chương 29 đến 33).
  5. Advanced process và program topics: process groups, sessions, job control (chương 34), process priorities và scheduling (chương 35); process resources (chương 36). daemons (chương 37); writing secure privileged programs (chương 38); capabilities (chương 39); login accounting (chương 40);
    and shared libraries (chương 41 và 42).
  6. Interprocess communication (IPC): tổng quan về IPC (chương 43); pipes và FIFOS (chương 44). System V IPC - message queues, semaphores, shared memory (chương 45-48). memory mappings (chương 49). virtual memory operations (chương 50). POSIX IPC - message queues … chương 51 đến 54); file locking (chương 55).
  7. Sockets và network programming: IPC và network programming với socket (chương 56 đến 61)
  8. Advanced IO topics. terminals (chương 62). alternative IO models (chương 63), và pseudoterminal (chương 64).

Các chương trình mẫu

Tôi minh họa cách sử dụng hầu hết các interfaces được mô tả trong cuốn sách một cách ngắn gọn, các chương trình hoàn chỉnh, nhiều trong số chúng được thiết kế để cho phép bạn dễ dàng thử từ command line để xem các các system call và library functions hoạt động. Đúc kết lại, cuốn sách bao gồm rất nhiều ví dụ khoảng 15000 dòng code C và shell session logs.

Mặc dù việc đọc và thử các ví dụ là hiệu quả để bắt đầu, nhưng cách hiệu quả nhất để củng cố các khái niệm được thảo luận là viết code, thử sửa các chương trình mẫu để cố thực thi các ý tưởng hoặc viết một chương trình mới.

Tất cả source code trong cuốn sách là có sẵn và có thể tải xuống từ trang web của cuốn sách này. Mục đích và chi tiết của các chương trình được mô tả trong comments của mã nguồn. Makefiles được cung cấp để build các chương trình và đi kèm README file gửi tới chi tiết về chowng trình.

Source code là miễn phí để phân phối lại, sửa chữa với giấy phép GNU Affero General Public License (Affero GPL) version 3.

Các bài tập

Hầu hết các chương đều có các bài tập, thỉnh thoảng có gợi ý các các bài tập sử dụng các code mẫu. Các bài tập khác là những câu hỏi liên quan đến các khái niệm được thảo luận trong chương và cũng có các gợi ý cho các chương trình bạn có thể viết để củng cố hiểu biết của bạn. Ban có thể tìm thấy giải pháp để chọn bài tập ở Appendix F

Standards và portability

Thông qua cuốn sách này, tôi nói về các vấn đề portability issues. Bạn sẽ tìm thấy một cách thường xuyên liên quan đến các chuẩn, đặc biết là POSIX.1-2001 và Single UNIX Specification version 3 (SUSv3) standard. Bạn cũng sẽ tìm thấy chi tiết về các thay đổi.
Về các tính năng không chuẩn. Tôi sẽ biểu thị các phạm vi khác nhau trong các bản UNIX implementations. Tôi cũng highlight các tính năng quan trọng của LINUX, cũng như các khác biệt nhỏ giữa các implementation của system calls, và các thư viện trên Linux và các bản UNIX implementations. Nơi mà một tính năng không được chỉ ra, bạn có thể giả sử rằng nó là tính năng chuẩn xuất hiện hầu hết trong các bản UNIX implementations.

Tôi đã thử test hầu hết các chương trình mẫu được trình bày trong cuốn sách với Solaris, FreeBSD, Mac OS X, Tru64 UNIX và HP-UX. Để improve portability một vài tính năng của hệ thống, website cho cuốn sách này cung cấp một phiên bản thay thế của các ví dụ với các code mở rộng xuất hiện tỏng sách.

Linux kernel và C library versions

Cuốn sách tập trung chính vào Linux 2.6.x, kernel version được sử dụng rộng rãi nhất vào thời điểm tôi viết cuốn sách. Chi tiết về Linux 2.4 cũng được coverd. Tôi cũng chỉ ra những điểm khác biệt về Linux 2.4 và 2.6. Các tính năng mới trong 2.6.x chính xác là 2.6.34 sẽ được ghi lại.

Với sự tôn trọng tới thư viện C, tập trung vào GNU C library (glibc) version 2. Những điểm khác tỏng glibc 2.x version cũng được ghi chú

(Bây giờ Linux kernel đã có bản 5. rồi. Nhưng chúng ta vẫn cứ học theo cuốn sách này.)

Sử dụng progmramming interface từ ngôn ngữ khác.

Mặc dù các chương trình mẫu được viết bằng C, bạn có thể sử dụng interfaces được mô tả trong sách từ nhiều ngôn ngữ khác - ví dụ, các ngôn ngữ biên dịch như C++, Pascal, Modula, Ada, FORTRAN, D và ngôn ngữ scripting như Perl, Python, Ruby (Java là mô hình khác).

Tổng kết

Bài tiếp theo k khó nói về lịch sử của UNIX/Linux. Để sẵn sàng cho các bài tiếp. Chúng ta hãy bắt đầu bằng việc cài và sử dụng linux. Hãy sử dụng như hệ điều hành chính.

Đừng cố nhớ hãy sử dụng nó

Một số nguồn tài liệu khác

Kênh của Ariff Butt https://www.youtube.com/channel/UCMqUl4U_8LwHiXT09_ouzxQ
The Linux Command line http://linuxcommand.org/tlcl.php

Tranh thủ học tiếng anh

I give careful attention to: Tôi cũng nói rõ về

Thus, this book also provides a comprehensive description of : do vậy cuốn sách này cũng mô tả một cách toàn diện

This book could have been purely about:

PNUMBER

Đề bài

Đáp án

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
#include<math.h>
using namespace std;

int main(){
bool arr[1000001];
int a,b;
cin>>a>>b;
if(a<2) a=2;
for(int i=1;i<=b;i++){
arr[i] = true;
}
int sqr = sqrt(b);
for(int i=2;i<=sqr;i++){
if(arr[i]) {
for(int j=i*i; j<=b;j+=i){
arr[j] = false;
}
}
}
for(int i=a;i<=b;i++){
if(arr[i]){
cout<<i<<endl;
}
}
return 0;
}

POST

Đề bài

POST - A cộng B
Cho 2 số nguyên A và B . Hãy tính A + B .

Input
Gồm 1 dòng chứa 2 số nguyên A và B , cách bởi 1 dấu cách.

Output
Ghi ra tổng A+B .

Ví dụ
Input:
3 4

Output:
7

Gợi ý:
Sử dụng toán tử “+” .

Đáp án

1
2
3
4
5
6
7
8
9
#include <bits/stdc++.h>
using namespace std;

int main() {
int a, b;
cin>>a>>b;
cout<<a+b;
return 0;
}