Chương trình là gì — quan hệ với CPU, bộ nhớ và lưu trữ

Bài viết này nằm trong khóa Kiến thức nền tảng về CNTT, xây dựng từ đầu những kiến thức CNTT thực tế tối thiểu mà bạn cần để lập trình và vibe coding.
Chương trình là một chuỗi lệnh, khi bạn chạy nó thì nó được nạp vào bộ nhớ và CPU thực hiện từng lệnh một. Các sơ đồ cho thấy vì sao chỉ lưu thì chưa chạy, bắt đầu từ việc 3 bộ phận chia việc ra sao.

Bài viết này nói về những gì xảy ra bên trong máy tính khi một chương trình chạy.

Lưu file và chạy file là hai sự việc khác nhau bên trong máy tính.

Khác biệt đó giải thích được bằng việc 3 bộ phận CPU, bộ nhớ và lưu trữ đảm nhiệm những gì.

  • Chương trình là một chuỗi lệnh, chạy nó là đi từ trên xuống từng dòng một
  • Cách CPU, bộ nhớ và lưu trữ chia việc, và thứ gì mất đi khi tắt nguồn
  • Vì sao chỉ lưu thì chưa chạy — phần được ghi chỉ đi tới lưu trữ
  • Câu "hãy chạy" trong hướng dẫn trao gì cho môi trường chạy

Chương trình là một dãy lệnh, chạy nó là đi theo thứ tự từ trên xuống

Chương trình (program) là các lệnh bạn muốn máy tính thực hiện, xếp theo đúng thứ tự thực hiện.

Phần chữ mà con người đọc được là mã nguồn (source code), còn việc thực hiện từng lệnh một từ trên xuống là chạy (run / execute).

3 dòng xếp bên trái sơ đồ là nội dung của app.js, và CPU lúc nào cũng chỉ nhận 1 dòng.

Dòng chỉ ghi nhớ giá trị thì không đưa gì lên màn hình.

Khi dòng thứ 3 xong thì lượt chạy kết thúc, giá trị nhớ giữa chừng cũng không còn lại.

Nếu một lệnh giữa chừng không thực hiện được thì lượt chạy kết thúc ngay ở đó.

Trong 3 dòng sau, cái tên gokei ở giữa không được viết ở đâu cả.

console.log("In ra tổng");
gokei();
console.log("Đã xong");

"Dừng vì lỗi" nghĩa là lượt chạy kết thúc trước khi tới dòng cuối.

Dòng đầu vẫn hiện lên màn hình, dòng giữa cho ra dòng chữ báo lỗi, còn dòng cuối kết thúc mà không được đọc.

Chương trình là chuỗi lệnh thực hiện từ trên xuống

Chương trình là những việc bạn muốn máy làm, viết ra theo thứ tự.

Chạy là thực hiện chuỗi đó từng lệnh một từ trên xuống, và nếu một dòng giữa chừng không thực hiện được thì các dòng sau nó kết thúc mà không được đọc.

CPU, bộ nhớ và lưu trữ đảm nhiệm những gì

"Máy tính" trong sơ đồ trước gồm 3 bộ phận có vai trò khác nhau.

Bộ phận thực hiện từng lệnh một là CPU (Central Processing Unit), bộ phận chỉ chứa nội dung trong lúc đang chạy là bộ nhớ (memory), còn bộ phận giữ lại kể cả khi tắt nguồn là lưu trữ (storage).

Cách CPU, bộ nhớ và lưu trữ chia việc
CPUprocessorBộ nhớRAMLưu trữSSD / diskĐọc từng lệnhrồi thực hiệnChứa thứ đang chạyvà giá trị tạmLưu giữcác fileKhông còn lại gìBị xóaCòn lại"Thiếu bộ nhớ"là ở đây"Thiếu dung lượng"là ở đây
Bên trái là bộ phận, ở giữa là việc đảm nhiệm, bên phải là có còn lại khi tắt nguồn hay không. Cột ngoài cùng bên phải là manh mối khi bạn đọc các thông báo cảnh báo.
1 file tách thành các lệnh và tới CPU từng lệnh một
app.js tronglưu trữLệnh dòng 1Lệnh dòng 2Lệnh dòng 3CPU chạy từnglệnh mộtBộ nhớ
app.js trong lưu trữ ở bên trái là 1 file. Khi được nạp vào bộ nhớ, nó tách thành các lệnh bên trong, và CPU bên phải nhận từng lệnh một theo thứ tự từ trên xuống.

1 file nằm trong lưu trữ trở thành một chuỗi lệnh bên trong bộ nhớ, và CPU chỉ nhận 1 lệnh trong số đó.

Giá trị giữa chừng của phép tính cũng nằm trong bộ nhớ, còn file trong lưu trữ thì không bị thay đổi trong lúc chạy.

3 bộ phận này được chia trong 1 máy tính như sau.

3 bộ phận bên trong máy tính của bạn
Máy tính của bạn
Lưu trữ
  • File app.js đã lưu
  • Vẫn còn nguyên kể cả khi tắt nguồn
Bộ nhớ
  • Nội dung app.js đã được nạp vào
  • Các giá trị nhớ giữa chừng như 150 và 200
  • Tắt nguồn là mất sạch
CPU
  • Chỉ nhận đúng 1 lệnh đang thực hiện
  • Các lệnh đã xong thì không còn giữ nữa
Bên ngoài là máy tính của bạn. Lưu trữ giữ lại các file bạn đã lưu, còn bộ nhớ chỉ chứa thứ đang chạy ngay lúc này.

Thứ di chuyển chỉ là nội dung; bản thân app.js trong lưu trữ vẫn nằm nguyên đó.

Thứ vào bộ nhớ chỉ là cái đang chạy lúc này và các giá trị giữa chừng của nó.

Ranh giới này cũng xuất hiện trong cách đọc các cảnh báo máy tính đưa ra.

"Thiếu bộ nhớ" là chuyện của bộ nhớ, nên xóa file thường không làm nó tăng lên.

"Thiếu dung lượng trống" là chuyện của lưu trữ, cái này xóa file thì tăng lên.

Chỗ để cất và chỗ để chạy là hai chỗ khác nhau

Chỗ cất các file là lưu trữ, chỗ đặt thứ đang chạy lúc này là bộ nhớ, còn thứ thực hiện từng lệnh một là CPU.

Thứ đã ghi vào lưu trữ vẫn còn khi tắt nguồn, còn thứ nằm trong bộ nhớ thì mất đi.

Vì sao chỉ lưu file thì chưa chạy

Lưu là ghi các ký tự của mã nguồn vào lưu trữ.

Nơi được ghi vào là bên trong thư mục my-app, ứng dụng đặt chỗ bạn đang làm.

Khi lưu, file được đặt vào chỗ nào trong lưu trữ
Lưu trữ
my-app (thư mục của ứng dụng đặt chỗ bạn đang làm)
  • app.js — mã nguồn bạn đã lưu
  • Lưu lại lần nữa thì nội dung file này thay đổi
Các thư mục khác
  • File ảnh và tài liệu
  • Các file không chạy cũng nằm nguyên ở đó
Bên ngoài là lưu trữ. my-app là thư mục của ứng dụng đặt chỗ bạn đang làm, và app.js bạn lưu nằm bên trong đó.

CPU không bao giờ tự đi đọc file đặt ở đây.

Ở trạng thái mới chỉ lưu, chưa một lệnh nào được thực hiện.

Thao tácLưu trữBộ nhớMàn hình
Chỉ lưuapp.js được ghi vàoKhông có gì vàoKhông hiện gì
Lưu rồi chạyapp.js vẫn nguyênĐược nạp vào và bắt đầu chạyHiện ra 350

Hàng chỉ lưu dừng lại ở lưu trữ, và vì không có gì vào bộ nhớ nên CPU không nhận được lệnh nào.

Màn hình không có gì xảy ra vì bạn chưa ra lệnh chạy.

Khi bạn chạy lại, nội dung cũ trong bộ nhớ bị bỏ đi và file mới được nạp vào.

Nội dung bạn sửa chạy đúng vào lúc lần nạp lại đó xảy ra.

Đây là lý do hướng dẫn viết "hãy chạy lại".

Lưu không phải là đã có hiệu lực

Lưu chỉ đi tới bước ghi các ký tự vào lưu trữ.

Chương trình đang chạy vẫn đi tiếp với nội dung ở thời điểm nó được nạp, nên dù bạn sửa file thì kết quả trên màn hình cũng không đổi cho tới khi bạn chạy lại.

"Hãy chạy" nghĩa là trao file cho môi trường chạy

Thứ nạp file vào bộ nhớ và đưa lệnh tới CPU là môi trường chạy (runtime, phần mềm đọc mã nguồn và cho CPU thực hiện các lệnh).

Câu "hãy chạy" trong hướng dẫn nghĩa là trao file cho môi trường chạy này.

Thứ bạn tự gõ chỉ là 1 dòng ngoài cùng bên trái.

1 dòng đó xuất hiện trong hướng dẫn dưới dạng thế này.

# Chạy mã nguồn JavaScript (Node.js)
node app.js

# Chạy mã nguồn Python
python app.py

1 dòng này là câu lệnh (command, chỉ thị bằng chữ để nói cho phần mềm biết phải làm gì).

Đầu câu là tên môi trường chạy, phía sau là tên file mã nguồn, giữa hai phần ngăn nhau bằng dấu cách.

Bên trong 1 câu lệnh
1 câu lệnh (node app.js)
Đầu câu — tên môi trường chạy
  • node — đọc mã nguồn JavaScript
  • python — đọc mã nguồn Python
Phía sau — file bạn trao
  • app.js — tên file mã nguồn bạn đã lưu
  • Môi trường chạy nạp file này từ lưu trữ
  • Đôi khi người ta viết một tên ngắn đã quy ước thay cho tên file
Bên ngoài là 1 câu lệnh, 2 phần bên trong là đầu câu và phía sau. Các câu lệnh xuất hiện trong hướng dẫn đều đọc được bằng cách tách ra 2 phần này.

Nhìn đầu câu là biết cần môi trường chạy nào, nhìn phía sau là biết file nào được nạp.

Màn hình để gõ 1 dòng này thì bài "Môi trường phát triển là gì" trong khóa học này sẽ nói tới.

Dù ngôn ngữ có đổi, cách đọc vẫn thế: đầu câu là phần mềm nhận, phía sau là thứ bạn trao cho nó.

Còn một chỗ nữa mà câu chữ trong hướng dẫn khác nhau.

Sau khi bạn ra lệnh chạy, cách kết thúc chia làm 2.

Sau khi ra lệnh chạy, cách kết thúc chia làm 2
Ra lệnhchạyChạy tới dòngcuối rồi kết thúcKết quả hiện ra,về lại ô nhậpCó lệnh chờrequest liên tụcKhông kết thúccho tới khi dừng
Từ 1 lệnh chạy, sơ đồ tách thành nhánh trên và nhánh dưới. Nhánh trên là chương trình kết thúc ở dòng cuối, nhánh dưới là chương trình không kết thúc cho tới khi bạn dừng.

Nhánh dưới là loại chương trình mà hướng dẫn bảo bạn cứ để nó chạy tiếp.

Cũng có môi trường chạy tự nạp lại mỗi lần bạn lưu.

Kể cả khi đó, màn hình chỉ đổi sau khi file mới đã được nạp.

Ra lệnh chạy nghĩa là trao đi một file

"Hãy chạy" nghĩa là hãy trao file cho phần mềm gọi là môi trường chạy.

Cách trao là 1 dòng như node app.js, và có loại chạy tới dòng cuối rồi kết thúc, có loại không kết thúc cho tới khi bạn dừng.

QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Khi mới chỉ lưu mã nguồn, file đó nằm ở bộ phận nào?

Câu 2"Chạy một chương trình" nghĩa là máy tính làm gì?

Câu 3Trong câu lệnh node app.js, chữ node ở đầu chỉ cái gì?