Linux学习记录之进程(二)

3 线程在Linux中的实现

Linux中不区分线程和进程,线程仅仅被视为一个域其他进程共享某些资源的进程。

线程的创建和普通进程的创建过程类似,只不过需要在调用clone()的时候传递一些参数来指明需要共享的资源:clone(CLONE_VM, CLONE_FS,CLONE_FILES,0)

参数列表如下:


内核线程

内核经常需要在后天运行一些任务,这可以通过内核线程来完成。内核线程与普通线程的区别在于没有独立的地址空间,它的mm指针设置为NULL。他们只在内核空间运行

4 进程终结

一般进程的西沟发生在它调用exit()之后,既可能显式的调用这个系统调用,也可能隐式的从某某个程序的主函数返回。不管进程是如何终结的,该任务大部分都要考do_exit()来完成,它要做下面这些繁琐的工作:

1、首先,将task_struct中的标志成员设置为PF_EXITING。

2、其次,调用del_timer_sync()删除任意内核定时器。根据返回的记过,它确保没有定时器在排队,也没有定时器处理程序在运行。

3、如果BSD的进程记账功能是开启的,do_exit()调用acct_process()来输出记账信息。

4、然后调用exit_mm()函数放弃进程占用的mm_struct,如果没有别的进程使用它们(也就是说没有被共享),就彻底释放它们。

5、接下来调用exit_sem()函数。如果进程排队等候IPC信号,它则离开队列。

6、调用——exit_files()、_exit_fs()、exit_namespace()和exit_sighand(),以分别递减文件描述符、文件系统数据、进程命名空间和信号处理函数的引用计数。如果其中某些引用计数的数值降为零,那么就代表没有进程在使用相应的资源,此时可以释放。

7、接着把存放在task_struct的exit_code成员中的任务退出代码置为exit()提供的代码中,或者去完成任何其他由该内核机制规定的退出动作。退出代码存放在这里共父进程随时检索。

8、调用exit_notify()向父进程发送信号,将子进程的父进程重新设置为线程组中的其他线程或init进程,并把进程状态设成TASK_ZOMBIE。

9、最后,do_exit()调用schedule()切换到其他进程。因为处于TASK_ZOMBIE状态的进程不会再被调度,所以这是进程所执行的最后一段代码。

这是进程处于不可运行的状态,并且占有内核栈、thread_info结构和task_struct结构。此时进程存在的唯一目的就是向他的父进程提供信息。父进程检索到信息后,或者通知内核那是无关的信息后,由进程所持有的剩余内存也被释放,归还给系统使用。

如果父进程在子进程之前退出,那么要为子进程重新找个父进程,可以使init进程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值