Day 26 操作系统,进程
用户认证,验证用户合法性
hmac包
# 1.需要认证 # 程序和用户打交道的时候才会用到用户认证 # 对所有的客户端进行统一的认证 # # 我现在要做的事情 # 写一个server端 # 写一个client端 特殊的 符合我的server端要求的代码 # 1.client端不会被其他机器获取到 # 2.即使客户端的代码不在别人手上 有心人仍然可以非法的访问我们的程序 # hashlib # 密钥 # 随机的字符串 # server 密钥 发送一个随机字符串,密钥为盐,对随机字符串进行摘要 得到一个字符串结果 # client 密钥 密钥为盐,对随机字符串进行摘要 得到一个字符串结果 将结果发送回server端
客户端:
def auth(sk): socket_key = b'addit' rand_b = sk.recv(32) obj = hmac.new(socket_key, rand_b) res2 = obj.digest() sk.send(res2) sk = socket.socket() sk.connect(('127.0.0.1', 9998)) auth(sk) msg = sk.recv(1024) print(msg.decode())
服务器端:
def auth(conn): h_bytes = b'addit' random_b = os.urandom(32) conn.send(random_b) obj = hmac.new(h_bytes, random_b) res1 = obj.digest() res2 = conn.recv(1024) res = hmac.compare_digest(res1, res2) print(res) sk = socket.socket() sk.bind(('127.0.0.1', 9998)) sk.listen() conn, addr = sk.accept() res = auth(conn) if res: print('合法') conn.send('你好'.encode()) else: conn.close() sk.close()
sys.argv 完成了用户认证功能
# sys.argv import sys # python解释器 print('我正常的逻辑') # print(sys.argv) # 在执行python文件的时候 # python 某文件 C:\Python36\python.exe D:/python骑士计划3期/day26/5.进程的概念.py # python 某文件 参数1 参数2 参数3 # argv指参数 # sys.argv是python解释器在运行的时候传递进来的参数 # if sys.argv[1] == 'alex' and sys.argv[2] == 'sb': # print('登陆成功') # else: # print('登陆失败') # exit() # print('登陆成功之后可以做很多很多操作')
操作系统历史:
http://www.cnblogs.com/Eva-J/articles/8253521.html
i/o:
# i = input 输入 # 从任何其他地方 --> 内存 # 读文件、json.load # 从网络上接收信息 # o = output 输出 # 内存 --> 放到任何其他地方 # 写文件、json.dump # 向网络上发送 send sendto
进程:
1.什么是进程
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
2.程序和进程的区别:
程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。 而进程是程序在处理机上的一次执行过程,它是一个动态的概念。程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。
3.进程的调度:
先来先服务的调读 短作业优先的调度时间片轮转法多级反馈队列
4.进程的并行与并发:
并行 : 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个 线程,四核的CPU )
并发 : 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同 时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。
区别:
并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器。
并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个 session。
5.同步,异步,阻塞,非阻塞:
一、进程三状态图:

(1)就绪(Ready)状态
当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
(2)执行/运行(Running)状态当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
(3)阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
二、同步
所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。
三、阻塞
阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的
四、同步/异步与阻塞/非阻塞
同步阻塞形式
效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。
异步阻塞形式
如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;
异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
同步非阻塞形式
实际上是效率低下的。
想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。
异步非阻塞形式
效率更高,
因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。
比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。
6.进程的创建
但凡是硬件,都需要有操作系统去管理,只要有操作系统,就有进程的概念,就需要有创建进程的方式,一些操作系统只为一个应用程序设计,比如微波炉中的控制器,一旦启动微波炉,所有的进程都已经存在。
而对于通用系统(跑很多应用程序),需要有系统运行过程中创建或撤销进程的能力,主要分为4中形式创建新的进程:
1. 系统初始化(查看进程linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且只在需要时才唤醒的进程,称为守护进程,如电子邮件、web页面、新闻、打印)
2. 一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)
3. 用户的交互式请求,而创建一个新进程(如用户双击暴风影音)
4. 一个批处理作业的初始化(只在大型机的批处理系统中应用)
无论哪一种,新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的。
7.进程的结束
1. 正常退出(自愿,如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess)
2. 出错退出(自愿,python a.py中a.py不存在)
3. 严重错误(非自愿,执行非法指令,如引用不存在的内存,1/0等,可以捕捉异常,try...except...)
4. 被其他进程杀死(非自愿,如kill -9)

浙公网安备 33010602011771号