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

制作卡牌的网站wordpress微拍源码

制作卡牌的网站,wordpress微拍源码,东莞网站建设网,app软件开发公司推荐异常 异常控制流 控制流#xff1a; 假设从处理机上电运行一直到断电关机的这段时间内#xff0c;程序计数器的值是下图序列#xff0c;其中ak表示某一条指令Ik的地址。 **控制转移#xff1a;**每一次从ak到ak1的过渡 **平滑#xff1a;**Ik和Ik1在内存中是相邻的 假设从处理机上电运行一直到断电关机的这段时间内程序计数器的值是下图序列其中ak表示某一条指令Ik的地址。 **控制转移**每一次从ak到ak1的过渡 **平滑**Ik和Ik1在内存中是相邻的若平滑发生了突变通常是由于跳转、函数调用和返回这类指令造成 **最简单的控制流**一个平滑的序列 假设从网络中传输的数据包到达网络适配器之后需要将数据放到内存中此时发生的突变就称为异常控制流。 异常控制流是操作系统用来实现I/O、进程、并发以及虚拟内存的基本机制。 系统为每种类型的异常都分配了唯一的异常编号其中一些号码是由处理器的设计者分配的例如被0除、缺页以及算术运算等其他号码是由操作系统内核的设计者分配的例如系统调用以及来自外部I/O设备的信号 **异常表**系统启动时操作系统分配和初始化的一个跳转表异常号为跳转表的索引号发生异常时根据该表找到对应的异常处理程序异常表的起始地址保存在CPU的一个特殊寄存器中通过异常表基址寄存器和异常号可以确定异常表项异常表项中的对应异常处理程序的起始地址。 异常处理 返回当前指令或下一条指令处理器的状态压入栈中控制从用户态转向内核态那么所有内容都压入内核栈中而不是用户栈中异常处理程序运行在内核态所以对所有系统资源都有访问权限 异常 异常分为中断、陷阱、故障和终止中断是异步的即异常来自CPU外部另外三个是同步的异常来自CPU内部。 中断 处理过程 假设I/O设备为键盘敲一下键盘时键盘控制器会向处理器的中断引脚发送信号来触发中断同时会将异常号标识引起中断的设备放到系统总线上CPU执行完当前指令后发现中断引脚电压变高于是从系统总线上读取异常号判断是哪个设备发生中断然后调用对应中断处理程序中断处理完毕后CPU返回继续执行下一条指令没发生中断前的下一条 陷阱 用途为用户程序和操作系统内核之间提供一个类似函数的接口即系统调用。 处理过程当应用程序需要读取文件或者创建新的进程时此时需要向内核请求服务处理器为其提供了一条特殊指令——syscall执行syscall导致一个陷阱接下来陷阱处理程序解析参数并调用适当的内核程序提供系统级的服务陷阱处理程序执行完毕后返回到指令syscall之后的指令继续执行。 故障 故障是由错误情况引起的有可能被故障处理程序修复 处理过程当前指令若导致故障发生处理器会将控制转移给故障处理程序故障处理程序如果能修复这个故障情况那么就将控制返回给引起故障的指令然后重新执行该条指令否则终止引起故障的应用程序经典案例缺页异常。 终止 终止是由不可恢复的致命错误导致的通常是一些硬件错误例如DRAM或者SRAM存储为被损坏时会导致奇偶校验出错对于这类硬件错误终止处理程序从不将控制返回给应用程序而是直接终止这个应用程序。 x86系统中共定义了256种异常编号0~31是intel架构师定义的32~255是由操作系统定义 异常号描述异常类型0除0异常故障13引用了未定义的虚拟内存区域或程序尝试去写只读文本段段错误故障14缺页异常故障18机器检查硬件发生错误终止32-255操作系统定义的异常中断或陷阱 进程与上下文 进程进程就是一个正在执行的程序实例。 运行程序时的两个假象 程序独占的使用处理器程序独占的使用内存系统 **逻辑控制流**假如用调试器控制程序单步执行我们会看到一系列程序计数器PC的数值 这些数值与可执行程序中的指令是一一对应的把这个PC值的序列成为逻辑控制流如下图竖线表示逻辑控制流这张图描述了不同进程之间轮流使用处理器的情况每个进程执行逻辑流的一部分而时间上有重叠的的流称为并发流进程之间也称为并发流。 地址空间地址分布 低地址部分是预留给应用程序的包括代码段、数据段、堆和栈代码段总是从0x400000处开始地址的高地址部分是留给操作系统内核的属于用户代码不可见的内存区域 tips在Linux环境下使用有一个proc文件记录了内核相关数据结构通过这个文件用户模式下也能访问内核数据结构的内容 模式 通常处理器通过控制寄存器的模式位来实现用户模式和内核模式的切换 内核模式可以执行特权指令特权指令可以停止处理器、改变模式位以及发起一个IO操作等 用户模式通过中断、陷阱系统调用、故障切换到内核模式执行完异常处理程序后回到用户模式 上下文context 内核为每一个进程维持了一个上下文上下文就是内容重新启动一个被抢占进程所需的状态由**通用目的寄存器、浮点寄存器、程序寄存器、用户栈、状态寄存器、内核栈和各种内核数据结构包括描述地址空间的页表、包含有关当前进程信息的进程表以及包含进程已打开文件的信息表**的值组成。 上下文切换 进程调度使用上下文切换机制。 分为三步 保存当前进程的上下文恢复某个先前被抢占进程的上下文将控制传递给这个新恢复的进程 创建进程 fork函数 调用一次返回两次一次返回给父进程另一次返回给新创建的子进程。 int main() {pid_t pid;int x 1;pid Fork();if(pid 0){printf(child: x%d\n, x);exit(0);}printf(parent: x%d\n, --x);exit(0); }父进程中fork的返回值是子进程的PID子进程中fork的返回值是0由于子进程的进程号总是大于0所以可以通过进程号不同来区分当前在哪个进程执行。 运行结果 parent x0 child x2父进程与子进程的地址空间内容是相同的且共享文件但他们都有自己的私有地址空间 execve函数 int execve(const char *filename, const char *argv[], const char *envp[]);调用之后不会返回。 参数 第一个参数表示可执行程序的文件名 第二个参数表示可执行程序需要输入的参数列表 第三个参数表示环境变量列表 运行下列程序可以查看系统环境变量 #includestdio.h int main(int argc, char *argv[], char *envp[]){printf(环境变量:\n);int i;for(i 0; envp[i] ! 0; i){printf(envp[%2d]: %s\n, i, envp[i]);}return 0; }作用 调用加载器在执行可执行程序的main函数之前启动代码需要设置用户栈并将控制传递给新程序的主函数 僵死进程zombie 当一个进程由于某种原因终止时内核并不是立即把它从系统中清楚此时进程被保持在一种已终止的状态中直到被它的父进程回收我们把一个终止运行但未被回收的进程成为僵死进程。 僵死进程虽然没有在运行但是仍然在消耗系统的内存资源。 waitpid函数 父进程等待子进程终止或停止 #includesys/type.h #includesys/wait.h pid_t waitpid(pid_t pid, int *statusp, int options);第一个参数 ① pid 0 表示等待的进程是一个单独的子进程子进程ID就是pid的值。 ②pid -1 表示等待的进程是由父进程创建的所有子进程组成的集合 第二个参数 statusp是非空的函数waitpid会在statusp中放上导致返回的子进程的状态信息 statusp指向的参数status对应的几个宏 WIFEXITED(status) 子进程是通过函数exit或者return正常终止那么该宏结果就是True WIFSIGNALED(status) 子进程是通过一个未捕获的信号终止的那么该宏结果就是True WEXITSTATUS(status) 返回一个正常终止的子进程的退出状态。只有在WIFEXITED()返回为真时才会定义这个状态。 WTERMSIG(status) 返回导致子进程终止的信号的编号。只有在WIFSIGNALED()返回为真时才定义这个状态。 WIFSTOPPED(status) 如果引起返回的子进程当前是停止的那么就返回真。 WSTOPSIG(status) 返回引起子进程停止的信号的编号。只有在WIFSTOPPED()返回为真时才定义这个状态。 WIFCONTINUED(status) 如果子进程收到SIGCONT信号重新启动那么就返回为真。 信号 信号允许内核和进程中断其他进程信号提供了一种机制用来通知进程发生了哪些异常情况。 关于信号类型看书 示例 ​ 例如当一个进程试图执行除以0的操作时那么内核会给该进程发送一个SIGFPG的信号这个信号对应的是浮点异常的事件。 ​ 例如当一个进程执行了一条非法指令那么内核会给该进程发送一个SIGILL的信号该信号对应的事件是非法指令。 ​ 例如当一个进程在Linux Shell中执行此时按下CtrlC键那么内核就会发送一个中断信号给当前进程终止它的运行。 进程组 每个进程都只属于一个进程组每个进程组有自己唯一的ID值来唯一标识ID为一个正整数。 可以使用getpgrp函数来获取当前进程所属的进程组ID。 #includeunistd.h pid_t getpgrp(void);默认情况下一个子进程和它的父进程属于一个进程组不过进程可以通过下图这个函数改变自己或者其他进程的进程组。 #includeunistd.h pid_t setpgrp(pid_t pid, pid_t pgid);如果pid值为0那么使用当前进程的PID值如果pgid值为0那么就是用pid指定的进程PID作为进程组的ID值。 发送信号 几种信号传送机制 第一种 通过/bin目录中的kill程序可以向其他进程发送任意信号如下图。 linuc /bin/kill -9 15213信号9表示杀死进程这条命令执行完后15213进程终止运行。 linuc /bin/kill -9 -15213这条命令执行完后15213进程组的每一条进程都终止运行。 第二种 当键盘输入CtrlC默认终止前台作业输入CtrlZ会挂起前台作业。 第三种 #includesys/types.h #includesignal.h int kill(pid_t pid, int sig);如果pid值大于0那么函数kill发送信号sig给进程pid 如果pid等于0那么函数kill发送信号给当前进程所在进程组的所有进程 如果pid小于0那么函数kill发送信号给进程组pid中的每个进程 第四种 #includeunistd.h unsigned int alarm(unsigned int secs);参数secs表示函数alarm安排内核在secs秒后发送一个SIGALARM信号给当前进程如果secs为0就不会调用新的闹钟了。 接收信号 当内核把进程p从内核模式切换到用户模式时此时会检查进程p未阻塞状态的待处理的信号集合如果这个集合为空那么内核将控制传递到进程p的逻辑控制流的下一条指令如果集合时非空那么内核选择集合中的一个信号k强制进程p接受信号k接受信号会触发控制转移到信号处理程序在信号处理程序完成处理之后它将控制返回给被中断的程序。 每个信号都有一个预定义的默认行为 第一种行为是进程终止例如收到信号SIGKILL后接收进程终止运行。 第二种行为是进程终止并转储内存转存内存的意思是把代码和数据的内存镜像写到磁盘上 第三种行为是进程挂起进程挂起直到被SIGCONT信号重启 第四种行为是可以直接忽略的信号例如SIGCHLD信号 一个发出但未被接收的信号叫做待处理信号一种类型只有一个待处理信号例如进程有一个类型为k的待处理信号那么任何接下来发送到该进程类型为k的信号都会被丢弃。 信号处理程序可以被其他信号处理程序中断。 非本地跳转 C提供了一个用户级异常控制流形式称为非本地跳转将控制直接从一个函数转移到另一个正在执行的函数而不需要经过正常的调用返回序列。其实现形如 #include setjmp.h int setjmp(jum_buf env);其中在第一次调用时setjmp()返回0且不能赋值给变量。setjmp()在env缓冲区保存当前的调用环境并使用longjmp函数从env缓冲区中恢复调用环境然后触发一个从最近一次初始化env的setjmp调用的返回形如 #include setjmp.h int longjmp(jum_buf env, int retval);非本地跳转的一个重要应用是允许从一个深层嵌套的函数调用中立即返回例如发现错误情况就可以直接返回到一个普通的本地化的错误处理程序而不是费力的反复返回来解开调用栈。   示例代码 #include csapp.h jmp_buf buf; int error1 0; int error2 1; void foo(void); void var(void); int main(){swtich(setjmp(buf)){case 0:foo();break;case 1:printf(Detect an error1 condition in foo\n);break;case 2:printf(Detect an error2 condition in foo\n);break;default:printf(Unknown error condition in foo\n);}exit(0); }void foo(void){if (error1)longjmp(buf, 1);bar();}void bar(void){if (error2)longjmp(buf, 2);}exit(0); }其在进入main()后的开关语句中setjmp()保存了环境并返回了0执行情况0即调用foo()foo()在正确的情况下调用bar()完成调用执行exit(0)关闭进程。如果调用foo()的过程中出现error1则会跳转到开关语句setjmp()返回1执行情况1报告error1的错误如果调用bar()的过程出现error2则会跳转到开关语句setjmp()返回2执行情况2报告error2的错误。 ; } exit(0); } void foo(void){ if (error1) longjmp(buf, 1); bar(); } void bar(void){if (error2)longjmp(buf, 2); } exit(0);} 其在进入main()后的开关语句中setjmp()保存了环境并返回了0执行情况0即调用foo()foo()在正确的情况下调用bar()完成调用执行exit(0)关闭进程。如果调用foo()的过程中出现error1则会跳转到开关语句setjmp()返回1执行情况1报告error1的错误如果调用bar()的过程出现error2则会跳转到开关语句setjmp()返回2执行情况2报告error2的错误。非本地跳转的另一个重要应用是使信号处理程序分支到一个特殊的代码位置而不返回到被信号到达中断了的指令的位置。例如程序通过信号和非本地跳转重新定义中断的动作使得进程不立即终止而是回到主程序的入口实现软重启。
http://wiki.neutronadmin.com/news/240476/

相关文章:

  • 集团公司网站改版方案科技资讯
  • 网站优化外包公司wordpress 主机
  • 刷东西网站怎么做呼市推广网站
  • 自己做的网站如何让别人看到seo百度排名优化
  • 珠海公司网站设计企业建站网站建站系统
  • 南京高新区建设规划局网站友情链接的四个技巧
  • 做seo时网站发文目的蚌埠做网站公司
  • 惠州专业的免费建站做网站所具备的的条件
  • 河北省质监站网址建设网站主要有哪些技术
  • 沈阳网站推广深圳品牌做网站公司
  • 怎么做ppt教程网站电子商务公司属于什么行业类型
  • 别人做的网站打不开哪个网络推广公司好
  • 个人怎么做优惠券网站东莞装饰网站建设
  • 免费网站建设模板下载宁波手机网站开发公司
  • 做网站原型图是用什么软件wordpress如何修改后台路径
  • 上海网站建设招聘义乌创源网站建设
  • 茂名企业建站模板阿里云是不是做网站的
  • 电子商务网站名字网站做线上销售
  • 网站的ui规范专业网站建设新闻
  • 饮料网站建设规划书四川手机网
  • 文山州中小企业网站建设店铺设计图纸及效果图大全
  • 网站容易出现的问题吗科技布
  • 寻找定制型网站建设怎样给网站换空间
  • 网站asp源码2023新闻摘抄大全
  • 昆明seo关键词排名熊掌号结合网站做seo
  • 网站平台运营方案免费html网站模板
  • 扬州做企业网站招聘网页制作工程师
  • 制做网站的公司建筑公司网站广告宣传语
  • 有ip怎么用自己的主机做网站住房城乡建设局网站
  • 青岛在线制作网站wordpress ip更换域名