linux内核情景分析{中断 系统调用 内存}

Linux的系统调用是通过中断来实现的,从用户态进入系统态。用户态和系统态有很清晰的区分,保证了安全。系统调用表是系统调用的跳转表。使用寄存器传递参数,而不是栈,因为用户态是无法访问系统栈的。地址错误是通过页面异常来处理的。

Linux内核并不支持真正意义上的线程, LinuxThreads 是用与普通进程具有同样内核调度视图的轻量级进程来实现线程支持的。这些轻量级进程拥有独立的进程 id ,在进程调度、信号处理、 IO 等方面享有与普通进程一样的能力。由于异步信号是内核以进程为单位分发的,而 LinuxThreads 的每个线程对内核来说都是一个进程,且没有实现 " 线程组 " ,因此,某些语义不符合 POSIX 标准,比如没有实现向进程中所有线程发送信号, README 对此作了说明。在 LinuxThreads 中,管理线程的栈和用户线程的栈是分离的,管理线程在进程堆中通过 malloc() 分配一个 THREAD_MANAGER_STACK_SIZE 字节的区域作为自己的运行栈。 " 一对一 " 模型的好处之一是线程的调度由核心完成了,而其他诸如线程取消、线程间的同步等工作,都是在核外线程库中完成的。管理线程与其他线程之间通过一对 " 管理管道( manager_pipe[2] " 来通讯。当核内既支持进程也支持线程时,就可以实现线程 - 进程的 " 多对多 " 模型,即一个进程的某个线程由核内调度,而同时它也可以作为用户级线程池的调度 者,选择合适的用户级线程在其空间中运行。这就是前面提到的 " 混合 " 线程模型,既可满足多处理机系统的需要,也可以最大限度的减小调度开销。绝大多数商业 操作系统(如 Digital Unix Solaris Irix )都采用的这种能够完全实现 POSIX1003.1c 标准的线程模型。在核外实现的线程又可以分为 " 一对一 " " 多对 一 " 两种模型,前者用一个核心进程(也许是轻量进程)对应一个线程,将线程调度等同于进程调度,交给核心完成,而后者则完全在核外实现多线程,调度也在用 户态完成。后者就是前面提到的单纯的用户级线程模型的实现方式,显然,这种核外的线程调度器实际上只需要完成线程运行栈的切换,调度开销非常小,但同时因 为核心信号(无论是同步的还是异步的)都是以进程为单位的,因而无法定位到线程,所以这种实现方式不能用于多处理器系统,而这个需求正变得越来越大,因 此,在现实中,纯用户级线程的实现,除算法研究目的以外,几乎已经消失了。

Linux内核只提供了轻量进程的支持,限制了更高效的线程模型的实现,但 Linux 着重优化了进程的调度开销,一定程度上也弥补了这一缺陷。

glibc malloc 的实现中 分配虚存有两种系统调用可用 : brk() mmap(),  如果要分配大块内存 , glibc 会使用 mmap() 去分配内存 , 这种内存靠近栈 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值