Linux/Unix系统编程-基本概念

时间:2022-12-03 17:22:49

内核

内核是操作系统的核心,是指管理和分配系统资源的核心软件。

  1. 内核的职责
    ①进程调度:linux属于抢占式多任务操作系统,多个进程可以同时存在于内存当中,但是每次只能有一个进程获得对cpu的使用权。内核通过一定的进程调度算法控制哪个进程获得对cpu的使用,以及使用时间。
    ②内存管理:虽然现在的计算机内存大小逐渐增长。但内存还是属于有限资源,进程间需要共享资源,linux采用了虚拟内存机制,看过操作系统的应该会了解一点虚拟内存机制,系统会将进程和进程之间、进程和内核之间彼此隔离,一个进程无法读取和修改其他进程或内核的内存。这种机制会将不需要的内存页保存在外存中,需要用的时候再调出来。
    ③文件系统:内核在磁盘上提供文件系统,对文件执行各种操作。
    ④创建和终止进程:内核来控制对进程的创建,资源的分配,当进程结束后,对资源进行回收。
    ⑤对设备的访问:计算机有很多设备,包括输入输出设备,IO设备等,内核为程序访问设备提供了接口,控制程序对设备的访问。
    ⑥联网:内核会以用户进程的名义收发数据包,控制数据包的路由。
    ⑦提供系统调用应用编程接口:进程通过内核提供的api请求内核执行各种任务。

  2. 内核态和用户态
    cpu存在两种状态:内核态和用户态,在用户态下,cpu只能访问用户空间的内存,处于内核态时,既可以访问用户空间的内存,也能访问内核空间的内存。只有处于核心态时,才能执行一些特定操作,如宕机,访问内存管理软件,IO设备的初始化等。

shell

shell是一种具有特殊用途的程序,用于读取命令,相应命令。也叫做命令解释器。

用户和组

linux作为一个多用户的系统,可以创建多个用户,同时多个用户还能一起登录,每个用户会有唯一的用户名和ID。用户可以隶属于多个组,我们可以对不同的组设置不同的权限,来做权限管理。

进程

进程是正在执行的程序实例,当创建一个进程时,内核会对该进程的信息进行记录,然后会将程序载入内存,为程序分配空间和资源。进程之间是互不干涉的,他们有独立的内存空间和资源。进程在内存中有这么几块区域:
文本:程序的指令
数据:程序使用的静态变量
堆:程序可动态分配的内存空间
栈:随函数调用、返回而增减的一个内存区域,能为局部变量分配空间,内存的分配和回收由系统控制。
父进程可以使用系统调用fork()来创建一个子进程,内核通过对父进程的复制来创建子进程。创建出来的子进程相当于父进程的副本,子进程可以去执行与父进程共享代码段的不同函数,但是更常见的是通过系统调用execve()加载一个全新程序,这个系统调用会销毁现有的文本段,数据段,栈和堆段,来创建新的这些段。

线程

线程是比进程更小的划分。可以说线程是进程的一部分,一个没有线程的进程可以看做是一个单线程。每个进程可以执行多个线程,线程之间共享数据区和堆,但是每个线程都有自己的栈,用来装载本地变量和函数调用链接信息。线程间的通信往往是通过共享变量的使用。

静态库和共享库

我们知道代码需要先通过编译变成机器代码,然后通过链接器将库文件和其他目标代码进行链接,最后生成可执行文件。
静态库相当于每次生成可执行文件都会把所需静态库中的函数织入可执行文件中。所以不同的可执行文件会存在同一库函数的程序,造成了内存浪费。
共享库相当于在内存中只保存一份库文件中的目标模块,当可执行文件运行时动态地将所需库文件函数载入内存,大大节省了内存空间。