操作系统的发展史:
第一代计算机:真空管和穿孔卡片(1940-1955)特点:没有操作系统的概念,所有的程序都是直接控制计算机硬件的,此时运行模式为串行,浪费了计算机资源
第二代计算机:晶体管和批处理操作系统(1955-1964),特点:有了操作系统的概念,将程序放在磁带上中间需要人在中间传输数据,节省了机时几个人攒一波,一起输出,但仍然是串行,有了进程的概念,一次运行一批
第三代计算机集成电路芯片和多道程序(1965-1980),特点:采用小规模芯片集成电路的主流机型,与采用晶体管的第二代计算机相比,性价比有了很大的提高这也是服务器的前身,
多道技术:
空间上的复用:将多个程序一起放进内存,程序之间的内存空间是相互隔离的,提升了程序的安全性,稳定性
时间上的复用:多个程序共享一个CPU的资源,即一个CPU在多个进程之间快速切换,如果遇到程序要做io就切换,或者遇到程序占用时间过长也会切换
多道技术就是为了做并发,是操作系统的技术
并发:并发不一定会提升效率,只有遇到io切的时候才会提升效率,如果运行时间过长,反而效率会低,但仍然要切,为了实现并发
分时操作系统:在多道技术下诞生的第一个操作系统,利用连接设备连接计算机,每一个连接设备就是一个终端,计算机在多个连接终端之间来回切换,解决了程序串行,和操作工程中程序员共享计算机资源的问题
Unix系统:肯汤普森被称为目前最稳定的操作系统,最初开源,后来随着他的闭源,用户也相对少了很多
minix:基于Unix操作系统写的操作系统,代码非常简单,用于教学与售卖
Linux:利勒斯基于minix操作系统写的操作系统,目前服务器用的最多的一种操作系统,也是非常广泛的系统,遵循开源协议,开源导致他非常火
GitHub:全球最大的代码存放网站,
串行:一个操作系统每个程序运行完一个程序,才会运行下一个程序
并行:一个操作系统拥有多核,同一时间运行多个程序
并发:一个操作系统多个进程同步运行,同一时间只能运行一个程序,但操作系统在多个程序之间来回切换,给使用者的感觉就像实在同时运行了多个程序
进程运行的三种状态:
运行态:程序正在运行的过程
阻塞态:程序运行过程中,遇到io就会切换到阻塞态,因等待输入而阻塞,出现有效输入后会进入就绪态
就绪态:程序运行过程中,调度程序进入另一个进程
提交任务的两种方式:
同步:提交任务以后等到任务运行完,才会运行下一个任务
异步:提交任务以后,不会等到任务结束,在等的过程中就会提交下一个任务
开启进程的两种方式:
方式一:
from multiprocessing import process
import os
import time
def task(n):
print("父进程:%s 自己:%s 正在运行"%(os.getppid(),os.getpid()))
time.sleep(n)
print("父进程:%s 自己:%s 正在运行"%(os.getppid(),os.getpid()))
if __name__ == '__main__':
p = process(target = task,args=(3,))
p.start() #通知操作系统开进程
print("主",os.getpid())
#getpid是查看自己当前进程号,getppid是查看自己的子进程号,此处要注意的是p.start()为通知操作系统开启子
# 进程,子进程在开辟时操作系统需要开辟新的内存空间,将父进程的数据拷贝到了子进程,这段时间计算机会优先运行print
#无论父子进程所控制的输出终端是一样的,开进程是应用程序通知操作系统要开,操作系统来开
方式二:
from multiprocessing import process
import os
import time
class Myprocess(process):
def __init__(self,n):
super().__init__()
self.n = n
def run(self):
print("父进程:%s 自己:%s 正在运行" % (os.getppid(), os.getpid()))
time.sleep(self.n)
print("父进程:%s 自己:%s 正在运行" % (os.getppid(), os.getpid()))
if __name__ == '__main__':
p = Myprocess(3)
p.start() #通知操作系统开进程
print("主",os.getpid())
#进程对象之间的方法
from multiprocessing import process
import os
import time
count = 100
def task():
global count
count = 0
if __name__ == '__main__':
p = process(target = task)
p.start() #通知操作系统开进程
p.join() #让主进程等到子进程运行完,在运行以下代码
print("主",os.getpid())
#例二:
from multiprocessing import process
import os
import time
def task(n):
print(os.getpid())
time.sleep(n)
if __name__ == '__main__':
p1 = process(target = task,args=(3))
p2 = process(target = task,args=(2))
p3 = process(target = task,args=(1))
start = time.time()
p1.start() #通知操作系统开进程
p2.start() #通知操作系统开进程
p3.start() #通知操作系统开进程
p1.join() #让主进程等到子进程运行完,在运行以下代码
p2.join()
p3.join()
stop = time.time()
print(stop-start)
#以上这个程序为同时运行的,此时join是让主进程等,但不会影响子进程之间的代码,所以以上程序无论3个join无论谁在前谁在后
#都没有任何关系,程序的运行时间都是3秒多,此时操作系统运行为并发运行但若是将每个join提到对应的start后面的话就是串行了,此时程序的运行时间为6秒多
进程对象的一些基础调用方法:
p1 = process(target = task,args=(3),name ='进程1') 此方法为改进程名
p1.pid #调用p1的进程号
p1.terminate() #给操作系统发信号,强制将这个子进程杀死