搜索

操作系统概念学习笔记 第三章 进程

gecimao 发表于 2019-04-30 04:12 | 查看: | 回复:

  (process control block,PCB)来表示,PCB包含了进程状态、程序计数器、cpu寄存器、cpu调度信息、内存管理信息、记账信息、I/O状态信息等信息。

  CPU寄存器: 与程序计数器一起,这些寄存器的状态信息在出现中断时也需要保存,以便进程以后能正确的执行。

  内存管理信息:根据内存系统,这类信息包括基址和界限寄存器的值,页表或段表。

  记账信息:这类信息包括CPU时间、实际使用时间、时间界限、记账数据、作业或进程数量等。

  I/O状态信息:这类信息包含分配给进程的I/O设备列表、打开的文件列表等。

  多道程序设计的目的是无论何时都有进程执行,从而使cpu利用率达到最大。分时系统的目的是在进程之间快速切换cpu以便用户在程序运行时能与其进行交互。为达到这一目的,进程调度选择一个可用的进程到cpu上执行。单处理器系统从不会有超过一个进程在执行。如果有多个进程,那么余下的则需要等待CPU空闲并且重新调度。

  进程进入系统时被加入到作业队列中,该队列包含系统中所有进程。驻留在内存中等待运行的程序保存在就绪队列中,该队列常用链表来实现,其头节点指向链表的第一个和最后一个PCB块的指针。每个PCB包括一个指向就绪队列的下一个PCB的指针域。

  在linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB,还包含有指向父进程和子进程的指针。例如,进程的状态就是通过这个结构中的long state字段来表示的。

  在Linux内核里,所有活动的进程是通过一个名为task_struct的双向链表来表示的,内核为当前正在运行的进程保存了一个指针。

  如内核想把当前运行的进程状态值修改成 new_state。如果current是指向当前进程的指针,则:

  操作系统也有其他队列。等待特定IO设备的进程列表称为设备队列。每个设备都有自己的设备队列。

  新进程开始处于就绪队列,它就在就绪队列中等待直到被选中执行或被派遣。当进程分配到cpu执行时,可能发生:

  对于前两种情况,进程最终从等待状态切换到就绪状态,并放回到就绪队列中。进程继续这一循环直到终止,到那时它将从所有队列中删除,其PCB和资源将得以释放。

  进程会在各种调度队列之间迁移,为了调度,操作系统必须按某种方式从这些队列中选择进程。进程的选择是由相应的调度程序(scheduler)来执行的。

  通常批处理系统中,进程更多的是被提交,而不是马上执行。这些进程通常放到磁盘的缓冲池里,以便以后执行。长期调度程序或作业调度程序从该池中选择进程,并装入内存以准备执行。短期调度程序或cpu调度程序从准备执行的进程中选择进程,并为之分配cpu。

  短期调度程序通常100ms至少执行一次,由于每次执行之间的时间较短,短期调度程序必须要快。

  长期调度程序执行的并不频繁,所以长期调度程序能使用更多的时间来选择执行进程。长期调度程序控制多道程序设计的程度(内存中进程的数量)。长期调度程序必须仔细选择执行进程。通常,绝大多数进程可分为:I/O为主或CPU为主。I/O为主的进程通常执行I/O方面比执行计算花费更多时间,另一方面,CPU为主的进程很少产生I/O请求。为使系统达到平衡和更好的性能,长期调度程序应当选择一个合理的包含IO为主的和cpu为主的组合进程以充分使用设备和短期调度程序。

  对于Linux和Windows系统通常没有长期调度程序,这些系统的稳定性依赖于物理限制,如果系统性能下降很多,会有用户的退出。

  有的系统如分时系统,可能引入中期调度程序,其核心思想是能够将进程从内存中移出,从而降低多道程序设计的程度,之后进程可以被换入。

  中断使CPU从当前任务改变为运行内核子程序。当发生一个中断时,系统需要保存当前运行在CPU中进程的上下文,从而能在其处理完后恢复上下文。进程的上下文用PCB来表示。通常通过执行一个状态保存(state save)来保存cpu当前状态,之后执行一个状态恢复(state restore)重新开始运行。

  将CPU切换到另一进程需要保存当前状态并恢复另一进程状态,这叫做上下文切换(context switch)。当发生上下文切换时,内核会将旧进程的状态保存在PCB中,然后装入经调度要执行的并已保存的新进程的上下文。

  上下文切换时间是额外开销,因为切换时系统并不能做什么有用的工作。其切换时间与硬件支持密切相关。

  进程在执行时,能通过创建进程系统调用创建多个新进程。创建进程为父进程,而新进程叫做子进程。新进程都可再创建其他进程,从而形成了进程树。

  大多数操作系统根据一个唯一的进程标识符(process indentifier,pid)来识别进程,pid通常是一个整数值。

  通常进程需要一定的资源(如CPU时间,内存,文件,I/O设备)来完成其任务。子进程被创建时,子进程可能直接从操作系统,也可能只从父进程那里获取资源。父进程可能必须在其子进程之间分配资源或共享资源(如内存或文件),限制子进程只能使用父进程的资源能防止创建过多的进程带来的系统超载。

  在进程创建时,除了得到各种物理和逻辑资源外,初始化数据(或输入)由父进程传给子进程。

  UNIX操作系统中,每个进程用唯一整数标识符来标识,通过fork()系统调用,可创建新进程,新进程通过复制原来进程的地址空间而成。这种机制允许父子进程之间方便的通信。

  两个进程都继续执行位于系统调用fork()之后的指令,但是对于子进程,系统调用fork的返回值为0:而对于父进程,返回值为子进程的进程标识符(非零)。

  通常系统调用fork后,一个进程会使用系统调用exec(),以用新程序来取代进程的内存空间。系统调用exec()将二进制文件装入内存(消除了原来包含系统调用exec()的程序内存映射),并开始执行。采用这种方式,两个进程都能相互通信,并按各自的方式执行。

  父进程能创建更多的子进程,或者如果在子进程运行时没有什么可做,那么它采用系统调用wait()把自己移出就绪队列来等待子进程的终止。

  下面的c程序是我自己写的在linux下编写一个多进程并发执行程序。父进程首先创建一个执行 ls 命令的子进程然后该子进程再创建一个执行 ps 命令的子进程,并控制ps 命令总在 ls 命令之前执行。

  当子进程完成时通过调用exit(),父进程会从wait()调用处开始继续,并调用exit()以表示结束。

  进程执行完最后的语句并使用系统调用exit()请求系统删除自身时,进程终止。此时,进程可以返回状态值(通常为整数)到父进程(通过系统调用wait())。所有进程资源(物理和虚拟内存、打开文件和I/O缓冲)会被操作系统释放。

  进程通过适当的系统调用能终止另外一个进程。通常,只有被终止进程的父进程才能执行这一系统调用。否则,用户可以任意的终止彼此的作业。

  子进程使用了超过它所分配的一些资源。(为判定是否发生这种情况,要求父进程有一个检查其子进程状态的机制)

  父进程退出,如果父进程终止,那么操作系统不允许子进程继续(有些操作系统,对于这类操作系统这种现象称为级联终止)。

  UNIX:可以通过系统调用exit()来终止进程,父进程可以通过系统调用wait()以等待子进程的终止。系统调用wait()返回了中止子进程的进程标识符,以使父进程能够知道哪个子进程终止了。如果父进程终止,那么其所有子进程会以init进程作为父进程,因此,子进程仍然有一个父进程来收集状态和执行统计。

  按进程是否与其他进程共享数据,可分为独立的和协作的,即独立进程或协作进程。

  如果希望一个特定任务快速运行,那么必须将它分为子任务,每个子任务可以与其他子任务并行执行。如果要实现这样的加速,需要计算机有多个处理单元(例如CPU和I/O通道)

  协作进程需要一种进程间通信机制(IPC)来允许进程相互交换数据与信息。进程间通信有两种基本模式模式:

  对于以上两种模式,消息传递对于交换较少数据很有用,并且更易于实现,但需要更多内核介入的时间。

  共享内存系统需要建立共享内存区域。通常一块共享内存区域驻留在生成共享内存段进程的地址空间。其他希望使用这个共享内存段进行通信的进程必须将此放到它们自己的地址空间上。数据的形式或位置取决于这些进程而不是操作系统,进程还负责保证他们不向同一区域同时写数据。

  生产者—消费者问题是协作进程的通用范例。生产者进程产生信息以供消费者进程消费。例如,编译器产生的汇编代码供汇编程序使用,而汇编程序反过来产生目标代码供连接和装入程序使用。

  采用共享内存是解决生产值——消费者问题方法之一。为允许生产者进程和消费者进程能并发执行,必须有一个缓冲来被生产者填充并被消费者所使用。此缓冲驻留在共享内存区域,消费者使用一项时,生产者能产生另一项。生产者和消费者必须同步,以免消费者消费一个没有生产出的项。

  无限缓冲对缓冲大小没有限制。消费者可能不得不等待新的项,但生产者总可以产生新的项。

  有限缓冲假设缓存大小固定。对于这种情况,如果缓冲为空,那么消费者必须等待,如果缓冲为满,那么生产者必须等待。

  共享缓存通过循环数组和两个逻辑指针in和out来实现,in指向缓冲中下一个空位;out指向缓冲中第一个满位。当in = = out时,缓冲为空;当(in+1)%BUFFER-SIZE = = out时,缓冲为满。

  生产者和消费者代码如下:生产者进程有一个局部变量nextProduced以储存所产生的新项。消费者有一个局部变量nextConsumed以存储要使用的新项。

  消息传递提供一种机制以允许进程不必通过共享地址空间来实现通信和同步,这在分布式系统中很有用。例如用于程序就是通过信息交换来实现通信。

  如果进程P和Q需要通信,他们之间要有通信线路(communication link).这里不关心线路的物理实现只讨论逻辑实现。下面是一些逻辑线路和接收/发送操作的方法:

  receive(id,message)接收来自任何进程的消息,变量id设置成与其通信的进程名称

  邮箱可以抽象为一个对象,进程可以向其中存放消息,也可以从中删除消息,每个邮箱有唯一的标识符。一个进程可能通过许多不同的邮箱与其他进程通信。但两个进程仅在其共享至少一个邮箱时可以互相通信。

  send和receive可以是阻塞或非阻塞的。当都阻塞时,则接受者和发送者之间就有一个集合点(rendezvous)。当使用阻塞send和receive时,如何解决生产者和消费者问题就不在重要了。生产者仅需要调用阻塞send()并等待,直到消息被送到进程或邮箱。同样的,当消费者调用receive()时,发生阻塞直到有一个消息可用。

  不管进程是直接的还是间接的通信进程所交换的消息都驻留在临时队列中,队列实现有三种方法

  零容量:队列的最大长度为0.线路中不能有消息处于等待,对于这种情况,消息必须阻塞发送,直到接受者接收到消息。

  想访问共享内存段的进程必须采用shmat()系统调用来将其加入地址空间,其需要三个参数。

  如果成功,shmat()返回一个指向附属的的共享内存区域的内存中的初始位置的指针。

  一旦共享内存区域被加入到进程的地址空间,进程就可以采用从shmat()返回的指针,作为一般的内存访问来访问共享内存。

  当一个进程不再需要访问共享内存段,可按照下面方法将共享内存的指针传给系统调用shmdt():

  下图演示了:生成4096B的共享内存段,一旦共享内存被加入,进程向其中写入消息“hi,there”,输出后,他被删除共享内存区域。

  Mach系统中绝大多数通信是通过消息传递的。每个任务创建时,也创建了两个特别的邮箱:内核邮箱和通报邮箱(notify)。内核使用内核邮箱与任务通信,使用通报邮箱发送事件发生的通知。

  消息传输需三个调用:msg-send()向邮箱发送消息,msg_receive()接受信息。远程过程调用(RPC)通过msg_rpc() 执行,它发送消息并只等待来自发送者的一个返回消息。RPC模拟了典型的子程序过程调用,但他还能在系统之间工作——这就解释了远程。

  系统调用port-allocate()创建新邮箱并为其消息队列分配空间,消息队列默认最大长度8个消息。拥有者也被允许接收来自邮箱的消息。一次只能有一个任务能拥有邮箱或从邮箱接受。

  消息本身由固定的头部和可变长的数据部分组成。头部包括消息长度和两个邮箱名。消息的可变部分为具有类型的数据项的链表。

  通过虚拟内存管理技术,Mach消息系统试图避免双重复制,其关键在于Mach将发送者的地址空间映射到接收者的地址空间,消息本身并不真正复制。这种消息管理技术大大提高了性能,但是只适用于系统内部的消息传递。

  Socket(套接字)可定义通信的端点。一对通过网络通信的进程需要使用一对Socket,每个进程各一个。Socket由IP地址与一个端口号连接组成。服务器通过监听指定端口来等待客户请求。一旦收到请求,服务器就接收来自客户Socket的连接。服务器实现特定功能(如telnet、ftp、http)所有低于1024的端口被认为是众所周知的,用来实现标准服务。

  之前介绍的RPC方式许多方面类似于IPC机制 。与IPC不同,用于RPC交换的消息有很好的结构,因此不再仅仅是数据包。

  端口只是一个数字,并包含在消息包的开始处,虽然一个系统通常只有一个网络地址,但他在这一地址内有许多端口号以区分所支持的多种网络服务。

  许多RPC系统定义了数据的机器无关表示。一种这样的表示称为外部数据表示(XDR)。在客户机端,参数编组涉及将机器有关数据再被发送到服务器端之前编组成XDR,在服务器端,XDR转换成服务器所用的机器有关表示。

  一个重要的事项是调用的语义,处理该问题的一种方法是操作系统确保一个消息刚好执行一次,而不是最多执行一次。

  另一个重要事项是RPC方案要求客户机和服务器之间有类此绑定的一种关系。但客户机如何知道服务器的端口呢?一个系统无法拥有另一个系统的所有信息,因为他们无法共享内存。

  第二种方法,绑定通过集合点机制动态的进行。通常操作系统会在一个固定的RPC端口上提供集合点服务程序。客户机程序发送一个包括PRC的名称的消息给集合点服务程序,以请求他所执行的RPC端口地址。

  远程方法调用(RMI)是一个类似的java特性。RMI允许线程调用远程对象的方法。如果对象位于不同的JVM上,那么就认为是远程的。

  一、RPC支持子程序编程,即只能调用远程的子程序或函数。而RMI是基于对象的,他支持调用远程对象的方法。

  二、RPC中,远程过程的参数是普通数据结构,RMI可以将对象作为参数传递给远程方法。

  为了使远程方法对客户机和服务器透明,RMI采用存根(stub)和骨干(skeleton)实现远程对象。存根为远程对象的代理,他驻留在客户机中。当客户机调用远程方法时,远程对象的存根被调用。这种客户端存根负责创建一个包,它具有服务器上要调用方法的名称和用于该方法的编排参数。存根将该报发送给服务器,远程对象的骨干会接受他。骨干负责重新编排参数并调用服务器上要执行的方法。骨干接着编排返回值,然后打包,并将该包返回给客户机。存根重新编排返回值,并传给客户机

  前言计算机四级的网络工程师考试总共有两部分,一部分是操作系统占50分,一部分是计算机网络占50分。考试中每部分均要达到30分以上即为成绩合格操作系统的概念计算机系统计算机系统包括硬件系统和软件系统。硬...博文来自:Mr.Spade的博客

  分时操作系统分时操作系统的核心原理在于将作业直接放入内存,并引入了时间片的概念,采用轮转运行的方式,规定每个作业每次只能运行一个时间片,然后就暂停该作业并立即调度下一个作业运行。在不长的时间内使所有的...博文来自:二弧的博客

  分页(paging)内存管理方案允许进程的物理地址空间可以使非连续的。分页避免了将不同大小的内存块匹配到交换空间上(前面叙述的内存管理方案都有这个问题,当位于内存中的代码和数据需要换出时,必须现在备份...博文来自:MingChao_Sun

  操作系统概念:是计算机系统中的一个系统软件,它是这样一些程序模块的集合,它们管理和控制计算机系统中的软件和硬件资源,组织计算机的工作流程,以便有效地利用这些资源为用户提供一个有足够多的功能、使用方便、...博文来自:huangwwu11的专栏

  本章目标:1、详细讨论内存硬件的组织方法;2、讨论各种内存管理技术,如分段、分页;8.1背景介绍高速缓存:由于CPU对寄存器的访问速率快于对内存的访问速率,导致在实际运行中,没有数据完成正在进行的操作...博文来自:Cait_的博客

  操作系统6————进程间通信IPC一.目录操作系统6————进程间通信IPC一.目录二.进程通信概述三.共享存储器1.概述2.共享某些数据结构3.共享存储区四.管道通信1.概述2.管道机制必须提供的协...博文来自:冰炭不投day的博客

  共享存储器系统相互通信的进程共享某些数据结构或共享存储区,进程之间能通过这些空间进行通信基于共享数据结构的通信方式例如生产者消费者,共享一个存储区,效率低,只能传递相对少量的数据基于共享存储区的通信方...博文来自:沸沸腾的专栏

  实验一、进程控制实验1.1实验目的加深对于进程并发执行概念的理解。实践并发进程的创建和控制方法。观察和体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过程。掌握进程控制的方法,了...博文来自:志博云天

  •操作系统内并发执行的进程可能是独立进程和协作进程。为什么会有进程间协作?→信息共享infornationsharing→提高运算速度computationspeedup子任务并行执行(需要计算机有多...博文来自:white_cloth的专栏

  (一)操作系统的一些理解与概念1.一般程序猿也不会参与系统编程,那么还有学习操作系统和系统编程的必要吗?​ 答案是肯定,因为理解操作系统可以更好地服务于编程,比如更深入的理解多线.操作系统的理解...博文来自:Ivan_zcy的博客

  操作系统结构可以从系统提供的服务、程序员采用的接口、系统组件及其相互关系来分析操作系统操作系统服务用户功能用户界面命令行界面、批处理界面、图形用户界面程序执行I/O操作文件系统操作,查找删除读写等等通...博文来自:John Raymond的博客

  概述文件系统驻留在外存上,在外存上,如何存储和访问文件?如何组织文件,分配磁盘空间,恢复空闲空间,跟踪数据位置,以及相关的性能?这些在文件系统中,如何实现?文件系统结构磁盘称为存储多个文件的方便介质的...博文来自:sailist的记录站

  (一)请分别简单说一说进程和线程以及它们的区别。进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位。线程是进程的实体,是CPU调度和分派的基本单位,它...博文来自:小小呆的博客

  通常我们所认为的进程有五大状态,新建态,就绪态,阻塞态,运行态,退出态。 下面是示意图: 事实上还存在被挂起的进程。    交换的需要前面图中三个基本状态(就绪态、运行态和阻塞态)提供了一种为进程行为...博文来自:FreeeLinuxs blog

  进程是指在操作系统中正在运行的一个应用程序,线程是指进程内独立执行某个任务的一个单元。...

  操作系统概念第七版的课后答案,中英文都有,中文可能不全,但是英文很全,中文版的可以拿来对照英文版作翻译参考。

  一、初识进程进程组成进程状态进程控制块(PCB)二、进程调度调度队列调度程序各类进程调度的特点:进程的类型上下文切换进程操作进程创建进程终止进程间通信共享内存系统消息传递系统IPC系统实例(略)客户机...

  Operating System Concepts, 9th Edition,操作系统概念第九版pdf版本。

  第二部分进程管理第三章进程进程包括:代码段,当前活动(程序计数器的值和处理器寄存器的内容),进程堆栈段(临时数据,如函数参数、返回地址和局部变量)和数据段(包括全局变量),堆(进程运行期间动态分配的内...

  第七版操作系统概念答案英文 第七版操作系统概念答案英文 第七版操作系统概念答案英文

  进程进程是指存放运行一个程序所需要所有信息的容器,与每个进程相关的是地址空间,该地址空间是连续有限的,存放有可执行程序,程序计数器、堆栈等,进程可以在这里进行读写。在许多操作系统中,与进程相关的所有信...

  10-27包含了俗称“恐龙书”的《操作系统概念》1-13章的所有答案,包括了部分编程题目的代码,这是其他答案中所没有的下载

  阅读数 26万+圣诞献礼!          2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多篇与设计模式相关的文章,涵盖了七个面向对象设计原则和24个设计模式(23个GoF设计模式 +  简...博文

  阅读数 1万+使用指南 阅读本指南前,请先阅读快速起步。本文档使用更复杂的场景进一步介绍Sharding-JDBC的分库分表能力。 数据库模式 本文档中提供了两个数据源db0和db1,每个数据源之...博文

  阅读数 27万+帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文

  阅读数 4万+0.绪论这篇文章主要为了研究双目立体视觉的最终目标——三维重建,系统的介绍了三维重建的整体步骤。双目立体视觉的整体流程包括:图像获取,摄像机标定,特征提取(稠密匹配中这一步可以省略),立体匹配,三维重...博文

  阅读数 336废话少说直接干货 在虚拟机里安装hadoop,关闭防火墙、配置ip 我的系统环境为:win8系统、vmware11、centos81、设置虚拟机网络通信模式为host only模式 在虚拟机目录...博文

  阅读数 3万+卷积神经网络是深度学习的基础,但是学习CNN却不是那么简单,虽然网络上关于CNN的相关代码很多,比较经典的是tiny_cnn(C++)、DeepLearnToolbox(Matlab)等等,但通过C语...博文

  阅读数 2万+单机最大的TCP连接数及其修改 一个误解: 单个服务器程序可承受最大连接数“理论”上是“65535” .    65535这个数字的由来,很多人想当然地将它与port最大值联系起来。的确,TCP的...博文

  阅读数 2985Dll文件调用方式分为显式调用和隐式调用,在这里选择隐式调用的方式。 准备dll文件: 这里选择VS 2010作为dll的开发工具,打开vs 2010,选择文件-新建-项目 在新建项目窗...博文

  C#技术分享【PDF转换成图片——10种方案】(2013-07-25重新整理)

  阅读数 4万+最近公司安排了个任务:要求交付一个DLL,实现【PDF转换成图片】,最好的效果是能够掌握所有源码,实在不行才交付第三方DLL。研究了6个工作日+1双休+每晚9点下班,逛遍了国内外各种论坛,还是没能成功...博文

  阅读数 15万+扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文

  阅读数 5484最近项目空闲期,来看下spring源码,把过程全部记录下来, 方便想知道spring初始化过程初学者,先从spring作为入口。 org.springframework.web....博文

  阅读数 1万+1、错误:                 键盘遮挡输入框最常见的可能就是在登录界面了,无论有多少个textFiled,不论是在VC的任何位置。都有可能造成键盘弹出来时,把输入框挡住了。...博文

  阅读数 2100众所周知,Activex组件没有进行有效的签名,在IE上无法安装的,除非你让用户手工开启“接收任何未签名的ActiveX”,这个很明显不现实。而组件签名需要证书,证书从哪里来,你可以选择付1000到3...博文

  阅读数 1万+上一篇博客介绍了如何解决Fragment重叠的问题,有需要的同学可以看一下,底部有demo下载。 直通车:完美解决Fragment重叠本篇博客我们来说一下怎么让fragment重新加载布局资源文件。...博文

  阅读数 2万+我们可能经常会用到这一功能,比如有时,我们不希望用户没有进行登录访问后台的操作页面,而且这样的非法访问会让系统极为的不安全,所以我们常常需要进行登录才授权访问其它页面,否则只会出现登录页面,当然我的思...博文

  阅读数 1万+MATLAB编程题 题目描述:从一个NxM的矩阵C中找出与1xM的矩阵P欧氏距离最小的某一行row,要求不能用循环!!! 输入:矩阵C(NxM)、矩阵P(1xM) 输出:row 解题思...博文

  阅读数 1452自微软从2013版本推出新的插件注册器后,随着UI的重大更新后,问题也多了很多,前面已有博客提到注册assembly时看不到注册按钮(博文

  阅读数 46万+jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文

  阅读数 59万+强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文

  阅读数 1540工作需求,渐变色的边框和文字,还需要显示drawable。我们知道如果是View的背景色渐变,那么很好办,只需要写一个drawable文件,里面定义shape然后设置为View的background就...博文

  阅读数 4万+command窗口是命令窗口,即为sqplus窗口,有命令提示符,识别sqlplus命令,基本的命令都可以执行 sql仅可执行DDL、select、DML等...博文

  阅读数 13万+上一篇文章讲解了SNMP的基本架构,本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1、v2c、v3)进行区别! 四、SNMP协议数据单元 在SNMP管理中,管理站(NMS)和代理(Age...博文

  阅读数 10万+iOS安全攻防(二十三):Objective-C代码混淆class-dump可以很方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完善的程序给同行留下笑柄。所以,我们...博文

  阅读数 6932测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查询是那个谁在那个时间段登录的,就考虑怎么记录每一个MYSQL账号的登录信息,在MYSQL中,每个连接都会先执...博文

  阅读数 5029前言 以前在博客:基于PYQT编写一个人脸识别软件 中给出了我自己用PYQT编写的一个小软件。鉴于使用的是开源库——face_recogniton,尽管使用很简单,但是还有些问题,比如:识别黄种人时...博文

  阅读数 2万+最近在做一个Mac下的ssh调试工具,但是出现了一点问题。后来发现居然Mac下有串口调试工具可以用,所以果断换串口了,是普通PL2303芯片的usb转串口线。 接下来说下简单的安装步骤吧。我是勤劳的...博文

本文链接:http://baumseelen.com/duiliekongzhikuai/344.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部