Java线程和POSIX线程,是用户级还是内核级?

4

我对线程和操作系统构造不太熟悉,

想知道一些问题的答案。

在C语言中实现线程时,你可以使用POSIX线程,那么POSIX线程是操作系统级别的线程吗?是否在内核级别运行?

在Java中创建和运行线程时,这些都是用户级别的线程吗?我们在Java中对操作系统级别构造有哪些访问权限?在Java中的信号量只是在用户空间设置的吗?

感谢您提供任何关于这些问题的见解。


1
什么是“操作系统级别的构造”?显然,I/O将需要操作系统的支持,信号量和类似的同步机制也需要线程等待。 - Martin James
2个回答

6

POSIX线程是内核线程。内核线程是“普通”的线程;如果您在C语言中使用用户线程,那么您必须自己编写整个线程系统。

Java线程通常也是内核线程。在类Unix系统上,它们可能使用POSIX线程;在Windows上,它们使用Windows线程。可以想象,在没有线程的系统上有一个JVM,并且它自己实现线程(作为用户线程)。


谢谢@immibis,这让我明白了很多。就信号量而言,在C和Java中实现信号量时,可以说C提供了对信号量的更低级别访问?比如进程级别与线程级别?或者在Java中也有这个功能? - pipedreams2
@pipedreams2 什么是“进程级信号量”或“线程级信号量”? - user253751
抱歉,如果我对某些术语有些不太准确,因为我在这个领域还比较新。据我理解,信号量是一种用于同步的工具。在C语言中,您可以在内核或操作系统级别访问它们,并且即使它们位于当前程序的地址空间之外,也可以通过不同的进程访问它们。在Java中,我见过的所有信号量引用都是通过线程完成的。所以想知道Java是否支持通过信号量进行进程间通信?Java中的信号量与C中的有何不同? - pipedreams2
@pipedreams2 - 它们不会,因为所有这些同步要求都委托给底层操作系统。 - Martin James

0

补充一下@user253751的回答,通常使用pthread库创建的线程是(基本上)内核线程的另一个指示是由于传递给pthread_create的第二个参数的值。这个API的常见(但不强制)用法将以attr参数为NULL的方式进行,这意味着该线程将是内核(感知)线程。

int pthread_create(pthread_t *restrict thread,
                   const pthread_attr_t *restrict attr,
                   void *(*start_routine)(void *),
                   void *restrict arg);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接