操作系统的历史 多道操作系统 遇到IO操作就切换的 提高CPU的利用率 进程之间数据隔离 时空复用 : 再同一个时间点上,多个程序同时执行着,一块儿内存条上存储了多个进程的数据 分时操纵系统 时间分片 时间片轮转 进程 是计算机中最小的资源分配单位 : 每一个程序在运行起来的时候需要给分配一些内存 一个运行的程序 在操作系统中用pid来唯一标识一个进程 线程 是计算机中能被CPU调度的最小单位 : 实际执行具体编译解释之后的代码的是线程,所以cpu执行的是解释之后的线程中的代码 并行和并发 并发 : 一个CPU,多个程序轮流执行 并行(好):多个cpu,各自在自己的cpu上执行多个程序 同步和异步 同步 : 调用一个操作,要等待结果 异步 : 调用一个操作,不等待结果 阻塞和非阻塞 阻塞 : CPU不工作 非阻塞 : CPU工作 同步阻塞 input sleep recv recvfrom 同步非阻塞 ret = eval('1+2+3+4+5') def func(*args): count = 0 for i in args: count += i return count a = 1 b = 2 c = a + b d = func(a,b,c) print(d)
异步非阻塞(阻塞 blocking) 异步阻塞
import socket sk =socket.socket() sk.setblocking(False) sk.bind(('127.0.0.1',9001)) sk.listen()
while True: try: conn,addr = sk.accept() except BlockingIOError: pass
二、今日内容
1、进程的三状态图
-
就绪
-
运行
-
阻塞
2、进程的调度算法
-
给所有的进程分配资源或者分配CPU使用权的一种方法
-
短作业优先
-
先来先服务
-
多级反馈算法
-
多个任务队列,优先级从高到低
-
新来的任务总是优先级最高的
-
每一个新任务几乎会立即获得一个时间片时间
-
执行完一个时间片之后就会降到下一级队列中
-
总是优先级高的任务都执行完才执行优先级低的队列
-
并且优先级越高时间片越短
-
3、进程的开启和关闭
4、进程模块
-
os.getpid() 获取进程ID
-
-
进程的开启
from multiprocessing import Process
import os
def func():
print(os.getpid(),os.getppid())
if __name__ == '__main__':
print('main:',os.getpid(),os.getppid())
p = Process(target=func)
p.start() -
multiprocessing模块内的Process类
from multiprocessing import Process
def func(name,age):
print(f'{name}今天多少{age}岁了')
print('发送完成')
if __name__ == '__main__':
lst = [('alex',84),('wusir',78),('taibai',69)]
p_lst = []
for i in lst:
p = Process(target=func,args=i)
p.start()
p_lst.append(p)
for p in p_lst:
p.join()
print('全部统计完成') -
join的用法
from multiprocessing import Process
def func(name,age):
print(f'{name}今天多少{age}岁了')
print('发送完成')
if __name__ == '__main__':
lst = [('alex',84),('wusir',78),('taibai',69)]
p_lst = []
for i in lst:
p = Process(target=func,args=i)
p.start()
p_lst.append(p)
for p in p_lst:
p.join()
print('全部统计完成') -
使用多进程实现并发socket的server端
from multiprocessing import Process
import socket
def talk(conn):
while True:
msg = conn.recv(1024).decode('utf-8')
msg = msg.upper()
conn.send(msg.encode('utf-8'))
if __name__ == '__main__':
sk = socket.socket()
sk.bind(('127.0.0.1', 9001))
sk.listen()
while True:
conn, _ = sk.accept()
p = Process(target=talk,args= (conn,))
p.start()import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9001))
while True:
sk.send('hello'.encode('utf-8'))
msg = sk.recv(1024).decode('utf-8')
print(msg) -