趣谈 Linux,基础篇

Linux 学习 6 步走:
1、熟练使用 Linux 命令行
《鸟哥的 Linux 私房菜》、《Linux 系统管理技术手册》
2、使用 Linux 进程程序设计
通过系统调用或者 glibc 库
《UNIX 环境高级编程》
3、了解 Linux 内核机制
《深入理解 Linux 内核》内核版本有些老,但是了解原理可以
4、阅读 Linux 内核代码
《Linux 内核源代码情景分析》内核版本有些老
一开始阅 读代码不要纠结一城一池的得失,不要每一行都一定要搞清楚它是干嘛的,而要聚焦于核心 逻辑和使用场景。
5、实验定制 Linux 组件
6、生产实践

![image.png](https://img-blog.csdnimg.cn/img_convert/37102a2f08897e6e7acbc3729ab256bc.png#align=left&display=inline&height=690&margin=[object Object]&name=image.png&originHeight=690&originWidth=738&size=179952&status=done&style=none&width=738)

系统调用

进程管理

fork 子进程返回 0,父进程返回子进程的进程号(PID)
父进程继续做原来做的事情
子进程通过 execve 系统调用执行另一个程序
父进程关心子进程的运行情况,使用系统调用 waitpid,参数传自己成 PID
可以得到子进程执行完了没 && 执行成功了没

内存管理

独立的进程内存空间:每个进程都有自己的内存,互相之间不干扰
放程序代码的部分:代码段(Code Segment)
放进程运行中产生数据的部分:数据段(Data Segment)
其中局部变量的部分,作用域完成后会被释放
也有长时间保存的,指明才销毁的,堆(Heap)
一个进程内存空间是很大的,32 位是 4G,64 位更大了。
所以并不是一次性就分配好,而是需要的时候再分配。
进程要用内存的时候才会使用内存管理的系统调用来登记,说自己马上要用了
希望分配一部分内存给他
但这并不代表真的就对应到了物理内存
只有真的写入数据的时候,发现没有对应的物理内存
会触发一个中断,现分配物理内存

两个会在堆里面分配内存的系统调用:brk 和 mmap
分配的内存数量较少,使用 brk,会和原来的堆数据连在一起,相当于“多个筷子多个凳子的事情”
分配的内存数量较大,使用 mmap,重新划分一块区域,也就是说地方不够,来个新的大的地方

文件管理

文件管理最重要的是 2 点:介质和格式
文件管理的方式:创建、打开、读、写等
open 打开,close 关闭,create 创建,lseek 跳转位置,read 读,write 写
一切皆文件!
二进制文件
文本文件
stdout 文件
管道
设备
socket
文件夹也是文件
每个文件都会分配一个文件描述符(File Descriptor),整数表示

信号处理

信号处理:
对于一些不严重的信号,可以忽略,该干啥干啥,但是像 SIGKILL(用于终止一个进程的信 号)和 SIGSTOP(用于中止一个进程的信号)是不能忽略的,可以执行对于该信号的默认 动作。每种信号都定义了默认的动作,例如硬件故障,默认终止;也可以提供信号处理函 数,可以通过sigaction系统调用,注册一个信号处理函数。

进程间通信

进程间通信:
消息队列(Message Queue):
通过 msgget 创建一个新的队列,msgsnd 将消息发送到消息队列
消息接收方可以使用 msgrcv 从队列中取消息
共享内存:
当交互的信息较大的时候,可以使用共享内存的方式
数据不用拷贝来拷贝去
通过 shmget 创建共享内存块,通过 shmat 将共享内存映射到自己的内存空间,然后就可以读写了
注意“竞争问题”,为了让不同的人能够排他的访问,使用“信号量”机制
对于只允许一个人访问的需求,我们可以将信号量设为 1。当一个人要访问的时候,先调用 sem_wait。如果这时候没有人访问,则占用这个信号量,他就可以开始访问了。如果这个 时候另一个人要访问,也会调用 sem_wait。由于前一个人已经在访问了,所以后面这个人 就必须等待上一个人访问完之后才能访问。当上一个人访问完毕后,会调用sem_post将信 号量释放,于是下一个人等待结束,可以访问这个资源了。

网络通信

网络通信:
不同的机器遵循相同的网络协议。
通信双方都需要建立一个 socket(插口、插槽),类似于网线,每个电脑各一头

查看源代码中的系统调用:
64 位系统,kernel 中的 unistd_64.h 文件

Glibc 是 Linux 下使用的开源的标准 C 库,GNU 发布
提供了丰富的 API,封装了操作系统提供的系统服务(系统调用)
每个特定的系统调用对应了至少一个 Glibc 封装的库函数,比如系统提供的打开文件系统调用 sys_open 对应的是 Glibc 中的 open 函数
Glibc 一个单独的 API 可能调用多个系统调用,比如 printf 会调用 sys_open、sys_mmap、sys_write、sys_close 等等系统调用
多个 API 也可能只对应同一个系统调用,如 Glibc 下实现的 malloc、calloc、free 等函数用来分配和释放内存,都利用了内核的 sys_brk 系统调用

![image.png](https://img-blog.csdnimg.cn/img_convert/2ae1cd92b85bd22a3689ec41e7f7ac1f.png#align=left&display=inline&height=456&margin=[object Object]&name=image.png&originHeight=456&originWidth=930&size=175167&status=done&style=none&width=930)

命令 strace 常用来跟踪进程执行时系统调用和所接收的信号。

你可能感兴趣的:(操作系统,Linux,linux,内核,操作系统)