OS实际上是由好几部分组成的,被加载到内存中后,很大一部分是不运行的,只是静静的在内存中等待用户程序来调用,这部分就是内核提供的系统代用部分。进程管理、文件管理等我现在理解为由一个个的进程来实现,如果是单核cpu的话,当我们用户程序执行时,进程管理等功能是被阻塞的,当我们的程序运行完才会被唤醒,然后进行进程调度等。
线程的实现有两种:用户线程和内核线程,这是针对于谁来创建线程这个点来区分的。
如果OS内核不支持多线程,那么就不会提供创建线程的系统调用,也就不会存在内核级线程,只能通过第三方线程库,来实现用户级线程,我猜测这些线程的线程ID都是一样的,所以对于OS来说,他们都是“同一个”线程(因为OS不支持内核级线程,所以,一个程序内所有的用户级线程对于OS来说都是同一个),陷入到内核态之后,他们都对应同一个内核级线程,这也就是线程模型中的n:1模型。(这里的内核级线程其实只是一个逻辑上的概念,是我们创建的用户级线程陷入到内核态后进行的身份转变)
如果OS支持多线程,那么就会对外提供一些创建线程的系统调用,这里的线程就不是由第三方线程库创建的(相当于模拟的),而是由OS来创建和管理的,这些线程可以在用户态运行也可以在核心态运行,对于OS来说,每个线程的线程ID都不同,这就是线程模型中的1:1模型,早先的java的线程模型就是这种实现。实际上,1:1模型中的用户级线程和内核级线程其实都是值同一个线程,只是身份不同而已,这个线程在用户态运行时,就是用户级线程,当其执行系统调用等陷入到内核态时,会切换线程栈,就换了个身份,变成了内核级线程。所以用户级线程和内核级线程数目是1:1.
而n:m模型,我猜测可能某一功能需要多个线程,这些线程进行相同的工作,所以这些用户线程的线程ID相同,陷入到内核态,对于OS来说,这几个线程被认为是“同一个线程”,因为他们的ID相同,而如果一个进程有多个功能,则可能就会有多个线程组,每个线程组都映射到OS中对应于一个内核级线程,所以就是n:m,其中,m≤n,因为他们只是同一个线程的不同身份,所以内核级线程肯定是少于等于用户级线程的。
以上,只是个人对于OS的一些理解,可能不是特别深入,或者有理解错误的地方,希望大佬可以指正。