博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
系统调用之sys_nanosleep
阅读量:4215 次
发布时间:2019-05-26

本文共 1979 字,大约阅读时间需要 6 分钟。

这个系统调用会sleep 一段时间其源码分析如下:SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,		struct timespec __user *, rmtp){	struct timespec64 tu;	#得到user space需要设置sleep的时间	if (get_timespec64(&tu, rqtp))		return -EFAULT;	#检查要睡眠的时间是否合法	if (!timespec64_valid(&tu))		return -EINVAL;	#修改当前current的restart_block	current->restart_block.nanosleep.type = rmtp ? TT_NATIVE : TT_NONE;	current->restart_block.nanosleep.rmtp = rmtp;	#调用高精度时钟来睡眠	return hrtimer_nanosleep(&tu, HRTIMER_MODE_REL, CLOCK_MONOTONIC);}long hrtimer_nanosleep(const struct timespec64 *rqtp,		       const enum hrtimer_mode mode, const clockid_t clockid){	struct restart_block *restart;	struct hrtimer_sleeper t;	int ret = 0;	u64 slack;	slack = current->timer_slack_ns;	if (dl_task(current) || rt_task(current))		slack = 0;	#在栈上新建一个高精度的timer	hrtimer_init_on_stack(&t.timer, clockid, mode);	#设置到期时间	hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack);	#开始睡眠,在do_nanosleep中会调用shedule 让出当前cpu	ret = do_nanosleep(&t, mode);	if (ret != -ERESTART_RESTARTBLOCK)		goto out;	/* Absolute timers do not update the rmtp value and restart: */	if (mode == HRTIMER_MODE_ABS) {		ret = -ERESTARTNOHAND;		goto out;	}	#sleep时间到期后,修改回当前进程的restart_block	restart = ¤t->restart_block;	restart->fn = hrtimer_nanosleep_restart;	restart->nanosleep.clockid = t.timer.base->clockid;	restart->nanosleep.expires = hrtimer_get_expires_tv64(&t.timer);out:	#销毁栈上的高精度timer	destroy_hrtimer_on_stack(&t.timer);	return ret;}static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode){	struct restart_block *restart;	hrtimer_init_sleeper(t, current);	do {		set_current_state(TASK_INTERRUPTIBLE);		hrtimer_start_expires(&t->timer, mode);		if (likely(t->task))		#核心code 调用shedule 让出cpu 其中#define freezable_schedule()  schedule()			freezable_schedule();		hrtimer_cancel(&t->timer);		mode = HRTIMER_MODE_ABS;	} while (t->task && !signal_pending(current));	__set_current_state(TASK_RUNNING);	return -ERESTART_RESTARTBLOCK;}

转载地址:http://njnmi.baihongyu.com/

你可能感兴趣的文章
KMP求前缀函数(next数组)
查看>>
KMP
查看>>
poj 3863Business Center
查看>>
Android编译系统简要介绍和学习计划
查看>>
Android编译系统环境初始化过程分析
查看>>
user2eng 笔记
查看>>
DRM in Android
查看>>
ARC MRC 变换
查看>>
Swift cell的自适应高度
查看>>
【linux】.fuse_hiddenXXXX 文件是如何生成的?
查看>>
【LKM】整合多个LKM为1个
查看>>
【Windows C++】调用powershell上传指定目录下所有文件
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>
小练习 - 排序:冒泡、选择、快排
查看>>
SparkStreaming 如何保证消费Kafka的数据不丢失不重复
查看>>
Spark Shuffle及其调优
查看>>
数据仓库分层
查看>>
常见数据结构-TrieTree/线段树/TreeSet
查看>>
Hive数据倾斜
查看>>
TopK问题
查看>>