当前位置: 首页 > news >正文

下载的网站模板怎么改网站服务器怎么选

下载的网站模板怎么改,网站服务器怎么选,长沙网站制作费用,网站做营销推广Linux进程控制 程序是一组可执行的静态指令集#xff0c;而进程(process)是一个执行中的程序实例。利用分时技术#xff0c;在Linux操作系统上同时可以运行多个进程。分时技术的基本原理是把CPU的运行时间划分成一个个规定长度的时间片#xff0c;让每个进程在一个时间片内运… Linux进程控制     程序是一组可执行的静态指令集而进程(process)是一个执行中的程序实例。利用分时技术在Linux操作系统上同时可以运行多个进程。分时技术的基本原理是把CPU的运行时间划分成一个个规定长度的时间片让每个进程在一个时间片内运行。当进程的时间片用完时系统就利用调度程序切换到另一个进程去运行。因此实际上对于具体单个CPU的机器来说某一个时刻只能运行一个进程。但由于每个进程运行的时间片很短(例如15个系统滴答150ms)所以表面看起来好像所有进程在同时运行着。   对于Linux0.11内核来讲系统最多可由64个进程同时存在。除了第一个进程是手工建立以外其余的都是进程使用系统调用fork创建的新进程被创建的进程成为子进程(Child Process)创建者则称为父进程(parent process)。内核程序使用进程标识号(process ID,pid)来标识每个进程。进程由可执行的指令代码数据和堆栈区组成。进程中的代码和数据部分分别对应一个可执行文件中的代码段数据段。每个进程只能执行自己的代码和访问自己的数据及堆栈区。进程之间相互之间的通信需要通过系统调用来进行。对于只有一个CPU的系统在某一个时刻只能有一个进程正在运行。内核通过进程调度程序分时调度各个进程运行。   Linux系统中一个进程可以在内核态(Kernal mode)或者用户态(user mode)下执行因此Linux内核堆栈和用户堆栈是分开的。用户堆栈用于进程在用户态下临时保存调用函数的参数局部变量等数据。内核堆栈则含有内核程序执行函数调用时的信息。     1.1任务数据结构   内核程序通过进程表对进程进行管理每个进程在进程表中占有一项。在Linux系统中进程表项是一个task_struct任务结构指针。任务数据结构定义在头文件include/linux/sched.h中。有些书上称其为进程控制块PCB(Process Control Block)或者进程描述符PD(Processor Descriptor)。其中保存着用于控制和管理进程的所有信息。主要包括进程当前运行的状态信息信号进程号父进程号运行时间累计值正在使用的文件和本任务的局部描述符以及任务状态段信息。该结构每个字段的含义如下所示。   当一个进程在执行时CPU的所有寄存器中的值进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换(switch)至另一个进程时它就需要保存当前进程的所有状态也即保存当前进程的上下文以便在再次执行该进程时能够恢复到切换时的状态执行下去。在Linux中当前进程上下文均保存在进程的任务数据结构task_struct中。在发生中断时内核就在被中断进程的上下文中在内核状态下执行中断服务例程。但同时会保留所有需要用到的资源以便中断服务结束时能恢复被中断进程的执行。     1.2 进程运行状态   一个进程在其生存期内可处于一组不同的状态下称为进程状态。见下图2-6所示。进程状态保存在进程任务结构的state字段中。当进程正在等待系统中的资源而处于等待状态时则称其处于睡眠等待状态。在Linux系统中睡眠等待状态被分为可中断的和不可中断的等待状态。   运行状态(TASK_RUNNING)   当进程正在被CPU执行或已经准备就绪随时可以由调度程序执行则称该进程为处于运行状态(running)。进程可以在内核态运行也可以在用户态运行。当系统资源已经可用时进程就被唤醒而进入准备运行状态该状态称为就绪态。这些状态在内核中表示方法相同都被称为处于TASK_RUNNING状态。   可中断睡眠状态(TASK_INTERRUPTIBLE)   当进程处于可中断等待状态时系统不会调度该进程执行。当系统产生一个中断或者释放了进程正在等待的资源或者进程收到一个信号都可以唤醒进程转换到就绪状态(运行状态)。   不可中断睡眠状态(TASK_UNINTERRUPTIBLE)   与可中断睡眠状态类似。但处于该状态的进程只有被使用wake_up()函数明确唤醒时才能被转换到可运行就绪状态。   暂停状态(TASK_STOPPED)   当进程收到信号SIGSTOP,SIGTSTP,SIGTTIN或SIGTTOU时就会进入暂停状态。可向其发送SIGCONT信号让进程转换到可运行状态。在Linux0.11中还为实现对该状态的转换处理。处于该状态的进程将被作为进程终止来处理。   僵死状态(TASK_ZOMBIE)   当进程已停止运行但其父进程还没有询问其状态时则称该进程处于僵死状态。   当一个进程的运行时间片用完系统就会使用调度程序强制切换到其他的进程去执行。另外如果进程在内核态执行时需要等待系统的某个资源此时该进程就会调用sleep_on()或者sleep_on_interruptible()自愿放弃CPU使用权而让调度程序去执行其他程序。进程则进入睡眠状态(TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE)。   只有当进程从内核运行态转移到睡眠状态时内核才会进行进程切换操作。在内核态下运行的进程不能被其他进程抢占而且一个进程不能改变另一个进程的状态。为了避免进程切换时造成内核数据错误内核在执行临街区代码时禁止一切中断。     1.3 进程初始化   在boot/目录中引导程序把内核从磁盘上加载到内存中并让系统进入保护模式下运行后就开始执行系统初始化程序init/main.c。该程序首先确定如何分配使用系统物理内存然后调用内核各部分的初始化函数分别对内存管理中断处理块设备和字符设备进程管理以及硬盘和软盘硬件进行初始化处理。在完成了这些操作之后系统各部分已经处于可运行状态。此后程序把自己手工移动到任务0(进程0)中运行并使用fork()调用首次创建出进程1。在进程1种程序将继续进行应用环境的初始化并执行shell登陆程序。而原进程0则会在系统空闲时被调度执行此时任务0仅执行pause()系统调用并又会调用调度函数。   移动到任务0种执行这个过程由宏move_to_user_mode(include/asm/system.h)完成。它把main.c程序执行流从内核态(特权级0)移动到了用户态(特权级3)的任务0种继续运行。在移动之前系统在对调度程序的初始化过程(sched_init())中首先对任务0的运行环境进行的设置。这包括人工预先设置好 任务0数据结构各字段的值(include/linux/shed.h)在全局描述符中添入任务0的任务状态段(TSS)描述符和局部描述符表(LDT)的段描述符并把它们分别加载到任务寄存器tr和局部描述符表寄存器ldtr中。   这里需要强调的是内核初始化是一个特殊过程内核初始化代码也即是任务0的代码。从任务0数据结构中设置的初始化数据可知任务0的代码段和数据段的基址是0段限长是640KB。而内核代码段和数据段的基地址时0段限长是16MB因此任务0的代码段和数据段分别包含在内核代码段和数据段中。内核初始化程序main.c也即是任务0中的代码只是在移动到任务0之前系统正以内核态特权级0运行着main.c程序。宏move_to_user_mode的功能就是把运行特权级内核态的0级变换到用户态的3级但是仍然继续执行原来的代码指令流。   在移动到任务0的过程中宏move_to_user_mode使用了中断返回指令造成特权级改变的方法。该方法的主要思想是在对站中构筑中断返回指令需要的内容把返回地址的段选择符设置成任务0代码段选择符其特权级为3。此后执行中断返回指令iret时将导致系统CPU从特权级0跳转到外层的特权级3上运行。参见下图所示的特权级发生变化时中断返回堆栈结构示意图。            宏move_to_user_mode首先往内核堆栈中压入任务0数据段选择符和内核堆栈指针。然后压入标志寄存器内容。最后压入任务0代码段选择符合执行中断返回后需要执行的下一条指令的偏移位置。该偏移位置是iret后的一条指令处。   当执行iret指令时CPU把返回地址送入CS:EIP中同时探出对站中标志寄存器内容。由于CPU判断出墓地代码段的特权级是3与当前内核态的0级不同。于是CPU会把堆栈中的堆栈段选择符合堆栈指针弹出到SS:ESP中。由于特权级发生了变化段寄存器DS,ES,FS和GS的值变得无效此时CPU会把这些段寄存器清零。因此在执行了iret指令后需要重新加载这些段寄存器。此后系统就开始特权级3运行在任务0的代码上。所使用的用户态堆栈还是原来在移动之前使用的堆栈。而其内核态堆栈则被指定为其任务数据解噢股所在页面的顶端开始(PAGE_SIZE(long)init_task)。由于以后在创建新进程时需要复制任务0的任务数据结构包括其用户堆栈指针因此需要任务0的用户态堆栈在创建任务1(进程1)之前保持干净状态。     1.4 创建新进程   Linux系统中创建新进程使用fork()系统调用。所有进程都是通过复制进程0而得到的都是进程0的子进程。   在创建新进程的过程中系统首先在任务数组中找出一个还没有被任何进程使用的空项(空槽)。如果系统已经有64个进程在运行则fork()系统调用会因为任务数组表中没有可用空项而出错返回。然后系统为新建进程在主内存区中申请一页内存来存放其任务数据结构信息并复制当前进程任务数据结构中所有内容作为新进程人物数据结构的模板。为了防止这个还未处理完成的新进程被调度函数执行此时应该立刻将新进程状态置为不可中断的等待状态(TASK_UNINTERRUPTIBLE)。   随后对复制的任务数据结构进行修改。把当前进程设置为新进程的父进程清除信号位图并复位新进程各统计值并设置初始运行时间片值为15个系统嘀嗒数(150ms)。接着根据当前进程设置任务状态段(TSS)中各寄存器的值。由于创建进程时新进程返回值应为0所以需要设置tss.eax0。新建进程内核态堆栈指针tss.esp0被设置成新进程任务数据结构所在内存页面的顶端而堆栈段tss.ss0被设置成内核数据段选择符。tss.ldt被设置为局部表描述符在GDT中所引值。如果当前进程使用了协处理器把还需要协处理器的完整状态保存到新进程的tss.i387结构中。   此后系统设置新任务的代码和数据段基址限长并辅之当前进程内存分页管理的页表。如果父进程中也有文件是打开的则应将对应文件的打开次数增1。接着在GDT中设置新任务的TSS和LDT描述符项其中基地址信息指向新进程人物结构中的tss和ldt。最后再将新任务设置成可运行状态并返回新进程号。   1.5 进程调度   由前面描述可知Linux进程是抢占式的。被抢占的进程仍然处于TASK_RUNNING状态只是暂时没有被CPU运行。进程的抢占发生在进程处于用户态执行阶段在内核执行时是不能被抢占的。   为了能让进程有效地使用系统资源又能使进程有较快的响应时间就需要对进程的切换调度采用一定的调度策略。在Linux0.11中采用了基于优先级排队的调度策略。   调度程序     schedule()函数首先扫描任务数组。通过比较每个就绪态(TASK_RUNNING)任务的运行时间递减滴答计数counter的值来确定当前哪个进程运行时间最少。哪一个的值大就表示运行时间还不长于是就选中该进程并使用任务切换宏函数切换到该进程运行。   如果此时所有处于TASK_RUNNING状态进程的时间片已经用完系统就会根据每个进程的优先权值priority对系统中所有进程(包括正在睡眠的进程)重新计算每个任务需要运行的时间片值counter。   计算公式是:  counter counter/2 priority   然后schedule()函数重新扫描人物数组中所有处于TASK_RUNNING状态重复上述过程直到选择出一个进程位置。最后调用switch_to()执行实际的进程切换操作。   如果此时没有其他进程可运行系统就会选择进程0运行。对于linux0.11来说进程0会调用pause()把自己置为可中断的睡眠状态并在此调用schedule()。不过在调度进程运行时schedule()并不在意进程0处于什么状态。只要系统空闲就调度进程0运行。   进程切换   执行实际进程切换的任务由switch_to()宏定义的一段汇编代码完成。在进行切换之前switch_to()首先检查要切换到的进程是否就是当前进程如果是则什么也不做直接退出。否则就首先把内核全局变量current置为新任务的指针然后长跳转到新任务的任务状态段TSS组成的地指处造成CPU执行任务切换操作。此时CPU会把其所有寄存器的转改保存到当前人物寄存器TR中TSS段选择符所指向的当前进程任务数据结构的tss结构中然后把新任务状态段选择符所指向的新任务数据结构中tss结构中的寄存器信息恢复到CPU中系统就正式开始运行新切换的任务了。这个过程可参考下图     1.6 终止进程   当一个进程结束了运行或在半途中终止了运行那么内核就需要释放该进程所占用的系统资源。这包括进程运行时打开的文件申请的内存等。   当一个用户程序调用exit()系统调用时就会执行内核函数do_exit()。该函数会首先释放进程代码段和数据段占用的内存页面关闭进程打开着的所有文件对进程使用的当前工作目录根目录和运行程序的i节点进行同步操作。如果进程有子进程则让init进程作为其所有子进程的父进程。如果进程是一个会话头进程并且有控制终端则释放控制终端并向属于该会话的所有进程发送挂断信号SIGHUP,这通常会终止该会话中的所有进程。然后把进程状态置为僵死状态TASK_ZOMBIE。并向其原父进程发送SIGCHILD信号通知其某个子进程已经终止。最后do_exit()调用调度函数去执行其他进程。由此可见在进程终止时它的task_struct任务数据结构仍然保留着。因为其父进程还需要使用其中的信息。   在子进程在执行期间父进程通常使用wait()或waitpid()函数等待其某个子进程终止。当子进程被终止并处于僵死状态时父进程就会把子进程运行所使用的时间累加到自己进程中。最终释放已终止子进程任务数据结构所占用的内存页面并置空子进程在任务数组中占用的指针项。 转载于:https://www.cnblogs.com/mod109/p/6042073.html
http://wiki.neutronadmin.com/news/362755/

相关文章:

  • 学习网站建设与管理专业做数据的网站
  • 宁远网站建设网站做百度权重排名论坛
  • wordpress 导航网站主题网站如何去分析
  • 台州cms建站系统免费永久空间
  • 自己做的网站360显示过期最近消息报道
  • 做网站公司项目的流程网站怎么做备份
  • html5手机网站制作软件长春网站建设论坛
  • 网站vps十大引擎网址
  • asp做的静态网站卡不卡北京市建设资格执业中心网站
  • 笑话网站html模板wordpress建的网站吗
  • 正能量网站入口免费安全电子商务网站费用预算
  • 专业网页制作与网站设计宁波seo快速优化教程
  • 免费网站软件哪个好东莞公司建网站模板
  • 网站建设与推广的实训报告学做美食网站
  • 摄影网站的市场可行性seo优化服务是什么
  • 研究生网站建设本地wordpress如何迁移
  • 写一个网站需要什么技术网站开发的好处
  • 手表网站制作模板桂林医院网站建设
  • 安徽科技网站建设html网站开发项目
  • 工作正能量励志句子优化大师软件大全
  • 郑州网站建设公宁波建设信息网站
  • 加快政务网站群建设管理商标设计网站猪八戒
  • 建设化工网站的功能通辽做网站有没有
  • 麦积区建设局网站wordpress怎么改标题和meta
  • 广告网站建设公司封面型网页网站有哪些内容
  • 房地产网站建设案例优化搜索点击次数的方法
  • 网站权重最高是多少网站查询域名解析
  • 如何在局域网内做网站php网站搭建环境
  • 网站建设 锋云科技公司陕西工程项目信息网
  • 阜阳企业网站建设专业网站排名优化公司