进程与线程
进程和线程是操作系统中的两个重要概念。
进程是指在操作系统中正在运行的一个程序的实例。每个进程都有自己的地址空间、内存、文件描述符和其他系统资源。进程之间是相互独立的,彼此之间不能直接访问对方的内存或资源。进程之间的通信需要通过一些特定的机制来实现,比如管道、消息队列、共享内存等。
线程是进程中的一个执行单元,一个进程可以包含多个线程。线程与进程共享同一地址空间和其他系统资源,可以直接访问进程的内存。不同线程之间的切换比不同进程之间的切换要快捷高效。线程之间的通信可以直接通过共享内存来实现,避免了进程间通信的开销。
进程和线程各有优缺点。进程之间相互独立,可以更好地实现资源隔离和安全性,但进程切换开销较大。线程之间切换开销小,可以更好地实现并发执行和资源共享,但线程之间的访问需要通过同步机制来进行控制。
在实际应用中,进程和线程通常是结合使用的。进程可以用来实现任务的隔离和资源管理,而线程可以用来实现任务的并发执行和资源共享。
CPU时间片
CPU时间片是操作系统中的一个概念,指的是每个进程在CPU上执行的时间段。操作系统使用时间片轮转调度算法来分配CPU时间片给各个进程。每个进程被分配一个固定的时间片,当时间片用完后,操作系统会中断该进程的执行,重新分配CPU时间片给其他进程。
时间片的长度通常是几毫秒到几十毫秒,具体取决于操作系统的设计和配置。较短的时间片可以提高系统对多任务的响应速度,但也会增加进程切换的开销;较长的时间片可以减少进程切换的开销,但可能导致系统响应速度下降。
时间片轮转调度算法可以保证每个进程都有机会执行,并且公平地分配CPU资源。当一个进程的时间片用完后,它会被移到就绪队列的末尾,等待下一次调度。这种算法适用于多任务环境,可以提高系统的吞吐量和响应速度。
python多进程
import os
from multiprocessing import Process
num = 1000
def sing():
global num
for i in range(50):
num -= 1
print(os.getpid(), "唱歌", num)
#os.getpid()函数返回当前进程的进程ID。os.getppid()函数返回当前进程的父进程ID。
def dance():
global num
for i in range(50):
num -= 1
print(os.getpid(), "跳舞", num)
if __name__ == "__main__":
p1 = Process(target=sing)
p1.start()
p2 = Process(target=dance)
p2.start()
print("主进程", num)
主进程 1000
44620 唱歌 950
76004 跳舞 950
python多线程
import threading
def print_numbers():
for i in range(1, 11):
print(i)
def print_letters():
for letter in 'abcdefghij':
print(letter)
# 创建两个线程
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)
# 启动线程
thread1.start()
thread2.start()
# 等待线程结束
thread1.join()
thread2.join()