1.1多任务引入
生活中一般是多项事情同时进行,歌手唱歌、跳舞同时进行,用程序模拟唱歌、跳舞,代码如下:
import time
def sing():
forx in range(3):
print("正在唱歌。。。")
def dance():
fory in range(3):
print("正在跳舞。。。")
def main():
sing()
dance()
if __name__ =="__main__":
main()
<<15_1.py>>
但是输出的是先唱歌3次,再跳舞3次(并不是同时进行)
1.2多任务的概念
多任务:同时进行多项事务,对计算机操作系统而言,就是同时运行多个任务(程序),真正的并行多任务只能在多核CPU上实现,实际的计算任务量远超过CPU核心数,操作系统通过调度算法,将多任务分配给每个核心,单核cpu执行的时候是采用时间片轮转的方式运行多个任务
1.3进程的创建-fork
1.进程vs程序
进程:需要分配到时间片、在内存空间中、有程序代码、被CPU执行
程序:保存在磁盘上的一段代码
2.fork()
在Linux系统中可以调用系统fork()函数可以轻松创建进程
用fork()创建边唱歌、边跳舞的进程,示例代码:
import os,time
def sing():
forx in range(3):
print("正在唱歌%d"%x)
def dance():
fory in range(3):
print("正在跳舞%d"%y)
pid = os.fork()
if pid < 0:
print("fork调用失败!")
elif pid == 0:
print("进入子进程")
sing()
else:
print("进入父进程")
dance()
<<15_2.py>>
【注】os.fork()函数创建进程的时候先复制原有进程(父进程)到子进程,在父进程里返回值是创建的子进程的pid,在子进程里返回值是0,可以通过os.getpid()函数获取当前进程的pid,通过os.getppid()获取父进程的pid,调用一次,有两个返回值,fork()不能用于windows系统
示例代码:
import os
def main():
pid= os.fork()
ifpid < 0:
print("fork调用失败")
elifpid == 0:
print("进入子进程:")
print("当前进程pid=%d,父进程pid=%d"%(os.getpid(),os.getppid()))
print("在子进程中执行完毕")
else:
print("进入父进程执行")
print("当前进程的子进程pid=%d,父进程pid=%d"%(pid,os.getpid()))
print("父进程中运行完毕")
if __name__ =="__main__":
main()
<<15_3.py>>
僵尸进程产生的原因:子进程运行结束,父进程尚未结束,并且未取回收子进程的资源就形成僵尸进程,僵尸进程保留这资源信息,以便父进程查找进程结束的原因
回收僵尸进程:在子进程后面调用os.wait()函数,os.wait()会阻塞父进程,(子进程没结束,父进程不会运行)
示例代码:(用fork产生僵尸进程)
import os
def main():
pid= os.fork()
ifpid < 0:
print("fork失败!")
elifpid == 0:
whileTrue:
print("进入子进程,子进程pid=%d,父进程是%d"%(os.getpid(),os.getppid()))
else:
print("进入父进程,父进程pid=%d,子进程pid=%d"%(os.getpid(),pid))
if __name__ =="__main__":
main()
<<fork产生僵尸进程.py>>
孤儿进程:子进程还在运行,父进程已经结束,就产生了孤儿进程,变成后台进程,不阻塞bash程序,不能接受用户输入,