怎么由操作系统的角度看代码的执行

如何由操作系统的角度看代码的执行?
最近学习操作系统原理,然后想结合具体的程序来理解进程状态是如何切换以及资源分配问题。
例如如下代码:
C/C++ code

#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具体是什么竟然不理解,希望大家能解答下。

谢谢了。








------解决方案--------------------
刚开始入门了,不太懂,不要还是要多多学习学习
------解决方案--------------------
探讨
最近学习操作系统原理,然后想结合具体的程序来理解进程状态是如何切换以及资源分配问题。
例如如下代码:

C/C++ code

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

int main(){
printf("Welcome!");
int a=5;
int b;
scanf("%d",&amp;b);
char* c=(char*)……

------解决方案--------------------
看汇编吧
------解决方案--------------------
学习......
------解决方案--------------------
编译成的exe文件分成数据段,指令段,还有其他的信息。操作系统执行的时候,加载如内存中,进程的堆栈结构中进行变量初始化,等。调用printf和scanf等函数的时候,底层已经在调用IO的函数了,弹出的控制台窗口就是IO终端了。scanf等待输入时,如果你长时间不输入,你的程序一直在等待,但这是操作系统在调度其他的进程,当scanf输入完成后,内核得到IO完成通知,然后设置你的进程状态为就绪态,等到CPU调度轮到你的进程,就执行你的程序。其实这些时间很短,以至于你感觉不到,操作系统调度的过程。至于进程切换,这个都是压栈的,各个进程在内存中是不重叠的。除了共享内存外。这个可以不去了解了。
------解决方案--------------------
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。
编译原理、操作系统
《深入解析Windows操作系统-Windows Internals》
Linux源代码