hello word(协程)的大致执行过程

----------helloword执行流程------

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mj0PypRY-1603292936297)(gorutine.assets/image-20201015214056687.png)]

  • hello word 程序被编译成可执行文件加载到内存中
  • 对于程序执行空间中的代码段,重要的是程序执行入口,不同平台执行入口不一样

在这里插入图片描述

  • 在进行一系列的程序代码检查和初始化之后会已runtime.main为程序执行入口创建main goroutine
  • main goutine 执行以后才会调用我们编写的main.main

数据段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5CwVJq7l-1603292936301)(gorutine.assets/image-20201015215524417.png)]

全局变量 g0。m0

  • 协程对应的数据结构是runtime.g,工作线程对应的是runtime.m,全局变量g0就是主协程对应的g,全局变量m0就是主线程对应的m
  • 与其他协程不同的是,他的协程栈 是由主线程栈上分配的
  • G0 持有m0的指针,m0 也记录着g0的指针,而且一开始m0上执行的协程正是g0
  • 全局变量allgs记录着所有的g,allm用于记录所有的m.全局变量sched(代表的是调度器,数据结构示runtime.schedt,记录所有空闲的m,空闲的p,全局队列runq等)全局变量allp记录所有的P

GMP 模型

一开始调度模型只有MG,但是因为频繁的加锁和解锁带来很大的资源消耗

在这里插入图片描述

  • 每个M和本地的自己的P绑定,这样可以避免只有一个p带来的加锁和解锁的性能消耗
  • 还有一个全局队列P,用于所有的P满了之后放入全局P中
  • M先从关联的本地队列中获取,如果没有的话在到全局队列领取一些任务,全局都没有就会随机窃取其他P的任务放入本地队列

p的创建过程

  • 全局变量allp记录所有的p
  • 程序初始化的时候会进行调度器初始化,这时会根据GOMAXPROCS环境变量来创建P的个数,并将allp[0]和m[0]绑定建立关系

main goroutin创建之前GPM关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zsuxboWp-1603292936309)(gorutine.assets/image-20201021224218642.png)]

程序初始化

  • 队列里只有main goutine 切换到main goutine
  • 执行入口是runtime.main,会创建监控线程,进行包初始化等,然后调用main.main,输出hello word
  • 在mian.main返回之后会调用exit()退出结束进程

在这里插入图片描述

通过协程输出hello word过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-23UsIr7p-1603292936311)(gorutine.assets/image-20201021224824821.png)]

  • 当main.main被执行时就会创建一个新的goroutie
  • 会被编译器转为newproc函数调用,调用时,之后给入口和参数,而newproc函数会给goroutine创建一个栈帧,目的是让协程结束后,返回到goexit中,进行协程资源回收

协程返回以后怎么样了

协程返回后怎么样了,是被回收了吗

  • 如果只有一个main.goroutine,那么执行完毕后后调用exit函数,释放空间内存,进行资源回收

  • 时候time.sleep 会将main.goroutine放入等待队列,为waiting状态,其他写成得以执行,等到sleep执行之后,time会把main goroutine重新置为——Grunnable状态,放回到runq的队列中,再然后就结束了,exit调用,进程退出,这是只有一个p的情况

在这里插入图片描述

创建多个p的退出

  • 默认会加到当前p的本地队列
  • 有空闲p的情况下,就可以启动新的线程关联这个p,并把hello goroutine 放入到本地队列中=

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xmHoTVOf-1603292936313)(gorutine.assets/image-20201021230533419.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: hello.jsp的执行过程如下图所示: 1. 用户在浏览器中输入hello.jsp的URL,请求发送到服务器。 2. 服务器接收到请求后,将请求发送给JSP引擎。 3. JSP引擎将hello.jsp转换成Java Servlet,并编译成.class文件。 4. Servlet容器加载并执行hello.jsp对应的Servlet。 5. Servlet生成HTML代码,并将其发送给浏览器。 6. 浏览器接收到HTML代码后,解析并渲染页面。 文字描述: 当用户在浏览器中输入hello.jsp的URL时,请求会被发送到服务器。服务器接收到请求后,将请求发送给JSP引擎。JSP引擎将hello.jsp转换成Java Servlet,并编译成.class文件。Servlet容器加载并执行hello.jsp对应的Servlet,生成HTML代码,并将其发送给浏览器。浏览器接收到HTML代码后,解析并渲染页面,最终呈现给用户。 ### 回答2: hello.jsp是一个JavaServer Pages(JSP)页面,它会在服务器上运行。在执行过程中,会依次经过解析、编译和执行三个主要步骤,如下图所示: 1. 解析阶段(Parsing Phase) 在这个阶段,JSP容器(如Tomcat)会解析hello.jsp文件中的所有标记,并将其转换为Java代码。这些标记包括<% %>, <%= %>, <%! %>和<%@ %>等。 例如,下面是一个简单的hello.jsp页面: <html> <head> <title>Hello World in JSP</title> </head> <body> <% String name = "World"; %> Hello <%= name %>! </body> </html> 在解析阶段,JSP容器会将上述JSP页面的<% %>标记中的代码转换为以下的Java代码: String name = "World"; 2. 编译阶段(Compilation Phase) 在编译阶段,JSP容器会将解析后的Java代码编译成可执行的Java类文件,并加载到服务器的内存中。服务器会自动触发该JSP页面的_init()方法以初始化该类,也就是在JSP页面中定义的所有变量和方法都会被初始化和预编译。 例如,在上面的例子中,JSP容器会编译以下的Java代码: out.write("Hello "); out.write(name); out.write("!"); 3. 执行阶段(Execution Phase) 在执行阶段,当一个客户端请求hello.jsp页面时,JSP容器会调用该类的_service()方法,该方法会生成HTML响应并将其发送回给客户端。在此阶段,所有在JSP页面中定义的变量和方法都可以被访问和使用。 例如,在上面的例子中,当客户端请求hello.jsp页面时,_service()方法将生成以下的HTML响应: <html> <head> <title>Hello World in JSP</title> </head> <body> Hello World! </body> </html> 总的来说,hello.jsp的执行过程可以通过解析、编译和执行三个主要步骤来描述。其中,在解析阶段,JSP容器会解析JSP页面的所有标记并将其转换为Java代码;在编译阶段,JSP容器会将解析后的Java代码编译为可执行的Java类文件;在执行阶段,当请求一个JSP页面时,JSP容器会调用该类的_service()方法生成HTML响应。 ### 回答3: 首先,hello.jsp需要被Tomcat服务器解析和处理,因此将会按照JSP规范将hello.jsp转换成一个Servlet。这个Servlet就是我们平时使用Java编写的Servlet,用来处理用户的请求和响应。 hello.jsp转换成Servlet后,Tomcat服务器会自动编译这个Servlet并将其部署到Web应用程序的工作目录下。此时,用户输入网址请求hello.jsp页面,Tomcat服务器就会寻找并执行这个Servlet。 在执行Servlet过程中,首先会执行<jsp:include>指令,将所包含的jsp文件内容嵌入到当前的Servlet中,以便于在后面的处理中使用。接下来,会执行所有的Java脚本代码并将其编译成相应的Java类文件。同时,会将所有的静态内容和表达式都转换成Java代码并编译成类文件。 最后,执行转换后的Servlet类中的service()方法,根据请求方式(GET或POST)选择相应的处理方法。在service()方法中,包含所有转换后的JSP代码和Java脚本代码,以及请求和响应参数。在完成对请求参数的处理后,将处理结果通过响应参数发送给客户端,完成整个执行过程。 需要注意的是,hello.jsp的执行过程不是一次性完成的,而是每次用户访问页面都会重新解析、转换、编译并执行。因此,在处理大量访问时,需要对JSP和Servlet进行优化来提高处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a...Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值