操作系统(7)--进程、线程基本概念

线程与进程的区别:

Linux的线程实现非常特别, 它对线程和进程并不区分,从内核的角度来看,它并没有线程这个概念。内核把进程的列表存放在叫做任务列表的双向循环链表中,链表每一项都是类型为task_struct,称为进程描述符的结构,定义在<linux/sched.h>中。Linux通过slab分配器分配task_struct结构,用来达到对象服用和缓存着色的目的。

创建进程时,由于采用写时拷贝策略(copy-on-write),fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。fork()实际上是clone()系统调用实现的,内核倾向于首先执行子进程。

线程在Linux内部仅仅被视为一个与其他进程共享资源的进程,每个线程都拥有唯一隶属于自己的task_struct,所以在内核中看起来它就像一个普通的进程,只是线程和其他的一些进程共享例如地址空间之类的资源。

创建线程时调用clone,与创建进程不同的是它会传递一些参数来指明需要共享的资源。

进程的调度

进程调度的基本原则很简单,既最大限度地利用处理器的时间。Linux是抢占式多任务系统,由调度器决定什时候停止一个进程的运行,进程被抢占之前的时间都是预先设定好的 ,叫进程的时间片。除了Mac OS9及其前身还有windows3.1及其前身这些非抢占式多任务系统以外,绝大部分操作系统都是抢占式多任务的。

如何增加计算型进程的时间?

对于这类进程,调度策略往往是尽量降低它们的调度频率,而延长运行时间。延长进程时间的方法可以有1:调整进程nice值(操作方法参考http://blog.csdn.net/codestinity/article/details/7496962,或系统调用);2:可以用一个只有该进程使用的自旋锁,保证进程不会被切换;3: 也可以通过preempt_disable/preempt_enable函数来禁止/重新开启内核抢占,自旋锁上锁前会调用preempt_disable, 解锁前会调用preempt_enable重新开启内核抢占(

内核中每个进程数据结构里有一个计数器preempt_count
抢占的开启与禁止,操作当前进程的preempt_count
内核在进行进程调度的时候,只要prempt_count为0,内核就可以进行抢占。
    struct thread_info {
        struct task_struct *task; /* main task structure */
        ............//省略
        int     cpu;              /* cpu we're on */
        int     preempt_count;    /* 0 => preemptable,  <0 => BUG */
    };
);

进程的状态

  • 运行态:进程在内存中并可以执行;
  • 就绪态:进程做好了准备,只要有机会就开始执行;
  • 就绪/挂起态:进程在外存中,但是只要被载入内存就可以执行;
  • 阻塞态:进程在内存中并等待一个事件;
  • 阻塞/挂起态:进程在外存中并等待一个事件;
  • 新建态:刚刚穿件的进程,操作系统还没有把 它加入到可执行进程组中;
  • 退出态:操作系统从可执行进程组中释放出的进程,或者因为它自身停止了,或者是某种原因被取消



  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
进程线程操作系统中的两个基本概念,它们都是用来执行程序的执行单元,但在一些方面有着明显的区别。 1. 进程(Process): - 进程是程序在执行过程中的一个实例。 - 每个进程都有自己的独立内存空间,包括代码段、数据段和堆栈段。 - 进程之间相互独立,拥有各自的资源,通信需要通过进程间通信(IPC)机制。 - 进程拥有自己的进程控制块(PCB),用于描述进程的状态、资源和调度信息。 2. 线程(Thread): - 线程进程中的一个执行单元。 - 多个线程可以共享同一个进程的内存空间,包括代码段、数据段和堆栈段。 - 线程之间共享进程的资源,如打开的文件、信号处理等。 - 线程线程控制块(TCB)来描述,每个线程有自己的栈和寄存器上下文。 区别: 1. 资源占用:每个进程都有独立的内存空间和系统资源,而线程共享进程的资源。 2. 创建销毁开销:创建或销毁进程线程开销大,因为进程需要分配独立的内存空间和系统资源,而线程只需要创建线程控制块。 3. 切换开销:进程切换的开销较大,需要保存和恢复整个进程的上下文,而线程切换只需要保存和恢复线程的上下文。 4. 通信和同步:进程间通信需要使用进程间通信机制,如管道、消息队列等。线程间通信和同步相对容易,可以使用共享内存、信号量、互斥量等机制。 总结: 进程线程都是用于执行程序的执行单元,但进程是资源分配的基本单位,线程是CPU调度的基本单位。多线程比多进程更轻量级,线程之间的切换开销更小,但进程之间相互独立,安全性更高。在实际应用中,需要根据具体需求选择使用进程还是线程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风暴蓝熊猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值