内核系统调用的实现和互斥机制

系统
操作系统本质上是对底层的资源进行管理并封装了底层的能力,对上层提供服务。这种服务好比是实现了一个排序算法,但是是否使用多线程,这个是由上层决定的,内核本身不会在底层实现多线程排序这种能力。

[[403398]]

本文转载自微信公众号「编程杂技」,作者theanarkh。转载本文请联系编程杂技公众号。

有感于最近在知乎看到了两个问题,分享一下对内核系统调用的实现和互斥机制的认识。

下面是这两个问题:

https://www.zhihu.com/question/462048846/answer/1919407185

https://www.zhihu.com/question/460985657/answer/1912146181

系统调用的实现

两个问题分别是问了TCP/IP协议和epoll的实现中,内核是否使用了多线程。这个问题的角度挺有意思的,内核虽然在内部使用进程/线程实现了某些功能(比如pdflush线程定时回写硬盘、kswapd进程周期回收内存、处理工作队列的线程)。但是系统调用的实现中,是不涉及多线程的概念的。

操作系统本质上是对底层的资源进行管理并封装了底层的能力,对上层提供服务。这种服务好比是实现了一个排序算法,但是是否使用多线程,这个是由上层决定的,内核本身不会在底层实现多线程排序这种能力。

互斥机制

但是因为在多核的情况下,多个CPU上会执行多个线程,如果多个线程同时请求内核访问同一个内核数据结构,那么就会引起竞态情况。所以内核需要实现访问资源的互斥机制。这样才能保证多个CPU中同时只有一个CPU会操作共享的数据结构。比如自旋锁,保证多个CPU只有其中一个CPU拿到这个锁,然后操作共享的数据。另外,内核还实现了原子操作,比如内核里提供的atomic原子操作,可以对整形变量进行原子性操作,其具体实现原理根据CPU架构而不同,比如i386 CPU提供了Lock指令,保证同时只有一个CPU可以锁住总线,对内存进行互斥访问,下面是i386原子操作的实现。

  1. static __inline__ void atomic_add(int i, atomic_t *v) 
  2.   __asm__ __volatile__( 
  3.     LOCK "addl %1,%0" 
  4.     // 输出到v->counter所在内存 
  5.     :"=m" (v->counter) 
  6.     // %1和0%对应下面两个值,i是整形,随便存到一个寄存器,m表示表示从v->counter的内存读取 
  7.     :"ir" (i), "m" (v->counter)); 

如果单核的情况下,非抢占式的则不需要这种机制,因为在执行系统调用的时候,进程调度器是不会调度其他进程执行的,这就保证了系统调用的原子性。如果在抢占式模式下并且支持在执行系统调用时被抢占,那么还是需要互斥和原子机制的,总而言之,存在竞态情况的,都需要保证共享数据的互斥访问。

 

内核实现的功能虽然没有使用多线程,但是通常底层是多核,上层是使用多进程/多线程的,所以内核为了保证互斥访问共享数据,需要实现一些原子操作和互斥机制。

 

责任编辑:武晓燕 来源: 编程杂技
相关推荐

2011-01-14 13:50:37

2021-03-15 15:18:16

鸿蒙HarmonyOS应用

2022-04-11 08:42:09

TypeScript子类型定义

2009-10-29 09:41:01

Linux内核DeviceMappe

2021-01-29 13:29:53

系统调用

2016-09-20 15:21:35

LinuxInnoDBMysql

2019-04-10 13:43:19

Linux内核进程负载

2023-12-15 15:55:24

Linux线程同步

2021-10-25 09:53:52

鸿蒙HarmonyOS应用

2015-03-26 13:14:53

javascriptjs callback实现调用

2020-12-28 08:51:06

操作系统微内核Dubbo

2020-09-04 10:14:02

Linux驱动7内核

2024-01-09 09:40:23

2017-08-16 16:20:01

Linux内核态抢占用户态抢占

2021-05-10 08:30:59

CentosUbutun运维

2017-12-15 10:20:56

MySQLInnoDB同步机制

2009-06-19 20:32:00

Linux

2021-05-25 09:28:34

鸿蒙HarmonyOS应用

2022-01-23 22:36:39

Linux

2020-11-20 07:55:55

Linux内核映射
点赞
收藏

51CTO技术栈公众号