主流网站建设,网站建设服务器的选择方式包括哪些,吴江那里有做公司网站的,seo推广内容一、什么是进程
进程#xff1a;正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。
二、进程与程序的区别
程序仅仅只是一堆代码而已#xff0c;而进程指的是程序的运行过程。
三、并发与并行
无论是并行还是并发#xff0c;在用户看来都是’同时’运行的正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。
二、进程与程序的区别
程序仅仅只是一堆代码而已而进程指的是程序的运行过程。
三、并发与并行
无论是并行还是并发在用户看来都是’同时’运行的不管是进程还是线程都只是一个任务而已真是干活的是cpucpu来做这些任务而一个cpu同一时刻只能执行一个任务
3.1 并发
是伪并行即看起来是同时运行。单个cpu多道技术就可以实现并发并行也属于并发
3.2 并行
同时运行只有具备多个cpu才能实现并行
单核下可以利用多道技术多个核每个核也都可以利用多道技术多道技术是针对单核而言的
有四个核六个任务这样同一时间有四个任务被执行假设分别被分配给了cpu1cpu2cpu3cpu4
一旦任务1遇到I/O就被迫中断执行此时任务5就拿到cpu1的时间片去执行这就是单核下的多道技术
而一旦任务1的I/O结束了操作系统会重新调用它(需知进程的调度、分配给哪个cpu运行由操作系统说了算)可能被分配给四个cpu中的任意一个去执行 所有现代计算机经常会在同一时间做很多件事一个用户的PC无论是单cpu还是多cpu都可以同时运行多个任务一个任务可以理解为一个进程。
启动一个进程来杀毒360软件
启动一个进程来看电影暴风影音
启动一个进程来聊天腾讯QQ
所有的这些进程都需被管理于是一个支持多进程的多道程序系统是至关重要的
多道技术概念回顾内存中同时存入多道多个程序cpu从一个进程快速切换到另外一个使每个进程各自运行几十或几百毫秒这样虽然在某一个瞬间一个cpu只能执行一个任务但在1秒内cpu却可以运行多个进程这就给人产生了并行的错觉即伪并发以此来区分多处理器操作系统的真正硬件并行多个cpu共享同一个物理内存
四、同步/异步阻塞/非阻塞重点
4.1 同步
所谓同步就是在发出一个功能调用时在没有得到结果之前该调用就不会返回。按照这个定义其实绝大多数函数都是同步调用。但是一般而言我们在说同步、异步的时候特指那些需要其他部件协作或者需要一定时间完成的任务。
举例
1. multiprocessing.Pool下的apply #发起同步调用后就在原地等着任务结束根本不考虑任务是在计算还是在io阻塞总之就是一股脑地等任务结束2. concurrent.futures.ProcessPoolExecutor().submit(func,).result()3. concurrent.futures.ThreadPoolExecutor().submit(func,).result()
4.2 异步
异步的概念和同步相对。当一个异步功能调用发出后调用者不能立刻得到结果。当该异步功能完成后通过状态、通知或回调来通知调用者。如果异步功能用状态来通知那么调用者就需要每隔一定时间检查一次效率就很低有些初学多线程编程的人总喜欢用一个循环去检查某个变量的值这其实是一 种很严重的错误。如果是使用通知的方式效率则很高因为异步功能几乎不需要做额外的操作。至于回调函数其实和通知没太多区别。
举例
1. multiprocessing.Pool().apply_async() #发起异步调用后并不会等待任务结束才返回相反会立即获取一个临时结果并不是最终的结果可能是封装好的一个对象。2. concurrent.futures.ProcessPoolExecutor(3).submit(func,)3. concurrent.futures.ThreadPoolExecutor(3).submit(func,)
4.3 阻塞
阻塞调用是指调用结果返回之前当前线程会被挂起如遇到io操作。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来实际上他是不同的。对于同步调用来说很多时候当前线程还是激活的只是从逻辑上当前函数没有返回而已。
举例 1. 同步调用apply一个累计1亿次的任务该调用会一直等待直到任务返回结果为止但并未阻塞住即便是被抢走cpu的执行权限那也是处于就绪态; 2. 阻塞调用当socket工作在阻塞模式的时候如果没有数据的情况下调用recv函数则当前线程就会被挂起直到有数据为止。
4.4 非阻塞
非阻塞和阻塞的概念相对应指在不能立刻得到结果之前也会立刻返回同时该函数不会阻塞当前线程。
4.5 小结
1. 同步与异步针对的是函数/任务的调用方式同步就是当一个进程发起一个函数任务调用的时候一直等到函数任务完成而进程继续处于激活状态。而异步情况下是当一个进程发起一个函数任务调用的时候不会等函数返回而是继续往下执行当函数返回的时候通过状态、通知、事件等方式通知进程任务完成。 2. 阻塞与非阻塞针对的是进程或线程阻塞是当请求不能满足的时候就将进程挂起而非阻塞则不会阻塞当前进程
五、进程的创建了解
但凡是硬件都需要有操作系统去管理只要有操作系统就有进程的概念就需要有创建进程的方式一些操作系统只为一个应用程序设计比如微波炉中的控制器一旦启动微波炉所有的进程都已经存在。
而对于通用系统跑很多应用程序需要有系统运行过程中创建或撤销进程的能力主要分为4中形式创建新的进程
系统初始化查看进程linux中用ps命令windows中用任务管理器前台进程负责与用户交互后台运行的进程与用户无关运行在后台并且只在需要时才唤醒的进程称为守护进程如电子邮件、web页面、新闻、打印
一个进程在运行过程中开启了子进程如nginx开启多进程os.fork,subprocess.Popen等
用户的交互式请求而创建一个新进程如用户双击暴风影音
一个批处理作业的初始化只在大型机的批处理系统中应用
无论哪一种新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的
在UNIX中该系统调用是forkfork会创建一个与父进程一模一样的副本二者有相同的存储映像、同样的环境字符串和同样的打开文件在shell解释器进程中执行一个命令就会创建一个子进程
在windows中该系统调用是CreateProcessCreateProcess既处理进程的创建也负责把正确的程序装入新进程。
关于创建的子进程UNIX和windows
相同的是进程创建后父进程和子进程有各自不同的地址空间多道技术要求物理层面实现进程之间内存的隔离任何一个进程的在其地址空间中的修改都不会影响到另外一个进程。
不同的是在UNIX中子进程的初始地址空间是父进程的一个副本提示子进程和父进程是可以有只读的共享内存区的。但是对于windows系统来说从一开始父进程与子进程的地址空间就是不同的。
六、进程的终止了解
正常退出自愿如用户点击交互式页面的叉号或程序执行完毕调用发起系统调用正常退出在linux中用exit在windows中用ExitProcess
出错退出自愿python a.py中a.py不存在
严重错误非自愿执行非法指令如引用不存在的内存1/0等可以捕捉异常try…except…
被其他进程杀死非自愿如kill -9
七、进程的层次结构
无论UNIX还是windows进程只有一个父进程不同的是
在UNIX中所有的进程都是以init进程为根组成树形结构。父子进程共同组成一个进程组这样当从键盘发出一个信号时该信号被送给当前与键盘相关的进程组中的所有成员。
在windows中没有进程层次的概念所有的进程都是地位相同的唯一类似于进程层次的暗示是在创建进程时父进程得到一个特别的令牌称为句柄,该句柄可以用来控制子进程但是父进程有权把该句柄传给其他子进程这样就没有层次了。
八、进程的状态
tail -f access.log | grep 404
执行程序tail开启一个子进程执行程序grep开启另外一个子进程两个进程之间基于管道’|’通讯将tail的结果作为grep的输入。
进程grep在等待输入即I/O时的状态称为阻塞此时grep命令都无法运行
其实在两种情况下会导致一个进程在逻辑上不能运行
进程挂起是自身原因遇到I/O阻塞便要让出CPU让其他进程去执行这样保证CPU一直在工作
与进程无关是操作系统层面可能会因为一个进程占用时间过多或者优先级等原因而调用其他的进程去使用CPU。
因而一个进程由三种状态 九、进程并发的实现了解
进程并发的实现在于硬件中断一个正在运行的进程把此时进程运行的所有状态保存下来为此操作系统维护一张表格即进程表process table每个进程占用一个进程表项这些表项也称为进程控制块 该表存放了进程状态的重要信息程序计数器、堆栈指针、内存分配状况、所有打开文件的状态、帐号和调度信息以及其他在进程由运行态转为就绪态或阻塞态时必须保存的信息从而保证该进程在再次启动时就像从未被中断过一样。