初探Linux kernel之进程相关一

      终于到了重点部分,这次来说说linux的进程管理,不一定能说完,这个比较多,说多少是多少

 

      要知道啊,OS是干啥的?处理提供对硬件层的抽象以外,还担负着很多的硬件管理功能,而这些功能,用一句话来说,就是来处理各个部件的时空复用问题(时间和空间的重用问题,如cpu是分时重用的(当然还有多核cpu的特例,而内存是即分时又分空的……)。往古至今,大牛们对OS的定义不下其数,而本人认为最有说服力的OS的定义就是:“所有软件(特指应用程序)的交集”,料想计算机诞生初期都是专用机,在一款机器上只能跑订制的专用程序,而这个程序要自己做好所有硬件的协调且还要完成他应有的本分工作,慢慢的计算机向通用型发展,为了提高系统利用率和避免盲目且重复的底层实现,OS随着需求一步步形成且不断完善……不知你发现没有,好多东西都是在历史舞台上重复出现的,仿佛对应着“20年后又是一条好汉”这句话,看现在的googleChrome OS,其实最初的原型说白了就是把chrome浏览器必要的底层重新从OS中剥离,使其具有独立运行的能力,这不是有点最早的专用机的味道,计算机这东西很是神奇,一个好的点子就可能改变整个市场,甚至一个世纪……哈哈,个人愚见,扯远了。

 

      重新回来,回到复用性说起吧,因为cpu要跑的程序很多,但是cup个数有限,这就牵扯到cpu的重用,也就是被多个进程重用(进程与程序的区别就不多说了,自己熟悉OS知识去吧,简单的提一下程序运行的本质就是从内核申请个进程,再把程序包中的代码拷贝到对应进程的代码域并设置好相关变量数据令进程跑起来,所以程序只是静态的代码,而进程是一个不断从程序加载代码的执行过程),这是由于进程间要复用cpu,所以就要求有人来负责他们有组织有纪律的复用,并协调进程间的轻重缓急、切换规则、切换后的一些处理……另外还有怎样生产进程、怎样切换、怎样销毁……这些由谁完成?当然是OS,对于linux,当然是kernel了。毕竟OS就是用来跑程序的,而进程就是程序的灵魂,可见进程管理的重要性,咱就从进程说起先。

      

      虽然吧,进程是处于执行期的程序,但是要明白,进程并不仅仅局限于一段可执行的代码,你想,要想跑进程,你得知道是谁的进程,要区别于其他进程;还要保证当前进程不能随意访问其他进程的地址空间,要是连这都不限制,那写个黑客程序多随意啊;还牵扯到多线程问题;另外,由于进程间是复用cpu的,就是一会儿这个执行,一会儿换另一个,那你还要保证它可以接着上次的执行啊,要不不就乱了套了……如此说来,进程需要的东西大概有:

             打开的文件

             挂起的信号   (linux一个事件的处发是基于信号机制的,就像windows的事件机制)

             内核内部数据 (这就是传说中恢复现场用的,要还原到进程切换前的状态需要保存现场)

             处理器状态   (没理解错的话,这也是现场保持的一部分,因为有些程序的执行是)

             地址空间

             一个或多个执行线程(Linux下的线程实现非常有趣,也非常简单,本质上也就是几个共享进程,没有设置专门的线程数据结构)

 

      以上是Linux下进程的主要组成部分,当然了,进程管理么,有了进程还要有管理,管理相关着进程的策略和生命周期等一些东西,我们会慢慢讲来。

 

      话说很久很久以前,进程自创建时刻起就开始存活了,活在Linux世界的进程爹fork()系统调用一下,就会生个小进程,比和女儿国的水来的还快。进程这东西没耳朵没眼睛的,他爹咋知道啥时候生好了。既然fork()是生婆,那这是生婆最懂了。fork()系统调用会返回两次:一次回到父进程,一次回到子进程。

 

      新的进程是为了立即执行新的不同的程序,而接着调用exec*()这族函数就可以创建新的地址空间,并把新的程序载入。(fork()实际上是由clone()系统调用实现的。)

 

      最终,程序会通过exit()系统调用退出执行。这个函数会终结进程并将其占用的资源释放。父进程会通过wait4()系统调用来查询子进程是否终结,这就使得进程拥有了等待特定进程执行的能力。进程退出后被设置为僵死状态,直到父进程调用wait()waitpid()为止。

 

      

   额,有空继续,今天就到这里吧……休息一下,看个动漫先,哈

  详细请咨询blog专题:http://blog.csdn.net/dreambegin

 

你可能感兴趣的:(多线程,数据结构,windows,linux,OS,chrome)