Linux线程

线程概念:

线程是进程内部的一条执行路径或执行序列。线程的量级很小,一切的进程都至少有一条线程,隶属于一个进程的多个线程指向同一块地址空间,但有自己的线程ID。

进程和线程的区别

  1. 进程是资源竞争的基本单位。
  2. Linux下没有真正的线程,因为Linux下没有给线程设计专有的结构体,它的线程是由进程模拟的,是多个进程共享一块地址空间模拟而来。
  3. 创建线程的资源成本小,工作效率高。
  4. Linux下CPU能够看见的所有线程都可以看成轻量级的进程。
  5. 进程是承担分配系统资源的基本实体,进程具有独立性,但进程间的通信打破了独立性。
  6. 线程是CPU或操作系统调度的基本单位,线程具有共享性。

线程同步的方法:信号量、互斥锁、条件变量、读写锁

线程的并发运行

并发(concurrency):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。(并发是指同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上有多个进程被同时执行的效果--宏观上并行,针对单核处理器)

互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。
同步(synchronous):进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。(彼此有依赖关系的调用不应该同时发生,而同步就是阻止那些“同时发生”的事情)
 

线程安全

所谓线程安全,就是当多个线程访问同一个数据时,不会造成数据出错。其实它是采用了加锁的机制来保证在一个线程访问该数据时,其他的线程不可以访问,直到等到那个线程访问结束才可以访问。而线程不安全,就是没有采用加锁的机制来保证这一点。

线程的实现

在fork()中,fork调用clone()系统调用,然后由clone()调用do_fork完成了创建中的大部分工作,该函数调用copy_process()函数,使进程开始运行,copy_process()函数的工作:

  1. 调用dup_task_struct()为新进程创建一个内核栈、thread_info结构和task_atruct,这些值与当前进程的值相同,此时,子进程和父进程的描述符是完全相同的。
  2. 检查并确保新创建这个子进程后,当前用户所拥有的进程数目没有超出给它分配的资源的限制。
  3. 子进程着手使自己和父进程区分开来,进程描述符中很多成员都要清0或重设为初始值。那些不是继承而来的进程描述符成员,主要是统计信息。task_struct中的大多数数据都依然没被修改。
  4. 子进程的状态被设置为TASK_UNINTERRUPTIBLE,以保证它不会投入使用。
  5. copy_process()调用copy_flags()以更新task_struct的flags成员。表明进程是否拥有超级用户权限的PF_SUPERPRIV标志被清0。表明进程还没有调用exec()函数的PF_FORKNOEXEC标志被设置。
  6. 调用alloc_pid()为新进程分配一个有效的PID。
  7. 根据传递给clone()函数的参数标志,copy_process()拷贝和共享打开的文件、文件系统信息、信号处理函数、进程地址空间和命名空间等。一般情况下,这些资源会被给定进程的所有线程共享;否则,这些资源对每个进程是不同的,因此被拷贝到这里。
  8. 最后,copy_process()做扫尾工作并返回一个指向子进程的指针。

在回到do_fork()函数,如果copy_process()函数成功返回,新创建的子进程就会被唤醒并投入使用。内核有意将其先于父进程执行,避免写时拷贝的额外开销。

Linux多线程的调试

自己查阅,多说无益。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值