内核系统结布光
操作系统内核是一个庞大的系统工程,越大越复杂的系统就越须要构架设计,将复杂的大系统进行模块化分解,因而将大的复杂问题,弄成若干相对小的简单问题。以子系统维度看,它的系统结布光,如下所示:
内核作用
内核把计算机资源管理上去,保护上去,之后通过系统调用这个服务窗口将这种资源分配给用户程序使用,对底层硬件和用户程序起到隔离和协调的作用,提高资源使用效率和程序开发者的开发效率。
系统调用
如上所述,要使用计算机资源,就必须晓得如何使用系统调用服务。下边是一些常见的系统调用。
进程管理fork
创建进程使用fork。当父进程调用fork创建进程的时侯,子进程将各个子系统为父进程创建的数据结构也全部拷贝了一份,甚至连程序代码也是拷贝过来的。
对于fork系统调用的返回值,假如当前进程是子进程,就返回0;假如当前进程是父进程,就返回子进程的进程号。这样首先在返回值这儿就有了一个分辨,之后通过if-else句子判定,倘若是父进程,还接着做原先应当做的事情;假如是子进程,须要恳求另一个系统调用execve来执行另一个程序linux系统编程,这个时侯,子进程和父进程就彻底分道扬镳了,也就形成了一个分支(fork)了。
execve
运行一个程序用execve。
waitpid
父进程可以调用它,将子进程的进程号作为参数传给它,这样父进程就晓得子进程运行完了没有,成功与否。
显存管理
每位进程都有自己独立的显存空间,例如:代码段、数据段、堆、栈等。
brk/mmap
这儿介绍两个在堆上面分配显存的系统调用,brk和mmap。当分配的显存数目比较小的时侯。当分配的显存数目比较大的时侯,使用mmap,会重新界定一块区域。
文件管理
Linux里有一个特性,那就是一切皆文件,包括二补码文件、文本文件、标准输入输出文件、管道、socket、设备、文件夹等都是文件。每位文件linux主机,Linux就会分配一个文件描述符(FileDescriptor),这是一个整数。有了文件描述符linux 内核查询,我们就可以使用系统调用,查看或则干预进程运行的方方面面。“一切皆文件”的优势:统一了操作的入口,提供了极大的便利。
对于文件的操作,下边这六个系统调用是最重要的:
open
打开文件
close
关掉文件
creat
创建文件
lseek
打开文件之后,可以使用lseek跳到文件的某个位置
read/write
文件读写
讯号处理kill/SIGKILL/SIGSTOP
发送讯号,中止进程
sigaction
注册一个讯号处理函数
sem_wait/sem_post
占据/释放讯号量
进程间通讯msgget/msgsnd/msgrcv
通过msgget创建一个新的消息队列(在系统内核中),msgsnd将消息发送到消息队列,而消息接收方可以使用msgrcv从队列中取消息。
shmget/shmat
通过shmget创建一个共享显存块,通过shmat将共享显存映射到自己的显存空间,之后就可以读写了。共享显存存在“竞争”问题,通过讯号量的机制Semaphore解决。
网路通讯socket/bind/connect/accept/listen
我们可以通过Socket系统调用构建一个Socket。Socket也是一个文件,也有一个文件描述符,也可以通过读写函数进行通讯。
Glibc
Glibc为程序员提供丰富的API,不仅比如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装。
每位特定的系统调用对应了起码一个Glibc封装的库函数,例如说,系统提供的打开文件系统调用sys_open对应的是Glibc中的open函数。
有时侯,Glibc一个单独的API可能调用多个系统调用,例如说,Glibc提供的printf函数都会调用如sys_open、sys_mmap、sys_write、sys_close等等系统调用。
也有时侯,多个API也可能只对应同一个系统调用,如Glibc下实现的malloc、calloc、free等函数拿来分配和释放显存linux 内核查询,都借助了内核的sys_brk的系统调用。
内核源码: