三、文件描述符及重定向 系统中由3个文件描述符0,1,3,分别对应/dev/std中的3个文件: stdin 标准输入,默认为键盘。 如:键盘输入 stdout 标准输出,默认为显示器。 标准输出重定向,覆盖文件内容 #ls 1> ttt 2> 标准错误输出重定向,覆盖文件内容 #la 2> ttte &> 标准输出+标准错误输出重定向,覆盖文件内容 #ls / /test &> ttt3 >> 输出追加重定向,追加文件内容,不覆盖 #ls >> ttt3 << 输入重定向 #cat > t <<END 杀掉某一控制台上所有进程: skill -9 pts/2 查看进程: ps 查看当前所有正在执行的进程 vim /etc/inittab 1.表示单用户模式 作用:重置root密码 2.多用户模式 但是不带NFS(不支持) 3.完全多用户模式 4.未使用的 id:3:initdefault: 开机选择启动方式 3或5
程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。[3] 进程是操作系统中最基本、重要的概念。 在轮转法中,加入到就绪队列的进程有3种情况: 一种是分给它的时间片用完,但进程还未完成,回到就绪队列的末尾等待下次调度去继续执行。 (3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。 (3)阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。 一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等) 3. 用户的交互式请求,而创建一个新进程(如用户双击暴风影音) 4.
进程与程序的区别,可以理解为程序是我们写的一堆代码,而进程则是CPU执行这堆代码的过程,同一个程序被执行两次,就会产生两个进程。 当有新的请求提交到Pool中时,如果资源池还没满,就会创建一个新的进程,如果Pool中的进程数达到最大值,新的请求就会进入等待状态,直到进程池中有进程结束,才会创建新的进程来处理。 ()*3) print('进程 %s 运行结束'%id) if __name__=='__main__': print('当前进程ID:%s'%os.getpid()) p=Pool (processes=3) for i in range(5): p.apply_async(pool_run,args=(i,)) print('子进%s程启动'%i) 上面的代码创建了容量为3的进程池,再向进程池中添加5个任务,从运行结果可看出,虽然是创建5个进程任务,但每次最多运行3个,当一个任务结束了,新的任务才被添加进来,而新添加的任务依然是原来的进程,从进程的
是否为系统进程: 是 absr.exe进程文件: absr or absr.exe进程名称: Backdoor.Autoupder Virus描述: 这个进程是Backdoor.Autoupder后门病毒程序创建的 是否为系统进程: 否 acrobat.exe进程文件: acrobat or acrobat.exe进程名称: Adobe Acrobat描述: Acrobat Writer用于创建PDF文档。 是否为系统进程: 否 acrord32.exe进程文件: acrord32 or acrord32.exe进程名称: Acrobat Reader描述: Acrobat Reader是一个用于阅读PDF 是否为系统进程: 否 aim.exe进程文件: aim or aim.exe进程名称: AOL Instant Messenger描述: AOL Instant Messenger是一个在线聊天和即时通讯 是否为系统进程: 否 cmd.exe 进程文件: cmd or cmd.exe 进程名称: Windows Command Prompt 描述: Windows控制台程序。
Android 系统将尽量长时间地保持应用进程,但为了新建进程或运行更重要的进程,最终需要移除旧进程来回收内存。 以下列表按照重要程度列出了各类进程(第一个进程最重要,将是最后一个被终止的进程): 1.前台进程:(foregroundprocess) 用户当前操作所必需的进程。 可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。 3.服务进程 正在运行已使用 startService() 方法启动的服务且不属于上述两个更高类别进程的进程。 此外,一个进程的级别可能会因其他进程对它的依赖而有所提高,即服务于另一进程的进程其级别永远不会低于其所服务的进程。
前言: 继上文介绍了着重介绍了进程的内部属性,以及在操作系统层面进程如何被组织起来的,如何调用系统接口,有关task_struct,进程的部分理解等,今天,我们就从进程的相关属性入手, 进程的创建 承接上文 \n"); } 代码本身是没有什么错误的,但是打印出来的时候,会发现打印出来并不是一个父进程一个子进程的打印,因为子进程会执行父进程后面的代码,所以也会执行这个死循环,从而导致子进程创建子进程,变成了指数级别的增长 根据前面的代码我们知道,子进程会继承父进程后面的所有代码,但是我们创建子进程就是为了执行后面的代码吗?父进程也可以执行啊,为什么要创建呢? 翻译过来就是,成功创建子进程,那么子进程的Pid就会返回给父进程,0返回给子进程,失败了就是返回-1给父进程,也就是说,成功了会有两个返回值,我们就可以写如下代码: 7 pid_t id = fork 不出意外的,我们创建了6个进程,主函数是第一个进程,后面通过for循环创建了5个子进程,并且5个子进程之间是没有关联的,并且通过它们各自的pid我们发现5个子进程的ppid都是父进程的12607,大胆预测的父进程的
kill -19 进程PID 暂停进程 kill -18 进程PID 恢复进程之前状态 kill - 9 进程PID 干掉进程 用的也是一个简单无限循环代码。 #include<stdio.h> 2 #include<unistd.h> 3 #include<sys/types.h> 4 int main() 5 { 6 pid_t p 四、孤儿进程 僵尸进程是子进程被干掉,父进程还不进行回收的情况。如果保留子进程,让其正常运行,转而把它的父进程干掉,那么这个子进程就会变成孤儿进程。之后这个孤儿进程会被系统给领养。 系统为什么要领养孤儿进程?这是因为孤儿进程没有了父进程,也就没有对其进行回收的进程。当孤儿进程执行完毕的时候就会变成僵尸进程,会有危害。 而把这些孤儿进程交给系统,当孤儿进程退出的时候系统就可以将其回收。系统领养孤儿进程的目的就是:避免孤儿进程终止后成为 “无人回收的僵尸进程”。
通常,每个服务实例都是一个进程。 因此,如图 3-1 所示,服务必须使用进程间通信(IPC)机制进行交互。 稍后我们将了解到多种 IPC 技术,但在此之前,我们先来探讨一下涉及到的各种设计问题。 ? – 一对一 一对多 同步 请求/响应 – 异步 通知 发布/订阅 异步 请求/异步响应 发布/异步响应 表 3-1、进程间通信方式 一对一交互分为以下列举的类型,包括同步(请求/响应)与异步(通知与请求 由于客户端进程与服务进程是分开的,服务可能无法及时响应客户端的请求。由于故障或者维护,服务可能需要关闭。也有可能因服务过载,造成响应速度变得极慢。 例如,请回想第二章中的产品详细信息场景。 以致最终,在运行时将线程用完,造成无法响应,如图 3-3 所示。 ? 为了防止出现此类问题,您必须设计您的服务以处理局部故障。以下是一个由 Netflix 给出的好办法。 级别 3 级别 3 的 API 基于非常规命名原则设计,HATEOAS(Hypermedia as the engine of application state,超媒体即应用程序状态引擎)。
一、理解进程程序替换 如果我们想要在一个进程里面执行另一个程序,那么就需要进行程序替换,也就是父进程创建一个子进程,然后通过程序替换的方式将想要执行的程序交给这个子进程去去执行。 创建一个子进程,这个子进程会拷贝父进程的从而拥有自己的task_struct(新建结构体并大部分拷贝父进程)、虚拟地址空间和页表,代码和数据与父进程共享。 为什么一定是父进程创建子进程 + 子进程程序替换的方式?因为程序替换会直接重置页表,虚拟地址用的又是新的程序的。如果直接由父进程进行程序替换的话,父进程它本身原来要执行的程序就相当于直接销毁了。 示例: 1 #include<unistd.h> 2 #include<stdio.h> 3 #include<sys/types.h> 4 #include<wait.h ,我回收了子进程\n"); 23 return 0; 24 } myfile.c 3 int main() 4 { 5 printf("我是file文件,程序切换成功啦!
目录 Ring3挂起进程,跟恢复进程. 一丶简介 二丶代码 Ring3挂起进程,跟恢复进程. 一丶简介 有时候我们做对抗的时候可能会遇到.一个进程常常操作我们.但是我们 可以通过挂起进程来挂起它让它无法操作.当然方法很多.不止这一种. 原理: 原理就是挂起所有线程,我们可以调用NtDLL中低层的函数还挂起进程. NT 函数 NtSuspendProcess NtResumeProcess 第一个是挂起进程,第二个是恢复进程 二丶代码 #include <Windows.h> #include <stdio.h
多进程抢占资源 当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题。 print('%s: %s is down' % (n, os.getpid())) if __name__ == '__main__': for i in range(3) : # 利用for循环模拟多进程 p=Process(target=work,args=(i,)) p.start() 输出结果: 0: 10974 , os.getpid())) lock.release() if __name__ == '__main__': lock = Lock() for i in range(3)
3A安全认证服务: AAA 认证(Authentication)含义: 1验证(Authentication)用户的身份与可使用的网络服务; 2授权(Authorization):依据认证结果开放网络服务给用户 ; 3计帐(Accounting):记录用户对各种网络服务的用量,并提供给计费系统。 用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。 针对用户进程,又可以分为交互进程、批处理进程和守护进程三类。 3.进程的属性 (1)进程的几种状态 进程在启动后,不一定马上开始运行,因而进程存在很多种状态。 R(Running)该进程正在运行中。 进程的查看: 1 静态进程的查看命令是ps 2动态进程的查看命令是top 3进程树的查看命令是pstree 举例:查看自己的bash相关进程 ?
进程状态 任何一个进程都要有自己的代码和数据一样,每一个进程都有自己的状态。 1、3、进程状态D Linux系统特有的状态。其中D看源码代表的disk sleep那这到底是啥意思也还是没这么明白。 如果进程中内存严重不足的情况下,Linux的操作系用有权利杀掉进程来释放空间。 2、僵尸进程 这样的代码的含义就是父进程一直处于while循环之中,但是子进程只会执行5次,此时子进程执行结束之后,父进程还没有结束,所以此时的子进程处于没有被回收的状态,也就是子进程现在是僵尸进程 3、孤儿进程 顾名思义,这个进程就是父进程先退出了,但是子进程还没有结束。 此时这种进程的状态就被称为阻塞。 当我们对硬件有操作之后,之后操作系统就要将硬件的结构体中队列中的特定的进程中释放,重新链回对于的进程的运行队列中。 5、3、挂起 磁盘中存在swap分区。
(父进程)复制出一份进程(子进程),这两个进程几乎完全相同,所以fork在两个进程中都返回,子进程中返回0,父进程中返回子进程的id,如以下代码 import os if __name__ Child process 2 (21076) Running Child process 3 (21077) Running Child process 0 (21074) Running %(name,os.getpid())) time.sleep(random.random()*3) print("Task %s end." Task 3 (pid = 21130) is running… Task 2 end. Task 4 (pid = 21128) is running… Task 4 end. Task 3 end. All subprocesses done 可以看出,由于制定了进程池中进程的数量为3,当调用的线程多余3个时,会阻塞
如果用户进程没有这个需要,那么程序可以依赖内核的自动的选址机制来完成自动地址选择,而不需要调用bind的函数,同时也避免不必要的复杂度。 在一般情况下,对于服务器进程问题需要调用bind函数,对于客户进程则不需要调用bind函数 ---- listen sys/socket.h 中有关于 listen 的定义 /* Prepare to 用户在调用socket函数之后,返回一个套接字sockfd. sockfd默认一个主动连接的套接字,也就是此时系统假设用户会对这个套接字调用connect函数,期待它主动与其它进程连接,然后在服务器编程中 由于系统默认时认为一个套接字是主动连接的,所以需要通过某种方式来告诉系统,用户进程通过系统调用listen来完成这件事 listen函数可使得流套接字sockfd处于监听状态,使得一个进程可以接受其它进程的请求 ,从而成为一个服务器进程。
在解释进程之前,我们要知道在操作系统中存在就绪队列和阻塞队列 进程 进程基本概念 进程是执行中的程序, 也就是说进程是动态的, 程序是静态的 进程是操作系统分配资源的最小单位,有一个进程控制块(PCB) , 有自己唯一的一个进程标识符(PID) 进程之间相互独立, 内存不共享 每个进程都是一个实体, 每个进程都有属于自己的一块内存, 进程是一个执行中的程序 进程的创建,销毁,切换的开销都比较大 进程只能创建子进程 , 进程开始执行 阻塞: 进程申请的资源未被满足, 比如申请一个临界资源时(临界区是进程访问临界资源的那一段代码), 资源正在被其他进程使用, 这时进程进入阻塞状态, 释放处理器, 进程的阻塞是主动的, CPU处理进程方式 时间片轮转: 给每个进程分配一个时间片, 如果进程在时间片内执行完就直接执行下一个进程, 如果没执行完, 进程释放CPU给下一个进程 优先级队列: 在优先级队列中, 每个进程都会被分配优先级 非抢占式和抢占式区别: 非抢占式: 在进程运行时, 不允许别的进程剥夺当前运行进程的处理器, 在这种情况下, 在用优先级分配处理机时, 正在运行的进程优先级不一定是当前所有进程中优先级最高的, 因为可能在进程运行过程中有更高的进程被加入到就绪队列中
进程作为人类的发明,自然也免不了脱离人类的习性,也有通信的需求。如果进程之间不进行任何通信,那么进程所能完成的任务就要大打折扣。 同理,进程也可以通过同样的方式来进行通信。本篇我们就来看看进程的这些交互方式。 一、进程对白:管道、套接字 人们最常用的通信手段就是对白,一方发出声音,另一方接收声音。 (管道或套接字),这需要消耗系统资源; (2)通信是自愿的,而管道和套接字需要强制双方进行通信; (3)由于建立连接需要消耗时间,一旦建立就应该尽可能多的通信,如果通信信息量很小,则就是“杀鸡用牛刀 一个进程在信号变为0或1的情况下推进,并将信号变为1或0来防止别的进程同时推进。当该进程完成任务后,则将信号再改为0或1,从而允许其他进程执行。 ,而管道是点对点; (3)消息队列只在内存中实现,而管道还可以在磁盘上实现; 参考资料 ?
PS:在多进程并发的环境里,虽然从概念上看,有多个进程在同时执行,但在单个CPU下,在任何时刻只能有一个进程处于执行状态,而其他进程则处于非执行状态。 那么问题来了,我们是如何确定在任意时刻到底由哪个进程执行,哪些不执行呢?这就涉及到进程管理的一个重要组成部分:进程调度,跟随本篇来一起复习下进程调度吧! 一、进程调度基础 1.1 进程调度定义 进程调度是操作系统进程管理的一个重要组成部分,其任务是选择下一个要运行的进程。 而抢占式则是每增加一个新的进程就需要对所有进程(包括正在CPU上运行的进程)进行检查,谁的时间短就运行谁。 2.4 优先级调度算法 优先级调度算法给每个进程赋予一个优先级,每次需要进程切换时,找一个优先级最高的进程进行调度。这样如果赋予长进程一个高优先级,则该进程就不会再“饥饿”。
因此,我们可以得到:进程=程序+执行。本篇将会对进程、进程模型、进程状态以及进程的缺陷等进行学习,为后续学习进程调度与进程通信打下坚实基础。 一、进程是什么鬼? (从逻辑上来说,程序计数器可以有多个) (3)时序视角:从时间来看,每个进程都必须往前推进。在运行一定时间后,进程都应该完成了一定的工作量。换句话说,每次进程返回,它都处在上次返回点之后。 三、进程的层次与状态 3.1 进程的层次结构 一个进程在执行过程中可以通过系统调用创建新的进程,这个新的进程就称为子进程,而创建子进程的进程则被称为父进程。 子进程又可以再创建子进程,于是这样子子孙孙地创建下去就形成了所谓的进程树。 3.2 进程的状态转换 基本的进程状态主要有3种:执行、阻塞和就绪,如下图所示: ? PS:当然,上述阐述的3种典型状态并不是唯一的分类方式,事实上,许多商业OS的进程都不止3个,比如Windows的进程就有7种状态。
多进程在Python的写法和多线程是差不多的,但它背后的逻辑却有很大的不同。多进程对于CPU的开销比多线程要大得多,所以我们还是最常用多线程。 导入多进程Process类 from multiprocessing import Process 2.创建示例 def function(): for i in range(10): print("子进程", i) if __name__ == '__main__': p = Process(target=func) p.start() for i in range(5): print("主进程", i) 通过运行结果可以看到除了导包不同,创建的实例化对象不同,思路是一致的。