zoukankan      html  css  js  c++  java
  • TLPI读书笔记第2章-基本概念2

    1.8 内存映射

    调用系统函数 mmap()的进程,会在其虚拟地址空间中创建一个新的内存映射

    映射分为两类。

    1.8.1 文件映射:

    将文件的部分区域映射入调用进程的虚拟内存。映射一旦完成,对文件映射内容的访问则转化为对相应内存区域的字节操作。映射页面会按需自动从文件中加载。

    1.8.2 匿名映射

    其映射页面的内容会被初始化为 0。

    由某一进程所映射的内存可以与其他进程的映射共享。达成共享的方式有二:

    其一是两个进程都针对某一文件的相同部分加以映射,

    其二是由 fork()创建的子进程自父进程处继承映射。 当两个或多个进程共享的页面相同时,进程之一对页面内容的改动是否为其他进程所见呢?

    这取决于创建映射时所传入的标志参数。若传入标志为私有,则某进程对映射内容的修改对于其他进程是不可见的,而且这些改动也不会真地落实到文件上;若传入标志为共享,对映射内容的修改就会为其他进程所见,并且这些修改也会造成对文件的改动。

    内存映射用途很多,其中包括:以可执行文件的相应段来初始化进程的文本段、内存(内容填充为 0)分配、文件 I/O(即映射内存 I/O)以及进程间通信(通过共享映射)。

    1.9 静态库与共享库

    目标库是这样一种文件:将一组函数代码加以编译,并置于一个文件中,供其他应用程序调用。

    现代 UNIX 系统提供两种类型的对象库:静态库和共享库。

    1.9.1 静态库

    静态库是早期 UNIX 系统中唯一的一种目标库。 本质上说来,静态库是对已编译目标模块的一种结构化整合。要使用静态库中的函数,需要在创建程序的链接命令中指定相应的库。主程序会对静态库中隶属于各目标模块的不同函数加以引用。链接器在解析了引用情况后,会从库中抽取所需目标模块的副本,将其复制到最终的可执行文件中,这就是所谓静态链接。对于所需库内的各目标模块,采用静态链接方式生成的程序都存有一份副本。这会引起诸多不便。其一,在不同的可执行文件中,可能都存有相同目标代码的副本,这是对磁盘空间的浪费。同理,调用同一库函数的程序,若均以静态链接方式生成,且又于同时加以执行,这会造成内存浪费,因为每个程序所调用的函数都各有一份副本驻留在内存中,此其二。此外如果对库函数进行了修改,需要重新加以编译、生成新的静态库,而所有需要调用该函数“更新版”的应用,都必须与新生成的静态库重新链接。

    1.9.2 共享库

    设计共享库的目的是为了解决静态库所存在的问题。 如果将程序链接到共享库,那么链接器就不会把库中的目标模块复制到可执行文件中,而是在可执行文件中写入一条记录,以表明可执行文件在运行时需要使用该共享库。一旦在运行时将可执行文件载入内存,一款名为“动态链接器”的程序会确保将可执行文件所需的动态库找到,并载入内存,随后实施运行时链接,解析可执行文件中的函数调用,将其与共享库中相应的函数定义关联起来。在运行时,共享库代码在内存中只需保留一份,且可供所有运行中的程序使用。经过编译处理的函数仅在共享库内保存一份,从而节约了磁盘空间。另外,这一设计还能确保各类程序及时使用到函数的最新版本,功莫大焉,只需将带有函数新定义体的共享库重新加以编译即可,程序会在下次执行时自动使用新函数

    1.10 进程间通信

    读写磁盘文件中的信息是进程间通信的方法之一。可是,对许多程序来说,这种方法既慢又缺乏灵活性。

    Linux 也提供了丰富的进程间通信(IPC)机制

    信号( signal),用来表示事件的发生。

    管道(亦即 shell 用户所熟悉的“ |”操作符)和 FIFO,用于在进程间传递数据。

    套接字,供同一台主机或是联网的不同主机上所运行的进程之间传递数据。

    文件锁定,为防止其他进程读取或更新文件内容,允许某进程对文件的部分区域加以锁定。

    消息队列,用于在进程间交换消息(数据包)。

    信号量( semaphore),用来同步进程动作。

    共享内存,允许两个及两个以上进程共享一块内存。当某进程改变共享内存内容时,其他进程立即了解这一变化。

    本质而言, FIFO和 UNIX 套接字功能相同,允许同一系统上并无关联的进程彼此交换数据。二者之所以并存于现代 UNIX 系统之中,是由于 FIFO 来自 System V,而套接字则源于 BSD

    1.11 信号

    人们往往将信号称为“软件中断”。进程收到信号,就意味着某一事件或异常情况的发生。 信号的类型很多,每一种分别标识不同的事件或情况。采用不同的整数来标识各种信号类型,并以 SIGxxxx 形式的符号名加以定义

    内核、其他进程(只要具有相应的权限)或进程自身均可向进程发送信号

    下列情况之一时,内核可向进程发送信号。 用户键入中断字符(通常为 Control-C)。 进程的子进程之一已经终止。 由进程设定的定时器(告警时钟)已经到期。 进程尝试访问无效的内存地址。

    在 shell 中,可使用 kill 命令向进程发送信号。在程序内部,系统调用 kill()可提供相同的 功能。收到信号时,进程会根据信号采取如下动作之一。 忽略信号。 被信号“杀死”。 先挂起,之后再被专用信号唤醒。

    程序可选择不采取默认的信号动作,而是忽略信号或者建立自己的信号处理器。信号处理器是 由程序员定义的函数,会在进程收到信号时自动调用,根据信号的产生条件执行相应动作。

    1.12 线程

    每个进程都可执行多个线程。可将线程想象为共享同一虚拟内存及一干其他属性的进程。每个线程都会执行相同的程序代码,共享同一数据区域和堆。可是每个线程都拥有属于自己的栈,用来装载本地变量和函数调用链接信息。

    线程之间可通过共享的全局变量进行通信。借助于线程 API 所提供的条件变量和互斥机制,进程所属的线程之间得以相互通信并同步行为

    线程的主要优点在于协同线程之间的数据共享(通过全局变量)更为容易,而且就某些算法而论,以多线程来实现比之以多进程实现要更加自然。

    1.13 进程组和shell任务控制

    shell 执行的每个程序都会在一个新进程内发起。 shell 创建了 3 个进程来执行以下管道命令

    ls -l |sort -k5n | less

    几乎所有的主流 shell 都提供了一种交互式特性,名为任务控制。该特性允许用户同时执行并操纵多条命令或管道。在支持任务控制的 shell 中,会将管道内的所有进程置于一个新进程组或任务中。

    进程组中的每个进程都具有相同的进程组标识符

    1.14 会话、控制终端和控制进程

    会话指的是一组进程组(任务)。会话中的所有进程都具有相同的会话标识符。会话首进程( session leader)是指创建会话的进程,其进程 ID 会成为会话 ID。

    使用会话最多的是支持任务控制的 shell,由 shell 创建的所有进程组与 shell 自身隶属于同一会话, shell 是此会话的会话首进程。

    会话都会与某个控制终端相关。控制终端建立于会话首进程初次打开终端设备之时。对于由交互式 shell 所创建的会话,这恰恰是用户的登录终端。一个终端至多只能成为一个会话的控制终端。

    在任一时点,会话中总有一个前台进程组(前台任务),可以从终端中读取输入,向终端发送输出

    如果用户在控制终端中输入了“中断”(通常是 Control-C)或“挂起”字符(通常是 Control-Z),那么终端驱动程序会发送信号以终止或挂起(亦即停止)前台进程组。一个会话可以拥有任意数量的后台进程组(后台任务),由以“ &”字符结尾的行命令来创建

    支持任务控制的 shell 提供如下命令:列出所有任务,向任务发送信号,以及在前后台任 务之间来回切换

    1.15 伪终端

    伪终端广泛应用于各种应用领域,最知名的要数 telnet 和 ssh 之类提供网络登录服务的应用

    1.16 日期和时间

    进程涉及两种类型的时间。 真实时间:指的是在进程的生命期内(所经历的时间或时钟时间),以某个标准时间点(日历时间)或固定时间点(通常是进程的启动时间)为起点测量得出的时间。

    进程时间:亦称为 CPU 时间,指的是进程自启动起来,所占用的 CPU 时间总量。

    1.17 客户端服务器架构

    客户端/服务器应用由两个组件进程组成。 客户端:向服务器发送请求消息,请求服务器执行某些服务。 服务器:分析客户端的请求,执行相应的动作,然后,向客户端回发响应消息。

    1.18 实时性

    实时性应用程序是指那些需要对输入做出及时响应的程序。

    由于实时响应的需求与多用户分时操作系统的需求存在冲突,大多数操作系统“天生”并不提供这样 的支持。

    1.19 /proc文件系统

    /proc 文件系统是一种虚拟文件系统,以文件系统目录和文件形式,提供一个指向内核数据结构的接口。

    /proc 目录下的文件内容都采取人类可读的文本形式, shell 脚本也能对其进行解析。程序可以打开、读取和写入/proc 目录下的既定文件

  • 相关阅读:
    GDB Practice
    GCC常用命令
    使用VS2010 C#编写ActiveX控件
    [.NET] 使用 .NET Framework 開發 ActiveX Control
    VC2005开发MFC ActiveX控件
    Register DLL and OCX
    COM组件开发实践
    Java Invoke C and C++ Using JNI
    Unable to cast object of type 'System.Int32' to type 'System.String'.
    SharePoint wiki 分类获取所有的
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/14621572.html
Copyright © 2011-2022 走看看