操作系统
2025-46
某进程的虚拟地址空间如下图所示,阴影部分为未占用区域。

另有 C 程序代码:
char *ptr;
void main()
{
int length;
ptr = (char *)malloc(sizeof(char));
scanf("%s", ptr);
length = strlen(ptr);
printf("length=%d\n", length);
free(ptr);
}请回答下列问题,并说明理由:
- 上述程序执行时,其进程控制块位于哪个区域?执行 scanf() 等待键盘输入时,该进程处于什么状态?
- main() 函数的代码位于哪个区域?其直接调用的哪些函数的功能需要通过执行驱动程序实现?
- 变量 ptr 被分配在哪个区域?若变量 length 没有被分配在寄存器中,则会被分配在哪个区域?ptr 指向的字符串位于哪个区域?
答案
(1)PCB 位于操作系统内核区;进程执行 scanf() 等待键盘输入时处于阻塞态。
(2)main() 函数的代码位于只读代码区。其直接调用的函数中,scanf() 需要键盘/终端驱动程序,printf() 需要显示/终端驱动程序。
(3)全局变量 ptr 位于可读/写数据段;局部变量 length 若未分配在寄存器中,则位于用户栈;ptr 指向的字符串位于运行时堆。