一、操作系统介绍
现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。
一般而言,现代计算机系统是一个复杂的系统。
其一:如果每位应用程序员都必须掌握该系统所有的细节,那就不可能再编写代码了(严重影响了程序员的开发效率:全部掌握这些细节可能需要一万年....)
其二:并且管理这些部件并加以优化使用,是一件极富挑战性的工作,于是,计算安装了一层软件(系统软件),称为操作系统。它的任务就是为用户程序提供一个更好、更简单、更清晰的计算机模型,并管理刚才提到的所有设备。
总结:
程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的,有了他,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件的编写就可以了,应用软件直接使用操作系统提供的功能来间接使用硬件。
精简的说的话,操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序。
#操作系统位于计算机硬件与应用软件之间,本质也是一个软件。
操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成,
所以,单纯的说操作系统是运行于内核态的,是不准确的。
二、进程
1、进程理论
进程是正在执行的程序实例。执行程序时,内核会将程序代码载入虚拟内存,为程序变量分配空间,在内核中建立相应的数据结构,以记录与进程有关的各种信息(比如,进程ID、用户ID、组ID以及终止状态等)
在内核看来,进程是一个个实体,内核必须在它们之间共享各种计算机资源。对于像内存这样的受限资源来说,内核一开始会为进程分配一定数量的资源,并在进程的生命周期内,统筹该进程和整个系统对资源的需求,对这一分配进行调整。程序终止时,内核会释放所有此类资源,供其他进程重新使用。其他资源(如CPU、网络带宽等)等属于可再生资源,但必须在所有进程间平等共享。
2、多进程实现
from multiprocessing import Process import time def work(name): print('task <%s> is runing' %name) time.sleep(2) print('task <%s> is done' % name) if __name__ == '__main__': # Process(target=work,kwargs={'name':'egon'}) p1=Process(target=work,args=('egon',)) p2=Process(target=work,args=('alex',)) p1.start() p2.start() print('主')
3、join方法
from multiprocessing import Process import time def work(name): print('task <%s> is runing' %name) time.sleep(3) print('task <%s> is done' % name) if __name__ == '__main__': p1=Process(target=work,args=('egon',)) p2=Process(target=work,args=('alex',)) p3=Process(target=work,args=('yuanhao',)) # p1.start() # p2.start() # p3.start() # # p1.join() #主进程等,等待p1运行结束 # p2.join() #主进程等,等待p2运行结束 # p3.join() #主进程等,等待p3运行结束 p_l = [p1, p2, p3] for p in p_l: p.start() for p in p_l: p.join() print('主') # p_l = [p1, p2, p3] # for p in p_l: # p.start() # p.join() # p1.start() # p1.join() # p2.start() # p2.join() # p3.start() # p3.join() # print('主')
4、守护进程
# from multiprocessing import Process # import time # def work(name): # print('task <%s> is runing' %name) # time.sleep(2) # print('task <%s> is done' % name) # # if __name__ == '__main__': # p1=Process(target=work,args=('egon',)) # p1.daemon = True # p1.start() # # print('主') #主进程代码运行完毕,守护进程就会结束 from multiprocessing import Process import time def foo(): print(123) time.sleep(1) print("end123") def bar(): print(456) time.sleep(3) print("end456") if __name__ == '__main__': p1=Process(target=foo) p2=Process(target=bar) p1.daemon=True p1.start() p2.start() print("main-------") #打印该行则主进程代码结束,则守护进程p1应该被终止,可能会有p1任务执行的打印信息123,因为主进程打印main----时,p1也执行了,但是随即被终止
5、进程队列
from multiprocessing import Queue # q=Queue(3) # # q.put('first') # q.put('second') # q.put('third') # # q.put('fourth') # # print(q.get()) # print(q.get()) # print(q.get()) # print(q.get()) #了解 q=Queue(3) q.put('first',block=False) q.put('second',block=False) q.put('third',block=False) # q.put_nowait('fourth') #q.put('fourth',block=False) q.put('fourth',timeout=3)
6、生产者消费模型
# from multiprocessing import Process,Queue # import time,os # def producer(q,name): # for i in range(3): # time.sleep(1) # res='%s%s' %(name,i) # q.put(res) # print('\033[45m<%s> 生产了 [%s]\033[0m' %(os.getpid(),res)) # # # def consumer(q): # while True: # res=q.get() # if res is None:break # time.sleep(1.5) # print('\033[34m<%s> 吃了 [%s]\033[0m' % (os.getpid(), res)) # # if __name__ == '__main__': # q=Queue() # #生产者们:即厨师们 # p1=Process(target=producer,args=(q,'包子')) # p2=Process(target=producer,args=(q,'饺子')) # p3=Process(target=producer,args=(q,'馄饨')) # # #消费者们:即吃货们 # c1=Process(target=consumer,args=(q,)) # c2=Process(target=consumer,args=(q,)) # # p1.start() # p2.start() # p3.start() # c1.start() # c2.start() # # p1.join() # p2.join() # p3.join() # q.put(None) # q.put(None) # # print('主') from multiprocessing import Process, JoinableQueue import time, os def producer(q, name): for i in range(3): time.sleep(1) res = '%s%s' % (name, i) q.put(res) print('\033[45m<%s> 生产了 [%s]\033[0m' % (os.getpid(), res)) q.join() def consumer(q): while True: res = q.get() time.sleep(1.5) print('\033[34m<%s> 吃了 [%s]\033[0m' % (os.getpid(), res)) q.task_done() if __name__ == '__main__': q = JoinableQueue() # 生产者们:即厨师们 p1 = Process(target=producer, args=(q, '包子')) p2 = Process(target=producer, args=(q, '饺子')) p3 = Process(target=producer, args=(q, '馄饨')) # 消费者们:即吃货们 c1 = Process(target=consumer, args=(q,)) c2 = Process(target=consumer, args=(q,)) c1.daemon=True c2.daemon=True p1.start() p2.start() p3.start() c1.start() c2.start() p1.join() print('主')
7、进程池
from multiprocessing import Pool import os,time def work(n): print('task <%s> is runing' %os.getpid()) time.sleep(2) return n**2 if __name__ == '__main__': # print(os.cpu_count()) p=Pool(4) # for i in range(10): # res=p.apply(work,args=(i,)) # print(res) res_l=[] for i in range(10): res=p.apply_async(work,args=(i,)) res_l.append(res) p.close() p.join() # # for res in res_l: # print(res.get())
import requests #pip3 install requests
import os,time
from multiprocessing import Pool
def get_page(url):
print('<%s> get :%s' %(os.getpid(),url))
respone = requests.get(url)
if respone.status_code == 200:
return {'url':url,'text':respone.text}
def parse_page(dic):
print('<%s> parse :%s' %(os.getpid(),dic['url']))
time.sleep(0.5)
res='url:%s size:%s\n' %(dic['url'],len(dic['text'])) #模拟解析网页内容
with open('db.txt','a') as f:
f.write(res)
if __name__ == '__main__':
p=Pool(4)
urls = [
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
]
for url in urls:
p.apply_async(get_page,args=(url,),callback=parse_page)
p.close()
p.join()
print('主进程pid:',os.getpid())