linux/unix系统编程1(第二章)

linux/unix基本概念

1. 操作系统的内核

在广义情况下:内核是指完整的软件包,包括计算机核心层软件,以及所有的附带 标准工具:如命令解释器,图形用户界面,文件操作工具和文本编辑器等。

在侠义情况下:内核就是指管理计算机资源(CPU,RAM和设备)的核心层软件。

本书中的内核为狭义的内核

  1. 内核的职责
    1. 进程调度:linux为抢占式多任务操作系统,多任务指同时可以有多个进程驻留于内存之中,抢占是指操作系统内核对每个进程占用CPU时间的分配。
      进程本身对于自己何时执行,执行多长时间毫不知情
    2. 内存管理:采用和windows类似的虚拟内存管理技术(计算机历史上最为成功的抽象技术之一) ,主要有一下两个优点。
      1. 进程与进程之间,进程与内核之间彼此隔离,因此一个进程无法直接读取或修改内核或其他进程的内容。
      2. 提供了虚拟内存(就是可以将部分磁盘空间当做内存处理),保证了CPU在任意时刻都有进程执行,它使得应用程序认为它拥有连续可用的内存,但实际上,它通常是被分割为多个物理内存碎片,还有部分暂时存储在外部的磁盘存储器上,需要时进行数据交换。linux提供的“交换空间”通常就是被视为虚拟内存的磁盘空间。
    3. 提供了文件系统:文件系统的存在可以方便的对存在于磁盘上的文件进行创建,删除,修改,检查的功能,文件系统本身也是计算机历史上最重要的抽象概念之一。
    4. 创建和终止进程:内核可以将可执行文件加载如内存,并为其提供所需的资源,进程执行完毕后,内核还可以释放占用的全部资源。
    5. 内核既为程序的访问设备提供了简化的标准接口,还仲裁多个进程对每一个设备的访问。
    6. 联网:内核可以以进程的名义收发网络数据
    7. 提供系统调用接口:进程可以利用内核提供的接口去请求内核执行各种任务

操作系统的本质就是一种特殊的软件:一般来说,只要有进程管理和内存管理就可以叫做操作系统了。

  1. 内核态和用户态 :现代CPU至少可以被分为两种状态:用户态和内核态,操作系统为了合理使用CPU的两个状态,将虚拟内存分为了用户态和内核态。内核态的CPU可以访问用户态和内核态的进程虚拟内存,用户态的CPU只可以访问用户态的进程虚拟内存。
    仅当处理器处于核心态时,才可执行某些位于虚拟内存内核态的操作,比如关机,硬件管理,进程管理等。

2. shell

命名解释器,shell的命令就是人机交互,同时执行一些脚本

3.文件I/O模型

  1. 在linux系统中一切皆文件,且同一套系统调用(open,read,write,close等)所执行的I/O操作,可作用于所有的文件系统,比如套接字。因为应用程序发起I/O请求,内核会将其转化为相应的文件系统操作,就本质而言,内核只提供一种文件类型:字节流序列。

  2. stdio库:C语言在执行I/O操作时,往往会调用C语言的标准输入输出库,其中包括(fopen,fclose,scanf,printf,fgets,fputs)。

  3. 对于进程来说,许多事情的生都无法预期,进程不知道自己何时开始,结束占据CPU,不知道自己在物理内存和交换空间中的实际位置,不知道外部信号的来历,等等。进程仅仅是一个孤岛,对于整个体系的把控完全依赖于内核。

  4. 进程的内存布局

    1. 文本:程序的指令
    2. 数据:程序使用的静态变量
    3. 堆:程序可以从该区域动态分配额外内存
    4. 栈:随函数调用,返回而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间。
  5. 创建进程执行程序
    进程可以调用fork()来创建。父进程调用fork函数来创建子进程,子进程可以将父进程的文本,数据,堆,栈复制过来(内存中标记为只读的部分则由父,字进程共享)。
    当然,execve函数可以去加载一个全新的程序,execve函数会销毁现有的文本段,数据段,堆,栈,根据新程序创建一个新段来替换它们。

  6. 进程终止和终止状态:可以使用以下两种方式来终止一个进程

    1. 调用相关的exit()库函数
    2. 向进程传递信号(最常用kill命令)
  7. 守护进程:指具有特殊用途的进程,进程创建和处理此类的进程的方式和其他进程相同,但以下特征是其所独有的,守护进程的例子有(syslogd,在系统日志中记录消息,httpd,利用HTTP分发web页面)

    1. “长生不老"。守护进程通常在系统引导时启动,直到系统关闭时生命周期才会结束。
    2. 守护进程在后台运行,且无控制终端供其读取或写入数据。
  8. init进程:系统引导时会创建最初的进程,名叫init进程,是所有进程之父。init的进程号为1,且总以超级用户的权限运行,只有关闭了系统init进程才会终止,init的任务是创建并监控系统运行所需的一系列进程

4. 进程间的通信及同步

Linux系统上运行有多个进程,其中许多都是独立运行的,然而,进程间的通信(IPC)和同步是完成某些任务的必要机制。
读写磁盘文件中的信息是进程间通信的方法之一。可是,对许多程序员来说,这种方法既满又缺乏灵活性。因此,linux也提供了丰富的进程间通信的机制。

  1. 信号(signal):用来表示事件的发生
  2. 管道和FIFO:用于在进程间传递数据
  3. 套接字:供一台主机或是互联网的不同主机上所运行的进程之间传递信息。
  4. 文件锁定:防止其他进程读取或更新文件的内容,允许某进程对文件的部分区域加以锁定。
  5. 消息队列:允许在进程间交换消息(数据包)
  6. 信号量:用来同步进程动作
  7. 共享内存:允许两个及两个以上的进程共享一块内存,当某进程改变了共享内存的内容时,其他进程会立刻了解这一个变化。

5. 信号

尽管上一节将信号视为IPC的方法之一,但信号是一种广泛应用的操作。
人们往往将信号称为”软件中断“,进程收到信号,就意味着有事情要发生。
kill命令即可发出信号,kill本事发信号的命令,但是它发的大多数信号可以杀死进程,所有就起了(kill这个名字)

6.文件系统 /Proc

/Proc是一种虚拟文件系统,为内核提供了一个方便控制所有文件的接口,使操作系统内核可以方便的查看,修该各种属性。

发布了7 篇原创文章 · 获赞 0 · 访问量 612

猜你喜欢

转载自blog.csdn.net/qq_42055033/article/details/103883674