Cần lưu ý rằng trong phần cứng đầu (trước năm 1960), I / O đơn giản hơn nhiều. Bạn có thể đọc thẻ, hoặc bấm thẻ hoặc in một dòng trên máy in, mỗi dòng có một hướng dẫn duy nhất: kích thước bộ đệm đã được cố định và thường thì địa chỉ bộ đệm cũng được sửa.
Ngay cả trong những năm đầu thập niên 60, với các bộ xử lý tinh vi hơn (ví dụ 7090), bạn vẫn có thể đọc hoặc bấm thẻ với một thói quen nhỏ (khoảng 20 hướng dẫn), dễ dàng được sao chép vào mỗi chương trình.
Vì máy tính hoàn toàn dành riêng cho một công việc duy nhất, không có vấn đề gì nếu bộ xử lý không hoạt động trong khi chờ đầu đọc thẻ sẵn sàng để đọc thẻ tiếp theo hoặc cho máy in dòng tiếp nhận dòng tiếp theo.
Vâng, nó đã thành vấn đề, bởi vì thời gian tính toán thực sự tốn kém. Đây là lý do tại sao mọi người phát minh ra đa xử lý, chia sẻ thời gian, thêm I / O không đồng bộ, và ngắt và trình điều khiển thiết bị và hệ điều hành. Các giao diện thiết bị phần cứng trở nên phức tạp hơn, đối với người lập trình, cho phép truy cập vào các thanh ghi I / O cấp thấp hơn, đòi hỏi sự phức tạp hơn từ trình điều khiển thiết bị. Chi phí phức tạp này (bộ nhớ, thời gian lập trình) được khấu hao theo một số chương trình sử dụng các thiết bị "đồng thời", được hệ điều hành ghép lại.
Vẫn trong những năm 80, tôi đã sử dụng một máy tính dựa trên bộ vi xử lý, mô phỏng một trong những hệ thống cũ hơn đó. Các hướng dẫn máy có định dạng thống nhất trên 80 bit (10 octet) và hướng dẫn đọc phần đầu tiên của đĩa cứng đầu tiên và lưu trữ vào bộ nhớ tại địa chỉ 0 rất thuận tiện: 0000000000. Vì vậy, quy trình khởi động bao gồm mỗi sáng để gõ lệnh này trên thiết bị đầu cuối, nó đã lưu nó ở địa chỉ 0 và thực thi nó, sau đó tải khu vực khởi động và tiếp tục thực hiện ở lệnh tiếp theo (tại địa chỉ 10). Hệ thống tệp bao gồm một "tên" tệp ánh xạ bảng tĩnh cho các phạm vi của các lĩnh vực, được phân bổ thủ công! I / O được thực hiện trong trình biên dịch chương trình với các tệp đó bằng cách trực tiếp đọc hoặc ghi các cung, bù vào vị trí của tệp trên đĩa cứng đã được phục hồi bởi "