在我参加的操作系统课程(该课程所涉及的操作系统是Linux)中,我们被告知:
进程具有确定将执行哪个进程的优先级值。
优先级值由进程调度算法确定。
线程没有优先级值,并且它们不是由算法调度的。
另一方面,我了解到每个线程都有以下属性:线程优先级、标识符、调度参数和堆栈大小。此外,多线程系统中还存在线程调度算法。
哪一个是真的?
答案1
嗯,这取决于定义。不同的系统可能有不同的习惯,或者同一事物有不同的名称。
这POSIX定义是一个进程由地址空间(进程可见的内存)标识,并且许多/大多数操作系统资源属于该进程。 (进程 ID(显然)、用户 ID、工作目录、文件描述符...)
另一方面,定义了一个线程作为进程内的“控制流”,包括运行时环境(CPU寄存器、浮点状态),和例如调度优先级。
所以通常是:进程<->资源,线程<->调度。
但事情并不一定一定是这样。在Linux中,进程及其子进程共享的资源可以通过clone(2)
系统调用,因此至少看起来可能有两个进程共享文件描述符,但具有不同的地址空间。或者反过来。
而且,在过去,Linux 实际上并没有正确区分进程和线程,只有内核级别的进程。 (从技术上讲,我们通常认为的线程仍然被内核称为“进程”,而通常意义上的进程称为“进程组”。)
某些类型的线程可以纯粹在用户空间中实现,无需操作系统的支持。在这种情况下,线程将不会由与进程相同的系统进行调度,因为操作系统调度程序甚至不知道它们存在。但即使在这种情况下,用户空间实现也需要有某种方法来确定要运行哪个线程。 (用户空间线程实现在实现正确线程的系统上已经过时,但这大约是我能想到的唯一情况,甚至接近您的第三点。)