百度首页 | 百度空间
 
查看文章
 
linux笔记 -- 进程线程
2008-07-11 13:12

进程线程

第一段:
进程的要素:
首先,要有剧本就是代码,供进程去执行的代码实体。
其次,私有财产也就是系统堆栈空间。
再次,有财产登记证且有户口的功效也就是进程结构task_struct。
最后,独立的3g空间也就是用户空间。
注:
如果具备前三条缺第四条就是线程了。
如果完全没有用户空间就是内核线程。
如果有共享的用户空间就是用户线程。
如果在一个进程中用pthread_creat创建的所谓“线程”,
跟这里的线程概念是两码事,因为其不作为一个调度单位,
受内核调度。(个人观点请指正:))。
linux中第一个进程是被捏造出来的,之后才复制为多个真正的进程。
linux在为每个进程分配空间的时候,实际上分了两页,而不是sizeof(task_struct),
因为其中包括系统堆栈的空间大约7kb,且属于静态分配所以中断处理程序,软中断处理程序等不能
嵌套太深,局部变量不宜过大而冲破这个堆栈。
当进程在系统空间运行的时候需要访问自己的task_struct,这时候linux通过:
return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));语句实现。
当前系统堆栈的指针与上THREAD_SIZE - 1即可。
假设系统堆栈从0xc3450000开始,则这个地址指向task_struct,当sp=0xc3451000的时候,与上FFFFE000仍然是这个0xc3450000值。
第二段:
进程的一生是被创建、执行程序辉煌时期、死亡的一生。 linux系统中进程一定要由一个已经存在的进程“复制”出来,而不是“创造”出来。 linux将进程的创建与目标程序的执行分成两步,当然kernel_thread是一把抓的,随后讨论: 第一步复制子进程,fork和clone,vfork。fork是父进程所有资源都通过数据结构的复制遗传给子进程。clone有选择的复制给子进程,函 数带有参数,vfork除task-struct和系统空间堆栈以外的都通过指针复制实现共享。第二步目标程序的执行,通过系统调用execve()去执 行一个以文件形式存在的可执行程序的映像。创建完子进程后,父进程有三种选择,通过三个系统调用wait3、wait4和exit,wait3等待任何子 进程去世。wait4等待特定子进程去世,exit是自行解决了自己。注:对exit的调用是每一个可执行映像必有的。程序以return从main返 回,gcc在编译连接时候会加上exit,一个人从出生到慢慢长大,经历了自己光辉的人生岁月的时候谁也不想去exit,但是当人生辉煌已过壮士暮年,上 天注定了你是逃不了回归大自然的。对于kernel_thread是对clone的封装,只能去执行内核中某一函数。
第三段:fork,vfork的学习
vfork用于创建一个新进程,而该新进程的目的是exec一个新进程,
vfork和fork一样都创建一个子进程,但是它并不将父进程的地址空间
完全复制到子进程中,因为子进程会立即调用exec,于是也就不会存放该地址空间。
。不过在子进程中调用exec或exit之前,他在父进程的空间中运行。
vfork和fork之间的另一个区别是: vfork保证子进程先运行,在她调用exec或exit之后
父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作
,则会导致死锁。
一点学习体会:
vfork创建的更像一个用户线程,它和父进程共用用户空间,包括用户堆栈,但是其拥有自己的系统堆栈。创建好后父进程被挂起等待子进程的运 行,直到子进程调用 exit后,父进程才会被执行,所以vfork后的子进程一定要小心使用,因为子进程完全可以破坏父进程的数据结构或者堆栈,如果子 进程改变了父进程的数据结构,那么它就不能调用exit退出,此外还要保证子进程不改变全局数据,以防父进程不能继续运行。
fork就创建了一个纯粹的进程了。

http://blog.mcuol.com/User/shenghuo456/Article/558_1.htm

类别:进程通信 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu