推荐两本书:现代操作系统和操作系统原来,学习好python以后再去研究.
 
并发:任务的切换,保存状态,存在io的是实现空间和时间的 重复利用
操作系统的发展历史:
第一代(1940-1955)手工操作------穿孔卡片
    穿孔卡带的过程:程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
   手工操作特点:
    (1)用户独占全机。不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低。
    (2)CPU 等待手工操作。CPU的利用不充分。
    (3)没有操作系统的概念。
    (4)所有的程序设计都是直接操控硬件。
 
第二代(1955-1965)磁带处理-批处理系统
   20世纪50年代后期,出现人机矛盾:手工操作的慢速度和计算机的高速度之间形成了尖锐矛盾,手工操作方式已严重损害了系统资源的利用率(使资源利用率降为百分之几,甚至更低),不能容忍。唯一的解决办法:只有摆脱人的手工操作,实现作业的自动过渡。这样就出现了成批处理
  批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
  特点:
    设计人员、生产人员、操作人员、程序人员和维护人员直接有了明确的分工,计算机被锁在专用空调房间中,由专业操作人员运行,这便是‘大型机’。
    有了操作系统的概念
    有了程序设计语言:FORTRAN语言或汇编语言
   1.联机批处理系统: 首先出现的是联机批处理系统,即作业的输入/输出由cpu来处理
2.脱机批处理系统: 为克服与缓解:高速主机与慢速外设(输入输出设备)的矛盾,提高CPU的利用率,又引入了脱机批处理系统,即输入/输出(input\output,简称I\O操作)脱离主机控制。
卫星机:一台不与主机直接相连而专门用于与输入/输出设备打交道的。
      其功能是:
        (1)从输入机上读取用户作业并放到输入磁带上。
        (2)从输出磁带上读取执行结果并传给输出机。
         这样,主机不是直接与慢速的输入/输出设备打交道,而是与速度相对较快的磁带机发生关系,有效缓解了主机与设备的矛盾。主机与卫星机可并行工作,二者分工明确,可以充分发挥主机的高速计算能力。
            脱机批处理系统:20世纪60年代应用十分广泛,它极大缓解了人机矛盾及主机与外设的矛盾。
         不足:但目前为止,所有的程序都还是串行执行的,也就是一个程序结束才执行下一个程序,每次主机内存中仅存放一道作业,每当主机中这个运行期间的作业或者说程序发出输入/输出(I/O)请求后,CPU要去高速磁带里读数据,计算结果要往高速磁带里面写数据,那么高速的CPU便处于等待低速的I/O完成状态,CPU并没有完全的运算起来,也可以理解为我要等着你输入或者等着你输出,致使CPU空闲。注意:之前系统的缺点说的是等待用户将程序全部输入进去,等待程序运行结束后输出最终结果的操作。现在说的是程序运行期间发生的输入\输出操作,也就是去高速磁带里面去读取程序数据,然后将输出数据写到高速磁带中,也是耗时的,cpu这段时间内的利用率也是很低的。
       为改善CPU的利用率,又引入了多道程序系统
 
第三代(1955-1965) 多道程序系统(多道是重点*****)
多道程序设计技术: 多道程序设计技术是指在内存同时放若干道程序,使它们在系统中并发执行,共享系统中的各种资源。当一道程序暂停执行时,CPU立即转去执行另一道程序。
 
空间上的复用:将内存分为几个部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序.
时间上的复用: 当一个程序在等待I/O时,另一个程序可以使用cpu,如果内存中可以同事存放足够多的作业,则cpu的利用率接近100%
分时系统,实时系统和通用操作系统
 
并行与并发
并行性和并发性 (Concurrence) 是既相似又有区别的两个概念,并行性是指两个或多个事件在同一时刻发生;而并发性是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可同时执行。
1.并行:
  看着像同时运行,其实是任务之间的切换(遇到io切换的会提高代码效率) ,任务切换+保存状态(保存现场)
2.并发:
  伪并行,看着像同时运行,其实是任务之间的切换(遇到io切换的会提高代码效率) ,任务切换+保存状态(保存现场)
 
 
同步,异步,非阻塞
进程的三种基本状态
1. 就绪(Ready)状态
  当进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
2. 执行状态
  进程已获得 CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态。
3. 阻塞状态
  正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即进程的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态
 
 
同步,异步,阻塞与非阻塞
  1.同步阻塞形式
    效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。
 
  2.异步阻塞形式
    如果在排队取餐的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能做其它的事情,就在那坐着等着,不能玩游戏等,那么很显然,这个人被阻塞在了这个等待的操作上面;异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
 
  3.同步非阻塞形式
    实际上是效率低下的。想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。
 
  4.异步非阻塞形式
    效率更高,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉点餐员说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。很多人会把同步和阻塞混淆,是因为很多时候同步操作会以阻塞的形式表现出来,同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO操作处被阻塞。
 
进程的创建:
1.multiprocessing 模块
import time
from multiprocessing import Process
 
def f1():
    time.sleep(3)
    print('xxxx')
 
def f2():
    time.sleep(3)
    print('ssss')
 
# f1()
# f2()
 
 
#windows系统下必须写main,因为windows系统创建子进程的方式决定的,开启一个子进程,这个子进程 会copy一份主进程的所有代码,并且机制类似于import引入,这样就容易导致引入代码的时候,被引入的代码中的可执行程序被执行,导致递归开始进程,会报错
if __name__ == '__main__':  #
    # p1 = Process(target=f1,)
    p2 = Process(target=f2,)
    # p1.start()
    p2.start()
 
2.for循环创建进程
import time
from multiprocessing import Process
 
def f1(i):
    time.sleep(3)
    print(i)
 
if __name__ == '__main__':
 
    for i in range(20):
        p1 = Process(target=f1,args=(i,))
        p1.start()
 
3.进程的传参方式和创建方式
 
from multiprocessing import Process
 
#演示两种传参方式
def f1(n):
    print(n)
 
 
if __name__ == '__main__':
    # p1 = Process(target=f1,args=('大力与奇迹',)) #创建进程对象
    p1 = Process(target=f1,kwargs={'n':'大力'}) #创建进程对象
 
    p1.start()  #给操作系统发送了一个创建进程的信号,后续进程的创建都是操作系统的事儿了
 
 
#进程的创建方式2
 
class MyProcess(Process):
 
    def __init__(self,n):
        super().__init__()  #别忘了执行父类的init
        self.n = n
 
    def run(self):
        print('宝宝and%s不可告人的事情'%self.n)
 
 
if __name__ == '__main__':
 
    p1 = MyProcess('高望')
    p1.start()
 
4.join方法
import time
from multiprocessing import Process
 
def f1():
    time.sleep(2)
    print('xxxx')
 
def f2():
    time.sleep(2)
    print('ssss')
 
# f1()
# f2()
if __name__ == '__main__':
 
    p1 = Process(target=f1,)
    p1.start()
    p1.join()  # 主进程等待子进程运行完才继续执行
 
    print('开始p2拉')
 
    p2 = Process(target=f2,)
    p2.start()
    p2.join()
    print('我要等了...等我的子进程...')
    # time.sleep(3)
    print('我是主进程!!!')
 
 
 
                                    
推荐两本书:现代操作系统和操作系统原来,学习好python以后再去研究.
 
并发:任务的切换,保存状态,存在io的是实现空间和时间的 重复利用
操作系统的发展历史:
第一代(1940-1955)手工操作------穿孔卡片
    穿孔卡带的过程:程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
   手工操作特点:
    (1)用户独占全机。不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低。
    (2)CPU 等待手工操作。CPU的利用不充分。
    (3)没有操作系统的概念。
    (4)所有的程序设计都是直接操控硬件。
 
第二代(1955-1965)磁带处理-批处理系统
   20世纪50年代后期,出现人机矛盾:手工操作的慢速度和计算机的高速度之间形成了尖锐矛盾,手工操作方式已严重损害了系统资源的利用率(使资源利用率降为百分之几,甚至更低),不能容忍。唯一的解决办法:只有摆脱人的手工操作,实现作业的自动过渡。这样就出现了成批处理
  批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
  特点:
    设计人员、生产人员、操作人员、程序人员和维护人员直接有了明确的分工,计算机被锁在专用空调房间中,由专业操作人员运行,这便是‘大型机’。
    有了操作系统的概念
    有了程序设计语言:FORTRAN语言或汇编语言
   1.联机批处理系统: 首先出现的是联机批处理系统,即作业的输入/输出由cpu来处理
2.脱机批处理系统: 为克服与缓解:高速主机与慢速外设(输入输出设备)的矛盾,提高CPU的利用率,又引入了脱机批处理系统,即输入/输出(input\output,简称I\O操作)脱离主机控制。
卫星机:一台不与主机直接相连而专门用于与输入/输出设备打交道的。
      其功能是:
        (1)从输入机上读取用户作业并放到输入磁带上。
        (2)从输出磁带上读取执行结果并传给输出机。
         这样,主机不是直接与慢速的输入/输出设备打交道,而是与速度相对较快的磁带机发生关系,有效缓解了主机与设备的矛盾。主机与卫星机可并行工作,二者分工明确,可以充分发挥主机的高速计算能力。
            脱机批处理系统:20世纪60年代应用十分广泛,它极大缓解了人机矛盾及主机与外设的矛盾。
         不足:但目前为止,所有的程序都还是串行执行的,也就是一个程序结束才执行下一个程序,每次主机内存中仅存放一道作业,每当主机中这个运行期间的作业或者说程序发出输入/输出(I/O)请求后,CPU要去高速磁带里读数据,计算结果要往高速磁带里面写数据,那么高速的CPU便处于等待低速的I/O完成状态,CPU并没有完全的运算起来,也可以理解为我要等着你输入或者等着你输出,致使CPU空闲。注意:之前系统的缺点说的是等待用户将程序全部输入进去,等待程序运行结束后输出最终结果的操作。现在说的是程序运行期间发生的输入\输出操作,也就是去高速磁带里面去读取程序数据,然后将输出数据写到高速磁带中,也是耗时的,cpu这段时间内的利用率也是很低的。
       为改善CPU的利用率,又引入了多道程序系统
 
第三代(1955-1965) 多道程序系统(多道是重点*****)
多道程序设计技术: 多道程序设计技术是指在内存同时放若干道程序,使它们在系统中并发执行,共享系统中的各种资源。当一道程序暂停执行时,CPU立即转去执行另一道程序。
 
空间上的复用:将内存分为几个部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序.
时间上的复用: 当一个程序在等待I/O时,另一个程序可以使用cpu,如果内存中可以同事存放足够多的作业,则cpu的利用率接近100%
分时系统,实时系统和通用操作系统
 
并行与并发
并行性和并发性 (Concurrence) 是既相似又有区别的两个概念,并行性是指两个或多个事件在同一时刻发生;而并发性是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可同时执行。
1.并行:
  看着像同时运行,其实是任务之间的切换(遇到io切换的会提高代码效率) ,任务切换+保存状态(保存现场)
2.并发:
  伪并行,看着像同时运行,其实是任务之间的切换(遇到io切换的会提高代码效率) ,任务切换+保存状态(保存现场)
 
 
同步,异步,非阻塞
进程的三种基本状态
1. 就绪(Ready)状态
  当进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
2. 执行状态
  进程已获得 CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态。
3. 阻塞状态
  正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即进程的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态
 
 
同步,异步,阻塞与非阻塞
  1.同步阻塞形式
    效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。
 
  2.异步阻塞形式
    如果在排队取餐的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能做其它的事情,就在那坐着等着,不能玩游戏等,那么很显然,这个人被阻塞在了这个等待的操作上面;异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
 
  3.同步非阻塞形式
    实际上是效率低下的。想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。
 
  4.异步非阻塞形式
    效率更高,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉点餐员说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。很多人会把同步和阻塞混淆,是因为很多时候同步操作会以阻塞的形式表现出来,同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO操作处被阻塞。
 
进程的创建:
1.multiprocessing 模块
import time
from multiprocessing import Process
 
def f1():
    time.sleep(3)
    print('xxxx')
 
def f2():
    time.sleep(3)
    print('ssss')
 
# f1()
# f2()
 
 
#windows系统下必须写main,因为windows系统创建子进程的方式决定的,开启一个子进程,这个子进程 会copy一份主进程的所有代码,并且机制类似于import引入,这样就容易导致引入代码的时候,被引入的代码中的可执行程序被执行,导致递归开始进程,会报错
if __name__ == '__main__':  #
    # p1 = Process(target=f1,)
    p2 = Process(target=f2,)
    # p1.start()
    p2.start()
 
2.for循环创建进程
import time
from multiprocessing import Process
 
def f1(i):
    time.sleep(3)
    print(i)
 
if __name__ == '__main__':
 
    for i in range(20):
        p1 = Process(target=f1,args=(i,))
        p1.start()
 
3.进程的传参方式和创建方式
 
from multiprocessing import Process
 
#演示两种传参方式
def f1(n):
    print(n)
 
 
if __name__ == '__main__':
    # p1 = Process(target=f1,args=('大力与奇迹',)) #创建进程对象
    p1 = Process(target=f1,kwargs={'n':'大力'}) #创建进程对象
 
    p1.start()  #给操作系统发送了一个创建进程的信号,后续进程的创建都是操作系统的事儿了
 
 
#进程的创建方式2
 
class MyProcess(Process):
 
    def __init__(self,n):
        super().__init__()  #别忘了执行父类的init
        self.n = n
 
    def run(self):
        print('宝宝and%s不可告人的事情'%self.n)
 
 
if __name__ == '__main__':
 
    p1 = MyProcess('高望')
    p1.start()
 
4.join方法
import time
from multiprocessing import Process
 
def f1():
    time.sleep(2)
    print('xxxx')
 
def f2():
    time.sleep(2)
    print('ssss')
 
# f1()
# f2()
if __name__ == '__main__':
 
    p1 = Process(target=f1,)
    p1.start()
    p1.join()  # 主进程等待子进程运行完才继续执行
 
    print('开始p2拉')
 
    p2 = Process(target=f2,)
    p2.start()
    p2.join()
    print('我要等了...等我的子进程...')
    # time.sleep(3)
    print('我是主进程!!!')
 
 
 
                                    

day30 进程的更多相关文章

  1. day30 网络编程 之进程,线程,协程

    进程点进去 线程点进去 协程点进去 什么是进程 进程(有时称为重量级进程)是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.同一个程序执行两次,属于是两个不 ...

  2. day30 操作系统介绍 进程的创建

    今日内容 一.操作系统的简单介绍 二,并发与并行 三.同步异步阻塞非阻塞 四.multiprocess模块 1. 操作系统的简单介绍 多道技术(重点) 空间复用: 时间复用: 进程之间是空间隔离的 分 ...

  3. 8.9 day30 并发编程 进程理论 进程方法 守护进程 互斥锁

    多道技术 1.空间上的复用 多个程序共用一套计算机硬件 多道技术原理 2.时间上的复用 ​ 切换+保存状态 ​ 1.当一个程序遇到IO操作 操作系统会剥夺该程序的CPU执行权限( 提高了CPU的利用率 ...

  4. day30线程(Threads)

    day30线程(Threads) 1.开启线程 一.什么是线程: 1.进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程. 2.主进程中的线程称为主线程,其他开启的线程称 ...

  5. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  6. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  7. 使用Monit监控本地进程

    目前用它监控某些服务,失败自动重启,同时监控特定的日志文件,如果有变化,就发邮件报警 安装不细写了,网上好多 我先用cat /proc/version看了下我的系统是el6的,于是wget http: ...

  8. [APUE]进程控制(上)

    一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是init进程,在自举(bootstr ...

  9. [APUE]UNIX进程的环境(下)

    一.共享库 共享库使得可执行文件中不再需要包含常用的库函数,而只需在所有进程都可存取的存储区中保存这种库例程的一个副本.程序第一次执行的时候或第一次调用某个库函数的时候,用动态链接方法将程序与共享库函 ...

随机推荐

  1. 使用C++11新特性来实现RAII进行资源管理

    方法一:借助auto.decltype.unique_ptr.Lambda表达式构造 sqlite3 *db = NULL; auto deleter = [](sqlite3 *pdb){sqlit ...

  2. mysql安装错误之->ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

    有时候,当我们使用“mysql”.“mysqladmin”.“mysqldump”等命令管理数据库时,服务器抛出类似如下错误: 一.错误现场还原:下面我们通过三种方式来连接,然后观察提示的错误信息: ...

  3. ZT 设计模式六大原则(4):接口隔离原则

    设计模式六大原则(4):接口隔离原则 分类: 设计模式 2012-02-27 08:32 17948人阅读 评论(21) 收藏 举报 设计模式classinterfacecstring框架 定义:客户 ...

  4. MapReduce过程详解(基于hadoop2.x架构)

    本文基于hadoop2.x架构详细描述了mapreduce的执行过程,包括partition,combiner,shuffle等组件以及yarn平台与mapreduce编程模型的关系. mapredu ...

  5. shared_ptr 的使用及注意事项

    1. 声明#include <boost/shared_ptr.hpp> class UsersBitmap { ... } typedef boost::shared_ptr<Us ...

  6. jemter多种方式查看结果树及正则的使用

    最近才发现jemter结果是有一种正则表达式匹配的显示方式,以前直接在TEXT下显示和来匹配正则,真是费时间,使用方式如下: 默认使用TEXT方式显示: 显示方式有以下几种: RegExp Teste ...

  7. @autoclosure-可以让表达式自动封装成一个闭包:输入的是一个表达式

    @autoclosure 在闭包前面加上@autoclosure func or(first:Bool,@autoclosure second:()->Bool) -> Bool { if ...

  8. PHP时间戳和日期相互转换(转载)

    在php中我们要把时间戳转换日期可以直接使用date函数来实现,如果要把日期转换成时间戳可以使用strtotime()函数实现,下面我来给大家举例说明. 1.php中时间转换函数 strtotime ...

  9. 关于P/Invoke的闲话

    P/Invoke,Platform Invoke,平台调用,是.NET打通托管与非托管两个世界的通路,10来年前曾经研究过这方面的技术,还曾发表过相关文章在<程序员>上,呵呵. 昨天有需求 ...

  10. 给windows添加路由

    route add 10.0.0.0 mask 255.0.0.0 172.16.1.253 -p