ITPub博客

首页 > Linux操作系统 > Linux操作系统 > perfessional linux kernel archticture 学习笔记2

perfessional linux kernel archticture 学习笔记2

原创 Linux操作系统 作者:spurray 时间:2009-05-07 18:25:37 0 删除 编辑

1.3 内核的元素

        这章节提供一个简短的概述关于内核各种元素,更多的细节我们在以后的章节叙述。尽管是单内核,Linux有着令人吃惊的良好的结构。当然,各种独立的元素会有相互的影响,它们共享数据结构,通过比之严格隔离的系统要多的函数进行共同合作。在接下来的章节,我不得不频繁的引用其他相关元素的章节。由于这个原因,我在这里先大略的介绍这些内核基本元素,希望大家能够有对各个内核元素在整个内核当中的位置和角色有个大概的印象。图1-1提够了一个粗略的关于Linux系统各层之间相互关系的视图,也包含一些Linux重要的子系统等等,注意,实际过程中,子系统将以多种附加的方法相互交互,这些没有在图上显示。


1.3.1 进程,任务切换和调度
   
        应用软件,服务和其他的程序运行在Unix上,通常都看作为进程(processes)。每一个进程都在CPU的虚拟内存中分配了地址空间。这些单独进程的地址空间完全独立,各个进程相互不知道对方的存在,每个进程都认为自己是这个系统独一无二的。如果进程想相互通讯交换数据,那么特殊的内核机制需要用到。

        由于Linux是一个多任务系统,它支持多个进程并发运行,由于只有多CPU的系统能够真正的同时运行多个进程,所以内核切换各个进程在一个短的时间间隔当中,使得多个进程似乎在同一时间中运行。这里,有两个方面的问题:

        1. 在CPU的帮助下,内核的任务切换技术的细节是可信任的,每一个独立的进程被给与一种CPU总是可用的假象。当进程使用的CPU资源被耗尽之前,与该进程相关的所有状态依赖元素将被保存,进程处于空闲状态,当该进程被重新激活,保存的相关状态将被恢复,进程间的切换被称为任务切换(task switching)。

        2. 内核需要决定CPU时间如何被存在的进程分享。重要的进程将给与多的CPU时间,次重要的将会少一些,进程在CPU中运行多久的决定称之为调度(scheduling)。

1.3.2 Unix进程

        Linux使用分等级的配置,在此之中,每一个进程依赖于父进程。内核开始于init程序,它对进一步的系统初始化动作负责,显示登录提示或者是图形登录接口(如今使用的非常广泛)。init是这根,其他的进程或多或少的都来自于它。如pstree程序所示,init是这树结构的根。
wolfgang@meitner>    pstree
    init-+-acpid
          |-bonobo-activati
          |-cron
          |-cupsd
          |-2*[dbus-daemon]
          |-dbus-launch
          |-dcopserver
          |-dhcpcd
          |-esd
          |-eth1
          |-events/0
          |-gam_server
          |-gconfd-2
          |-gdm---gdm-+-X
          |             ‘-startkde-+-kwrapper
          |                          ‘-ssh-agent
          |-gnome-vfs-daemo
          |-gpg-agent
          |-hald-addon-acpi
          |-kaccess
          |-kded
          |-kdeinit-+-amarokapp---2*[amarokapp]
          |           |-evolution-alarm
          |           |-kinternet
          |           |-kio_file
          |           |-klauncher
          |           |-konqueror
          |           |-konsole---bash-+-pstree
          |           |                   ‘-xemacs
          |           |-kwin
          |           |-nautilus
          |           ‘-netapplet
          |-kdesktop
          |-kgpg
          |-khelper
          |-kicker
          |-klogd
          |-kmix
          |-knotify
          |-kpowersave
          |-kscd
          |-ksmserver
          |-ksoftirqd/0
          |-kswapd0
          |-kthread-+-aio/0
          |           |-ata/0
          |           |-kacpid
          |           |-kblockd/0
          |           |-kgameportd
          |           |-khubd
   |             |-kseriod
          |             |-2*[pdflush]
          |             ‘-reiserfs/0
      ...
        树结构如何伸展和如何生成一个新进程有着密切关系,Unix用fork和exec两种机制实现这个目的。

        1 fork -- 生成一个当前进程的拷贝,仅仅与父进程的PID(process identification)不同。当系统调用执行完成后,系统中将有两个进程,他们都执行相通的动作,初始进程的内容将被复制,至少从程序观点来看。Linux使用非常著名的写拷贝技术。它允许只有在父进程或子进程执行页写操作时,才执行拷贝动作,这样可以提高效率,读操作时不拷贝。
        一个可能存在的场景对于使用fork来说,当用户开启第二个浏览器窗口,如果相应选项被选择,浏览器执行fork,复制它的代码,开始在它的子进程中建立一个新窗口。
   
        2 exec -- 装载一个新程序到现有的内存并执行它,之前程序保留的内存页将被清除。取代的是新的数据。新的程序开始执行。

线程
        进程不是内核唯一的程序执行方式,除了重量级进程--传统Unix对于进程的另一种说法--还有一线程。有时候称之为轻量级进程。本质上讲,一个进程也许有多个线程组成,它们共享数据和资源,但是处于程序段的不同位置。线程的概念在驱动现代语言--例如:Java中相当完善。简单来说,进程能够被看做可执行的程序,而线程是一个程序功能或例程,能够并行的在主程序中运行。这是有用的,举例说,当Web浏览器需要同时下载借个图片,通常,浏览器不得不执行数次fork和exec调用头产生并行的实例,它需要主程序使用一些通讯机制保障下载的数据的可靠性。而对于线程来说,这个工作就简单了,浏览器定义一个下载图片的例程,然后作为线程,多线运行(每一个有不同的参数),由于线程和主程序共享地址空间,下载的数据被自动保存在主程序中,不需要任何通讯开销,除了防止访问同一内存。图1-2阐述了一个进程使用线程和未使用线程的区别。


        Linux提供clone方法生成线程,这个工作类似于fork但是更精确,它检查确定哪些资源可以和父进程共享,那些需要单独生成。这细致的资源分配对传统的线程概念做了扩充,允许一个线程与进程间或多或少的持续转化。

1-1.JPG

1-2.GIF

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12366772/viewspace-594451/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-20

  • 博文量
    6
  • 访问量
    4335