参考博客https://zhuanlan.zhihu.com/p/446103318
https://blog.csdn.net/javaqaaa/article/details/126539194
# 和AI对话
# 知识点归纳
## 一、调度算法
在操作系统中调度是指一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法。对于不同的的系统和系统目标,通常采用不同的调度算法,例如,在批处理系统中,为了照顾为数众多的段作业,应采用短作业优先的调度算法;又如在分时系统中,为了保证系统具有合理的响应时间,应当采用轮转法进行调度。目前存在的多种调度算法中,有的算法适用于作业调度,有的算法适用于进程调度;但也有些调度算法既可以用于作业调度,也可以用于进程调度。 通常将作业或进程归入各种就绪或阻塞队列。 调度算法要求:高资源利用率、高吞吐量、用户满意等原则。 进程调度所采用的算法是与整个系统的设计目标相一致的: 1.批处理系统:增加系统吞吐量和提高系统资源的利用率; 2.分时系统:保证每个分时用户能容忍的响应时间。 3.实时系统:保证对随机发生的外部事件做出实时响应。## 二、线程
当涉及到并发编程时,线程是非常重要的概念。线程是操作系统进行调度的最小单位,它允许我们在同一进程中同时执行多个任务。
以下是一些关于线程的要点:
轻量级:线程是相对于进程而言的,它比进程更轻量级。线程之间共享进程的资源,包括内存空间、文件描述符等,这使得线程的切换比进程的切换更加高效。
并发执行:线程的特点之一是能够并发执行。多个线程可以在同一时间片内交替执行,从而实现任务的并行处理。这对于性能敏感的应用程序和处理大量并发请求的服务器很有用。
共享数据:与进程不同,线程共享相同的地址空间,可以访问同一块内存区域。但这也带来了线程安全的问题,因为多个线程可能同时访问和修改共享数据,需要使用同步机制(如锁、信号量等)来确保数据的一致性和线程安全性。
线程间通信:线程可以通过共享内存进行简单的通信。此外,还有其他线程间通信机制,如消息传递、管道、信号等。
上下文切换:线程切换的开销相对较小,因为线程共享相同的地址空间和资源,不需要切换进程的上下文。这使得线程适合于任务之间频繁切换的场景,例如事件驱动编程。
线程安全:由于线程共享数据,需要特别注意线程安全。编写线程安全的代码意味着在访问和修改共享数据时进行适当的同步措施,以避免竞争条件和数据不一致。
需要注意的是,线程的并发执行也带来了一些挑战,如竞争条件、死锁、活锁等问题。因此,在编写并发程序时,需要仔细考虑这些问题,并使用适当的同步和调度技术来确保正确性和性能。
# 伪代码示例
当涉及到并发执行时,一个常见的例子是多线程下载文件。
考虑一个场景,我们需要下载一个大文件并将其分成若干个部分同时下载。这可以通过多线程来实现并发下载,以加快下载速度。
以下是一个简单的伪代码示例:
```c
from threading import Thread
# 定义下载函数
def download(url, start, end):
# 通过 URL 下载文件的指定部分
# 将下载的部分保存到本地文件中
# 定义主函数
def main():
url = "http://example.com/file.rar"
num_threads = 4 # 使用 4 个线程下载文件
file_size = get_file_size(url) # 获取文件的总大小
# 计算每个线程下载的部分大小
part_size = file_size // num_threads
# 创建线程数组
threads = []
# 创建并启动线程
for i in range(num_threads):
start = i * part_size
end = start + part_size - 1
if i == num_threads - 1:
end = file_size - 1
thread = Thread(target=download, args=(url, start, end))
thread.start()
threads.append(thread)
# 等待所有线程完成下载
for thread in threads:
thread.join()
print("文件下载完成!")
# 执行主函数
if __name__ == "__main__":
main()
```
在这个例子中,我们创建了一个主函数 main(),其中包含了多线程下载的逻辑。我们通过 num_threads 变量指定要使用的线程数,根据文件总大小计算每个线程要下载的部分的大小。
然后,我们创建线程数组 threads,并用 Thread 类来创建并启动每个线程。每个线程都调用 download 函数来下载文件的指定部分。最后,我们使用 thread.join() 等待所有线程完成下载。
当所有线程完成下载后,打印消息表示文件下载完成。
这个例子展示了多线程并发下载的能力,利用多个线程同时下载文件的不同部分,可以显著提高下载速度和效率。