一.操作系统/应用程序
1.手工操作 —— 穿孔卡片
程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
2.批处理 —— 磁带存储和批处理系统
批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
包括联机批处理系统和脱机批处理系统
3.多道程序系统
多道程序设计技术 , 就是指允许多个程序同时进入内存并运行。即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。
4.分时系统
分时技术:把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。
5.实时系统
6.通用操作系统
7.操作系统的进一步发展
a.个人计算机操作系统
8.操作系统的作用
计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。
操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序。
二.并发和并行
并发, 伪 ,由于执行速度特别块,感觉不到停顿
并行, 真, 创建10个人同时操作
并行 : 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核的CPU )
并发 : 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。
区别:
并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器。
并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。
三.线程和进程
进程:序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。
程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。
缺点:
-
进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
-
进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。
线程 : 能独立运行的基本单位——线程(Threads)。
threading模块
方法:
- start 线程准备就绪,等待CPU调度
- setName 为线程设置名称
- getName 获取线程名称
- setDaemon 设置为后台线程或前台线程(默认)
如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止
如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止 - join 逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义
- run 线程被cpu调度后自动执行线程对象的run方法
线程的创建Threading.Thread类
import threading def func(arg): print(arg) t = threading.Thread(target=func,args=(11,)) t.start() print(111)
# 结果: 11 111
主线程默认等子线程执行完毕
import time def func(arg): time.sleep(2) print(arg) t1 = threading.Thread(target=func,args=(3,)) t1.start() t2 = threading.Thread(target=func,args= (9,)) t2.start() print(123)
#结果: 123 3 9
主线程不再等,主线程终止则所有子线程终止
import threading import time def func(arg): time.sleep(2) print(arg) t1 = threading.Thread(target=func,args=(3,)) t1.setDaemon(True) t1.start() t2 = threading.Thread(target=func,args=(9,)) t2.setDaemon(True) t2.start() print(123)
开发者可以控制主线程等待子线程(最多等待时间)
import threading import time def func(arg): time.sleep(10) print(arg) print("创建子进程t1") t1 = threading.Thread(target=func,args=(3,)) t1.start() t1.join(2) #无参数,让主线程在这里等着,等到子线程t1执行完毕,才可以继续往下走 #有参数,让主线程在这里最多等待n秒,无论是否执行完毕,会继续走下去 t1.join(2) print("创建子线程t2") t2 = threading.Thread(target=func,args=(9,)) t2.start() t2.join(2) print(123)
#结果:
创建子进程t1
创建子进程t2
123
3
9
线程名称
import threading def func(arg): t = threading.current_thread() #获取当前执行该函数的线程的对象 name = t.getName() #获取当前线程对象获取当前线程名称 print(name,arg) t1 = threading.Thread(target=func,args=(11,)) t1.setName("王") #给线程起名 t1.start() t2 = threading.Thread(target=func,args=(22,)) t2.setName("光") t2.start() print(123)