Linux 网络协议栈之内核锁(一)—— 进程调度

本文介绍了Linux内核中的进程调度,包括主动式和被动式的调度方式,以及内核抢占的概念。在主动式调度中,进程因等待资源而睡眠,通过schedule()函数让出CPU。被动式抢占则发生在特定的用户和内核返回场景。内核抢占允许高优先级进程抢占低优先级进程,但存在不可抢占的情况,如中断处理和持有特定锁时。preempt_count变量用于管理内核抢占状态,确保系统稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      学习内核锁之前,我们先了解一下关于内核的基础知识,以便更好的学习内核锁的使用!

      下面我们先学习一下进程调度:

一、进程调度

调度什么时候发生?即:schedule()函数什么时候被调用?
调度的发生有两种方式:
1、主动式
在内核中直接调用schedule()。当进程需要等待资源等而暂时停止运行时,会把状态置于挂起(睡眠),并主动请求调度,让出CPU。
主动放弃cpu例: 
1. current->state = TASK_INTERRUPTIBLE; 
2. schedule();

2、被动式(抢占)
用户抢占(Linux2.4、Linux2.6)
内核抢占(Linux2.6)
用户抢占发生在:
* 从系统调用返回用户空间
* 从中断处理程序返回用户空间

内核即将返回用户空间的时候,如果need_resched标志被设置,会导致schedule()被调用,此时就会发生用户抢占.

复制代码
* ENTRY(ret_from_exception) //异常返回
get_thread_info tsk
mov why, #0
b ret_to_user
* __irq_usr: //在用户态收到中断
usr_entry
kuser_cmpxchg_check
…… …… ……
b ret_to_user

ENTRY(ret_to_user)
ret_slow_syscall:
disable_irq @ disab
### 嵌入式 Linux 应用开发技术 #### 编程语言 对于嵌入式 Linux 开发而言,C 语言是最常用的语言之。由于其高效性和对硬件的良好控制能力,在底层驱动程序编写以及性能敏感的应用场景下尤为适用[^3]。 除了 C 之外,Python 也被广泛应用于快速原型设计或是脚本化任务处理;而 Shell 脚本则常用于自动化部署流程或执行简单的命令行操作。随着物联网的发展趋势,JavaScript (Node.js) 和 Go 这样的现代编程语言也逐渐进入这领域,特别是在云端服务对接方面表现出色。 #### 工具链 为了能够顺利编译运行于目标板上的应用程序,开发者通常会依赖交叉编译器来生成适合 ARM 或 MIPS 架构的二进制文件。BusyBox 是个集成众多 Unix 实用工具的小型软件包集合,非常适合资源受限环境下的系统初始化和服务提供[^2]。 另外,QEMU 模拟器允许在主机上模拟不同架构的目标设备行为,极大地方便了早期测试与验证工作。Yocto Project 提供了套完整的构建框架,支持创建定制化的根文件系统映像并管理整个项目生命周期内的版本变更等问题。 #### 文件 I/O 及网络通信库 针对文件读写操作,POSIX 标准定义了系列 API 函数可供调用,如 `open()`, `read()`, `write()` 等等。在网络协议实现层面,则有 Berkeley Sockets 接口作为事实标准被普遍采纳,通过它能方便地建立 TCP/UDP 链接完成数据交换过程[^1]。 ```c #include <sys/socket.h> #include <arpa/inet.h> int main(){ int sockfd; struct sockaddr_in dest_addr; /* 创建 socket */ sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 设置目的地址 */ memset(&dest_addr, 0, sizeof(dest_addr)); dest_addr.sin_family = AF_INET; inet_aton("192.168.1.1", &dest_addr.sin_addr); dest_addr.sin_port = htons(8080); /* 发起连接请求 */ connect(sockfd, (struct sockaddr*)&dest_addr, sizeof(struct sockaddr)); return 0; } ``` #### 多线程并发模型 当涉及到多任务调度时,Linux 下有两种主要的方式——进程间通讯(IPC)机制和轻量级的线程(Thread),后者因为共享同内存空间所以效率更高些。Pthreads(Portable Threads)组 POSIX 标准规定的函数接口,用来简化跨平台移植性的考虑。 ```c #include<pthread.h> void* thread_func(void *arg){ printf("Thread is running\n"); } pthread_t tid; if(pthread_create(&tid,NULL,thread_func,NULL)==0){ pthread_join(tid,NULL); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值