注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

《深入理解计算机系统》笔记(四)  

2014-09-23 20:32:13|  分类: 学习录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

八、异常控制流


1、从指令Ik的地址ak到另一个地址ak+1的过渡,这样的控制转移序列叫控制流。

   现代系统通过使控制流发生突变来对这些情况做出反应,这些突变叫异常控制流(ECF)。

2、异常类别

《深入理解计算机系统》笔记(四) - mihooke - mihooke的博客

陷阱有可能会返回内核中的abort例程,它会终止应用程序。而终止直接返回abort例程。

3、所有的到Linux系统调用的参数都是通过寄存器而不是栈传递的。寄存器%eax包含系统调用号,寄存器%ebx、%ecx、%edx、%edi、%ebp包含最多六个任意参数,栈指针%esp不能使用,因为当进入内核模式时,内核会覆盖它。

4、并发:一个逻辑流的执行在时间上与另一个流重叠,称这两个流并发地运行。并发的思想和处理器核数或计算机数无关,即使两个流式运行在同一个处理器上,也是并发的。但是并行流就是两个流并发地运行在不同的处理器核数上了。

5、上下文切换,每个系统都有某种产生周期性定时器中断的机制,每次发生定时器中断时,内核就能判定当前进程已经运行了足够长的时间,并切换到下一个进程。


6、获取进程ID:getpid函数返回调用进程的PID;pid_t getpid(void)

getppid函数返回它的父进程PID; pid_t getppid(void)

fork函数创建一个子进程; pid_t fork(void)   ,子进程得到与父进程用户级虚拟地址空间相同的一份拷贝。但他们有不同的PID,fork调用一次,返回2次:一次是在父进程中,另外一次是在子进程中。在父进程中,fork返回子进程的PID;在子进程中,fork返回0。

waitpid函数回收子进程; pid_t waitpid(pid_t pid,int *status,int options)  返回值:如果成功,返回子进程PID,如果WNOHANG,则为0,其他错误为-1.。pid>0,等待回收的就是单独一个子进程;pid=-1,等待回收的就是多有子进程,表示对waitpid的调用会阻塞,直到任意一个子进程终止。另外,回收子进程的有多个,则回收顺序是不确定的。

wait函数回收子进程,wait(&status)等价于waitpid(-1,&status,0)

sleep函数将一个进程挂起一段指定的时间。如果请求的时间到了,则返回0,否则返回剩下要休眠的秒数。

execve函数在当前的进程上下文中加载并运行一个新程序。int execve(const char *filename,const char *argv[],const char *envp[])

加载并运行filename文件,出现错误时才返回当前程序;argv变量指向一个以null结尾的指针数组,其中每个指针都指向一个参数串,通常,argv[0]是可执行目标文件的名字;envp环境变量也是指向一个以null结尾的指针数组,每个指针都指向一个环境变量串。在execve加载了filename之后,调用启动代码,启动代码设置栈,并将控制传递给新程序的主函数,该主函数原型是int main(int argc,int **argv,int **envp)。

execve和fork的区别是:execve在当前进程的上下文中加载并执行一个新的程序,会覆盖当前进程的地址空间,并没有创建一个新的进程,新的程序仍然有相同的PID,并且继承了调用execve函数时已打开的所有文件描述符。fork是在新的子进程中运行相同的程序,新的子进程是父进程的一个复制品。


7、传送一个信号到目的进程有两个步骤,发送信号:内核通过更新目的进程的上下文中的某个状态,饭送一个信号。接收信号:目的进程会被内核强迫以某种反应对信号的发送做出反应,此时目的进程就接受了信号,可以忽略,或者通过执行一个信号处理程序捕获此信号。

一种类型至多只会有一个待处理信号。如有多个待处理信号,就会被简单地丢弃。当一个信号被阻塞时,它仍可以被发送,但是产生的待处理信号不会被接收。一个待处理信号最多只能被接收一次。每个进程在pending位向量中维护着待处理信号,在blocked位向量中维护着被阻塞的信号。

8、发送信号函数

进程组:getpgrp函数返回当前进程的进程组IDpid_t getpgrp(void)

        setpgid函数改变自己或其他进程的进程组。int setpgid(pid_t pid,pid_t pgid)pid的进程组改为pgid

/bin/kill 程序可以像另外的进程发送任意的信号。

kill函数发送信号sig给进程pidint kill(pid_t pid,int sig)

alarm函数,unsigned int alarm(unsigned int secs),安排内核在secs秒内发送一个SIGALRM信号给调用进程,若secs0,则不会调度新的闹钟。返回值是前一次闹钟距离执行还剩下的秒数,若没有以前的闹钟,则返回0.

  评论这张
 
阅读(74)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017