进程与线程

对于运行宿主cpu

  • cpu有单核和多核之分,核心是物理概念,可以简单的将双核cpu看做两个cpu。
  • 每个cpu核都有独自的一套寄存器和几级缓存,一个cpu核心同时只能运行一个任务,因此操作系统会给每个cpu核心创建一个进程队列来做进程调度。
  • 每个核心存在进程队列,因此就有了cpu负载和cpu占用率的区别,cpu负载关注的是进程队列的的进程数量,而cpu占用率关注的是cpu一段时间内的统计工作时间比。

进程调度,cpu 分配区别

  • linux是基于时间片对进程进行调度的,每个进程执行一段时间后,再将cpu让给别的进程;对于不同cpu,cpu的分配也有些区别。
  • 对于单核cpu,没什么特别处理的。
  • 对于多核cpu,操作系统倾向于把多进程,分配给多个cpu核,而将多线程进程分给一个cpu核心, 因为进程之间内存是独立的,而线程不是,单个cpu核心进程切换时,如果下一个进程和之前运行的进程同属于一个进程的话,就能减少资源拷贝,多线程倾向于使用单核(线程的内存空间不是独立的,共享部分资源,线程切换有资源损耗)。
  • 以上只是倾向,但是如果cpu资源紧张,也非常可能导致一个进程中的多个线程分给多个cpu核心,linux操作系统有接口,设置进程和cpu核心的亲和性,可以将一个进程中的线程尽可能的分配到一个核心,当然这不一定是好事,如果该cpu核心较为紧张,可能会导致该进程运行缓慢。

线程切换和进程切换对于cpu核心区别

  • 线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。
  • 这两种上下文切换的处理都是通过操作系统内核来完成的;内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
  • 另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。
  • 还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲(processor’s Translation Lookaside Buffer (TLB))或者相当的神马东西会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题。

进程和线程运行的区别

  • 对于cpu,线程和进程的运行几乎没有区别。

对于Linux内核

  • 在Linux下,线程是轻量级进程,轻量体现于:创建一个线程,线程不拥有独自的4GB的虚拟内存空间,线程拥有的虚拟内存空间是在所属进程的4GB中,并且划分一段固定大小的内存空间作为线程栈,堆等共享所属进程的。
  • 系统内核的管理结构PCB,线程和进程是一样的,只是有部分属性不同。

进程是资源分配的最小单位,线程是cpu调度的最小单位

  • 创建进程,操作系统才会进行资源分配,例如分配内存等。
  • 创建线程只是在其所属进程所拥有的4GB内存中,划分一段内存,作为线程栈,进程的其它内存,线程共享。
  • 线程栈大小,Linux上可以自主设置,默认1MB。
  • 创建线程,内核会创建相应的PCB,来做进程调度和管理。

进程拥有的虚拟内存空间

  • 对于32位系统,每个进程拥有4GB的虚拟内存空间,实际使用时,再由操作系统转换为物理内存地址。
  • linux进程的虚拟地址空间分为内核空间和进程空间两部分,低地址的03G给用户空间,高地址的3G4G给内核空间,虚拟内存空间的划分大小由内核决定,编译内核时可以设置。
  • 每个进程都有所属的1GB内核空间,但是并不是内核空间有多份,内核空间的物理内存只有一份,每个进程中的内核空间其实都是指向一份物理内存空间,怎么实现的,进程的创建都是clone的父进程,内核空间的地址也都是clone的第一个进程init。
  • 下图是进程的虚拟内存空间分布:
    进程与线程_第1张图片

你可能感兴趣的:(#,Linux,内核知识)