如何由操作系统的角度看代码的执行?

cumirror 2010-04-26 09:40:28
最近学习操作系统原理,然后想结合具体的程序来理解进程状态是如何切换以及资源分配问题。
例如如下代码:

#inlcude <stdio.h>
#include <stdlib.h>

int main(){
printf("Welcome!");
int a=5;
int b;
scanf("%d",&b);
char* c=(char*)malloc(255);
strcpy(c,"this is a string to be copied.");

return 0;
}

上述程序随手写的,我想问的是,当编译连接生成.exe文件后,双击程序运行时,程序中一些变量的分配,I/O操作是如何完成的?还有I/O操作时等待输入时会阻塞,这时进程状态切换过程是怎样的?

具体问题如下:
1.操作系统原理中提到:进程由新建状态变为就绪状态要申请相应的资源,那么这里申请到的资源包括代码中a变量的内存空间,包含c指向的动态开辟区间吗?
我的理解:应该是不包含的,申请的进程资源应该是PCB、程序驻留空间等。.exe文件对于操作系统来说就是一组执行指令,在执行过程中操作系统再开辟分配相应的变量空间,不知道我的理解对不。

2.printf对I/O设备的输出,操作系统是如何完成的?
这个不用介绍底层原理,从进程中断、进程状态转换的角度来说就行。

3.执行scanf函数(此时对应的是一组系统指令吗?)时,进程会阻塞,系统如何判断输入完成呢?
通过输入的回车换行符号吗?我想问的是,这时系统的中断过程,以及相应的进程状态转换过程是怎样的。

4.由操作系统的角度看,在操作系统的内存中,.exe程序是按照代码那样的顺序执行吗?
虽然以及编写了一段时间的程序,但对.exe具体是什么竟然不理解,希望大家能解答下。

谢谢了。






...全文
155 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cumirror 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kingstarer 的回复:]
不一定真正分配到内存,但是虚拟内存应该是要有的
[/Quote]
这里提到的是char* c=(char*)malloc(255);
你认为在进程的就绪阶段会在虚拟内存中分配255个字节,是这样吗?

看汇编,这个现在没有那么多时间看,所以希望有相关知识的朋友能帮忙解释下。
z569362161 2010-04-27
  • 打赏
  • 举报
回复
看汇编吧
cumirror 2010-04-27
  • 打赏
  • 举报
回复
也不能老指望大家详细解释清楚,我继续学习,谢谢大伙。
赵4老师 2010-04-27
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。
编译原理、操作系统
《深入解析Windows操作系统-Windows Internals》
Linux源代码
cumirror 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cattycat 的回复:]
编译成的exe文件分成数据段,指令段,还有其他的信息。操作系统执行的时候,加载如内存中,进程的堆栈结构中进行变量初始化,等。调用printf和scanf等函数的时候,底层已经在调用IO的函数了,弹出的控制台窗口就是IO终端了。scanf等待输入时,如果你长时间不输入,你的程序一直在等待,但这是操作系统在调度其他的进程,当scanf输入完成后,内核得到IO完成通知,然后设置你的进程状态为就绪态,等到……
[/Quote]
还有点不理解:
进程由新建状态变为就绪状态要申请相应的资源,这里申请到的资源包括代码中a变量的内存空间,包含c指向的动态开辟区间吗?

你提到的操作系统执行时,在进程的堆栈结构中进行变量初始化等,我想知道这些初始化操作是在就绪状态就已经完成了吗?
cattycat 2010-04-27
  • 打赏
  • 举报
回复
编译成的exe文件分成数据段,指令段,还有其他的信息。操作系统执行的时候,加载如内存中,进程的堆栈结构中进行变量初始化,等。调用printf和scanf等函数的时候,底层已经在调用IO的函数了,弹出的控制台窗口就是IO终端了。scanf等待输入时,如果你长时间不输入,你的程序一直在等待,但这是操作系统在调度其他的进程,当scanf输入完成后,内核得到IO完成通知,然后设置你的进程状态为就绪态,等到CPU调度轮到你的进程,就执行你的程序。其实这些时间很短,以至于你感觉不到,操作系统调度的过程。至于进程切换,这个都是压栈的,各个进程在内存中是不重叠的。除了共享内存外。这个可以不去了解了。
howema 2010-04-27
  • 打赏
  • 举报
回复
学习......
kingstarer 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 cumirror 的回复:]
最近学习操作系统原理,然后想结合具体的程序来理解进程状态是如何切换以及资源分配问题。
例如如下代码:

C/C++ code

#inlcude <stdio.h>
#include <stdlib.h>

int main(){
printf("Welcome!");
int a=5;
int b;
scanf("%d",&b);
char* c=(char*)……
[/Quote]
下面也是我个人理解,仅供参考
1 不只的,还有进程的栈空间,数据段 这些空间应该都是在开始时分配的
不一定真正分配到内存,但是虚拟内存应该是要有的
2 不清楚原理
3 输入完成是由scanf函数判断的 不是由系统判断的
scanf会执行read系统调用 read何时返回才是系统判断的
4 exe最后翻译出来的代码应该是类似汇编那样
由一条条简单指令组成的 这个你学一下汇编会有助于理解
zhangyafei13 2010-04-26
  • 打赏
  • 举报
回复
刚开始入门了,不太懂,不要还是要多多学习学习

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧