操作系统:(承上启下作用,起到硬件与应用程序之间的连接作用(或者接口作用))
进程:本质上是一段程序运行的过程,是一个抽象的概念。
进程的目的就是切换,也就是程序A与程序B矛盾时,可以切换执行,提高CPU的效率。
进程包括三部分:程序,数据集,程序控制块三个部分。
程序是一个实体,进程是一个抽象。数据集相当于输入。程序控制块用于切换时,记录上一个进程执行到哪等信息。
说道切换,可以是一个进程遇到IO操作的时候,执行切换(因为IO时,CPU空闲);也可以根据时间序列切换等等。
如果只有一个CPU,进程切换只是实现并发(感觉看起来一起执行,比如既可以上网,也可以听歌,实际上不是同时执行),
并行至少需要多核(多个cpu).这样假如两个CPU同时对应4个任务,这样就既有并行也有并发。
线程:有了进程后,可以实现一边玩游戏一边听音乐了。假设一个文本程序,当键盘输入的同时,需要屏幕显示,并且同时刻录到磁盘中。
如果只是用一个进程的话,只能安顺序执行,也就是说键盘输入的同时,屏幕上是看不到的,要等输入完。
因此需要多进程,但是一个程序就这样分了,搞得跟多个程序似的,并且多进程切换过程会降低效率。
线程其实可以理解为一个进程中微进程,它共享一个进程中的资源集,线程的切换也比进程的切换省事。比如扣扣,既可以一边聊天,
又可以一边接收邮箱信息。它们共享一个用户的信息,状态什么的。
进程与线程区别:
1.一个程序至少有一个进程,一个进程至少有一个线程。(进程可以理解成线程的容器)
2.进程在执行过程中拥有独立的内存单元,而多个线程共享(一个进程)内存,从而极大地提高了程序的运行效率
3.线程是最小的执行单元,进程是最小的资源单位(操作系统分资源最小分发进程)。线程不可能脱离进程独立存在
等等
下面看两个简单的多线程例子:
1 import threading 2 import time 3 4 def music(): 5 print("begin to listen %s"%time.ctime()) 6 time.sleep(3) 7 print("stop listening %s" % time.ctime()) 8 9 def game(): 10 print("begin to game %s"%time.ctime()) 11 time.sleep(5) 12 print("stop gaming %s" % time.ctime()) 13 14 15 if __name__ == '__main__': 16 17 t1 = threading.Thread(target=music) 18 19 t2 = threading.Thread(target=game) 20 21 t1.start() # 与lesson2放在上面是一样的 22 t2.start() 23 24 t1.join() # join这个方法是子线程对象调用的函数,函数的意思是t1这个子线等待结束后,主线程才能走 25 # t2.join() 26 27 # 与join对应的.setDaemon是守护线程,比如T1设置为守护线程, 28 # 意思就是t1这个线程跟主线程一起退,主线程结束后,它问一下其他非守护线程,其他的非守护线程也都结束,它结束 29 30 print("ending............")
1 ''' 2 线程,threading可以开线程,里面实例对象有几个重要的方法,比如:.start,.join,.setDaemon 3 t = threading.Thread() 4 以上是t的方法(实例化的属性) 5 另外threading模块还有一些方法: 6 threading.currentThread() 返回当前的线程变量 7 threading.enumerate() 返回一个包含正在运行的线程的list.正在运行指线程启动后,结束前。 8 threading.activeCount() 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果 9 ''' 10 11 import threading # 线程 12 import time 13 14 15 def Hi(num, i): 16 print("hello %s" % num) 17 time.sleep(int(i)) 18 19 20 if __name__ == '__main__': 21 22 # 主线程下面开了两个子线程 23 24 t1 = threading.Thread(target=Hi, args=(10,2)) # 实例化一个线程对象,开一个子线程1 25 t1.start() 26 27 t2 = threading.Thread(target=Hi, args=(9,7)) # 实例化一个线程对象,开一个子线程2 28 t2.start() 29 30 print("ending.................")