[6]开发一个Linux系统吧——一些其他的东西

进程安全

为了防止多进程或多线程同时对资源的调用而出现数据错误,内核提供了两种工作状态:同步和异步,同步就是按照一定顺序进行访问,异步就是系统控制进程何时访问

同时在为了资源安排合理的情况下,系统提供了锁,它可以保护自己在运行时不会受到其他线程的干扰。但是如果两个线程互相持有对方的资源,且无法释放,这样会出现死锁现象。死锁可以由以下原因引发:

  • 资源抢夺导致的,如不可抢占或者资源消耗过多
  • 进程运行顺序不当,申请顺序有误

为了避免死锁我们必须清楚的了解加锁顺序,先加的锁一定后解,后入的锁一定先开锁,同时注意释放锁的逻辑。

下面是一些提升并发能力的操作:

  • 原子类型:使用了CAS的思想,可以不被调度机制打断
  • 自旋锁:可以自动保护,如果有其他程序申请,必须等候到运行结束
  • 信号量:发送结束信号,否则线程出于睡眠
  • 互斥锁:仅允许两个程序进行争夺

这里说一下信号量,其他的都为各种语言的基础,信号量的使用需要PV操作:

  • P:信号量值减一,若小于0,则进程阻塞,否则继续执行
  • V:信号量值加一,若结果小于等于0,则释放进程,若大于0,则继续执行

操作信号量可以使用semget函数,他的头为:

1
2
3
4
5
6
7
8
9
10
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

// 创建一个新的信号量
int semget(key_t key, int num_sems, int sem_flags);
// 改变信号量的值
int semop(int sem_id, struct sembuf *sops, size_t nsops);
// 信号量的初始化
int semctl(int sem_id, int sem_num, int command, ...);

时钟机制

每台计算机都会有一个时钟RTC。从单片机发展来看,时钟就是晶振一样的功能,提供给芯片完整的信息。

  • RTC:提供实时时钟
  • TSC:外部时钟信号
  • PIT:中断时钟信号
  • HPET:新的时钟,精度很高
  • ACPI:控制CPU的频率

Linux为了控制时钟中断提供了两个变量,分别为xtime和Jiffies。xtime从cmos获取时间,为了获取操作系统的日期,也就是实时时钟,他的精度为us,使用time.h就可以获取了。jiffies可以获取启动到下载的时间,也可以记录时间的发生间隔,一般用作驱动系统的参考时间。

时钟的单位有两种,一种是Hz,这是最基础的时钟单位,另一种就是tick,他是Hz的倒数,表示一次震荡的时间。

SWAP

SWAP就是在外存中分配一个空间做内存,这种就是虚拟内存,可以当作RAM使用,如果运行一些需要内存较大的程序,就需要使用交换空间,所以一般内存大小都是RAM+SWAP,但是虚拟内存毕竟是虚拟内存,速度比内存肯定慢了很多,所以增加虚拟内存不是解决办法,而是添加内存。

总结

这样Linux内核就已经更新完成了,本期博文只负责查缺补漏,这里给出各期的传送门,可以一起看咯~

Linux内核开发(1)

Linux内核开发(2)

Linux内核开发(3)

Linux内核开发(4)——VFS

Linux内核开发(5)——IO模型与中断


[6]开发一个Linux系统吧——一些其他的东西
https://blog.minloha.cn/posts/110722e000b8d22023020704.html
作者
Minloha
发布于
2023年2月7日
更新于
2023年12月21日
许可协议