python摸爬滚打之day030----进程
1、操作系统了解
现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成, 这些都是硬件设备, 而操作系统就是负责调用这些硬件为用户服务的.
操作系统位于计算机硬件与应用软件之间,本质也是一个软件.
精简的说的话,操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序。
2、操作系统发展中几个比较重要的系统阶段
多道程序系统
多道程序设计技术,就是指允许多个程序同时进入内存并运行。即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。
特点: 空间复用:将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序.
时间复用:当一个程序在等待I/O时,另一个程序可以使用cpu,如果内存中可以同时存放足够多的作业,则cpu的利用率可以接近100%.
缺点: 空间复用:程序之间的内存没有确切分割,不由操作系统控制。如果内存彼此不分割,则一个程序可以访问另外一个程序的内存。
时间复用:必须等某个程序出现I/O阻塞, cpu才会进行切换, 否则该程序一直占用cpu资源.
分时系统(交互式系统)
把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。若某个作业在分配给它的时间片内不能完成其计算,则该作业暂时中断,把处理机让给另一作业使用,等待下一轮时再继续其运行。由于计算机速度很快,作业运行轮转得很快,给每个用户的印象是,好象他独占了一台计算机。而每个用户可以通过自己的终端向系统发出各种操作控制命令,在充分的人机交互情况下,完成作业的运行。
特点:
(1)多路性。若干个用户同时使用一台计算机。微观上看是各用户轮流使用计算机;宏观上看是各用户并行工作.
(2)交互性。用户可根据系统对请求的响应结果,进一步向系统提出新的请求。这种能使用户与系统进行人机对话的工作方式,又被称为交互式系统.
(3)及时性。系统可对用户的输入及时作出响应.
3、什么是进程
进程: 就是执行中的程序. 当cpu调用程序计算时才是一个进程.
特点:
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
4、并发与并行
并发:是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发)
并行:并行:同时运行,只有具备多个cpu才能实现并行

内存中同时存入多道(多个)程序,cpu从一个进程快速切换到另外一个,使每个进程各自运行几十或几百毫秒,这样,虽然在某一个瞬间,一个cpu只能执行一个任务,但在1秒内,cpu却可以运行多个进程,这就给人产生了并行的错觉,即伪并行,以此来区分多处理器操作系统的真正硬件并行(多个cpu共享同一个物理内存)
5、同步/异步/阻塞/非阻塞
程序的三个状态
就绪状态: 当进程已分配到除CPU以外的所有必要的资源,只要获得cpu便可立即执行,这时的进程状态称为就绪状态。
执行/运行状态: 当进程已获得cup,其程序正在cpu上执行,此时的进程状态称为执行状态。
阻塞状态: 正在执行的进程,由于等待某个事件发生而无法执行时,便放弃cpu而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

同步: 第一个程序运行完才运行第二个程序, 串行.
异步: 不需要等待第一个程序结束, 就可以运行第二个程序.
阻塞: 程序在等待某个指令之外不能做其他的事, 这个机制就是阻塞.
非阻塞: 程序在等待某个指令之外, 还能做其他的事情, 即非阻塞.
同步阻塞: 程序被阻塞着, 除了等不能干其他的事情, 效率最低.
异步阻塞: 异步操作是可以被阻塞的, 不过不是在处理消息时阻塞, 而是在等待消息通知时被阻塞, 效率较低.
同步非阻塞: 程序没有阻塞, 但要在两种不同的行为之间来回切换, 效率较低.
异步非阻塞: 可以干其他的事情而且不会被阻塞.
6、创建进程的两种方式
创建Process类的进程对象.
import os
from multiprocessing import Process def func1(a):
print(a)
print("执行func1函数")
print("子进程的进程号-----",os.getpid())
print("子进程的父进程的进程号////////",os.getppid()) # 和主进程的进程号一样 def func2():
print("执行func2函数") a = ""
if __name__ == '__main__':
# --------> 在windows下必须要写的, 在创建子进程时, 系统会把当前模块内的所有代码复制一份到子进程中去,
# 加上 if __name__ == '__main__', 子进程运行时, __name__在子进程中为"__mp_main__", 不等于"__main__", 不会被执行. p = Process(target=func1,args=(563,)) # 创建一个进程对象, args参数必须是一个元组的形式
p.start() # 子进程执行start方法,并不是调用子进程, 而是告诉操作系统, 子进程创建好了, 可以让cpu去调用子进程了 print("主进程的进程号+++++",os.getpid())
print("执行到最后了") print(a+"主进程",__name__) # 放在 if __name__ == '__main__' 中, 只能执行一次
print(a+"子进程",__name__) # 会被执行两次
创建进程第一种方式
继承Process类, 以类的方式创建进程.
from multiprocessing import Process
class MyProcess(Process):
def __init__(self,m): # 想要传参必须先继承父类的__init__方法, 然后再封装参数在对象中.
super().__init__()
self.m = m
def run(self): # 方法名一定是run(), 否则无意义.
print("执行run方法")
print(self.m)
if __name__ == '__main__':
p = MyProcess(360) # 实例化自己定义的进程类
p.start()
创建进程的第二种方式
参数介绍: 1 group参数未使用,值始终为None
2 target表示调用对象,即子进程要执行的任务
3 name为子进程的名称
4 args表示调用对象的位置参数元组,args=(1,2,'egon',)
5 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
7、几种方法
p.terminate() : 强制终止进程
p.is_alive() : 如果p还在运行,就返回True
p.join() : 等待子进程结束后主进程再结束.
os.getpid() : 获取该进程的进程号
os.getppid() : 获取该进程父进程的进程号
p.pid: p进程的进程号
p.name: p进程的名字
import time
from multiprocessing import Process class MyProcess(Process): def __init__(self,m): # 想要传参必须先继承父类的__init__方法, 然后再封装参数在对象中.
super().__init__()
self.m = m def run(self): # 方法名一定是run(), 否则无意义.
print("执行run方法")
print(self.m)
time.sleep(5)
print("看看terminate好使不") if __name__ == '__main__': p = MyProcess(360) # 实例化自己定义的进程类
p.start() p.terminate() # 关闭进程,不会立即关闭,有个等着操作系统去关闭这个进程的时间,所以is_alive立刻查看的结果可能还是存活,但是稍微等一会,就被关掉了
print(p.is_alive()) # True
time.sleep(0.1)
print(p.is_alive()) # False
几种方法演示
8、进程之间的数据是隔离的, 一般情况下不同进程间的数据是相互访问不到的.
from multiprocessing import Process numb = 100
class MyProcess(Process): def run(self):
global numb
numb += 100
print("子进程的numb: ",numb) # numb都是200, 异步,每个子进程都开始抢占cpu资源 if __name__ == '__main__': p_lst = []
for i in range(10):
p = MyProcess()
p.start()
p_lst.append(p) # 创建10个进程并加进列表里
for p in p_lst:
p.join() # 等所有的进程都跑完了再走主进程 print(numb) # 还是100, 说明创建的10个子进程都访问不到主进程里的numb, 空间隔离说法成立.
验证进程间的内存互相访问不到
9、僵尸进程: 一个子进程退出, 那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
(了解ok)
python摸爬滚打之day030----进程的更多相关文章
- Python之线程、进程和协程
python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...
- Python全栈【进程、线程】
Python全栈[进程.线程] 本节内容: 进程 线程 协程 I/O多路复用 进程 1.进程就是一个程序在一个数据集上的一次动态执行过程,进程是资源分配的最小单元. 2.进程一般由程序.数据集.进程控 ...
- [转载] python利用psutil遍历进程名字和exe所在目录
本文转载自: http://www.duanzhihe.com/1594.html http://www.jianshu.com/p/64e265f663f6 import psutil,os,tim ...
- 在Python程序中的进程操作,multiprocess.Process模块
在python程序中的进程操作 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...
- python全栈开发 * 进程理论 进程创建 * 180724
一.进程理论 1.进程是资源分配的最小单位. 2.进程调度就是多个进程在操作系统的控制下被CPU执行,去享用计算机的资源. 先来先服务 短作业优先 时间片轮转 多级反馈队列 3.进程调度的过程是不能够 ...
- python自带的进程池及线程池
进程池 """ python自带的进程池 """ from multiprocessing import Pool from time im ...
- Python 多进程编程之 进程间的通信(在Pool中Queue)
Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...
- Python 多进程编程之 进程间的通信(Queue)
Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...
- python 全栈开发,Day38(在python程序中的进程操作,multiprocess.Process模块)
昨日内容回顾 操作系统纸带打孔计算机批处理 —— 磁带 联机 脱机多道操作系统 —— 极大的提高了CPU的利用率 在计算机中 可以有超过一个进程 进程遇到IO的时候 切换给另外的进程使用CPU 数据隔 ...
- Python之线程与进程
今天我们来了解一下Python的线程和进程的管理机制 首先,我们要了解下线程跟进程的概念: 线程(Thread)是操作系统能够进行运算调度的最小的单位,是一堆cpu的指令.他被包含在进程中,是进程中的 ...
随机推荐
- codeforces 893F - Physical Education Lessons 动态开点线段树合并
https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...
- C++设计模式——原型模式
什么是原型模式? 在GOF的<设计模式:可复用面向对象软件的基础>中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.这这个定义中,最重要的一个词是“拷贝”,也就 ...
- PostgreSQL快速入门
一.PostgreSQL是什么? PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS). 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们. PostgreSQ ...
- $Django 路飞之显示视频,Redis存购物车数据,优惠卷生成表,优惠卷的一个领取表。(知识小回顾)
知识小回顾之json序列化问题 精髓:支持python的几种数据类型(注意不是对象,不能放对象),其次是tuple变list. ensure_ascii:默认值True,如果dict内含有non-AS ...
- WPF 10天修炼 第一天- 入门
简介 WPF技术基于DirectX,完美的整合了矢量图形.2D或3D绘图技术.文件及多媒体技术.WPF将开发人员和设计人员的职责清楚的分离,提供了一种声明编程语言XAML.同时Expression B ...
- noj算法 堡垒问题 回溯法
描述: 城堡是一个4×4的方格,为了保卫城堡,现需要在某些格子里修建一些堡垒.城堡中的某些格子是墙,其余格子都是空格,堡垒只能建在空格里,每个堡垒都可以向上下左右四个方向射击,如果两个堡垒在同一行或同 ...
- niagara Workbench module import IntelliJ
1. 在整个网络布线中使用一种布线方式,但是两端都有RJ-45 plug 的网络连线,无论是采用方式A还是方式B 端接的方式都是试用的.网络都是通用的,双绞线的顺序与RJ-45偶的引脚序号一一对应, ...
- fs.inotify.max_user_watches默认值太小,导致too many open files
运行环境:centos7.5 linux 打开文件数 too many open files 解决方法fs.inotify.max_user_watches默认值太小,导致too many open ...
- C++线程中的几种锁
线程之间的锁有:互斥锁.条件锁.自旋锁.读写锁.递归锁.一般而言,锁的功能越强大,性能就会越低. 1.互斥锁 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量.也就是说是为了避免多个线程在 ...
- SQL反模式学习笔记15 分组
目标:查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段 反模式:引用非分组列 单值规则:跟在Select之后的选择列表中的每一列,对于每个分组来说都必须返回且仅返回一直值. ...