- VisualStudio2022
- pprof-Hướng dẫn sử dụng nó trong bản mạng trực tiếp
- Triển khai C# các loại hộp chọn nhiều màu lựa chọn thả xuống, cây lựa chọn nhiều màu lựa chọn thả xuống và các nút tối đa
- [Ghi chú học tập] Cơ sở dữ liệu cấu trúc: cat tree
Nhiều nhiệm vụ được thực hiện trong cùng một khoảng thời gian, nhưng không nhất thiết phải cùng một lúc. Ví dụ, trên CPU lõi đơn, hệ điều hành đạt được khả năng xử lý đồng thời bằng cách chuyển đổi nhanh chóng các tác vụ.
Bổ sung: Tính song song, trong đó nhiều tác vụ thực sự chạy đồng thời, thường yêu cầu hỗ trợ CPU đa lõi, với mỗi lõi chạy một tác vụ cùng một lúc.
Tăng tốc thông qua tính song song.
S=1/((1-P)+P/N).
P: Tỷ lệ các phần chương trình có thể song song hóa.
N: Số lượng bộ xử lý hoặc luồng thực thi được sử dụng bằng cách song song hóa.
Ví dụ
Nếu 95% chương trình có thể được song song hóa (bộ xử lý=4096), tốc độ tăng tốc tối đa theo lý thuyết là x20.
Đảm bảo rằng các tiến trình hoặc luồng đồng thời không thực thi một số chương trình nhất định (Phần quan trọng) cùng một lúc.
Cạnh tranh một biến mà hai quá trình muốn đọc hoặc cập nhật đồng thời.
Phần quan trọng: Phần mã truy cập tài nguyên được chia sẻ.
Giải pháp là triển khai loại trừ lẫn nhau: Tại một thời điểm nhất định, chỉ một quy trình có thể chạy trong phần quan trọng.
Vậy làm thế nào để đạt được sự loại trừ lẫn nhau? (Xây dựng phần quan trọng).
Khóa.
Semaphores.
Màn hình.
Tin nhắn.
Điều kiện cuộc đua cần thiết để tạo ra sự cạnh tranh:
Một lỗi (ví dụ: bản cập nhật bị mất) xảy ra do nhiều quá trình 'đua nhau' một cách không được kiểm soát thông qua một phần mã phi nguyên tử.
Tình trạng chạy đua xảy ra khi đầu ra phụ thuộc vào thời gian hoặc trình tự của các sự kiện không được kiểm soát.
Xảy ra nếu nhiều luồng thực thi nhập các phần quan trọng của mã vào cùng một thời điểm và cả hai đều cố gắng cập nhật dữ liệu được chia sẻ.
Tiền gửi ngân hàng điển hình.
(Thực hiện LOCK):
Điểm mấu chốt: Tạo phương thức cập nhật public voidsynchronous update(){} của lớp ngân hàng.
lớp công khai Bank_account { riêng tư int bal = 0; công khai Bank_account(int start_balance) { bal = start_balance; } công khai void cập nhật được đồng bộ hóa (int money) { bal = bal + money; } } lớp công khai DepositTask triển khai tài khoản Bank_account riêng tư; int money; //Phương thức xây dựng public Mythread(Bank_account account,int money){ this.account=account; this.amount=amount; } public void run(){ account.updata(amount); } } public class main{ public static void main(String args[]){ Bank_accountbank=new Bank_account(100); DepositTask(bank,5); DepositTask task2=new DepositTask(bank,5); t2=Chủ đề mới(task2); t1.start; t2.start; thread1.join();
Phối hợp: một quá trình muốn một quá trình khác có thể truy cập được kết quả cần thiết.
Ví dụ điển hình: vấn đề nhà sản xuất-người tiêu dùng (hộp sếp-nhân viên).
Việc thực thi chuyển sang phần khác của bộ nhớ.
Ngữ cảnh của một luồng bao gồm: vị trí thực thi chương trình hoặc hàm + vị trí của chuỗi lệnh gọi hàm trong ngăn xếp.
Đặt vào chương trình (hoặc chức năng) mà luồng đang thực thi Vị trí nơi chương trình hoặc chức năng được thực thi.
Đặt vào ngăn xếp để ghi nhớ chuỗi các lệnh gọi hàm mà luồng đang thực hiện khi nó thực thi chương trình (mỗi luồng cần có ngăn xếp riêng).
Triển khai C: Bộ đếm chương trình (PC)+Con trỏ ngăn xếp (SP).
Ba bước để chuyển ngữ cảnh:
Hủy lịch trình luồng đang chạy –Lưu các thanh ghi PC và SP CPU của luồng đang chạy –Bắt buộc để luồng đó tiếp tục thực thi chính xác ở vị trí còn lại.
Bộ lập lịch chọn luồng sẵn sàng 'tốt nhất' để chạy tiếp theo –Cắt theo thời gian, mức độ ưu tiên, thiếu –Kiến trúc phần cứng, v.v. .
Khôi phục nội dung đăng ký trở lại thanh ghi PC & SP –Thread tiếp tục ở nơi nó dừng lại lần cuối (PC được tải lần cuối).
Như đã đề cập trong phần trước, việc đồng bộ hóa có thể đạt được thông qua cạnh tranh và cạnh tranh là để xử lý việc loại trừ lẫn nhau các phần quan trọng (Phần quan trọng: các đoạn mã truy cập tài nguyên được chia sẻ) (Tại một thời điểm nhất định, chỉ một quy trình có thể chạy với phần quan trọng) . Có bốn cách để thực hiện loại trừ lẫn nhau: Khóa, ngữ nghĩa, giám sát và nhắn tin. Trong phần trên, Khóa được sử dụng để thực hiện vấn đề tiền gửi ngân hàng (chủ yếu sử dụng đồng bộ hóa). thực hiện loại trừ lẫn nhau.
Bộ đếm (đại diện cho các tài nguyên có sẵn), .
wait()/P(): Giảm Bộ đếm đi 1. Nếu bộ đếm âm, điều đó có nghĩa là có một số quy trình đang chờ, thì đó là quy trình mà khối chỉ muốn nhập.
signal()/V(): Tăng Bộ đếm lên 1 (cho biết tài nguyên đã được giải phóng/một quy trình được nhập/có ít quy trình hơn trong hàng đợi).
Ví dụ điển hình: vấn đề gửi tiền ngân hàng, sử dụng semaphore.
public class Bank_account{ Private int bal=0; Private Semaphone mutex =1;//Sử dụng semaphores để đạt được sự loại trừ lẫn nhau chỉ một quá trình chạy trong phần quan trọng public void Bank_account(int Balance){ bal=balance } public void updata(int money) ){ mutex.wait(); bal=bal+số tiền;
Trên thực tế, Java đã giúp chúng ta tạo ra lớp semaphone. Chúng ta chỉ cần import java.util.concurrent.Semaphore để trực tiếp tạo một semaphore mới:
Tạo một semaphore --> Tạo một phiên bản có thể chạy được và đặt semaphore làm tham số ---> Tạo một phiên bản luồng và đặt nó vào phiên bản có thể chạy được.
import java.util.concurrent.Semaphore; public class SemaphoreExample { public static void main(String[] args) { // Tạo một semaphore, cho phép tối đa 1 thread truy cập Semaphore cùng lúc semaphore = new Semaphore(1); // Tạo nhiều thread truy cập cùng một tài nguyên for (int i = 1; i <= 5; i++) { Thread thread = new Thread(new Task(semaphore), "Thread-" + i); thread.start(); } } } // Xác định lớp nhiệm vụ Class thực hiện Runnable { semaphore riêng tư semaphore; run () { try { System.out.println(Thread.currentThread().getName() + " đang chờ giấy phép..."); semaphore.acquire(); // Nhận quyền System.out.println(Thread.currentThread().getName() + " đã có giấy phép!"); // Mô phỏng quyền truy cập tài nguyên Thread.sleep(2000); e) { e.printStackTrace(); } cuối cùng { System.out.println(Thread.currentThread().getName() + " sẽ phát hành allow..."); semaphore.release(); // Cấp phép phát hành} } }
Tiếp theo, chúng ta hãy xem cách triển khai semaphore trong Java:
Tạo bộ đếm+tạo P+tạo V.
public class Semaphore { Private int count = 0; public Semaphore(int init_val) { count = init_val; //Bộ đếm ban đầu/số lượng tài nguyên/số tiến trình được phép truy cập khi được gọi} public được đồng bộ hóa void P() { count = count - 1; while (count < 0) wait(); // tại sao không dùng 'if'? để ngăn chặn sự đánh thức giả} được đồng bộ hóa công khai void V() { count = count + 1; một, đánh thức người phục vụ; */ if (count <= 0) notificationAll(); /*tại sao không sử dụng 'notify()' */ } }
Chúng ta cần chú ý đến những điểm sau:
Trong P, tại sao số lượng <0 yêu cầu chờ đợi? Vì số lượng nhỏ hơn 0 nên có nghĩa là có quá trình chờ trong hàng đợi, nên đương nhiên bạn cũng cần đợi. Nếu bộ đếm bằng hoặc lớn hơn 0 nghĩa là không có ai ở trước mặt bạn nên bạn có thể vào mà không cần chờ đợi.
Trong V, tại sao chỉ thông báo cho All khi đếm <= 0? Tương tự, có nghĩa là có hàng đợi nên cần thông báo. Nếu không có hàng chờ thì khi vào trực tiếp không cần thông báo.
while (count < 0) wait(); tại sao không sử dụng 'if'? Để ngăn chặn việc đánh thức sai + notificationAll được sử dụng trong mã.
1.Để ngăn chặn sự đánh thức giả, 2. chúng tôi sử dụng notificationAll() trong P(). Trong trường hợp cạnh tranh đa luồng, while có thể đảm bảo rằng chỉ những luồng đáp ứng các điều kiện mới có thể tiếp tục thực thi và các luồng còn lại sẽ đợi lại .
thông báoAll() tại sao không thông báo? khái niệm thông báo + khái niệm thông báo Tất cả + nhược điểm của notfiy (những cái không đáp ứng các điều kiện sẽ được đánh thức và chuyển sang trạng thái chờ, những cái đáp ứng các điều kiện không thể được đánh thức + một số luồng bị chết đói).
1. thông báo() Đánh thức một chuỗi đang chờ ngẫu nhiên 2. thông báoTất cả là đánh thức tất cả các chuỗi đang chờ 3. khi chúng ta sử dụng thông báo(), nó có thể đánh thức một chuỗi chưa sẵn sàng, trong khi chuỗi hài lòng không thể được đánh thức. up. Việc sử dụng notification() có thể khiến một số chủ đề bị chết đói.
Đánh thức sai đề cập đến hiện tượng quá trình bị đánh thức bất ngờ khi luồng không đáp ứng các điều kiện và không nhận được thông báo rõ ràng (chẳng hạn như thông báo() hoặc thông báoAll()).
Tài nguyên sẵn có ban đầu là 0 ---> nhà sản xuất tạo ra tài nguyên có sẵn (siganl()) ---> người tiêu dùng tiêu thụ tài nguyên (wait()).
Lấy ông chủ và nhân viên làm hộp làm ví dụ: ban đầu hộp trống -> sếp xác định kích thước hộp -> nhân viên lấy kích thước để làm hộp.
lớp công khai BoxDimension{ riêng tư int dim = 0; riêng tư Semaphore sem = 0; công khai void put(int d) {dim = d; //sem+1; ) { sem.wait();//sem-1; sem.P() return dim;
Lưu ý: Lúc đầu, Semaphore sem =0, có nghĩa là không có tài nguyên; trước tiên, ông chủ xác định kích thước và sau đó đánh dấu các tài nguyên có sẵn +1 và thông báo cho nhân viên trước xem họ có thể truy cập tài nguyên hay không và sau đó trả về dim.
Cuối cùng, bài viết này về việc triển khai đồng bộ hóa, các vấn đề về phần quan trọng, khóa và ngữ nghĩa có ở đây. Nếu bạn muốn biết thêm về việc triển khai đồng bộ hóa, các vấn đề về phần quan trọng, khóa và ngữ nghĩa, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Trong một cuộc phỏng vấn xin việc, một người bạn của tôi đã được yêu cầu viết một chương trình để đo dung lượng RAM khả dụng. Câu trả lời được mong đợi là sử dụng malloc() theo kiểu tìm kiếm nhị phân: phân bổ các phần bộ nhớ ngày càng lớn hơn cho đến khi bạn nhận được thông báo lỗi, giảm kích thước phần và sau đó
Tôi đang kiểm tra mức tiêu thụ bộ nhớ của một tab cụ thể trong Chrome thông qua Trình quản lý tác vụ. Nó cho thấy dung lượng RAM tôi đang sử dụng khá lớn: Tuy nhiên, khi tôi chụp nhanh heap trong các công cụ dành cho nhà phát triển, nó hiển thị kích thước nhỏ hơn vài lần: Làm sao có thể như vậy được? Câu trả lời hay nhất là không
Có cách nào di động, chạy trên cả .Net và Mono trên nhiều hệ điều hành được hỗ trợ, để chương trình biết dung lượng RAM (tức là bộ nhớ vật lý chứ không phải bộ nhớ ảo) có sẵn trên máy đang chạy không? Ngữ cảnh là một chương trình có yêu cầu về bộ nhớ là "vui lòng sử dụng
Có ai biết có cách nào để xem tất cả Chế độ xem, LinearLayout, TextView, v.v. trong dự án studio android không? Tôi đang sử dụng trình xem phân cấp trong màn hình thiết bị Android bằng xml
Rất đơn giản, tôi muốn chạy một lệnh/chương trình bên ngoài từ tập lệnh Python và sau khi hoàn thành, tôi cũng muốn biết nó đã tiêu tốn bao nhiêu thời gian CPU. Chế độ cứng: Chạy song song nhiều lệnh sẽ không còn gây ra kết quả tiêu thụ CPU không chính xác. Câu trả lời hay nhất trên UNIX: (a)
Tôi cần lặp số lượng X về phía trước và số tiền X lùi lại trong mảng trả về chỉ mục mới, cho chỉ mục và phạm vi mảng. Nếu vòng lặp tiến tới cuối mảng thì nó sẽ tiếp tục ở đầu mảng. Nếu vòng lặp đến đầu mảng trong khi quay ngược lại, nó sẽ tiếp tục ở cuối mảng. Ví dụ, số
Có điều gì tương tự như Hoạt động tối đa trong ứng dụng Android không? Tôi đang thắc mắc vì tôi đang nghĩ đến việc tạo một ứng dụng âm thanh có chức năng làm nhạc chuông. Nó sẽ có khoảng 40 hoạt động. Nhưng chỉ có 1 người sẽ tiếp tục chạy. Thế là quá nhiều
Có cách nào để hạn chế độ cong của kiểu trình bày này không? Tôi biết hệ thống tự động cuộn tròn dựa trên nội dung trong Chế độ xem của trình điều khiển khung nhìn mà chúng tôi trình bày theo phương thức. Nhưng đó là trên iPad của tôi
Tôi đang viết một ứng dụng Java cần kiểm tra dung lượng RAM tối đa có sẵn trong hệ thống (không phải RAM có sẵn cho VM). Có một cách di động để làm điều này? Cảm ơn rất nhiều :-) Câu trả lời hay nhất JMX Bạn có thể truy cập java.la
Tôi thấy rằng nó đang sử dụng 600 MB RAM, thậm chí nhiều hơn cả Visual Studio (tôi đã đóng nó khi nó đạt tới 400 MB RAM). Câu trả lời hay nhất Trình soạn thảo phi tiêu dựa trên Eclipse và Eclips
Câu hỏi này đã có câu trả lời: Java lấy bộ nhớ khả dụng (10 câu trả lời) Đã đóng 7 năm trước. Giả sử tôi có một JVM dành riêng để chạy một chương trình, làm cách nào để nhận được lượng RAM được phân bổ cho JVM? Giả mạo
Tôi vừa viết một chương trình sử dụng Eclipse mất nhiều thời gian để thực thi. Nó thậm chí còn mất nhiều thời gian hơn vì nó chỉ tải CPU của tôi lên 25% (Tôi cho rằng điều này là do tôi đang sử dụng lõi tứ và chương trình chỉ sử dụng một lõi). Có cách nào để làm
Tôi đã viết một bộ giải Rubik's Cube 2x2x2 sử dụng thuật toán tìm kiếm theo chiều rộng để giải các vị trí khối do người dùng nhập. Chương trình này giải được khối lập phương. Tuy nhiên, khi tôi gặp phải một vấn đề khó giải quyết mà tôi tìm hiểu sâu trong quá trình tìm kiếm của mình, tôi đã hết dung lượng lưu trữ. máy tính của tôi
Tôi đang cố chạy đồng bộ nhiều luồng fio, nhưng khi số lượng luồng tăng lên, máy tính của tôi hết bộ nhớ. Có vẻ như mỗi luồng fio chiếm khoảng 200 MB RAM. Điều đó đang được nói, có cách nào để có mức sử dụng bộ nhớ tối đa cố định cho mỗi luồng không? cài đặt
Tôi đã phát triển một cái trong Matlab bằng hàm "fitctree" (link: https://de.mathworks.com/help/stats/classificationtree-class.html)
Tôi có một quy trình .NET, vì lý do tôi không tham gia, quy trình này đang tiêu tốn rất nhiều RAM. Điều tôi muốn làm là triển khai giới hạn trên về dung lượng RAM mà quá trình này có thể sử dụng. Có cách nào để làm điều này? Gần nhất tôi tìm thấy là Process.GetCurre
Bạn có thể đã thấy rất nhiều ứng dụng Thông tin hệ thống hiển thị thông tin như thời lượng pin còn lại hoặc thậm chí thông tin hệ thống như bộ nhớ. Theo cách tương tự, có cách nào để truy xuất lượng RAM hiện có từ ứng dụng của tôi để tôi có thể quyết định tốt hơn khi nào
Tôi chưa bao giờ là một fan hâm mộ lớn của MFC, nhưng đó không phải là vấn đề. Tôi đọc được thông tin Microsoft sẽ phát hành phiên bản MFC mới vào năm 2010, điều này khiến tôi cảm thấy kỳ lạ - tôi tưởng MFC đã chết (tôi thực sự không có ác ý). MFC có được sử dụng cho mục đích phát triển mới không?
Tôi đang làm việc trên một máy có cài đặt 8 GB RAM và tôi đang cố gắng xác định theo chương trình lượng RAM được cài đặt trong máy. Tôi đã thử sử dụng sysctlbyname() để lấy dung lượng bộ nhớ đã cài đặt, nhưng dường như nó bị giới hạn trong việc trả về số nguyên 32 bit đã ký. ui
Về cơ bản, tôi muốn một trang được tạo từ các div có cùng kích thước (giả sử là 100x100) và một biến thể như 200x100. Cả hai đều float : điều chỉnh left để thay đổi kích thước cửa sổ cho phù hợp. Vấn đề là, tôi không biết làm cách nào để đưa chúng vào giữa trong trường hợp đó,
Tôi là một lập trình viên xuất sắc, rất xuất sắc!