Day-22 常用System Call

常用System Call

tags: IT铁人

前面提到了OS会提供许多API给User执行,让User可以切换成kernel mode执行程序,以下介绍几个System Call。

fork()

此system call可以建立child process,child process会被配置与parent不同的memory space(by kernel),他的资料内容都会来自於parent的copy。

fork()的回传值有以下两种:

类型 内容
失败(无法建立child) 传负值(-1)给kernel,kernel通知parent。
成功 传回0给child process。传回大於0的值给parent,此数值极为child之PID(process id)。

因此,如果child要做与parent相同之工作,则fork()即可完成目的。

exit()

用来终止程序,请kernel结束程序并且收回resource,可以决定要回传甚麽数值给kernel。

通常exit(0)代表正常结束,exit(1)代表异常结束。

如果是child process执行exit(),则kernel会将数值回传给parent process。

wait()

用来暂停process,直到某事件发生。

通常会让parent执行wait(),等待child执行完再继续执行。

如果child已经终止,但parent尚未执行wait(),这段期间kernel就不能清除child PCB,此段时间child就称为zombie process。

之前杰哥修OS的时候,就因为作业内容需要执行许多fork()指令,但又有许多人忘记wait(),导致工作站的PID被占用光了,以至於後来的同学要登入工作站,会发生因为没有多的PID可以分配而无法登入,每年的那段时间都要定期清除所有process,可以说相当有趣。

另外,如果parent没有执行wait()就结束,child此时没有parent,就成了孤儿(orphan),不过放心,OS会接纳他们,并且定期把他们杀了。

execlp()

用来载入特定的binary code file到memory中执行,他有许多不同的类型可以使用,根据路径、参数的传递方式,在man7的页面可以看到有以下几种:

除了用法不一样以外,功能是没有差别的。

getpid()

名字简单明了吧,就是告诉你自己的pid是多少而已,就像是告诉你你是谁这样子。

What's Next?

因为下篇的篇幅可能比较长,这篇就到此为止,後面会介绍许多CPU Scheduling Algorithm,也就是怎麽分配大家使用CPU的时间才让大家都满意。

希望各位在疫情期间,可以安全地执行fork(),少产出一些child,最好不要有orphan,毕竟现在的zombie已经够多了。

上一篇 下一篇
Child Process CPU Scheduling Algorithm


<<:  [Day 21 - React] 今晚我想来点,React的其他功能

>>:  Day19-Kubernetes 那些事 - Stateless 与 Stateful

前言

在进到目前公司以前都没使用过 Laravel ,到了现在也摸索着用了大半年,实作了不少功能。不过因为...

【Day 25】又绕!又绕!又绕 ETW! - Bypass ETW

环境 Windows 10 21H1 Visual Studio 2019 前情提要 在【Day 2...

Day28-D3 进阶图表:气泡图

本篇大纲:绘制气泡图的关键、资料下载、范例图表的画面与互动效果、绘制图表 今天的一天一图表,我们要...

[Day12] Boxenn 实作 Record Mapper 与 Factory

建议搭配之前的 sequence diagram 一起服用! Dry Initializer 在进到...

python开启ansys软件问题 (2147221164, '类别未登录')

问题描述 重灌了几次ansys,又灌了其他软件之後,突然某一天发现用 oAnsoftApp = cl...