线程和进程之间的区别?

线程和进程之间的区别?

在我参加的操作系统课程(该课程所涉及的操作系统是Linux)中,我们被告知:

  1. 进程具有确定将执行哪个进程的优先级值。

  2. 优先级值由进程调度算法确定。

  3. 线程没有优先级值,并且它们不是由算法调度的。

另一方面,我了解到每个线程都有以下属性:线程优先级、标识符、调度参数和堆栈大小。此外,多线程系统中还存在线程调度算法。

哪一个是真的?

答案1

嗯,这取决于定义。不同的系统可能有不同的习惯,或者同一事物有不同的名称。

POSIX定义是一个进程由地址空间(进程可见的内存)标识,并且许多/大多数操作系统资源属于该进程。 (进程 ID(显然)、用户 ID、工作目录、文件描述符...)

另一方面,定义了一个线程作为进程内的“控制流”,包括运行时环境(CPU寄存器、浮点状态),例如调度优先级。

所以通常是:进程<->资源,线程<->调度。


但事情并不一定一定是这样。在Linux中,进程及其子进程共享的资源可以通过clone(2)系统调用,因此至少看起来可能有两个进程共享文件描述符,但具有不同的地址空间。或者反过来。

而且,在过去,Linux 实际上并没有正确区分进程和线程,只有内核级别的进程。 (从技术上讲,我们通常认为的线程仍然被内核称为“进程”,而通常意义上的进程称为“进程组”。)


某些类型的线程可以纯粹在用户空间中实现,无需操作系统的支持。在这种情况下,线程将不会由与进程相同的系统进行调度,因为操作系统调度程序甚至不知道它们存在。但即使在这种情况下,用户空间实现也需要有某种方法来确定要运行哪个线程。 (用户空间线程实现在实现正确线程的系统上已经过时,但这大约是我能想到的唯一情况,甚至接近您的第三点。)

相关内容