在执行进程期间调用fork()id时,会创建一个具有单独内存空间但内存内容相同的新进程。因此,由于这些是不同的过程,它们将具有不同的过程描述块,因此它们将根据调度算法给出的机会执行(PCB将保持其程序计数器值)。
但是当一个进程占用另一个线程时,该线程共享其地址空间。 我的问题是关于线程的执行: - 线程是否给出了具有不同程序计数器值的单独PCB以及调度算法计划,下一步将执行哪个线程。 如果是,则线程如何在分配给它的函数完成执行后立即停止执行。 这是因为该函数是子线程堆栈中唯一的函数,当它返回时,没有其他函数可以去吗?
答案 0 :(得分:1)
通常,调度程序/调度程序处理线程。线程是执行的系统对象和线程控制块(或无论在任何操作系统上调用它),都有自己的堆栈,寄存器保存,(特别是堆栈指针,即中断时PC被推送的位置),线程优先级,其他特定于线程的数据和指向它所属进程的PCB指针。 PCB具有存储器管理数据,访问控制数据,权限等,即。特定于流程的数据。进程没有任何执行,除非每个进程必须拥有至少一个线程(通常,但不是唯一的,是在创建进程时由加载器引发的线程)。
如果线程代码通过从其创建中使用的顶级函数返回而退出((绝不是最常用的线程终止方法),它将弹出一个放在上面的返回地址它在创建时堆栈,因此制作一个'TerminateThread',(或其他)系统调用,导致它自杀。
显然,对“典型”操作系统有一个非常广泛的概述。细节取决于操作系统,(实际上,随发布版本而变化)。